]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/msgbuf.180
Extended drive table for use with DRIVE.COM, a dynamic drive re-assignment utility.
[z180-stamp-cpm3.git] / cbios / msgbuf.180
CommitLineData
ea5293bb
L
1 page 255\r
2 .z80\r
3\r
4\r
5 global msginit\r
6; global msg.ist,msg.in,msg.ost,msg.out\r
7; global msg.sout\r
8 global msg.sm,msg.recv\r
9\r
1e1c17d3 10 extrn bufinit,hwl2phy,phy2log\r
ea5293bb
L
11 extrn fifolst\r
12\r
3c56f4c2
L
13 maclib z180reg.inc\r
14 maclib config.inc\r
ea5293bb
L
15\r
16\r
2a413c0d 17 dseg\r
ea5293bb
L
18 mkbuf 0,mtx.fifo,mtx.fifo_len\r
19 mkbuf 1,mrx.fifo,mrx.fifo_len\r
20\r
40df51ae
L
21itx equ 0*2\r
22irx equ 1*2\r
ea5293bb
L
23\r
24;--------------------------------------------------------------\r
25;\r
40df51ae 26; Init message fifos\r
ea5293bb
L
27;\r
28 dseg\r
ea5293bb 29msginit:\r
40df51ae 30 ld a,(043h)\r
1e1c17d3 31\r
40df51ae 32;TODO: value should be 0\r
1e1c17d3 33\r
ea5293bb 34 ld ix,mtx.fifo\r
ea5293bb 35 call bufinit\r
1e1c17d3
L
36 push ix\r
37 pop hl\r
40df51ae
L
38 call hwl2phy\r
39 ld (040h),hl\r
40 ld (040h+2),a\r
41 ld a,0ffh\r
42 ld (043h),a\r
43 out (AVRINT5),a\r
44wait:\r
45 ld a,(043h)\r
46 or a\r
47 jr nz,wait\r
48\r
ea5293bb 49 ld ix,mrx.fifo\r
ea5293bb
L
50 jp bufinit\r
51\r
52\r
53;--------------------------------------------------------------\r
54\r
2a413c0d 55 dseg\r
ea5293bb
L
56msgi.st:\r
57 push ix\r
58 ld ix,(fifolst+irx) ;\r
59\r
60buf.empty:\r
61 ld a,(ix+o.in_idx) ;\r
62 sub (ix+o.out_idx) ;\r
63 pop ix\r
64 ret z\r
65 or 0ffh\r
66 ret\r
67\r
68;--------------------------------------------------------------\r
69\r
70msg.in:\r
71 push ix\r
72 ld ix,(fifolst+irx) ;\r
73\r
74buf.get:\r
75 ld a,(ix+o.out_idx) ;\r
76bg.wait:\r
77 cp (ix+o.in_idx) ;\r
78 jr z,bg.wait\r
79\r
afbcea2d
L
80 push ix ;\r
81 ex (sp),hl ;\r
ea5293bb
L
82 add a,l\r
83 ld l,a\r
84 jr nc,bg.nc\r
85 inc h\r
86bg.nc:\r
87 ld l,(hl)\r
88\r
89 ld a,(ix+o.out_idx) ;\r
90 inc a\r
91 and (ix+o.mask)\r
92 ld (ix+o.out_idx),a\r
93\r
94 ld a,l\r
95 pop hl\r
96 pop ix\r
97 ret\r
98\r
99\r
100;----------------------------------------------------------------------\r
101; Receive message\r
102;\r
103; hl: pointer to receive buffer\r
104; b: receive buffer size\r
105; return:\r
106; data in buffer, buffer[0] has len\r
107; bc, a: destroyed\r
108\r
109; TODO: time out\r
110; TODO: return number of stored chars\r
111; TODO: result code\r
112\r
113msg.recv:\r
ea5293bb
L
114 call msg.in\r
115 cp 0AEh\r
afbcea2d 116 jr nz,msg.recv\r
ea5293bb
L
117 call msg.in ; get message length\r
118 ld c,a\r
119 inc c\r
120 jr mr_do\r
ea5293bb 121mr_next:\r
afbcea2d
L
122 dec c ; while chars in input buffer\r
123 ret z\r
ea5293bb
L
124 call msg.in ; get next\r
125mr_do:\r
ea5293bb 126 dec b\r
afbcea2d
L
127 jp p,mr_store\r
128 inc b\r
129 jr mr_next\r
130mr_store:\r
131 ld (hl),a ; store char\r
132 inc hl\r
ea5293bb
L
133 jr mr_next ;\r
134\r
ea5293bb
L
135;--------------------------------------------------------------\r
136\r
137msgo.st:\r
138 push ix\r
139 ld ix,(fifolst+itx) ;\r
140\r
141buf.full:\r
142 ld a,(ix+o.in_idx) ;\r
143 inc a\r
144 and (ix+o.mask)\r
145 sub (ix+o.out_idx) ;\r
146 pop ix\r
147 ret z\r
148 or 0ffh\r
149 ret\r
150\r
151;--------------------------------------------------------------\r
152\r
153 if 0\r
154\r
155msg.out:\r
156 push ix\r
157 ld ix,(fifolst+itx) ;\r
158\r
ea5293bb
L
159 push bc\r
160 push ix\r
afbcea2d 161 ex (sp),hl ;\r
ea5293bb
L
162 ld c,(ix+o.in_idx) ;\r
163 ld b,0\r
164 add hl,bc\r
165 ld b,a\r
166\r
167 ld a,c ;\r
168 inc a\r
169 and (ix+o.mask)\r
170bp.wait:\r
171 cp (ix+o.out_idx) ;\r
172 jr z,bp.wait\r
173 ld (hl),b\r
174 ld (ix+o.in_idx),a\r
175\r
176 ld a,b\r
177 out (AVRINT5),a\r
ea5293bb 178 pop hl\r
afbcea2d 179 pop bc\r
ea5293bb
L
180 pop ix\r
181 ret\r
182\r
183 endif\r
184\r
185;--------------------------------------------------------------\r
186\r
187 if 0\r
188\r
189msg.out:\r
190 push ix\r
191 ld ix,(fifolst+itx) ;\r
192\r
193 push bc\r
194 ld c,(ix+o.in_idx) ;\r
195 ld b,0\r
196 push ix ;14\r
197 add ix,bc ;10\r
198 ld (ix+0),a ;15\r
199 pop ix ;12=51\r
200 ld b,a ; 4\r
201 ld a,c ;\r
202 inc a ;\r
203 and (ix+o.mask) ;\r
204bp.wait:\r
205 cp (ix+o.out_idx) ;\r
206 jr z,bp.wait ;\r
207 ld (ix+o.in_idx),a ;\r
208\r
209 ld a,b\r
210 out (AVRINT5),a\r
211 pop bc\r
212 pop ix\r
213 ret\r
214\r
215 endif\r
216;--------------------------------------------------------------\r
217\r
218 if 0\r
219 ; Works only, if buffer size < (128 - 3)\r
220 ; --> mask must be 03fh or less\r
221\r
222msg.out:\r
223 push ix\r
224 ld ix,(fifolst+itx) ;\r
225\r
226 push bc\r
227 ld b,a ; 4\r
228 ld a,(ix+o.in_idx) ;14\r
229 ld ($ + 3 + 2),a ;15\r
230 ld (ix+0),b ;15\r
231 inc a ;\r
232 and (ix+o.mask) ;\r
233bp.wait:\r
234 cp (ix+o.out_idx) ;\r
235 jr z,bp.wait ;\r
236 ld (ix+o.in_idx),a ;\r
237\r
238 ld a,b\r
239 out (AVRINT5),a\r
240 pop bc\r
241 pop ix\r
242 ret\r
243\r
244 endif\r
245\r
246;--------------------------------------------------------------\r
247;\r
248; (hl): data\r
249\r
250 if 0\r
251\r
252msg.sout:\r
253 push ix ;14\r
254 ld ix,(fifolst+itx) ;12\r
255 push bc ;11\r
256 push de ;11\r
257 ld c,(hl) ; 6\r
258 ld b,0 ; 6\r
259 inc hl ; 7\r
260ms.ol: ; \\r
261TODO: ld a,low mtx.fifo ; 6 does not work with DR LINK-80\r
262--> (fifolst+itx+0)\r
263 add a,(ix+o.in_idx) ;14\r
264 ld e,a ; 4\r
265 ld a,high mtx.fifo ; 6 does not work with DR LINK-80\r
266--> (fifolst+itx+1)\r
267 adc a,b ; 4\r
268 ld d,a ; 4\r
269\r
270 ld a,(ix+o.in_idx) ;14\r
271 inc a ; 4\r
272 and (ix+o.mask) ;14\r
273ms.wait:\r
274 cp (ix+o.out_idx) ;14\r
275 jr z,ms.wait ; 6/8\r
276\r
277 ldi ;12\r
278 ld (ix+o.in_idx),a ;15\r
279 jp pe,ms.ol ; 6/9 -- 126\r
280\r
281 out (AVRINT5),a ;10\r
282 pop de ; 9\r
283 pop bc ; 9\r
284 pop ix ;12\r
285 ret ; 9\r
286\r
287 endif\r
288\r
289;--------------------------------------------------------------\r
290;\r
291; (hl): data\r
292\r
293 if 1\r
294\r
295msg.sout:\r
296 push ix ;14\r
297 ld ix,(fifolst+itx) ;12\r
298 push bc ;11\r
299 push de ;11\r
300 ld b,(hl) ; 6\r
301 inc hl ; 4\r
302 ex de,hl ; 3\r
afbcea2d 303ms.ol: ;\r
ea5293bb
L
304 push ix ;14\r
305 pop hl ; 9\r
306 ld c,(ix+o.in_idx) ;14\r
307 ld a,c ; 4\r
308 add l ; 4\r
309 ld l,a ; 4\r
310 jr nc,ms.on ; 6/8\r
311 inc h ; 4\r
312ms.on:\r
313 ld a,c ; 4\r
314 inc a ; 4\r
315 and (ix+o.mask) ;14\r
316ms.wait:\r
317 cp (ix+o.out_idx) ;14\r
318 jr z,ms.wait ; 6/8\r
319 ld c,a ; 4\r
320 ld a,(de) ; 6\r
321 inc de ; 4\r
322 ld (hl),a ; 7\r
323 ld (ix+o.in_idx),c ;15\r
324 djnz ms.ol ; 7/9 -- 130\r
325\r
326 out (AVRINT5),a ;10\r
327 ex de,hl ; 3\r
328 pop de ; 9\r
329 pop bc ; 9\r
330 pop ix ;12\r
331 ret ; 9\r
332\r
333 endif\r
334\r
335;----------------------------------------------------------------------\r
336\r
337\r
338\r
339 ; Send message\r
340 ; b: msg length\r
341 ; hl: pointer to message (netto)\r
342\r
343msg.snd:\r
344 push ix\r
345 ld ix,(fifolst+itx)\r
346 ld c,0AEh\r
347 call buf.put\r
348msnd_l:\r
349 ld c,(hl)\r
350 inc hl\r
351 call buf.put\r
352 djnz msnd_l\r
353 pop ix\r
354 ret\r
355\r
356\r
357;----------------------------------------------------------------------\r
358;\r
359; Put char in message buffer:\r
360; ix: buffer to put into\r
361; c: char\r
362\r
363buf.put:\r
364 push ix ;15\r
afbcea2d 365 ex (sp),hl ;16\r
ea5293bb 366 ld a,(ix+o.in_idx) ;19\r
afbcea2d
L
367 add a,l ; 4\r
368 ld l,a ; 4\r
369 jr nc,bufp.1 ;12/7\r
370 inc h ; 4\r
371bufp.1:\r
372 ld (hl),c ; 7\r
373 pop hl ;10\r
ea5293bb 374\r
afbcea2d 375 ld a,(ix+o.in_idx) ;19\r
ea5293bb 376 inc a ;4\r
afbcea2d 377 and (ix+o.mask) ;19 =129\r
ea5293bb
L
378bufp.wait:\r
379 cp (ix+o.out_idx) ;19\r
380 jr z,bufp.wait ;12/7\r
381 ld (ix+o.in_idx),a ;19\r
382\r
383 out (AVRINT5),a ;11\r
384 ld a,c ;4\r
afbcea2d 385 ret ;10 =199\r
ea5293bb
L
386\r
387;----------------------------------------------------------------------\r
388; Send message MEMORY\r
389;\r
390; hl: pointer to message (netto)\r
391; b: msg length\r
392\r
393msg.sm:\r
394 push ix\r
395 ld ix,(fifolst+itx)\r
396 ld c,0AEh\r
397 call buf.put\r
398 ld c,b\r
399 call buf.put\r
400msm_l:\r
401 ld c,(hl)\r
402 inc hl\r
403 call buf.put\r
404 djnz msm_l\r
405 pop ix\r
406 ret\r
407\r
408\r
409;----------------------------------------------------------------------\r
410; Send message INLINE\r
411;\r
412; h: function\r
413; l: subfunction\r
414; b: msg length\r
415\r
416 if 0\r
417\r
418msg.sil:\r
419 ex (sp),hl\r
420 push ix\r
421 ld ix,(fifolst+itx)\r
422 ld c,0AEh\r
423 call buf.put\r
424 ld b,(hl)\r
425msnd_pl:\r
426 ld c,(hl)\r
427 inc hl\r
428 call puf.put\r
429 djnz msnd_pl\r
430 ex (sp),hl\r
431 pop ix\r
432 ret\r
433\r
434 endif\r
435\r
436;--------------------------------------------------------------\r
437\r
438 if 0\r
439\r
440msg.co:\r
441 push af\r
442 push hl\r
443 ld (buf_char),a\r
444 ld hl,buf\r
445 call msg.sout\r
446 pop hl\r
447 pop af\r
448 ret\r
449\r
450buf:\r
451 db buf_end - $ - 1 ;output string length\r
452 db 0AEh ; message start token\r
453 db buf_end - $ - 1 ; message length\r
454 db 1 ; command\r
455 db 1 ; subcommand\r
456buf_char:\r
457 db 0 ; pay load\r
458buf_end:\r
459\r
460 endif\r
461\r
462;--------------------------------------------------------------\r
463\r
464\r
465\r
466 end\r