mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
6.4 KiB
109 lines
6.4 KiB
.pl 51
|
|
.nf
|
|
.bp 1
|
|
.ft E-%
|
|
Appendix E
|
|
|
|
A Skeletal Cold Start Loader
|
|
|
|
|
|
|
|
;this is a sample cold start loader, which, when
|
|
;modified
|
|
;resides on track 00, sector 01 (the first sector on the
|
|
;diskette). we assume that the controller has loaded
|
|
;this sector into memory upon system start-up (this
|
|
;program can be keyed-in, or can exist in read-only
|
|
;memory
|
|
;beyond the address space of the cp/m version you are
|
|
;running). the cold start loader brings the cp/m system
|
|
;into memory at "loadp" (3400h + "bias"). in a 20k
|
|
;memory system, the value of "bias" is 000h, with
|
|
;large
|
|
;values for increased memory sizes (see section 2).
|
|
;after
|
|
;loading the cp/m system, the cold start loader
|
|
;branches
|
|
;to the "boot" entry point of the bios, which beings at
|
|
;"bios" + "bias". the cold start loader is not used un-
|
|
;til the system is powered up again, as long as the bios
|
|
;is not overwritten. the origin is assumed at 0000h, and
|
|
;must be changed if the controller brings the cold start
|
|
;loader into another area, or if a read-only memory
|
|
;area
|
|
;is used.
|
|
|
|
0000 org 0 ;base of ram in
|
|
;cp/m
|
|
|
|
0014 = msize equ 20 ;min mem size in
|
|
;kbytes
|
|
0000 = bias equ (msize-20)*1024 ;offset from 20k
|
|
;system
|
|
3400 = ccp equ 3400h+bias ;base of the ccp
|
|
4a00 = bios equ ccp+1600h ;base of the bios
|
|
0300 = biosl equ 0300h ;length of the bios
|
|
4a00 = boot equ bios
|
|
1900 = size equ bios+biosl-ccp ;size of cp/m
|
|
;system
|
|
0032 = sects equ size/128 ;# of sectors to load
|
|
|
|
; begin the load operation
|
|
|
|
cold:
|
|
0000 010200 lxi b,2 ;b=0, c=sector 2
|
|
0003 1632 mvi d,sects ;d=# sectors to
|
|
;load
|
|
0005 210034 lxi h,ccp ;base transfer
|
|
;address
|
|
lsect: ;load the next sector
|
|
|
|
; insert inline code at this point to
|
|
; read one 128 byte sector from the
|
|
; track given in register b, sector
|
|
; given in register c,
|
|
; into the address given by <hl>
|
|
;branch to location "cold" if a read error occurs
|
|
;
|
|
;
|
|
; user supplied read operation goes
|
|
; here...
|
|
;
|
|
;
|
|
|
|
0008 c36b00 jmp past$patch ;remove this
|
|
;when patched
|
|
000b ds 60h
|
|
|
|
past$patch:
|
|
;go to next sector if load is incomplete
|
|
006b 15 dcr d ;sects=sects-1
|
|
006c ca004a jz boot ;head for the bios
|
|
|
|
; more sectors to load
|
|
;
|
|
;we aren't using a stack, so use <sp> as scratch
|
|
;register
|
|
; to hold the load address increment
|
|
|
|
006f 318000 lxi sp,128 ;128 bytes per
|
|
;sector
|
|
0072 39 dad sp ;<hl> = <hl> +
|
|
128
|
|
0073 0c inr c ;sector=sector + 1
|
|
0074 79 mov a,c
|
|
0075 felb cpi 27 ;last sector of
|
|
;track?
|
|
0077 da0800 jc lsect ;no, go read
|
|
;another
|
|
|
|
;end of track, increment to next track
|
|
|
|
007a 0e01 mvi c,l ;sector = 1
|
|
007c 04 inr b ;track = track + 1
|
|
007d c30800 jmp lsect ;for another group
|
|
0080 end ;of boot loader
|
|
|
|
|
|
.nx appf
|
|
|