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