]> cloudbase.mooo.com Git - avrcpm.git/blame - cpm/BIOS.MAC
* cpm/BIOS.MAC
[avrcpm.git] / cpm / BIOS.MAC
CommitLineData
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
27nsects equ ($-ccp)/128 ;warm start sector count\r
28 \r
29 jp boot\r
30wboote: \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
55drvtbl: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
76dphi: 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
83signon:\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
88msgnl: db cr,lf,0\r
89\r
2396f399
L
90msgnodisk:\r
91 db "No disk!"\r
92 db cr,lf,0\r
93\r
072e0f3b
L
94const:\r
95 in a,(0)\r
96 ret\r
97\r
98conin:\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
106conout:\r
107 ld a,c\r
2396f399 108 out (1),a\r
072e0f3b
L
109 ret\r
110\r
111list:\r
112 ret\r
113\r
114listst:\r
115 ld a,0\r
116 ret\r
117\r
118punch:\r
119 ret\r
120\r
121reader:\r
122 ld a,01Fh\r
123 ret\r
124\r
125prmsg:\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
136prhex:\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
147prhexdigit:\r
148 and 00fh\r
149 cp 10\r
150 jp c,prd1\r
151 add a,7\r
152prd1:\r
153 add a,'0'\r
154 ld c,a\r
155 jp conout\r
156\r
072e0f3b
L
157boot:\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
176boot0:\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
208store1:\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
247boot1: \r
248 xor a\r
249 ld (iobyte),a\r
250 ld (cdisk),a\r
251 jp gocpm \r
252\r
253wboot: ;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
266load1:\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
306gocpm:\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
321msgSel: db 13,10,"Sel: ",0\r
322\r
2396f399
L
323getdpb:\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 331seldsk:\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
342getdph:\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
355home:\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
360settrk:\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
367setsec:\r
368 ld a,c\r
369 out (18),a\r
370 ret\r
371\r
372setdma:\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
379read:\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
386write:\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
395sectran:\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
408bcb: dw drvtbl\r
409 dw dirbuf\r
410 dw enddat\r
411 \r
072e0f3b
L
412bootdsk:ds 1\r
413bootspt:ds 1\r
414\r
415 .8080\r
416 endef\r
417 \r
418 end\r
419\r