page 255 .z80 ; CP/M 3 compatible character i/o public ?cinit,?ci,?co,?cist,?cost public @ctbl extrn ff.init,ff.i.st,ff.in,ff.o.st,ff.out extrn as0init,as0ista,as0inp,as0osta,as0out extrn as1init,as1ista,as1inp,as1osta,as1out include config.inc include z180reg.inc include modebaud.inc ; define mode bits and baud eqautes max$device equ 3 cseg ; c = device ?cinit: ; init devices ld b,c call vector$io dw ff.init dw as0init dw as1init dw rret ; b = device, c = output char, a = input char ?ci: ; character input call vector$io dw ff.in dw as0inp dw as1inp dw null$input ?cist: ; character input status call vector$io dw ff.i.st dw as0ista dw as1ista dw null$status ?co: ; character output call vector$io dw ff.out dw as0out dw as1out dw rret ?cost: ; character output status call vector$io dw ff.o.st dw as0osta dw as1osta dw ret$true vector$io: ld a,max$device ld e,b vector: pop hl ld d,0 cp e jr nc,exist ld e,a ; use null device if a >= max$device exist: add hl,de add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a jp (hl) null$input: ld a,1Ah rret: ret ret$true: or 0FFh ret null$status: xor a ret ;-------------------------------------------------------------- @ctbl: db 'HOST ' ; device 0 db mb$in$out db baud$none db 'ASCI0 ' ; device 1 db mb$in$out+mb$serial+mb$soft$baud ser0$baud: db baud$19200 db 'ASCI1 ' ; device 2 db mb$in$out+mb$serial+mb$soft$baud ser1$baud: db baud$19200 db 0 ; table terminator end