]> cloudbase.mooo.com Git - avrcpm.git/blame - avrcpm/cpm/bios.asm
* avr/ipl.asm
[avrcpm.git] / avrcpm / cpm / bios.asm
CommitLineData
fdcfcd44
L
1; CP/M BIOS for avrcpm
2; Copyright (C) 2010 Sprite_tm
3;
4; This program is free software: you can redistribute it and/or modify
5; it under the terms of the GNU General Public License as published by
6; the Free Software Foundation, either version 3 of the License, or
7; (at your option) any later version.
8;
9; This program is distributed in the hope that it will be useful,
10; but WITHOUT ANY WARRANTY; without even the implied warranty of
11; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12; GNU General Public License for more details.
13;
14; You should have received a copy of the GNU General Public License
15; along with this program. If not, see <http://www.gnu.org/licenses/>.
53327777
L
16;
17; $Id$
18;
fdcfcd44 19
701f0287 20msize: equ 62 ;size of available RAM in k
fdcfcd44 21
701f0287 22bias: equ (msize-20) * 1024
14d4e184
L
23ccp: equ 3400h+bias ;base of cpm ccp
24bdos: equ ccp+806h ;base of bdos
25bios: equ ccp+1600h ;base of bios
26cdisk: equ 0004h ;current disk number (0 ... 15)
27iobyte: equ 0003h ;intel iobyte
28buff: equ 0080h ;default buffer address
701f0287
L
29retry: equ 3 ;max retries on disk i/o before error
30
31cr: equ 13
32lf: equ 10
33
db568140
L
34READ_FUNC: equ 7
35WRITE_FUNC: equ 6
36BOOT_FUNC: equ 5
37HOME_FUNC: equ 4
38
701f0287
L
39 org bios
40nsects: equ ($-ccp)/128 ;warm start sector count
41
fdcfcd44 42 jp boot
701f0287 43wboote:
fdcfcd44
L
44 jp wboot
45 jp const
46 jp conin
47 jp conout
48 jp list
49 jp punch
50 jp reader
51 jp home
52 jp seldsk
53 jp settrk
54 jp setsec
55 jp setdma
56 jp read
57 jp write
58 jp listst
59 jp sectran
60
701f0287
L
61signon:
62 db cr,lf
63 db msize/10+'0'
64 db msize - (msize/10)*10 + '0' ;modulo doesn't work?
65 db "k cp/m vers 2.2"
a54e22b7
L
66msgnl: db cr,lf,0
67
68const:
69 in a,(0)
70 ret
71
72conin:
73 in a,(0)
14d4e184 74 cp 0ffh
a54e22b7
L
75 jp nz,conin
76
77 in a,(1)
78 ret
79
80conout:
81 ld a,c
82 out (2),a
83 ret
84
85list:
86 ret
87
88listst:
89 ld a,0
90 ret
91
92punch:
93 ret
94
95reader:
14d4e184 96 ld a,01Fh
a54e22b7
L
97 ret
98
99prmsg:
100 ld a,(hl)
101 or a
102 ret z
103 push hl
104 ld c,a
105 call conout
106 pop hl
107 inc hl
108 jp prmsg
109
110prhex:
111 ld a,c
112 push af
113 rra
114 rra
115 rra
116 rra
117 call prhexdigit
118 pop af
119 ; fall thru
120
121prhexdigit:
14d4e184 122 and 00fh
a54e22b7
L
123 cp 10
124 jp c,prd1
14d4e184 125 add a,7
a54e22b7 126prd1:
14d4e184 127 add a,'0'
a54e22b7
L
128 ld c,a
129 jp conout
130
fdcfcd44 131
701f0287
L
132boot:
133 ld sp,buff
134 ld hl,signon
135 call prmsg
a54e22b7
L
136
137 xor a
138 ld (bootdsk),a
139 ld a,(dpb)
140 ld (bootspt),a
141
142 ld c,'I'-'A'
143 call seldsk
144 ld a,h
145 or l
146 jp z,boot1
147
148 ld de,10
149 add hl,de
150 ld e,(hl)
151 inc hl
152 ld d,(hl) ;de = dpb of first ram disk
153
154 ld hl,7
155 add hl,de
156 ld a,(hl) ;get drm
157 inc a
14d4e184 158 and 0fch
a54e22b7
L
159 rrca ;4 dir entries per sector
160 rrca ;Number of sectors to init
161 push af
162
163 ld bc,6
164 add hl,bc
165 ld c,(hl) ;Start track
166 push bc ;Save track
167
168; Check, if we have reserved tracks.
169 ld a,c
170 or a
171 jp z,boot0 ;Skip if not.
172
173; Save CPM to ram disk.
174
175 ld a,(de) ;sectors per track
176 ld (bootspt),a
177 ld a,'I'-'A'
178 ld (bootdsk),a
179 call home
180 ld b,nsects
181 ld c,0 ;track
182 ld d,1 ;sektor (0 based)
183 ld hl,ccp
184store1:
185 push bc
186 push de
187 push hl
188 ld c,d
189 ld b,0
190 call setsec
191 pop bc
192 push bc
193 call setdma
194 ld c,0
195 call write
196
197 pop hl
198 ld de,128
199 add hl,de
200 pop de
201 pop bc
202 dec b
203 jp z,boot0
204
205 inc d
206 ld a,(bootspt)
207 dec a
208 cp d ;if sector >= spt then change tracks
209 jp nc,store1
210
211 ld d,0
212 inc c
213 push bc
214 push de
215 push hl
216 ld b,0
217 call settrk
218 pop hl
219 pop de
220 pop bc
221 jp store1
222
223; Clear directory area of ram disk.
224
225boot0:
226 pop bc
227 call settrk
228 pop af
229 ld d,a ;d = # of sectors
230 ld e,0 ;e = sector
231 push de
232 ld hl,dirbuf ;Clear dirbuf
233 ld c,128
14d4e184 234 ld a,0E5h
a54e22b7
L
235boot_cl:
236 ld (hl),a
237 inc hl
238 dec c
239 jp nz,boot_cl
240
241 ld bc,dirbuf
242 call setdma
243 pop de
244boot_cl2:
245 push de
246 ld c,e
247 ld b,0
248 call setsec
249 ld c,0
250 call write
251 pop de
252 inc e
253 dec d
254 jp nz,boot_cl2
255
256boot1:
701f0287
L
257 xor a
258 ld (iobyte),a
259 ld (cdisk),a
260 jp gocpm
fdcfcd44 261
701f0287
L
262wboot: ;re-load CP/M
263 ld sp,buff
a54e22b7 264 ld a,1<<BOOT_FUNC ;init (de)blocking
db568140 265 out (22),a
a54e22b7
L
266 ld a,(bootdsk)
267 ld c,a
701f0287
L
268 call seldsk
269 call home
270 ld b,nsects
271 ld c,0 ;track
272 ld d,1 ;sektor (0 based)
273 ld hl,ccp
274load1:
275 push bc
276 push de
277 push hl
278 ld c,d
db568140 279 ld b,0
701f0287
L
280 call setsec
281 pop bc
282 push bc
283 call setdma
284 call read
285 cp 0 ;read error?
286 jp nz,wboot
287
288 pop hl
289 ld de,128
290 add hl,de
291 pop de
292 pop bc
293 dec b
294 jp z,gocpm
295
296 inc d
a54e22b7
L
297 ld a,(bootspt)
298 dec a
299 cp d ;if sector >= spt then change tracks
300 jp nc,load1
fdcfcd44 301
701f0287
L
302 ld d,0
303 inc c
304 push bc
305 push de
306 push hl
db568140 307 ld b,0
701f0287
L
308 call settrk
309 pop hl
310 pop de
311 pop bc
312 jp load1
313
314gocpm:
315 ld a,0c3h
316 ld (0),a
317 ld hl,wboote
318 ld (1),hl
319 ld (5),a
320 ld hl,bdos
321 ld (6),hl
322
323 ld bc,buff
324 call setdma
325 ld a,(cdisk)
326 ld c,a
327 jp ccp
66faee4c 328
a54e22b7
L
329seldsk:
330 ld hl,dphtab
331 ld b,0
332 add hl,bc
333 add hl,bc
334 ld a,(hl) ;get table entry for selected disk
335 inc hl
336 ld h,(hl)
337 ld l,a
338 or h ;no entry, no disk
339 ret z ;
340
341 ld a,c
342 out (15),a
343 in a,(15) ;querry, if disk exists
344 or a ;0 = disk is ok
345 ret z
346 ld hl,0 ;error return code
fdcfcd44
L
347 ret
348
db568140
L
349home:
350 ld a,1<<HOME_FUNC
351 out (22),a
352
353 ld bc,0 ; same as seek to track 0
fdcfcd44 354settrk:
fdcfcd44
L
355 ld a,c
356 out (16),a
db568140
L
357 ld a,b
358 out (17),a
fdcfcd44
L
359 ret
360
361setsec:
fdcfcd44
L
362 ld a,c
363 out (18),a
fdcfcd44
L
364 ret
365
366setdma:
fdcfcd44
L
367 ld a,c
368 out (20),a
369 ld a,b
370 out (21),a
fdcfcd44
L
371 ret
372
373read:
db568140 374 ld a,1<<READ_FUNC
fdcfcd44 375 out (22),a
a54e22b7
L
376 in a,(22)
377 and 1
fdcfcd44
L
378 ret
379
380write:
a54e22b7
L
381 ld a,c
382 and 3 ;mask write type
383 or 1<<WRITE_FUNC
db568140 384 out (22),a
a54e22b7
L
385 in a,(22)
386 and 1
fdcfcd44
L
387 ret
388
fdcfcd44
L
389sectran:
390 ;translate sector bc using table at de, res into hl
fdcfcd44
L
391 ld h,b
392 ld l,c
db568140
L
393 ld a,d
394 or e
395 ret z
396 ex de,hl
397 add hl,bc
398 ld l,(hl)
399 ld h,0
fdcfcd44
L
400 ret
401
a54e22b7
L
402dphtab:
403 dw dpe0
404 dw dpe1
405 dw dpe2
406 dw dpe3
407 dw 0
408 dw 0
409 dw 0
410 dw 0
411 dw dperd0
412 dw 0
413 dw 0
414 dw 0
415 dw 0
416 dw 0
417 dw 0
418 dw 0
419
701f0287 420
fdcfcd44
L
421
422;Disk Parameter Header
66faee4c
L
423dpbase:
424dpe0: dw 0 ;XLT: No sector translation table
425 dw 0 ;000: Scratchpad
426 dw 0 ;000: Scratchpad
427 dw 0 ;000: Scratchpad
428 dw dirbuf ;DIRBUF: Address of a dirbuff scratchpad
429 dw dpb ;DPB: Address of a disk parameter block
430 dw chk0 ;CSV: Address of scratchpad area for changed disks
431 dw all0 ;ALV: Address of an allocation info sratchpad
432dpe1: dw 0 ;XLT: No sector translation table
433 dw 0 ;000: Scratchpad
434 dw 0 ;000: Scratchpad
435 dw 0 ;000: Scratchpad
436 dw dirbuf ;DIRBUF: Address of a dirbuff scratchpad
437 dw dpb ;DPB: Address of a disk parameter block
438 dw chk1 ;CSV: Address of scratchpad area for changed disks
439 dw all1 ;ALV: Address of an allocation info sratchpad
440dpe2: dw 0 ;XLT: No sector translation table
441 dw 0 ;000: Scratchpad
442 dw 0 ;000: Scratchpad
443 dw 0 ;000: Scratchpad
444 dw dirbuf ;DIRBUF: Address of a dirbuff scratchpad
445 dw dpb ;DPB: Address of a disk parameter block
446 dw chk2 ;CSV: Address of scratchpad area for changed disks
447 dw all2 ;ALV: Address of an allocation info sratchpad
448dpe3: dw 0 ;XLT: No sector translation table
db568140
L
449 dw 0 ;000: Scratchpad
450 dw 0 ;000: Scratchpad
451 dw 0 ;000: Scratchpad
452 dw dirbuf ;DIRBUF: Address of a dirbuff scratchpad
453 dw dpb ;DPB: Address of a disk parameter block
66faee4c
L
454 dw chk3 ;CSV: Address of scratchpad area for changed disks
455 dw all3 ;ALV: Address of an allocation info sratchpad
fdcfcd44 456
a54e22b7
L
457dperd0: dw 0 ;XLT: No sector translation table
458 dw 0 ;000: Scratchpad
459 dw 0 ;000: Scratchpad
460 dw 0 ;000: Scratchpad
461 dw dirbuf ;DIRBUF: Address of a dirbuff scratchpad
462 dw dpbrd ;DPB: Address of a disk parameter block
463 dw chkrd0 ;CSV: Address of scratchpad area for changed disks
464 dw allrd0 ;ALV: Address of an allocation info sratchpad
465
466
467dpb: dw 26 ;SPT: sectors per track
db568140
L
468 db 3 ;BSH: data allocation block shift factor
469 db 7 ;BLM: Data Allocation Mask
470 db 0 ;Extent mask
471 dw 242 ;DSM: Disk storage capacity
472 dw 63 ;DRM, no of directory entries
473 db 192 ;AL0
474 db 0 ;AL1
475 dw 16 ;CKS, size of dir check vector
476 dw 2 ;OFF, no of reserved tracks
477
a54e22b7
L
478dpbrd: dw 32 ;SPT: sectors per track
479 db 3 ;BSH: data allocation block shift factor
480 db 7 ;BLM: Data Allocation Mask
481 db 0 ;Extent mask
482 dw 55 ;DSM: Disk storage capacity
14d4e184 483 dw 31 ;DRM, no of directory entries
a54e22b7
L
484 db 128 ;AL0
485 db 0 ;AL1
486 dw 0 ;CKS, size of dir check vector
487 dw 2 ;OFF, no of reserved tracks
488
489bootdsk:ds 1
490bootspt:ds 1
fdcfcd44
L
491
492dirbuf:
493 ds 128
494
66faee4c
L
495chk0: ds 16
496all0: ds 31
497chk1: ds 16
498all1: ds 31
499chk2: ds 16
500all2: ds 31
501chk3: ds 16
502all3: ds 31
a54e22b7
L
503chkrd0: ds 0
504allrd0: ds 7
fdcfcd44 505
701f0287 506end
db568140 507