mirror of
https://github.com/stevenhowes/wbios.git
synced 2026-05-26 15:53:34 +01:00
Initial commit of 1.11 source as released by PC Engines
Original source https://www.pcengines.ch/file/wbios111s.zip
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
;
|
||||
; 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
|
||||
Reference in New Issue
Block a user