]>
Commit | Line | Data |
---|---|---|
072e0f3b L |
1 | ; CP/M BIOS for avrcpm\r |
2 | ; Copyright (C) 2010 Sprite_tm\r | |
3 | ;\r | |
4 | ; This program is free software: you can redistribute it and/or modify\r | |
5 | ; it under the terms of the GNU General Public License as published by\r | |
6 | ; the Free Software Foundation, either version 3 of the License, or\r | |
7 | ; (at your option) any later version.\r | |
8 | ;\r | |
9 | ; This program is distributed in the hope that it will be useful,\r | |
10 | ; but WITHOUT ANY WARRANTY; without even the implied warranty of\r | |
11 | ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r | |
12 | ; GNU General Public License for more details.\r | |
13 | ;\r | |
14 | ; You should have received a copy of the GNU General Public License\r | |
15 | ; along with this program. If not, see <http://www.gnu.org/licenses/>.\r | |
16 | ;\r | |
17 | ; $Id: bios.asm 71 2010-08-06 19:38:10Z leo $\r | |
18 | ;\r | |
19 | \r | |
2396f399 | 20 | maclib CFGACPM.LIB\r |
072e0f3b L |
21 | \r |
22 | aseg\r | |
23 | org 100h\r | |
24 | .phase bios\r | |
25 | .z80\r | |
26 | \r | |
27 | nsects equ ($-ccp)/128 ;warm start sector count\r | |
28 | \r | |
29 | jp boot\r | |
30 | wboote: \r | |
31 | jp wboot\r | |
32 | jp const\r | |
33 | jp conin\r | |
34 | jp conout\r | |
35 | jp list\r | |
36 | jp punch\r | |
37 | jp reader\r | |
38 | jp home\r | |
39 | jp seldsk\r | |
40 | jp settrk\r | |
41 | jp setsec\r | |
42 | jp setdma\r | |
43 | jp read\r | |
44 | jp write\r | |
45 | jp listst\r | |
46 | jp sectran\r | |
47 | \r | |
48 | .8080\r | |
49 | maclib AVRCPM.LIB\r | |
50 | \r | |
51 | ;Drive A B C D E F G H I J K L\r | |
abeec861 L |
52 | ;drvtbl:dtbl <dpha,dphb,dphc,dphd, , , , ,dphi,dphj,dphk,dphl>\r |
53 | ;drvtbl:dtbl <dpha, , , , , , , ,dphi,dphj,dphk,dphl>\r | |
fb050095 L |
54 | ;drvtbl: dtbl < , , , , , , , ,dphi,dphj,dphk,dphl>\r |
55 | drvtbl:dtbl < , , , , , , , ,dphi>\r | |
072e0f3b L |
56 | \r |
57 | ; Name spt bls dks dir cks off\r | |
5482d75f L |
58 | ; dpb dpb243, 26, 1024, 243, 64, 64, 2\r |
59 | ; dpb dp8192s,32, 4096,2046, 512, 512, 2\r | |
60 | ; dpb dp8192, 32, 4096,2046,1024,1024, 2\r | |
072e0f3b | 61 | ; dpb dpbrd, 32, 1024, 56, 32, 0, 2\r |
abeec861 | 62 | dpb rd192, 32, 1024, 192, 32, 0, 0\r |
fb050095 L |
63 | ; dpb rd1016, 32, 2048, 508, 192, 0, 2\r |
64 | ; dpb rd1024, 32, 2048, 512, 192, 0, 0\r | |
65 | ; dpb rd0960, 32, 2048, 480, 192, 0, 0\r | |
072e0f3b | 66 | \r |
5482d75f | 67 | ;dpha: dph dpb243\r |
072e0f3b L |
68 | ;dphb: dph dpb243\r |
69 | ;dphc: dph dpb243\r | |
70 | ;dphd: dph dpb243\r | |
2396f399 L |
71 | ;dpha: dph dp8192s\r |
72 | ;dphb: dph dp8192s\r | |
73 | ;dphc: dph dp8192\r | |
74 | ;dphd: dph dp8192\r | |
abeec861 L |
75 | ;dphi: dph rd1016\r |
76 | dphi: dph rd192\r | |
fb050095 L |
77 | ;dphj: dph rd1024\r |
78 | ;dphk: dph rd1024\r | |
79 | ;dphl: dph rd0960\r | |
072e0f3b L |
80 | \r |
81 | .z80\r | |
82 | \r | |
83 | signon:\r | |
84 | db cr,lf\r | |
85 | db msize/10+'0'\r | |
86 | db msize - (msize/10)*10 + '0' ;modulo doesn't work?\r | |
87 | db "k cp/m vers 2.2"\r | |
88 | msgnl: db cr,lf,0\r | |
89 | \r | |
2396f399 L |
90 | msgnodisk:\r |
91 | db "No disk!"\r | |
92 | db cr,lf,0\r | |
93 | \r | |
072e0f3b L |
94 | const:\r |
95 | in a,(0)\r | |
96 | ret\r | |
97 | \r | |
98 | conin:\r | |
99 | in a,(0)\r | |
100 | cp 0ffh\r | |
101 | jp nz,conin\r | |
102 | \r | |
103 | in a,(1)\r | |
104 | ret\r | |
105 | \r | |
106 | conout:\r | |
107 | ld a,c\r | |
2396f399 | 108 | out (1),a\r |
072e0f3b L |
109 | ret\r |
110 | \r | |
111 | list:\r | |
112 | ret\r | |
113 | \r | |
114 | listst:\r | |
115 | ld a,0\r | |
116 | ret\r | |
117 | \r | |
118 | punch:\r | |
119 | ret\r | |
120 | \r | |
121 | reader:\r | |
122 | ld a,01Fh\r | |
123 | ret\r | |
124 | \r | |
125 | prmsg:\r | |
126 | ld a,(hl)\r | |
127 | or a\r | |
128 | ret z\r | |
129 | push hl\r | |
130 | ld c,a\r | |
131 | call conout\r | |
132 | pop hl\r | |
133 | inc hl\r | |
134 | jp prmsg\r | |
135 | \r | |
136 | prhex:\r | |
137 | ld a,c\r | |
138 | push af\r | |
139 | rra \r | |
140 | rra \r | |
141 | rra \r | |
142 | rra \r | |
143 | call prhexdigit\r | |
144 | pop af\r | |
145 | ; fall thru\r | |
146 | \r | |
147 | prhexdigit:\r | |
148 | and 00fh\r | |
149 | cp 10\r | |
150 | jp c,prd1\r | |
151 | add a,7\r | |
152 | prd1:\r | |
153 | add a,'0'\r | |
154 | ld c,a\r | |
155 | jp conout\r | |
156 | \r | |
072e0f3b L |
157 | boot:\r |
158 | ld sp,buff\r | |
159 | ld hl,signon\r | |
160 | call prmsg\r | |
161 | \r | |
2396f399 L |
162 | ld a,low bcb\r |
163 | out (13),a\r | |
164 | ld a, high bcb\r | |
165 | out (14),a\r | |
166 | \r | |
072e0f3b L |
167 | xor a\r |
168 | ld (bootdsk),a\r | |
169 | ld e,a\r | |
2396f399 L |
170 | ld c,a\r |
171 | call seldsk\r | |
172 | jp nz,boot0\r | |
173 | ld hl,msgnodisk\r | |
174 | call prmsg\r | |
175 | halt\r | |
176 | boot0:\r | |
177 | call getdpb\r | |
178 | ld a,(de) ;dpb[0] is sectors_per_track\r | |
072e0f3b | 179 | ld (bootspt),a\r |
2396f399 | 180 | ld e,0\r |
072e0f3b L |
181 | ld c,'I'-'A'\r |
182 | call seldsk\r | |
92202636 | 183 | jp z,boot1 ;no ram disk\r |
072e0f3b | 184 | \r |
2396f399 | 185 | call getdpb ;de = dpb of first ram disk\r |
072e0f3b L |
186 | \r |
187 | ; Check, if we have reserved tracks.\r | |
188 | \r | |
189 | ld hl,13\r | |
190 | add hl,de\r | |
191 | \r | |
192 | ld a,(hl) ;# of reserved tracks \r | |
193 | inc hl\r | |
194 | or (hl)\r | |
195 | jp z,boot1 ;Skip if not.\r | |
196 | \r | |
197 | ; Save CPM to ram disk.\r | |
198 | \r | |
199 | ld a,(de) ;sectors per track\r | |
200 | ld (bootspt),a\r | |
201 | ld a,'I'-'A'\r | |
202 | ld (bootdsk),a\r | |
203 | call home\r | |
204 | ld b,nsects\r | |
205 | ld c,0 ;track\r | |
206 | ld d,1 ;sektor (0 based, skip ipl)\r | |
207 | ld hl,ccp\r | |
208 | store1:\r | |
209 | push bc\r | |
210 | push de\r | |
211 | push hl\r | |
212 | ld c,d\r | |
213 | ld b,0\r | |
214 | call setsec\r | |
215 | pop bc ;dma\r | |
216 | push bc\r | |
217 | call setdma\r | |
218 | ld c,0\r | |
219 | call write\r | |
220 | \r | |
221 | pop hl ;dma\r | |
222 | ld de,128\r | |
223 | add hl,de\r | |
224 | pop de ;d = sec\r | |
225 | pop bc ;b = # of secs, c = track\r | |
226 | dec b\r | |
227 | jp z,boot1\r | |
228 | \r | |
229 | inc d\r | |
230 | ld a,(bootspt)\r | |
231 | dec a\r | |
232 | cp d ;if sector >= spt then change tracks\r | |
233 | jp nc,store1\r | |
234 | \r | |
235 | ld d,0\r | |
236 | inc c\r | |
237 | push bc\r | |
238 | push de\r | |
239 | push hl\r | |
240 | ld b,0\r | |
241 | call settrk \r | |
242 | pop hl\r | |
243 | pop de\r | |
244 | pop bc\r | |
245 | jp store1\r | |
246 | \r | |
247 | boot1: \r | |
248 | xor a\r | |
249 | ld (iobyte),a\r | |
250 | ld (cdisk),a\r | |
251 | jp gocpm \r | |
252 | \r | |
253 | wboot: ;re-load CP/M\r | |
254 | ld sp,buff\r | |
255 | ld a,1 shl BOOT_FUNC ;init (de)blocking\r | |
256 | out (22),a\r | |
257 | ld a,(bootdsk)\r | |
258 | ld c,a\r | |
4cde2182 | 259 | ld e,0 ;clear reselection flag\r |
072e0f3b L |
260 | call seldsk\r |
261 | call home\r | |
262 | ld b,nsects\r | |
263 | ld c,0 ;track\r | |
264 | ld d,1 ;sektor (0 based)\r | |
265 | ld hl,ccp\r | |
266 | load1:\r | |
267 | push bc\r | |
268 | push de\r | |
269 | push hl\r | |
270 | ld c,d\r | |
271 | ld b,0\r | |
272 | call setsec\r | |
273 | pop bc\r | |
274 | push bc\r | |
275 | call setdma\r | |
276 | call read\r | |
277 | cp 0 ;read error?\r | |
278 | jp nz,wboot\r | |
279 | \r | |
280 | pop hl\r | |
281 | ld de,128\r | |
282 | add hl,de\r | |
283 | pop de\r | |
284 | pop bc\r | |
285 | dec b\r | |
286 | jp z,gocpm\r | |
287 | \r | |
288 | inc d\r | |
289 | ld a,(bootspt)\r | |
290 | dec a\r | |
291 | cp d ;if sector >= spt then change tracks\r | |
292 | jp nc,load1\r | |
293 | \r | |
294 | ld d,0\r | |
295 | inc c\r | |
296 | push bc\r | |
297 | push de\r | |
298 | push hl\r | |
299 | ld b,0\r | |
300 | call settrk \r | |
301 | pop hl\r | |
302 | pop de\r | |
303 | pop bc\r | |
304 | jp load1\r | |
305 | \r | |
306 | gocpm:\r | |
307 | ld a,0c3h\r | |
308 | ld (0),a\r | |
309 | ld hl,wboote\r | |
310 | ld (1),hl\r | |
311 | ld (5),a\r | |
312 | ld hl,bdos\r | |
313 | ld (6),hl\r | |
314 | \r | |
315 | ld bc,buff\r | |
316 | call setdma\r | |
317 | ld a,(cdisk)\r | |
318 | ld c,a\r | |
319 | jp ccp\r | |
320 | \r | |
321 | msgSel: db 13,10,"Sel: ",0\r | |
322 | \r | |
2396f399 L |
323 | getdpb:\r |
324 | ld de,10\r | |
325 | add hl,de\r | |
326 | ld e,(hl)\r | |
327 | inc hl\r | |
328 | ld d,(hl) ;de = dpb\r | |
329 | ret\r | |
330 | \r | |
072e0f3b | 331 | seldsk:\r |
2396f399 L |
332 | ld a,c\r |
333 | out (15),a\r | |
334 | \r | |
335 | ld a,e ;reselection bit\r | |
336 | rrca\r | |
337 | jp c,getdph ;skip, if disk already active\r | |
2396f399 | 338 | ld hl,0\r |
92202636 | 339 | in a,(15) ;querry, if disk exists\r |
2396f399 | 340 | or a\r |
92202636 | 341 | ret z\r |
2396f399 L |
342 | getdph:\r |
343 | ld hl,drvtbl\r | |
072e0f3b L |
344 | ld b,0\r |
345 | add hl,bc\r | |
346 | add hl,bc\r | |
347 | ld a,(hl) ;get table entry for selected disk\r | |
348 | inc hl\r | |
349 | ld h,(hl)\r | |
350 | ld l,a \r | |
2396f399 | 351 | or h ;return zero, if no entry (no disk)\r |
072e0f3b | 352 | ret\r |
2396f399 | 353 | \r |
072e0f3b L |
354 | \r |
355 | home:\r | |
356 | ld a,1 shl HOME_FUNC\r | |
357 | out (22),a\r | |
358 | \r | |
359 | ld bc,0 ; same as seek to track 0\r | |
360 | settrk:\r | |
361 | ld a,c\r | |
362 | out (16),a\r | |
363 | ld a,b\r | |
364 | out (17),a\r | |
365 | ret\r | |
366 | \r | |
367 | setsec:\r | |
368 | ld a,c\r | |
369 | out (18),a\r | |
370 | ret\r | |
371 | \r | |
372 | setdma:\r | |
373 | ld a,c\r | |
374 | out (20),a\r | |
375 | ld a,b\r | |
376 | out (21),a\r | |
377 | ret\r | |
378 | \r | |
379 | read:\r | |
380 | ld a,1 shl READ_FUNC\r | |
381 | out (22),a\r | |
382 | in a,(22)\r | |
383 | and 1\r | |
384 | ret\r | |
385 | \r | |
386 | write:\r | |
387 | ld a,c\r | |
388 | and 3 ;mask write type\r | |
389 | or 1 shl WRITE_FUNC\r | |
390 | out (22),a\r | |
391 | in a,(22)\r | |
392 | and 1\r | |
393 | ret\r | |
394 | \r | |
395 | sectran:\r | |
396 | ;translate sector bc using table at de, res into hl\r | |
397 | ld h,b\r | |
398 | ld l,c\r | |
399 | ld a,d\r | |
400 | or e\r | |
401 | ret z\r | |
402 | ex de,hl\r | |
403 | add hl,bc\r | |
404 | ld l,(hl)\r | |
405 | ld h,0\r | |
406 | ret\r | |
407 | \r | |
2396f399 L |
408 | bcb: dw drvtbl\r |
409 | dw dirbuf\r | |
410 | dw enddat\r | |
411 | \r | |
072e0f3b L |
412 | bootdsk:ds 1\r |
413 | bootspt:ds 1\r | |
414 | \r | |
415 | .8080\r | |
416 | endef\r | |
417 | \r | |
418 | end\r | |
419 | \r |