X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/50f3b8f0cb6ccbdc5c1ea8f916f3d95b197d3d04..99b8d89e09c2c5303d3cbec39c9dc288cc3a3233:/cbios/chario.180 diff --git a/cbios/chario.180 b/cbios/chario.180 index 9a14305..7133b77 100644 --- a/cbios/chario.180 +++ b/cbios/chario.180 @@ -4,42 +4,83 @@ - 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 - 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 - 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 - - cseg +_ioctl: + ld hl,O_IOCTLF + jr vector_io ;-------------------------------------------------------------- ; Character input @@ -47,12 +88,15 @@ _cinit: ; 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 @@ -60,12 +104,15 @@ _cinit: ; 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 @@ -74,12 +121,15 @@ _cinit: ; 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 ;-------------------------------------------------------------- @@ -89,34 +139,87 @@ _cinit: ; 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 -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) + 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 @@ -130,22 +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 - db baud$9600 - - db 'ASCI1 ' ; device 2 - db mb$in$out+mb$serial+mb$soft$baud - db baud$19200 - - db 0 ; table terminator - - end