forked from MirrorRepos/RomWBW
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
5.9 KiB
233 lines
5.9 KiB
title 'Character I/O handler for z80 chip based system'
|
|
|
|
; Character I/O for the Modular CP/M 3 BIOS
|
|
|
|
public ?cinit,?ci,?co,?cist,?cost
|
|
public @ctbl
|
|
|
|
; maclib Z80 ; define Z80 op codes
|
|
; maclib ports ; define port addresses
|
|
maclib modebaud.lib ; define mode bits and baud equates
|
|
|
|
;max$devices equ 6
|
|
|
|
cseg
|
|
|
|
?cinit:
|
|
ret
|
|
; mov a,c ! cpi max$devices ! jz cent$init ; init parallel printer
|
|
; rnc ; invalid device
|
|
; mov l,c ! mvi h,0 ; make 16 bits from device number
|
|
; push h ; save device in stack
|
|
; dad h ! dad h ! dad h ; *8
|
|
; lxi d,@ctbl+7 ! dad d ! mov l,m ; get baud rate
|
|
; mov a,l ! cpi baud$600 ; see if baud > 300
|
|
; mvi a,44h ! jnc hi$speed ; if >= 600, use *16 mode
|
|
; mvi a,0C4h ; else, use *64 mode
|
|
;hi$speed:
|
|
; sta sio$reg$4
|
|
; mvi h,0 ! lxi d,speed$table ! dad d ; point to counter entry
|
|
; mov a,m ! sta speed ; get and save ctc count
|
|
; pop h ; recover
|
|
; lxi d,data$ports ! dad d ; point at SIO port address
|
|
; mov a,m ! inr a ! sta sio$port ; get and save port
|
|
; lxi d,baud$ports-data$ports ! dad d ; offset to baud rate port
|
|
; mov a,m ! sta ctc$port ; get and save
|
|
; lxi h,serial$init$tbl
|
|
; jmp stream$out
|
|
;
|
|
;cent$init:
|
|
; lxi h,pio$init$tbl
|
|
;
|
|
;stream$out:
|
|
; mov a,m ! ora a ! rz
|
|
; mov b,a ! inx h ! mov c,m ! inx h
|
|
; outir
|
|
; jmp stream$out
|
|
|
|
|
|
?ci: ; character input
|
|
;ld bc,0000H ; unit 0, func 0 = CIN
|
|
ld c,b ; Unit number to C
|
|
ld b,00h ; HBIOS CIN Function
|
|
rst 08 ; do it
|
|
ld a,e ; put char in A
|
|
ret ; done
|
|
|
|
; mov a,b ! cpi 6 ! jnc null$input ; can't read from centronics
|
|
;ci1:
|
|
; call ?cist ! jz ci1 ; wait for character ready
|
|
; dcr c ! inp a ; get data
|
|
; ani 7Fh ; mask parity
|
|
; ret
|
|
;
|
|
;null$input:
|
|
; mvi a,1Ah ; return a ctl-Z for no device
|
|
; ret
|
|
|
|
?cist: ; character input status
|
|
;ld bc,0200H ; unit 0, func 2 = IST
|
|
ld c,b ; Unit number to C
|
|
ld b,02h ; HBIOS IST Function
|
|
rst 08 ; do it
|
|
or a ; set flags
|
|
ret z ; return w/ ZF set if no char ready
|
|
or 0FFH ; else signal nothing ready
|
|
ret ; done
|
|
|
|
; mov a,b ! cpi 6 ! jnc null$status ; can't read from centronics
|
|
; mov l,b ! mvi h,0 ; make device number 16 bits
|
|
; lxi d,data$ports ! dad d ; make pointer to port address
|
|
; mov c,m ! inr c ; get SIO status port
|
|
; inp a ; read from status port
|
|
; ani 1 ; isolate RxRdy
|
|
; rz ; return with zero
|
|
; ori 0FFh
|
|
; ret
|
|
|
|
;null$status:
|
|
; xra a ! ret
|
|
|
|
?co: ; character output
|
|
ld e,c ; char to E
|
|
;ld bc,0100H ; unit 0, func 1 = COUT
|
|
ld c,b ; Unit number to C
|
|
ld b,01h ; HBIOS COUT Function
|
|
rst 08 ; do it
|
|
ret ; done
|
|
|
|
; mov a,b ! cpi 6 ! jz centronics$out
|
|
; jnc null$output
|
|
; mov a,c ! push psw ; save character from <C>
|
|
; push b ; save device number
|
|
;co$spin:
|
|
; call ?cost ! jz co$spin ; wait for TxEmpty
|
|
; pop h ! mov l,h ! mvi h,0 ; get device number in <HL>
|
|
; lxi d,data$ports ! dad d ; make address of port address
|
|
; mov c,m ; get port address
|
|
; pop psw ! outp a ; send data
|
|
;null$output:
|
|
; ret
|
|
;
|
|
;centronics$out:
|
|
; in p$centstat ! ani 20h ! jnz centronics$out
|
|
; mov a,c ! out p$centdata ; give printer data
|
|
; in p$centstat ! ori 1 ! out p$centstat ; set strobe
|
|
; ani 7Eh ! out p$centstat ; clear strobe
|
|
; ret
|
|
|
|
?cost: ; character output status
|
|
;ld bc,0300H ; unit 0, func 3 = OST
|
|
ld c,b ; Unit number to C
|
|
ld b,03h ; HBIOS OST Function
|
|
rst 08 ; do it
|
|
or a ; set flags
|
|
ret z ; return w/ ZF set if not ready to send
|
|
or 0FFH ; else signal nothing ready
|
|
ret ; done
|
|
|
|
|
|
; mov a,b ! cpi 6 ! jz cent$stat
|
|
; jnc null$status
|
|
; mov l,b ! mvi h,0
|
|
; lxi d,data$ports ! dad d
|
|
; mov c,m ! inr c
|
|
; inp a ; get input status
|
|
; ani 4 ! rz ; test transmitter empty
|
|
; ori 0FFh ! ret ; return true if ready
|
|
;
|
|
;
|
|
;cent$stat:
|
|
; in p$centstat ! cma
|
|
; ani 20h ! rz
|
|
; ori 0FFh ! ret
|
|
|
|
;baud$ports: ; CTC ports by physical device number
|
|
; db p$baud$con1,p$baud$lpt1,p$baud$con2,p$baud$con34
|
|
; db p$baud$con34,p$baud$lpt2
|
|
;
|
|
;data$ports: ; serial base ports by physical device number
|
|
; db p$crt$data,p$lpt$data,p$con2data,p$con3data
|
|
; db p$con4data,p$lpt2data
|
|
|
|
|
|
@ctbl db 'COM0 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM1 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM2 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM3 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM4 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM5 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM6 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM7 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM8 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM9 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM10 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 'COM11 '
|
|
db mb$in$out+mb$serial+baud$none
|
|
db baud$none
|
|
db 0
|
|
|
|
;@ctbl db 'CRT ' ; device 0, CRT port 0
|
|
; db mb$in$out+mb$serial+mb$softbaud
|
|
; db baud$9600
|
|
; db 'LPT ' ; device 1, LPT port 0
|
|
; db mb$in$out+mb$serial+mb$softbaud+mb$xonxoff
|
|
; db baud$9600
|
|
; db 'CRT1 ' ; device 2, CRT port 1
|
|
; db mb$in$out+mb$serial+mb$softbaud
|
|
; db baud$9600
|
|
; db 'CRT2 ' ; device 3, CRT port 2
|
|
; db mb$in$out+mb$serial+mb$softbaud
|
|
; db baud$9600
|
|
; db 'CRT3 ' ; device 4, CRT port 3
|
|
; db mb$in$out+mb$serial+mb$softbaud
|
|
; db baud$9600
|
|
; db 'VAX ' ; device 5, LPT port 1 used for VAX interface
|
|
; db mb$in$out+mb$serial+mb$softbaud
|
|
; db baud$9600
|
|
; db 'CEN ' ; device 6, Centronics parallel printer
|
|
; db mb$output
|
|
; db baud$none
|
|
; db 0 ; table terminator
|
|
|
|
;speed$table db 0,255,255,255,233,208,104,208,104,69,52,35,26,17,13,7
|
|
;
|
|
;serial$init$tbl
|
|
; db 2 ; two bytes to CTC
|
|
;ctc$port ds 1 ; port address of CTC
|
|
; db 47h ; CTC mode byte
|
|
;speed ds 1 ; baud multiplier
|
|
; db 7 ; 7 bytes to SIO
|
|
;sio$port ds 1 ; port address of SIO
|
|
; db 18h,3,0E1h,4
|
|
;sio$reg$4 ds 1
|
|
; db 5,0EAh
|
|
; db 0 ; terminator
|
|
;
|
|
;pio$init$tbl db 2,p$zpio$2b,0Fh,07h
|
|
; db 3,p$zpio$2a,0CFh,0F8h,07h
|
|
; db 0
|
|
|
|
end
|
|
|