summaryrefslogtreecommitdiff
path: root/z180/chario.180
diff options
context:
space:
mode:
Diffstat (limited to 'z180/chario.180')
-rw-r--r--z180/chario.180113
1 files changed, 113 insertions, 0 deletions
diff --git a/z180/chario.180 b/z180/chario.180
new file mode 100644
index 0000000..4d37b89
--- /dev/null
+++ b/z180/chario.180
@@ -0,0 +1,113 @@
+ page 255
+ .z80
+
+
+; CP/M 3 compatible character i/o
+
+ public ?cinit,?ci,?co,?cist,?cost
+ public @ctbl
+
+ extrn ff.init,ff.i.st,ff.in,ff.o.st,ff.out
+ extrn as0init,as0ista,as0inp,as0osta,as0out
+ extrn as1init,as1ista,as1inp,as1osta,as1out
+
+ include config.inc
+ include z180reg.inc
+ include modebaud.inc ; define mode bits and baud eqautes
+
+
+max$device equ 3
+
+ cseg
+
+; c = device
+
+?cinit: ; init devices
+ ld b,c
+ call vector$io
+ dw ff.init
+ dw as0init
+ dw as1init
+ dw rret
+
+; b = device, c = output char, a = input char
+
+?ci: ; character input
+ call vector$io
+ dw ff.in
+ dw as0inp
+ dw as1inp
+ dw null$input
+
+?cist: ; character input status
+ call vector$io
+ dw ff.i.st
+ dw as0ista
+ dw as1ista
+ dw null$status
+
+?co: ; character output
+ call vector$io
+ dw ff.out
+ dw as0out
+ dw as1out
+ dw rret
+
+?cost: ; character output status
+ call vector$io
+ dw ff.o.st
+ dw as0osta
+ dw as1osta
+ dw ret$true
+
+vector$io:
+ ld a,max$device
+ ld e,b
+vector:
+ pop hl
+ ld d,0
+ cp e
+ jr nc,exist
+ ld e,a ; use null device if a >= max$device
+exist: add hl,de
+ add hl,de
+ ld a,(hl)
+ inc hl
+ ld h,(hl)
+ ld l,a
+ jp (hl)
+
+
+null$input:
+ ld a,1Ah
+rret:
+ ret
+ret$true:
+ or 0FFh
+ ret
+
+null$status:
+ xor a
+ ret
+
+;--------------------------------------------------------------
+
+
+@ctbl:
+ db 'HOST ' ; 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