X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/ea5293bb6ce484bf1ec9ab70befe10c3a36a70c2..e8a98308cd28da296993a9085df28dc5957de86d:/cbios/chario.180 diff --git a/cbios/chario.180 b/cbios/chario.180 index 3b02c8d..7133b77 100644 --- a/cbios/chario.180 +++ b/cbios/chario.180 @@ -4,35 +4,83 @@ - public ?cinit,?ci,?co,?cist,?cost + public ?cinit,ioctl,?ci,?co,?cist,?cost public @ctbl + extrn ff_dev + extrn as0_dev,as1_dev + extrn _b0call - extrn ff.init,ff.ist,ff.in,ff.ost,ff.out - extrn as0init,as0ista,as0inp,as0osta,as0out - extrn as1init,as1ista,as1inp,as1osta,as1out + maclib z180reg.inc + maclib config.inc + maclib modebaud.inc ; define mode bits and baud equates - include config.inc - include z180reg.inc - include modebaud.inc ; define mode bits and baud equates -max$devices equ 3 +;-------------------------------------------------------------- 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 - call vector$io - dw ff.init - dw as0init - dw as1init - dw rret + ld c,0 ; +ioctl: + b0call _ioctl + ret + + dseg +_ioctl: + ld hl,O_IOCTLF + jr vector_io ;-------------------------------------------------------------- ; Character input @@ -40,12 +88,15 @@ max$devices equ 3 ; return: ; a: input char + cseg ?ci: ; character input - call vector$io - dw ff.in - dw as0inp - dw as1inp - dw null$input + b0call _ci + ret + + dseg +_ci: + ld hl,O_CIF + jr vector_io ;-------------------------------------------------------------- ; Input status @@ -53,12 +104,15 @@ max$devices equ 3 ; return: ; a: 0ffh if char available, else 0 -?cist: ; character input status - call vector$io - dw ff.ist - dw as0ista - dw as1ista - dw null$status + cseg +?cist: ; character input + b0call _cist + ret + + dseg +_cist: ; character input status + ld hl,O_CISTF + jr vector_io ;-------------------------------------------------------------- ; Character output @@ -67,12 +121,15 @@ max$devices equ 3 ; return: ; a: output char -?co: ; character output - call vector$io - dw ff.out - dw as0out - dw as1out - dw rret + cseg +?co: ; character input + b0call _co + ret + + dseg +_co: ; character output + ld hl,O_COF + jr vector_io ;-------------------------------------------------------------- @@ -82,32 +139,87 @@ max$devices equ 3 ; a: 0ffh if device ready for next output char, else 0 -?cost: ; character output status - call vector$io - dw ff.ost - dw as0osta - dw as1osta - dw ret$true + 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 ;-------------------------------------------------------------- -vector$io: - ld a,max$devices - ld e,b -vector: - pop hl - ld d,0 - cp e - jr nc,exist - ld e,a ; use null device if a >= max$devices -exist: add hl,de - add hl,de - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - jp (hl) + 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 @@ -121,29 +233,4 @@ null$status: xor a ret -;-------------------------------------------------------------- - -@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 -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