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