\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
+ 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
+ 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
+ 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
+null_dev:\r
+ dw null$status\r
+ dw null$input\r
+ dw ret$true\r
+ dw rret\r
+ dw rret\r
+ dw 0\r
+\r
\r
;--------------------------------------------------------------\r
; Init character device\r
dseg\r
_cinit:\r
ld b,c\r
- call vector$io\r
- dw ff.init\r
- dw as0init\r
- dw as1init\r
- dw rret\r
-\r
+ ld hl,O_INITF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
; Character input\r
\r
dseg\r
_ci:\r
- call vector$io\r
- dw ff.in\r
- dw as0inp\r
- dw as1inp\r
- dw null$input\r
+ ld hl,O_CIF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
; Input status\r
\r
dseg\r
_cist: ; character input status\r
- call vector$io\r
- dw ff.ist\r
- dw as0ista\r
- dw as1ista\r
- dw null$status\r
+ ld hl,O_CISTF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
; Character output\r
\r
dseg\r
_co: ; character output\r
- call vector$io\r
- dw ff.out\r
- dw as0out\r
- dw as1out\r
- dw rret\r
+ ld hl,O_COF\r
+ jr vector_io\r
\r
\r
;--------------------------------------------------------------\r
\r
dseg\r
_cost: ; character output status\r
- call vector$io\r
- dw ff.ost\r
- dw as0osta\r
- dw as1osta\r
- dw ret$true\r
+ ld hl,O_COSTF\r
+ jr vector_io\r
\r
;--------------------------------------------------------------\r
\r
dseg\r
-vector$io:\r
- pop hl\r
+vector_io:\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
+ ex de,hl\r
\r
- ld e,(hl)\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 d,(hl)\r
+ ld h,(hl)\r
+ ld l,a\r
ex de,hl\r
- pop de\r
- jp (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
\r
+;--------------------------------------------------------------\r
\r
null$input:\r
ld a,1Ah\r
xor a\r
ret\r
\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$134\r
-\r
- db 0 ; table terminator\r
-\r
-\r
end\r