X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/c5868b68107012ee3bd827de8229ecc1037b5b69..e8a98308cd28da296993a9085df28dc5957de86d:/cbios/chario.180 diff --git a/cbios/chario.180 b/cbios/chario.180 index 72748e4..7133b77 100644 --- a/cbios/chario.180 +++ b/cbios/chario.180 @@ -4,21 +4,65 @@ - public ?cinit,?ci,?co,?cist,?cost + public ?cinit,ioctl,?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 ff_dev + extrn as0_dev,as1_dev extrn _b0call - include config.inc - include z180reg.inc + 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 - include modebaud.inc ; define mode bits and baud equates +;-------------------------------------------------------------- -max$devices equ 3 + dw rret + dw ret$true + dw null$input + dw null$status + dw rret +null_dev: ;-------------------------------------------------------------- @@ -27,18 +71,16 @@ max$devices equ 3 cseg ?cinit: ; init devices - b0call _cinit + ld b,c + ld c,0 ; +ioctl: + b0call _ioctl ret dseg -_cinit: - ld b,c - call vector$io - dw ff.init - dw as0init - dw as1init - dw rret - +_ioctl: + ld hl,O_IOCTLF + jr vector_io ;-------------------------------------------------------------- ; Character input @@ -53,11 +95,8 @@ _cinit: dseg _ci: - call vector$io - dw ff.in - dw as0inp - dw as1inp - dw null$input + ld hl,O_CIF + jr vector_io ;-------------------------------------------------------------- ; Input status @@ -72,11 +111,8 @@ _ci: dseg _cist: ; character input status - call vector$io - dw ff.ist - dw as0ista - dw as1ista - dw null$status + ld hl,O_CISTF + jr vector_io ;-------------------------------------------------------------- ; Character output @@ -92,11 +128,8 @@ _cist: ; character input status dseg _co: ; character output - call vector$io - dw ff.out - dw as0out - dw as1out - dw rret + ld hl,O_COF + jr vector_io ;-------------------------------------------------------------- @@ -113,34 +146,80 @@ _co: ; character output dseg _cost: ; character output status - call vector$io - dw ff.ost - dw as0osta - dw as1osta - dw ret$true + 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: - 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) +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 @@ -154,23 +233,4 @@ 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$19200 - - db 'ASCI1 ' ; device 2 - db mb$in$out+mb$serial+mb$soft$baud - db baud$19200 - - db 0 ; table terminator - - end