]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/fifo.180
include --> maclib
[z180-stamp-cpm3.git] / cbios / fifo.180
CommitLineData
d6829fd3
L
1\r
2 public bufinit\r
81ba3c84
L
3 public ff_empty,ff_get,ff_full,ff_put\r
4 public ff_puth,ff_cnt,ff_gech\r
d6829fd3
L
5\r
6 public fifolst\r
7\r
8 extrn msg.sm,hwl2phy\r
9\r
3c56f4c2
L
10 maclib z180reg.inc\r
11 maclib config.inc\r
d6829fd3
L
12\r
13\r
14;--------------------------------------------------------------------\r
15\r
16 dseg\r
17\r
18fifolst:\r
19 rept 4\r
20 dw 0\r
21 endm\r
22\r
23;--------------------------------------------------------------------\r
24\r
25 dseg\r
26\r
27bufinit:\r
28 ld (ix+o.in_idx),0 ;reset pointers (empty fifo)\r
29 ld (ix+o.out_idx),0\r
30 ld a,(ix+o.id)\r
31 ld hl,fifolst\r
32 ld e,a\r
33 ld d,0\r
34 add hl,de\r
35 add hl,de\r
36 push ix\r
37 pop de\r
38 cp 4\r
39 jr nc,bfi_skip\r
40\r
41 ld (hl),e\r
42 inc hl\r
43 ld (hl),d\r
44\r
45bfi_skip:\r
46 ex de,hl\r
47 call hwl2phy ;get phys. address of fifo\r
48 ld c,a\r
49 ld a,(ix+o.id) ;fifo id\r
50 or a ;test if fifo 0\r
51 ret z\r
52\r
53 cp 4\r
54 ret nc\r
55\r
56; TODO: move to better place\r
57\r
58 ld b,a\r
59 push bc ;c: bank-addr, b: ignored\r
60 push hl ;address\r
61 ld c,0\r
62 push bc ;c: function, b:subf\r
63 ld b,5\r
64 ld h,c\r
65 ld l,c\r
66 add hl,sp\r
67 call msg.sm\r
68 pop hl\r
69 pop hl\r
70 pop hl\r
71 ret\r
72\r
73;--------------------------------------------------------------\r
74; Check if characters in fifo\r
75; Fifo is empty, if output index and input index are the same\r
76\r
77ff_empty:\r
78 ld a,(ix+o.in_idx) ;\r
79 sub (ix+o.out_idx) ;\r
80 ret z\r
81 or 0ffh\r
82 ret\r
83\r
84;--------------------------------------------------------------\r
81ba3c84
L
85; get character from fifo\r
86; destroys hl,b\r
87;\r
88; return:\r
89; c,a: next character\r
d6829fd3
L
90\r
91ff_get:\r
92 push ix\r
93 pop hl\r
94 ld c,(ix+o.out_idx) ;\r
95 ld b,0\r
96 add hl,bc\r
97 ld a,c\r
98bg.wait:\r
99 cp (ix+o.in_idx) ;\r
100 jr z,bg.wait\r
d6829fd3
L
101 inc a\r
102 and (ix+o.mask)\r
81ba3c84 103 ld c,(hl)\r
d6829fd3 104 ld (ix+o.out_idx),a\r
81ba3c84
L
105 ld a,c\r
106 ret\r
107\r
108;--------------------------------------------------------------\r
109; get character and ramaining count from fifo\r
110; halt cpu, while buffer is empty\r
111; destroys hl\r
112;\r
113; return:\r
114; c,a: next character\r
115; b: number of charachters in fifo\r
116\r
117ff_gech:\r
118 push ix\r
119 pop hl\r
120 ld c,(ix+o.out_idx) ;\r
121 ld b,0\r
122 add hl,bc\r
123 jr $+3\r
124gech.wait:\r
125 halt\r
126 ld a,(ix+o.in_idx) ;\r
127 sub c\r
128 jr z,gech.wait\r
129 jr nc,$+5\r
130 adc (ix+o.mask) ; mask+carry == buffer size\r
131 dec a\r
132 ld b,a\r
133 ld a,c\r
134 inc a\r
135 and (ix+o.mask)\r
136 ld c,(hl)\r
137 ld (ix+o.out_idx),a\r
138 ld a,c\r
d6829fd3
L
139 ret\r
140\r
141;--------------------------------------------------------------\r
142; Check if room in fifo\r
143; buffer is full, if output index is one behind input index\r
81ba3c84
L
144;\r
145; return\r
146; a = 0 and z if buffer full\r
147; a = ff and nz if buffer not full\r
d6829fd3
L
148\r
149ff_full:\r
150 ld a,(ix+o.in_idx) ;\r
81ba3c84
L
151 inc a ;\r
152 and (ix+o.mask) ;\r
d6829fd3
L
153 sub (ix+o.out_idx) ;\r
154 ret z\r
155 or 0ffh\r
156 ret\r
157\r
158\r
159;--------------------------------------------------------------\r
160; put character in c in buffer\r
161; destroys hl, bc\r
162; returns output char in a\r
163\r
164ff_put:\r
165 push ix ;\r
166 pop hl ; get buffer start address\r
167\r
168 ld a,c ;\r
169 ld c,(ix+o.in_idx) ; add input index\r
170 ld b,0 ;\r
171 add hl,bc ;\r
172 ld (hl),a ; one place is allways free\r
173 ld b,a ;\r
174\r
175 ld a,c ; bump input index\r
176 inc a ;\r
177 and (ix+o.mask) ;\r
178bp.wait: ; do\r
179 cp (ix+o.out_idx) ;\r
180 jr z,bp.wait ; while new input idx == ouput idx\r
181 ld (ix+o.in_idx),a ;\r
182 ld a,b ;\r
183 ret ;\r
184\r
81ba3c84
L
185;--------------------------------------------------------------\r
186; put character in c in buffer\r
187; halt cpu, while buffer is is full\r
188; destroys hl, bc\r
189; returns output char in a\r
190\r
191ff_puth:\r
192 push ix ;\r
193 pop hl ; get buffer start address\r
194\r
195 ld a,c ;\r
196 ld c,(ix+o.in_idx) ; add input index\r
197 ld b,0 ;\r
198 add hl,bc ;\r
199 ld (hl),a ; one place is allways free\r
200 ld b,a ;\r
201\r
202 ld a,c ; bump input index\r
203 inc a ;\r
204 and (ix+o.mask) ;\r
205 jr $+3\r
206bph.wait: ; do\r
207 halt ; halt cpu\r
208 cp (ix+o.out_idx) ;\r
209 jr z,bph.wait ; while new input idx == ouput idx\r
210 ld (ix+o.in_idx),a ;\r
211 ld a,b ;\r
212 ret ;\r
213\r
b8ad769f
L
214;--------------------------------------------------------------\r
215; Return number of characters in fifo\r
216;\r
217\r
218ff_cnt:\r
219 ld a,(ix+o.in_idx) ;\r
220 sub (ix+o.out_idx) ;\r
221 ret nc\r
81ba3c84 222 adc (ix+o.mask) ; mask+carry == buffer size\r
b8ad769f
L
223 ret\r
224\r
81ba3c84 225;--------------------------------------------------------------\r
b8ad769f 226\r
d6829fd3 227 end\r