\r
\r
\r
- public ?cinit,?ci,?co,?cist,?cost\r
+ public ?cinit,ioctl,?ci,?co,?cist,?cost\r
public @ctbl\r
\r
+ extrn ff_dev\r
+ extrn as0_dev,as1_dev\r
+ extrn _b0call\r
\r
- extrn ff.init,ff.ist,ff.in,ff.ost,ff.out\r
- extrn as0init,as0ista,as0inp,as0osta,as0out\r
- extrn as1init,as1ista,as1inp,as1osta,as1out\r
+ maclib z180reg.inc\r
+ maclib config.inc\r
\r
+ maclib modebaud.inc ; define mode bits and baud equates\r
\r
- include config.inc\r
- include z180reg.inc\r
\r
- include modebaud.inc ; define mode bits and baud equates\r
\r
-max$devices equ 3\r
+;--------------------------------------------------------------\r
\r
cseg\r
+@ctbl:\r
+ db 'USB0 ' ; device 0\r
+ db mb$in$out\r
+ db baud$none\r
+\r
+ db 'ASCI0 ' ; device 1\r
+ db mb$in$out+mb$serial+mb$soft$baud\r
+ db baud$19200\r
+\r
+ db 'ASCI1 ' ; device 2\r
+ db mb$in$out+mb$serial+mb$soft$baud\r
+ db baud$19200\r
+\r
+ db 0 ; table terminator\r
+\r
+;--------------------------------------------------------------\r
+\r
+O_COF equ -10\r
+O_COSTF equ -8\r
+O_CIF equ -6\r
+O_CISTF equ -4\r
+O_IOCTLF equ -2\r
+\r
+ dseg\r
+xctbl:\r
+ dw ff_dev\r
+ dw as0_dev\r
+ dw as1_dev\r
+max$devices equ ($-xctbl)/2\r
+ dw null_dev ;todo:\r
+ rept 16 - max$devices\r
+ dw 0\r
+ endm\r
+\r
+;--------------------------------------------------------------\r
+\r
+ dw rret\r
+ dw ret$true\r
+ dw null$input\r
+ dw null$status\r
+ dw rret\r
+null_dev:\r
+\r
\r
;--------------------------------------------------------------\r
; Init character device\r
; c: device\r
\r
+ cseg\r
?cinit: ; init devices\r
ld b,c\r
- call vector$io\r
- dw ff.init\r
- dw as0init\r
- dw as1init\r
- dw rret\r
+ ld c,0 ;\r
+ioctl:\r
+ b0call _ioctl\r
+ ret\r
+\r
+ dseg\r
+_ioctl:\r
+ ld hl,O_IOCTLF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
; Character input\r
; return:\r
; a: input char\r
\r
+ cseg\r
?ci: ; character input\r
- call vector$io\r
- dw ff.in\r
- dw as0inp\r
- dw as1inp\r
- dw null$input\r
+ b0call _ci\r
+ ret\r
+\r
+ dseg\r
+_ci:\r
+ ld hl,O_CIF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
; Input status\r
; return:\r
; a: 0ffh if char available, else 0\r
\r
-?cist: ; character input status\r
- call vector$io\r
- dw ff.ist\r
- dw as0ista\r
- dw as1ista\r
- dw null$status\r
+ cseg\r
+?cist: ; character input\r
+ b0call _cist\r
+ ret\r
+\r
+ dseg\r
+_cist: ; character input status\r
+ ld hl,O_CISTF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
; Character output\r
; return:\r
; a: output char\r
\r
-?co: ; character output\r
- call vector$io\r
- dw ff.out\r
- dw as0out\r
- dw as1out\r
- dw rret\r
+ cseg\r
+?co: ; character input\r
+ b0call _co\r
+ ret\r
+\r
+ dseg\r
+_co: ; character output\r
+ ld hl,O_COF\r
+ jr vector_io\r
\r
\r
;--------------------------------------------------------------\r
; a: 0ffh if device ready for next output char, else 0\r
\r
\r
-?cost: ; character output status\r
- call vector$io\r
- dw ff.ost\r
- dw as0osta\r
- dw as1osta\r
- dw ret$true\r
+ cseg\r
+?cost: ; character input\r
+ b0call _cost\r
+ ret\r
+\r
+ dseg\r
+_cost: ; character output status\r
+ ld hl,O_COSTF\r
+ jr vector_io\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; hl: function table index (offset)\r
+; b: device\r
+; c: output char or ioctl #\r
+; de: ioctl arg pointer\r
+;\r
+; Calls funtion xctbl[offset] with\r
+; b,c,de unchanged and hl = ptr to drivers local data\r
+\r
+ dseg\r
+vector_io:\r
+ push de ;save arg ptr 11\r
+ ex de,hl ; 3\r
+ ;\r
+ ld a,max$devices ; 6\r
+ cp b ; 4\r
+ jr c,$+3 ; (6/8)\r
+ ld a,b ; (4)10/8\r
+ add a,a ; 4\r
+ ld hl,xctbl ; 9\r
+ add a,l ; 4\r
+ ld l,a ; 4\r
+ jr nc,$+3 ; (6/8)\r
+ inc h ; (4) 10/8\r
+ ld a,(hl) ; 6\r
+ inc hl ; 4\r
+ ld h,(hl) ; 6\r
+ ld l,a ; 4\r
+ ex de,hl ; 3\r
+ add hl,de ; 7\r
+ ld a,(hl) ; 6\r
+ inc hl ; 4\r
+ ld h,(hl) ; 6\r
+ ld l,a ; 4\r
+ ex (sp),hl ; 16\r
+ ex de,hl ; 3\r
+ ret ; 9 143\r
\r
;--------------------------------------------------------------\r
\r
-vector$io:\r
- pop hl\r
- push de\r
- ld de,max$devices ; default if\r
- ld a,b ;\r
- cp e ; b > max$devices\r
- jr nc,exist\r
- ld e,a\r
-exist:\r
- add hl,de\r
- add hl,de\r
-\r
- ld e,(hl)\r
- inc hl\r
- ld d,(hl)\r
- ex de,hl\r
- pop de\r
- jp (hl)\r
+ if 0\r
+\r
+vector_io:\r
+ push de ;11\r
+ push hl ;11\r
+ ;\r
+ ld hl,xctbl ;9 -\r
+ ld de,max$devices ;9\r
+ ld a,b ;4\r
+ cp e ;4\r
+ jr nc,$+3 ;(6/8)\r
+ ld e,a ;(4) 10/8\r
+ add hl,de ;7\r
+ add hl,de ;7\r
+ ld e,(hl) ;6\r
+ inc hl ;4\r
+ ld d,(hl) ;6\r
+ pop hl ;9\r
+ add hl,de ;7\r
+ ld a,(hl) ;6\r
+ inc hl ;4\r
+ ld h,(hl) ;6\r
+ ld l,a ;4\r
+ ex (sp),hl ;16\r
+ ex de,hl ;3\r
+ ret ;9 148\r
+\r
+ endif\r
\r
+;--------------------------------------------------------------\r
\r
null$input:\r
ld a,1Ah\r
xor a\r
ret\r
\r
-;--------------------------------------------------------------\r
-\r
-@ctbl:\r
- db 'AVRCON' ; device 0\r
- db mb$in$out\r
- db baud$none\r
-\r
- db 'ASCI0 ' ; device 1\r
- db mb$in$out+mb$serial+mb$soft$baud\r
- db baud$9600\r
-\r
- db 'ASCI1 ' ; device 2\r
- db mb$in$out+mb$serial+mb$soft$baud\r
- db baud$19200\r
-\r
- db 0 ; table terminator\r
-\r
-;--------------------------------------------------------------\r
-\r
-\r
-\r
-\r
-\r
end\r