]> cloudbase.mooo.com Git - avrcpm.git/blame - cpm/BIOS.MAC
* cpm/Makefile
[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
2396f399 52;drvtbl: dtbl <dpha,dphb,dphc,dphd, , , , ,dphi,dphj,dphk,dphl>\r
5482d75f
L
53;drvtbl: dtbl <dpha, , , , , , , ,dphi,dphj,dphk,dphl>\r
54drvtbl: dtbl < , , , , , , , ,dphi,dphj,dphk,dphl>\r
072e0f3b
L
55\r
56 ; Name spt bls dks dir cks off\r
5482d75f
L
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
072e0f3b
L
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
5482d75f 65;dpha: dph dpb243\r
072e0f3b
L
66;dphb: dph dpb243\r
67;dphc: dph dpb243\r
68;dphd: dph dpb243\r
2396f399
L
69;dpha: dph dp8192s\r
70;dphb: dph dp8192s\r
71;dphc: dph dp8192\r
72;dphd: dph dp8192\r
072e0f3b
L
73dphi: dph rd1016\r
74dphj: dph rd1024\r
75dphk: dph rd1024\r
76dphl: dph rd0960\r
77\r
78 .z80\r
79 \r
80signon:\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
85msgnl: db cr,lf,0\r
86\r
2396f399
L
87msgnodisk:\r
88 db "No disk!"\r
89 db cr,lf,0\r
90\r
072e0f3b
L
91const:\r
92 in a,(0)\r
93 ret\r
94\r
95conin:\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
103conout:\r
104 ld a,c\r
2396f399 105 out (1),a\r
072e0f3b
L
106 ret\r
107\r
108list:\r
109 ret\r
110\r
111listst:\r
112 ld a,0\r
113 ret\r
114\r
115punch:\r
116 ret\r
117\r
118reader:\r
119 ld a,01Fh\r
120 ret\r
121\r
122prmsg:\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
133prhex:\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
144prhexdigit:\r
145 and 00fh\r
146 cp 10\r
147 jp c,prd1\r
148 add a,7\r
149prd1:\r
150 add a,'0'\r
151 ld c,a\r
152 jp conout\r
153\r
072e0f3b
L
154boot:\r
155 ld sp,buff\r
156 ld hl,signon\r
157 call prmsg\r
158 \r
2396f399
L
159 ld a,low bcb\r
160 out (13),a\r
161 ld a, high bcb\r
162 out (14),a\r
163\r
072e0f3b
L
164 xor a\r
165 ld (bootdsk),a\r
166 ld e,a\r
2396f399
L
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
173boot0:\r
174 call getdpb\r
175 ld a,(de) ;dpb[0] is sectors_per_track\r
072e0f3b 176 ld (bootspt),a\r
2396f399 177 ld e,0\r
072e0f3b
L
178 ld c,'I'-'A'\r
179 call seldsk\r
92202636 180 jp z,boot1 ;no ram disk\r
072e0f3b 181\r
2396f399 182 call getdpb ;de = dpb of first ram disk\r
072e0f3b
L
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
205store1:\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
244boot1: \r
245 xor a\r
246 ld (iobyte),a\r
247 ld (cdisk),a\r
248 jp gocpm \r
249\r
250wboot: ;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
262load1:\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
302gocpm:\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
317msgSel: db 13,10,"Sel: ",0\r
318\r
2396f399
L
319getdpb:\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
072e0f3b 327seldsk:\r
2396f399
L
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
2396f399 334 ld hl,0\r
92202636 335 in a,(15) ;querry, if disk exists\r
2396f399 336 or a\r
92202636 337 ret z\r
2396f399
L
338getdph:\r
339 ld hl,drvtbl\r
072e0f3b
L
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
2396f399 347 or h ;return zero, if no entry (no disk)\r
072e0f3b 348 ret\r
2396f399 349 \r
072e0f3b
L
350\r
351home:\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
356settrk:\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
363setsec:\r
364 ld a,c\r
365 out (18),a\r
366 ret\r
367\r
368setdma:\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
375read:\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
382write:\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
391sectran:\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
2396f399
L
404bcb: dw drvtbl\r
405 dw dirbuf\r
406 dw enddat\r
407 \r
072e0f3b
L
408bootdsk:ds 1\r
409bootspt:ds 1\r
410\r
411 .8080\r
412 endef\r
413 \r
414 end\r
415\r