title 'Character I/O Module for the Modular CP/M 3 BIOS' page 255 .z80 public ?cinit,ioctl,?ci,?co,?cist,?cost public @ctbl extrn ff_dev extrn as0_dev,as1_dev extrn _b0call maclib z180reg.inc maclib config.inc maclib modebaud.inc ; define mode bits and baud equates ;-------------------------------------------------------------- cseg @ctbl: db 'USB0 ' ; device 0 db mb$in$out db baud$none db 'ASCI0 ' ; device 1 db mb$in$out+mb$serial+mb$soft$baud db baud$19200 db 'ASCI1 ' ; device 2 db mb$in$out+mb$serial+mb$soft$baud db baud$134 db 0 ; table terminator ;-------------------------------------------------------------- O_COF equ -10 O_COSTF equ -8 O_CIF equ -6 O_CISTF equ -4 O_IOCTLF equ -2 dseg xctbl: dw ff_dev dw as0_dev dw as1_dev max$devices equ ($-xctbl)/2 dw null_dev ;todo: rept 16 - max$devices dw 0 endm ;-------------------------------------------------------------- dw rret dw ret$true dw null$input dw null$status dw rret null_dev: ;-------------------------------------------------------------- ; Init character device ; c: device cseg ?cinit: ; init devices ld b,c ld c,0 ; ioctl: b0call _ioctl ret dseg _ioctl: ld hl,O_IOCTLF jr vector_io ;-------------------------------------------------------------- ; Character input ; b: device ; return: ; a: input char cseg ?ci: ; character input b0call _ci ret dseg _ci: ld hl,O_CIF jr vector_io ;-------------------------------------------------------------- ; Input status ; b: device ; return: ; a: 0ffh if char available, else 0 cseg ?cist: ; character input b0call _cist ret dseg _cist: ; character input status ld hl,O_CISTF jr vector_io ;-------------------------------------------------------------- ; Character output ; b: device ; c: output char ; return: ; a: output char cseg ?co: ; character input b0call _co ret dseg _co: ; character output ld hl,O_COF jr vector_io ;-------------------------------------------------------------- ; Output status ; b: device ; return: ; a: 0ffh if device ready for next output char, else 0 cseg ?cost: ; character input b0call _cost ret dseg _cost: ; character output status ld hl,O_COSTF jr vector_io ;-------------------------------------------------------------- ; ; hl: function table index (offset) ; b: device ; c: output char or ioctl # ; de: ioctl arg pointer ; ; Calls funtion xctbl[offset] with ; b,c,de unchanged and hl = ptr to drivers local data dseg vector_io: push de ;save arg ptr 11 ex de,hl ; 3 ; ld a,max$devices ; 6 cp b ; 4 jr c,$+3 ; (6/8) ld a,b ; (4)10/8 add a,a ; 4 ld hl,xctbl ; 9 add a,l ; 4 ld l,a ; 4 jr nc,$+3 ; (6/8) inc h ; (4) 10/8 ld a,(hl) ; 6 inc hl ; 4 ld h,(hl) ; 6 ld l,a ; 4 ex de,hl ; 3 add hl,de ; 7 ld a,(hl) ; 6 inc hl ; 4 ld h,(hl) ; 6 ld l,a ; 4 ex (sp),hl ; 16 ex de,hl ; 3 ret ; 9 143 ;-------------------------------------------------------------- if 0 vector_io: push de ;11 push hl ;11 ; ld hl,xctbl ;9 - ld de,max$devices ;9 ld a,b ;4 cp e ;4 jr nc,$+3 ;(6/8) ld e,a ;(4) 10/8 add hl,de ;7 add hl,de ;7 ld e,(hl) ;6 inc hl ;4 ld d,(hl) ;6 pop hl ;9 add hl,de ;7 ld a,(hl) ;6 inc hl ;4 ld h,(hl) ;6 ld l,a ;4 ex (sp),hl ;16 ex de,hl ;3 ret ;9 148 endif ;-------------------------------------------------------------- null$input: ld a,1Ah rret: ret ret$true: or 0FFh ret null$status: xor a ret end