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

.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