]>
Commit | Line | Data |
---|---|---|
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 | |
18 | fifolst:\r | |
19 | rept 4\r | |
20 | dw 0\r | |
21 | endm\r | |
22 | \r | |
23 | ;--------------------------------------------------------------------\r | |
24 | \r | |
25 | dseg\r | |
26 | \r | |
27 | bufinit:\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 | |
45 | bfi_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 | |
77 | ff_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 |
91 | ff_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 | |
98 | bg.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 | |
117 | ff_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 | |
124 | gech.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 |
149 | ff_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 | |
164 | ff_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 | |
178 | bp.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 | |
191 | ff_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 | |
206 | bph.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 | |
218 | ff_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 |