\r
\r
\r
- public ?cinit,?ci,?co,?cist,?cost\r
+ public ?cinit,ioctl,?ci,?co,?cist,?cost\r
public @ctbl\r
\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
+ extrn ff_dev\r
+ extrn as0_dev,as1_dev\r
extrn _b0call\r
\r
- include config.inc\r
- include z180reg.inc\r
+ maclib z180reg.inc\r
+ maclib config.inc\r
\r
- include modebaud.inc ; define mode bits and baud equates\r
+ maclib modebaud.inc ; define mode bits and baud equates\r
\r
-max$devices equ 3\r
\r
-O_CISTF equ 0\r
-O_CIF equ 2\r
-O_COSTF equ 4\r
-O_COF equ 6\r
-O_INITF equ 8\r
-O_CTBL equ 10\r
\r
;--------------------------------------------------------------\r
\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
- dw null_dev\r
-\r
- rept 16 - ($-xctbl)/2\r
+max$devices equ ($-xctbl)/2\r
+ dw null_dev ;todo:\r
+ rept 16 - max$devices\r
dw 0\r
endm\r
\r
-ff_dev:\r
- dw ff.ist\r
- dw ff.in\r
- dw ff.ost\r
- dw ff.out\r
- dw ff.init\r
- dw @ctbl+8*0\r
-\r
-as0_dev:\r
- dw as0ista\r
- dw as0inp\r
- dw as0osta\r
- dw as0out\r
- dw as0init\r
- dw @ctbl+8*1\r
-\r
-as1_dev:\r
- dw as1ista\r
- dw as1inp\r
- dw as1osta\r
- dw as1out\r
- dw as1init\r
- dw @ctbl+8*2\r
+;--------------------------------------------------------------\r
\r
-null_dev:\r
- dw null$status\r
- dw null$input\r
- dw ret$true\r
dw rret\r
+ dw ret$true\r
+ dw null$input\r
+ dw null$status\r
dw rret\r
- dw 0\r
+null_dev:\r
\r
\r
;--------------------------------------------------------------\r
\r
cseg\r
?cinit: ; init devices\r
- b0call _cinit\r
+ ld b,c\r
+ ld c,0 ;\r
+ioctl:\r
+ b0call _ioctl\r
ret\r
\r
dseg\r
-_cinit:\r
- ld b,c\r
- ld hl,O_INITF\r
+_ioctl:\r
+ ld hl,O_IOCTLF\r
jr vector_io\r
\r
;--------------------------------------------------------------\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\r
- ex de,hl\r
-\r
- ld hl,xctbl\r
- ld a,max$devices\r
- cp b\r
- jr c,$+3\r
- ld a,b\r
- add a,a\r
- add a,l\r
- ld l,a\r
- jr nc,$+3\r
- inc h\r
- ld a,(hl)\r
- inc hl\r
- ld h,(hl)\r
- ld l,a\r
- ex de,hl\r
- add hl,de\r
- ld a,(hl)\r
- inc hl\r
- ld h,(hl)\r
- ld l,a\r
- ex (sp),hl\r
- ex de,hl\r
- ret\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
+ 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