1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
|