]> cloudbase.mooo.com Git - z180-stamp.git/blame - z180/msgbuf-a.180
message buffer init changes. cp/m r/w for new memory map
[z180-stamp.git] / z180 / msgbuf-a.180
CommitLineData
6a4e9540
L
1 page 255\r
2 .z80\r
2fa1a706 3\r
8bbf185e 4 public mrx.fifo,mtx.fifo\r
6a4e9540 5\r
8bbf185e
L
6 public msginit,msgi.st,msg.in,msgo.st\r
7 public msg.sm,msg.sout\r
2fa1a706 8\r
8bbf185e
L
9 extrn bufinit,hwl2phy\r
10 extrn fifolst\r
6a4e9540
L
11\r
12 include config.inc\r
64cc2207 13 if CPU_Z180\r
6a4e9540 14 include z180reg.inc\r
64cc2207 15 endif\r
6a4e9540
L
16\r
17;--------------------------------------------------------------\r
18\r
19 dseg\r
20\r
e4c4b148
L
21 mkbuf mtx.fifo_id, mtx.fifo, mtx.fifo_len\r
22 mkbuf mrx.fifo_id, mrx.fifo, mrx.fifo_len\r
6a4e9540
L
23\r
24;--------------------------------------------------------------\r
25\r
26 cseg\r
27\r
28;\r
29; Init buffer\r
30;\r
2fa1a706 31\r
6a4e9540 32msginit:\r
8bbf185e
L
33 ld a,(043h)\r
34;TODO: value should be 0\r
6a4e9540 35 ld ix,mtx.fifo\r
8bbf185e
L
36 call bufinit\r
37 push ix\r
38 pop hl\r
39 call hwl2phy\r
40 ld (040h),hl\r
41 ld (040h+2),a\r
42 ld a,0ffh\r
43 ld (043h),a\r
44 out (AVRINT5),a\r
45wait:\r
46 ld a,(043h)\r
47 or a\r
48 jr nz,wait\r
49\r
cdc4625b 50 ld ix,mrx.fifo\r
8bbf185e 51 jp bufinit\r
6a4e9540
L
52\r
53;--------------------------------------------------------------\r
54\r
55msgi.st:\r
56 push ix\r
57 ld ix,mrx.fifo ;\r
58\r
59buf.empty:\r
60 ld a,(ix+o.in_idx) ;\r
61 sub (ix+o.out_idx) ;\r
62 pop ix\r
63 ret z\r
64 or 0ffh\r
65 ret\r
2fa1a706 66\r
6a4e9540
L
67;--------------------------------------------------------------\r
68\r
69msg.in:\r
70 push ix\r
71 ld ix,mrx.fifo ;\r
72\r
73buf.get:\r
74 ld a,(ix+o.out_idx) ;\r
75bg.wait:\r
76 cp (ix+o.in_idx) ;\r
77 jr z,bg.wait\r
78\r
79 push hl ;\r
80 push ix\r
81 pop hl\r
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
2fa1a706 88\r
6a4e9540
L
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
2fa1a706 93\r
6a4e9540
L
94 ld a,l\r
95 pop hl\r
96 pop ix\r
97 ret\r
98\r
99;--------------------------------------------------------------\r
100\r
101msgo.st:\r
102 push ix\r
103 ld ix,mtx.fifo ;\r
104\r
105buf.full:\r
106 ld a,(ix+o.in_idx) ;\r
107 inc a\r
108 and (ix+o.mask)\r
109 sub (ix+o.out_idx) ;\r
110 pop ix\r
111 ret z\r
112 or 0ffh\r
113 ret\r
114\r
115;--------------------------------------------------------------\r
116\r
2fa1a706
L
117 if 0\r
118\r
6a4e9540
L
119msg.out:\r
120 push ix\r
121 ld ix,mtx.fifo ;\r
122\r
123buf.put:\r
124 push hl ;\r
125 push bc\r
126 push ix\r
127 pop hl\r
128 ld c,(ix+o.in_idx) ;\r
129 ld b,0\r
130 add hl,bc\r
131 ld b,a\r
132\r
133 ld a,c ;\r
134 inc a\r
135 and (ix+o.mask)\r
136bp.wait:\r
137 cp (ix+o.out_idx) ;\r
138 jr z,bp.wait\r
139 ld (hl),b\r
140 ld (ix+o.in_idx),a\r
2fa1a706 141\r
6a4e9540 142 ld a,b\r
64cc2207 143 out (AVRINT5),a\r
6a4e9540
L
144 pop bc\r
145 pop hl\r
146 pop ix\r
147 ret\r
148\r
2fa1a706 149 endif\r
6a4e9540
L
150\r
151;--------------------------------------------------------------\r
6a4e9540 152\r
8bbf185e 153 if 0\r
2fa1a706
L
154\r
155msg.out:\r
6a4e9540
L
156 push ix\r
157 ld ix,mtx.fifo ;\r
158\r
2fa1a706 159buf.put:\r
6a4e9540 160 push bc\r
6a4e9540 161 ld c,(ix+o.in_idx) ;\r
2fa1a706
L
162 ld b,0\r
163 push ix ;14\r
164 add ix,bc ;10\r
165 ld (ix+0),a ;15\r
166 pop ix ;12 / 51\r
167 ld b,a ; 4\r
6a4e9540 168 ld a,c ;\r
2fa1a706
L
169 inc a ;\r
170 and (ix+o.mask) ;\r
171bp.wait:\r
6a4e9540 172 cp (ix+o.out_idx) ;\r
2fa1a706
L
173 jr z,bp.wait ;\r
174 ld (ix+o.in_idx),a ;\r
175\r
176 ld a,b\r
64cc2207 177 out (AVRINT5),a\r
6a4e9540
L
178 pop bc\r
179 pop ix\r
180 ret\r
181\r
8bbf185e
L
182 endif\r
183\r
184;----------------------------------------------------------------------\r
185;\r
186; Put char in message buffer:\r
187; ix: buffer to put into\r
188; c: char\r
189\r
190buf.put:\r
191 push ix ;15\r
192 push bc ;11\r
193 ld a,(ix+o.in_idx) ;19\r
194 ld c,a ;4\r
195 ld b,0 ;7\r
196 add ix,bc ;11\r
197 pop bc ;10\r
198 ld (ix),c ;7\r
199 pop ix ;14\r
200\r
201 inc a ;4\r
202 and (ix+o.mask) ;19 =121\r
203bufp.wait:\r
204 cp (ix+o.out_idx) ;19\r
205 jr z,bufp.wait ;12/7\r
206 ld (ix+o.in_idx),a ;19\r
207\r
208 out (AVRINT5),a ;11\r
209 ld a,c ;4\r
210 ret ;10 =191\r
211\r
2fa1a706
L
212\r
213;--------------------------------------------------------------\r
214\r
215 if 0\r
216 ; Works only, if buffer size < (128 - 3)\r
217 ; --> mask must be 03fh or less\r
218\r
219msg.out:\r
220 push ix\r
221 ld ix,mtx.fifo ;\r
222\r
223buf.put:\r
224 push bc\r
225 ld b,a ; 4\r
226 ld a,(ix+o.in_idx) ;14\r
227 ld ($ + 3 + 2),a ;15\r
228 ld (ix+0),b ;15\r
229 inc a ;\r
230 and (ix+o.mask) ;\r
231bp.wait:\r
232 cp (ix+o.out_idx) ;\r
233 jr z,bp.wait ;\r
234 ld (ix+o.in_idx),a ;\r
235\r
236 ld a,b\r
237 out (AVRINT5),a\r
238 pop bc\r
239 pop ix\r
240 ret\r
241\r
242 endif\r
243\r
244;--------------------------------------------------------------\r
245;\r
246; (hl): data\r
247\r
248msg.sout:\r
249 push ix ;14\r
250 ld ix,mtx.fifo ;12\r
251 push bc ;11\r
252 push de ;11\r
253 ld c,(hl) ; 6\r
254 ld b,0 ; 6\r
255 inc hl ; 7\r
256ms.ol: ; \\r
257 ld a,low mtx.fifo ; 6\r
258 add a,(ix+o.in_idx) ;14\r
259 ld e,a ; 4\r
260 ld a,high mtx.fifo ; 6\r
261 adc a,b ; 4\r
262 ld d,a ; 4\r
263\r
264 ld a,(ix+o.in_idx) ;14\r
265 inc a ; 4\r
266 and (ix+o.mask) ;14\r
267ms.wait:\r
268 cp (ix+o.out_idx) ;14\r
269 jr z,ms.wait ; 6/8\r
270\r
271 ldi ;12\r
272 ld (ix+o.in_idx),a ;15\r
273 jp pe,ms.ol ; 6/9 -- 126\r
274\r
275 out (AVRINT5),a ;10\r
276 pop de ; 9\r
277 pop bc ; 9\r
278 pop ix ;12\r
279 ret ; 9\r
280\r
281;--------------------------------------------------------------\r
282;\r
283; (hl): data\r
284\r
285 if 0\r
286\r
287msg.sout:\r
288 push ix ;14\r
289 ld ix,mtx.fifo ;12\r
290 push bc ;11\r
291 push de ;11\r
292 ld b,(hl) ; 6\r
293 inc hl ; 4\r
294 ex de,hl ; 3\r
295ms.ol: ; \\r
296 push ix ;14\r
297 pop hl ; 9\r
298 ld c,(ix+o.in_idx) ;14\r
299 ld a,c ; 4\r
300 add l ; 4\r
301 ld l,a ; 4\r
302 jr nc,ms.on ; 6/8\r
303 inc h ; 4\r
304ms.on:\r
305 ld a,c ; 4\r
306 inc a ; 4\r
307 and (ix+o.mask) ;14\r
308ms.wait:\r
309 cp (ix+o.out_idx) ;14\r
310 jr z,ms.wait ; 6/8\r
311 ld c,a ; 4\r
312 ld a,(de) ; 6\r
313 inc de ; 4\r
314 ld (hl),a ; 7\r
315 ld (ix+o.in_idx),c ;15\r
316 djnz ms.ol ; 7/9 -- 130\r
317\r
318 out (AVRINT5),a ;10\r
319 ex de,hl ; 3\r
320 pop de ; 9\r
321 pop bc ; 9\r
322 pop ix ;12\r
323 ret ; 9\r
324\r
325 endif\r
326\r
6a4e9540
L
327;--------------------------------------------------------------\r
328\r
329msg.co:\r
330 push af\r
331 push hl\r
332 ld (buf_char),a\r
333 ld hl,buf\r
334 call msg.sout\r
335 pop hl\r
336 pop af\r
337 ret\r
2fa1a706
L
338\r
339\r
6a4e9540
L
340buf:\r
341 db buf_end - $ - 1 ;output string length\r
3531528e 342 db 0AEh ; message start token\r
6a4e9540
L
343 db buf_end - $ - 1 ; message length\r
344 db 1 ; command\r
345 db 1 ; subcommand\r
346buf_char:\r
347 db 0 ; pay load\r
348buf_end:\r
349\r
350;----------------------------------------------------------------------\r
351\r
8bbf185e
L
352;----------------------------------------------------------------------\r
353; Send message MEMORY\r
354;\r
355; hl: pointer to message (netto)\r
356; b: msg length\r
357\r
358msg.sm:\r
359 push ix\r
360 ld ix,mtx.fifo\r
361 ld c,0AEh\r
362 call buf.put\r
363 ld c,b\r
364 call buf.put\r
365msm_l:\r
366 ld c,(hl)\r
367 inc hl\r
368 call buf.put\r
369 djnz msm_l\r
370 pop ix\r
371 ret\r
372\r
373\r
6a4e9540 374 end\r