]>
Commit | Line | Data |
---|---|---|
ea5293bb L |
1 | title 'Character I/O Module for the Modular CP/M 3 BIOS'\r |
2 | page 255\r | |
3 | .z80\r | |
4 | \r | |
5 | \r | |
6 | \r | |
7 | public ?cinit,?ci,?co,?cist,?cost\r | |
8 | public @ctbl\r | |
9 | \r | |
10 | \r | |
11 | extrn ff.init,ff.ist,ff.in,ff.ost,ff.out\r | |
12 | extrn as0init,as0ista,as0inp,as0osta,as0out\r | |
13 | extrn as1init,as1ista,as1inp,as1osta,as1out\r | |
50f3b8f0 | 14 | extrn _b0call\r |
ea5293bb L |
15 | \r |
16 | include config.inc\r | |
17 | include z180reg.inc\r | |
18 | \r | |
19 | include modebaud.inc ; define mode bits and baud equates\r | |
20 | \r | |
21 | max$devices equ 3\r | |
22 | \r | |
12f14a43 L |
23 | O_CISTF equ 0\r |
24 | O_CIF equ 2\r | |
25 | O_COSTF equ 4\r | |
26 | O_COF equ 6\r | |
27 | O_INITF equ 8\r | |
28 | O_CTBL equ 10\r | |
29 | \r | |
30 | ;--------------------------------------------------------------\r | |
31 | \r | |
32 | cseg\r | |
33 | @ctbl:\r | |
34 | db 'USB0 ' ; device 0\r | |
35 | db mb$in$out\r | |
36 | db baud$none\r | |
37 | \r | |
38 | db 'ASCI0 ' ; device 1\r | |
39 | db mb$in$out+mb$serial+mb$soft$baud\r | |
40 | db baud$19200\r | |
41 | \r | |
42 | db 'ASCI1 ' ; device 2\r | |
43 | db mb$in$out+mb$serial+mb$soft$baud\r | |
44 | db baud$19200\r | |
45 | \r | |
46 | db 0 ; table terminator\r | |
47 | \r | |
48 | \r | |
49 | dseg\r | |
50 | xctbl:\r | |
51 | dw ff_dev\r | |
52 | dw as0_dev\r | |
53 | dw as1_dev\r | |
54 | dw null_dev\r | |
55 | \r | |
56 | rept 16 - ($-xctbl)/2\r | |
57 | dw 0\r | |
58 | endm\r | |
59 | \r | |
60 | ff_dev:\r | |
61 | dw ff.ist\r | |
62 | dw ff.in\r | |
63 | dw ff.ost\r | |
64 | dw ff.out\r | |
65 | dw ff.init\r | |
66 | dw @ctbl+8*0\r | |
67 | \r | |
68 | as0_dev:\r | |
69 | dw as0ista\r | |
70 | dw as0inp\r | |
71 | dw as0osta\r | |
72 | dw as0out\r | |
73 | dw as0init\r | |
74 | dw @ctbl+8*1\r | |
75 | \r | |
76 | as1_dev:\r | |
77 | dw as1ista\r | |
78 | dw as1inp\r | |
79 | dw as1osta\r | |
80 | dw as1out\r | |
81 | dw as1init\r | |
82 | dw @ctbl+8*2\r | |
83 | \r | |
84 | null_dev:\r | |
85 | dw null$status\r | |
86 | dw null$input\r | |
87 | dw ret$true\r | |
88 | dw rret\r | |
89 | dw rret\r | |
90 | dw 0\r | |
91 | \r | |
ea5293bb L |
92 | \r |
93 | ;--------------------------------------------------------------\r | |
94 | ; Init character device\r | |
95 | ; c: device\r | |
96 | \r | |
2a413c0d | 97 | cseg\r |
ea5293bb | 98 | ?cinit: ; init devices\r |
50f3b8f0 L |
99 | b0call _cinit\r |
100 | ret\r | |
101 | \r | |
102 | dseg\r | |
103 | _cinit:\r | |
ea5293bb | 104 | ld b,c\r |
12f14a43 L |
105 | ld hl,O_INITF\r |
106 | jr vector_io\r | |
50f3b8f0 | 107 | \r |
ea5293bb L |
108 | ;--------------------------------------------------------------\r |
109 | ; Character input\r | |
110 | ; b: device\r | |
111 | ; return:\r | |
112 | ; a: input char\r | |
113 | \r | |
2a413c0d | 114 | cseg\r |
ea5293bb | 115 | ?ci: ; character input\r |
2a413c0d L |
116 | b0call _ci\r |
117 | ret\r | |
118 | \r | |
119 | dseg\r | |
120 | _ci:\r | |
12f14a43 L |
121 | ld hl,O_CIF\r |
122 | jr vector_io\r | |
ea5293bb L |
123 | \r |
124 | ;--------------------------------------------------------------\r | |
125 | ; Input status\r | |
126 | ; b: device\r | |
127 | ; return:\r | |
128 | ; a: 0ffh if char available, else 0\r | |
129 | \r | |
2a413c0d L |
130 | cseg\r |
131 | ?cist: ; character input\r | |
132 | b0call _cist\r | |
133 | ret\r | |
134 | \r | |
135 | dseg\r | |
136 | _cist: ; character input status\r | |
12f14a43 L |
137 | ld hl,O_CISTF\r |
138 | jr vector_io\r | |
ea5293bb L |
139 | \r |
140 | ;--------------------------------------------------------------\r | |
141 | ; Character output\r | |
142 | ; b: device\r | |
143 | ; c: output char\r | |
144 | ; return:\r | |
145 | ; a: output char\r | |
146 | \r | |
2a413c0d L |
147 | cseg\r |
148 | ?co: ; character input\r | |
149 | b0call _co\r | |
150 | ret\r | |
151 | \r | |
152 | dseg\r | |
153 | _co: ; character output\r | |
12f14a43 L |
154 | ld hl,O_COF\r |
155 | jr vector_io\r | |
ea5293bb L |
156 | \r |
157 | \r | |
158 | ;--------------------------------------------------------------\r | |
159 | ; Output status\r | |
160 | ; b: device\r | |
161 | ; return:\r | |
162 | ; a: 0ffh if device ready for next output char, else 0\r | |
163 | \r | |
164 | \r | |
2a413c0d L |
165 | cseg\r |
166 | ?cost: ; character input\r | |
167 | b0call _cost\r | |
168 | ret\r | |
169 | \r | |
170 | dseg\r | |
171 | _cost: ; character output status\r | |
12f14a43 L |
172 | ld hl,O_COSTF\r |
173 | jr vector_io\r | |
ea5293bb L |
174 | \r |
175 | ;--------------------------------------------------------------\r | |
176 | \r | |
2a413c0d | 177 | dseg\r |
12f14a43 | 178 | vector_io:\r |
b43b4662 | 179 | push de\r |
12f14a43 | 180 | ex de,hl\r |
f80331a6 | 181 | \r |
12f14a43 L |
182 | ld hl,xctbl\r |
183 | ld a,max$devices\r | |
184 | cp b\r | |
185 | jr c,$+3\r | |
186 | ld a,b\r | |
187 | add a,a\r | |
188 | add a,l\r | |
189 | ld l,a\r | |
190 | jr nc,$+3\r | |
191 | inc h\r | |
192 | ld a,(hl)\r | |
ea5293bb | 193 | inc hl\r |
12f14a43 L |
194 | ld h,(hl)\r |
195 | ld l,a\r | |
f80331a6 | 196 | ex de,hl\r |
12f14a43 L |
197 | add hl,de\r |
198 | ld a,(hl)\r | |
199 | inc hl\r | |
200 | ld h,(hl)\r | |
201 | ld l,a\r | |
202 | ex (sp),hl\r | |
203 | ex de,hl\r | |
204 | ret\r | |
ea5293bb | 205 | \r |
12f14a43 | 206 | ;--------------------------------------------------------------\r |
ea5293bb L |
207 | \r |
208 | null$input:\r | |
209 | ld a,1Ah\r | |
210 | rret:\r | |
211 | ret\r | |
212 | ret$true:\r | |
213 | or 0FFh\r | |
214 | ret\r | |
215 | \r | |
216 | null$status:\r | |
217 | xor a\r | |
218 | ret\r | |
219 | \r | |
ea5293bb | 220 | end\r |