title 'Character I/O Module for the Modular CP/M 3 BIOS' page 255 .z80 public ?cinit,?ci,?co,?cist,?cost public @ctbl extrn ff.init,ff.ist,ff.in,ff.ost,ff.out extrn as0init,as0ista,as0inp,as0osta,as0out extrn as1init,as1ista,as1inp,as1osta,as1out extrn _b0call include config.inc include z180reg.inc include modebaud.inc ; define mode bits and baud equates max$devices equ 3 ;-------------------------------------------------------------- ; Init character device ; c: device cseg ?cinit: ; init devices b0call _cinit ret dseg _cinit: ld b,c call vector$io dw ff.init dw as0init dw as1init dw rret ;-------------------------------------------------------------- ; Character input ; b: device ; return: ; a: input char cseg ?ci: ; character input b0call _ci ret dseg _ci: call vector$io dw ff.in dw as0inp dw as1inp dw null$input ;-------------------------------------------------------------- ; Input status ; b: device ; return: ; a: 0ffh if char available, else 0 cseg ?cist: ; character input b0call _cist ret dseg _cist: ; character input status call vector$io dw ff.ist dw as0ista dw as1ista dw null$status ;-------------------------------------------------------------- ; Character output ; b: device ; c: output char ; return: ; a: output char cseg ?co: ; character input b0call _co ret dseg _co: ; character output call vector$io dw ff.out dw as0out dw as1out dw rret ;-------------------------------------------------------------- ; 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 call vector$io dw ff.ost dw as0osta dw as1osta dw ret$true ;-------------------------------------------------------------- dseg vector$io: pop hl push de ld de,max$devices ; default if ld a,b ; cp e ; b > max$devices jr nc,exist ld e,a exist: add hl,de add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl pop de jp (hl) null$input: ld a,1Ah rret: ret ret$true: or 0FFh ret null$status: xor a ret ;-------------------------------------------------------------- cseg @ctbl: db 'AVRCON' ; device 0 db mb$in$out db baud$none db 'ASCI0 ' ; device 1 db mb$in$out+mb$serial+mb$soft$baud db baud$9600 db 'ASCI1 ' ; device 2 db mb$in$out+mb$serial+mb$soft$baud db baud$19200 db 0 ; table terminator end