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