mirror of
https://github.com/stevenhowes/wbios.git
synced 2026-05-26 15:53:34 +01:00
d410ad0acb
Original source https://www.pcengines.ch/file/wbios111s.zip
128 lines
2.5 KiB
Plaintext
128 lines
2.5 KiB
Plaintext
;
|
|
; Printer BIOS
|
|
;
|
|
; (C)1997-2001 Pascal Dornier / PC Engines; All rights reserved.
|
|
; This file is licensed pursuant to the COMMON PUBLIC LICENSE 0.5.
|
|
;
|
|
; Limitations:
|
|
;
|
|
; - Doesn't call INT15 function 90FE on busy wait.
|
|
;
|
|
; pd 991003 fixed lp_test loop
|
|
;
|
|
; INT 17 entry
|
|
;
|
|
int17: sti ;reenable interrupts
|
|
push ds ;save registers
|
|
push si
|
|
push bx
|
|
push cx
|
|
push dx
|
|
mov bx,ax ;save AX
|
|
xor ax,ax ;access BIOS segment
|
|
mov ds,ax
|
|
cmp dx,3 ;max port ?
|
|
jae lp_exit ;:return
|
|
mov si,dx ;-> table index
|
|
mov cl,[si+m_lptime] ;get time-out value
|
|
shl si,1
|
|
mov dx,[si+m_lpio] ;get I/O port base
|
|
and dx,dx ;0 -> not present
|
|
jz lp_exit
|
|
mov al,bh ;get command code
|
|
and al,al
|
|
jz lp_out ;AH=0 -> output character
|
|
dec ax
|
|
jz lp_init ;AH=1 -> initialize
|
|
dec ax
|
|
jz lp_stat ;AH=2 -> get status
|
|
lp_exit: mov al,bl ;restore AL
|
|
pop dx ;restore registers
|
|
pop cx
|
|
pop bx
|
|
pop si
|
|
pop ds
|
|
iret
|
|
;
|
|
; AH=00: output character
|
|
;
|
|
lp_out: mov al,bl ;output character
|
|
out dx,al ;[DX+0]
|
|
inc dx
|
|
xor si,si
|
|
lp_wait: in al,dx ;[DX+1] get status
|
|
mov ah,al
|
|
and al,al ;busy ?
|
|
js lp_ok ;:no
|
|
dec si
|
|
jnz lp_wait
|
|
dec cl
|
|
jnz lp_wait
|
|
or ah,1 ;time-out
|
|
and ah,0f9h
|
|
jmp short lp_out2 ;flip bits, exit
|
|
|
|
lp_ok: inc dx
|
|
mov al,0dh ;activate strobe
|
|
out dx,al ;[DX+2]
|
|
out iowait,ax
|
|
lp_in2: mov al,0ch ;deactivate strobe
|
|
out dx,al ;[DX+2]
|
|
dec dx
|
|
dec dx
|
|
out iowait,ax
|
|
;
|
|
; get printer status
|
|
;
|
|
lp_stat: inc dx ;get status
|
|
in al,dx ;[DX+1]
|
|
and al,0f8h
|
|
mov ah,al
|
|
lp_out2: mov al,bl ;restore AL
|
|
xor ah,048h
|
|
jmp lp_exit
|
|
;
|
|
; initialize printer
|
|
;
|
|
lp_init: mov al,8 ;reset printer
|
|
inc dx
|
|
inc dx
|
|
out dx,al ;[DX+2]
|
|
mov cx,5000 ;wait a bit
|
|
lp_in1: loop lp_in1
|
|
jmp lp_in2
|
|
;
|
|
; test printer ports
|
|
;
|
|
lp_test: mov ax,1414h ;init printer time-out
|
|
mov [m_lptime],ax
|
|
mov [m_lptime+2],ax
|
|
mov si,offset lp_ports
|
|
mov di,offset m_lpio ;destination for I/O port
|
|
lp_test0: cs: lodsw ;get I/O port to test
|
|
and ax,ax
|
|
jz lp_test0a ;:end of table
|
|
xchg dx,ax ;AX -> DX port address
|
|
call lp_test2 ;test the port
|
|
jmp lp_test0 ;try next
|
|
|
|
lp_test0a: mov dx,2
|
|
lp_test1: mov ah,1 ;init port
|
|
int 17h
|
|
dec dx
|
|
jns lp_test1
|
|
ret
|
|
|
|
lp_test2: mov ax,0aa55h ;write test pattern
|
|
out dx,al
|
|
out iowait,ax ;invert bus
|
|
out iowait,ax
|
|
in al,dx ;read back test pattern
|
|
cmp al,55h ;correct ?
|
|
jnz lp_test9 ;:no printer
|
|
mov [di],dx ;store port address
|
|
inc di
|
|
inc di
|
|
add byte [m_devflg+1],40h ;count printer ports in equipment flag
|
|
lp_test9: ret
|