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