]> cloudbase.mooo.com Git - z180-stamp.git/blame - z180/ser1-i.180
my_getchar() parameter: allow return without new character
[z180-stamp.git] / z180 / ser1-i.180
CommitLineData
a16ba2b0
L
1 page 200\r
2\r
3\r
4 extrn buf.init\r
5 extrn isv_sw\r
6\r
7 \r
8 global ser.init\r
9 global ser.instat,ser.in\r
10 global ser.out\r
11\r
12;TODO: define a trampoline area somewhere in top ram. \r
13rtxisvjmp equ 0FF60h ;momentan frei...\r
14\r
15 include config.inc\r
16 include z180reg.inc\r
17\r
18\r
19;-----------------------------------------------------\r
20\r
21 dseg\r
22 \r
23buf_start:\r
24 mkbuf ser1.inbuf,s1.rx_len\r
25 mkbuf ser1.outbuf,s1.tx_len\r
26buf_end:\r
27\r
28\r
29\r
30;-----------------------------------------------------\r
31\r
32 cseg\r
33;\r
34; Init Serial I/O for console input and output (ASCI1)\r
35;\r
36 \r
37\r
38ser.init:\r
39; ld a,i\r
40; push af ;save IFF\r
41; di\r
42\r
43 xor a ;\r
44 out0 (stat1),a ;Disable rx/tx interrupts\r
45 \r
46 ld hl,rxtx_src ;move rx and tx isv to common ram\r
47 ld de,rxtx_dst ;\r
48 ld bc,rxtx_src_e-rxtx_src ; \r
49 ldir ;\r
50\r
51 ld hl,rtxisvjmp ;rx/tx int vector\r
52 ld (ivtab + IV$ASCI1),hl;\r
53 ld a,0cdh ;\r
54 ld (rtxisvjmp),a ;\r
55 ld hl,isv_sw ;\r
56 ld (rtxisvjmp + 1),hl ;\r
57 ld hl,rxtxisv ;\r
58 ld (rtxisvjmp + 3),hl ;\r
59\r
60; ASCI1: 8N1, highest baudrate (56700), CTS disabled\r
61\r
62 ld a,M_MPBT \r
63 out0 (cntlb1),a\r
64 ld a,M_RE + M_TE + M_MOD2\r
65 out0 (cntla1),a\r
66 ld a,M_RIE\r
67 out0 (stat1),a ;Enable rx interrupts\r
68\r
69 ld ix,ser1.inbuf\r
70 ld a,ser1.inbuf.mask\r
71 call buf.init\r
72 ld ix,ser1.outbuf\r
73 ld a,ser1.outbuf.mask\r
74 call buf.init\r
75\r
76; pop af\r
77; ret po\r
78; ei\r
79 ret ;\r
80\r
81ser.instat:\r
82 push ix\r
83 ld ix,ser1.inbuf ;\r
84\r
85buf.empty:\r
86 ld a,(ix+o.in_idx) ;\r
87 sub (ix+o.out_idx) ;\r
88 pop ix\r
89 ret z\r
90 or 0ffh\r
91 ret\r
92 \r
93ser.in:\r
94 push hl ;11 \r
95 push de ;11\r
96 ld hl,ser1.inbuf-1 ; 9 hl = &rx.out_idx \r
97 ld a,(hl) ; 6 a = rx.out_idx\r
98 dec hl ; 4 hl = &rx.in_idx\r
99 jr bg.w1\r
100bg.wait:\r
101 halt\r
102bg.w1:\r
103 cp (hl) ; 6 while (out_idx==in_idx) \r
104 jr z,bg.wait ; 6 (/8) ;\r
105\r
a16ba2b0 106 ld e,a ; 4 \r
a16ba2b0 107 ld d,0 ; 6\r
4caee1ec
L
108 inc de\r
109 inc de\r
a16ba2b0
L
110\r
111 ex de,hl ; 3\r
112 add hl,de ;10\r
113 ld l,(hl) ; 6\r
114 ex de,hl ; 3 \r
4caee1ec
L
115\r
116 inc a ; 4\r
a16ba2b0
L
117 dec hl ; 4\r
118 and (hl) ; 6 \r
119 inc hl ; 4\r
120 inc hl ; 4\r
121 ld (hl),a ; 7\r
122 \r
123 ld a,e ; 4\r
124 pop de ; 9\r
125 pop hl ; 9\r
126 ret ; 9\r
127 ; 153 \r
128\r
129ser.outstat:\r
130 push ix\r
131 ld ix,ser1.outbuf ;\r
132buf.full:\r
133 ld a,(ix+o.in_idx) ;\r
134 inc a\r
135 and (ix+o.mask)\r
136 sub (ix+o.out_idx) ;\r
137 pop ix\r
138 ret z\r
139 or 0ffh\r
140 ret\r
141\r
142\r
143ser.out:\r
144 push ix\r
145 ld ix,ser1.outbuf ;\r
146buf.put:\r
147 push hl ;\r
148 push bc\r
149 push ix\r
150 pop hl\r
151 ld c,(ix+o.in_idx) ;\r
152 ld b,0\r
153 add hl,bc\r
4caee1ec 154 ld (hl),a\r
a16ba2b0
L
155\r
156 ld a,c ;\r
157 inc a\r
158 and (ix+o.mask)\r
159bp.wait:\r
160 cp (ix+o.out_idx) ;\r
161 jr z,bp.wait\r
a16ba2b0
L
162 ld (ix+o.in_idx),a\r
163\r
164 di ;036f\r
165 in0 a,(stat1) ;0374\r
166 set TIE,a ;0377\r
167 out0 (stat1),a ;0379\r
168 ei ;037c\r
169\r
170 ld a,b\r
171 pop bc\r
172 pop hl\r
173 pop ix\r
174 ret\r
175\r
176\r
177;------------------------------------------\r
178; ASCI 1 Transmit/Receive interupt routines\r
179; moved to common ram\r
180\r
181rxtx_src:\r
182 dseg\r
183rxtx_dst: ; (0c097h) old\r
184\r
185rxtxisv:\r
186 inidat\r
187 in0 a,(stat1) ;receive flag set?\r
188 jp p,txisv ;\r
189\r
190 in0 d,(rdr1) ;todo: break detection\r
191 bit FE,a ;framing error?\r
192 jr nz,??ri_1\r
193 \r
194 push ix\r
195 ld ix,ser1.inbuf ;\r
196 ld hl,ser1.inbuf ;\r
197 ld c,(ix+o.in_idx) ;\r
198 ld b,0\r
199 add hl,bc\r
200\r
201 ld a,c ;\r
202 inc a\r
203 and (ix+o.mask)\r
204 cp (ix+o.out_idx) ;\r
205 jr z,??ri_0\r
206 ld (hl),d\r
207 ld (ix+o.in_idx),a\r
208??ri_0:\r
209 pop ix\r
210??ri_1:\r
211 in0 a,(cntla1) ;0705 c0c0\r
212 res EFR,a ;0708\r
213 out0 (cntla1),a ;070a\r
214 ret\r
215\r
216 inidate\r
217\r
218txisv:\r
219 inidat\r
220 push ix\r
221 ld ix,ser1.outbuf ;\r
222\r
223 ld a,(ix+o.out_idx) ;\r
224 cp (ix+o.in_idx) ;\r
225 jr z,??ti_2\r
226\r
227 ld hl,ser1.outbuf ;\r
228 add a,l\r
229 ld l,a\r
230 jr nc,??ti_1\r
231 inc h\r
232??ti_1:\r
233 ld l,(hl)\r
234 out0 (tdr1),l ;071b\r
235 \r
236 ld a,(ix+o.out_idx) ;\r
237 inc a\r
238 and (ix+o.mask)\r
239 ld (ix+o.out_idx),a\r
240 jr ??ti_3\r
241??ti_2:\r
242 in0 a,(stat1) ;0730 disable tx-int\r
243 res TIE,a ;0733\r
244 out0 (stat1),a ;0735\r
245??ti_3:\r
246 pop ix\r
247 ret\r
248\r
249 inidate\r
250\r
251 cseg\r
252rxtx_src_e:\r
253\r
254\r
255 end\r
256\r
257\r