CP/M Operating System Manual
Appendix E
A Skeletal Cold Start Loader
NOTE
This appendix consists of a cross-reference listing
generated by the XREF utility from the results of
assembly with MAC. The original source file used to
generate this listing is available
here.
1 ;THIS IS A SAMPLE COLD START LOADER, WHICH, WHEN
2 ;MODIFIED
3 ;RESIDES ON TRACK 00, SECTOR 01 (THE FIRST SECTOR ON THE
4 ;DISKETTE), WE ASSUME THAT THE CONTROLLER HAS LOADED
5 ;THIS SECTOR INTO MEMORY UPON SYSTEM START-UP (THIS
6 ;PROGRAM CAN BE KEYED-IN, OR CAN EXIST IN READ-ONLY
7 ;MEMORY
8 ;BEYOND THE ADDRESS SPACE OF THE CP/M VERSION YOU ARE
9 ;RUNNING). THE COLD START LOADER BRINGS THE CP/M SYSTEM
10 ;INTO MEMORY AT"LOADP" (3400H +"BIAS"). IN A 20K
11 ;MEMORY SYSTEM, THE VALUE OF"BIAS" IS 000H, WITH
12 ;LARGE
13 ;VALUES FOR INCREASED MEMORY SIZES (SEE SECTION 2).
14 ;AFTER
15 ;LOADING THE CP/M SYSTEM, THE COLD START LOADER
16 ;BRANCHES
17 ;TO THE "BOOT" ENTRY POINT OF THE BIOS, WHICH BEGINS AT
18 ; "BIOS" +"BIAS". THE COLD START LOADER IS NOT USED UN-
19 ;TIL THE SYSTEM IS POWERED UP AGAIN, AS LONG AS THE BIOS
20 ;IS NOT OVERWRITTEN. THE ORIGIN IS ASSUMED AT 0000H, AND
21 ;MUST BE CHANGED IF THE CONTROLLER BRINGS THE COLD START
22 ;LOADER INTO ANOTHER AREA, OR IF A READ-ONLY MEMORY
23 ;AREA
24 ;IS USED.
25 0000 ORG 0 ;BASE OF RAM IN
26 ;CP/M
27 0014 = MSIZE EQU 20 ;MIN MEM SIZE IN
28 ;KBYTES
29 0000 = BIAS EQU (MSIZE-20)*1024 ;OFFSET FROM 20K
30 ;SYSTEM
31 3400 = CCP EQU 3400H+BIAS ;BASE OF THE CCP
32 4A00 = BIOS EQU CCP+1600H ;BASE OF THE BIOS
33 0300 = BIOSL EQU 0300H ;LENGTH OF THE BIOS
34 4A00 = BOOT EQU BIOS
35 1900 = SIZE EQU BIOS+BIOSL-CCP ;SIZE OF CP/M
36 ;SYSTEM
37 0032 = SECTS EQU SIZE/128 ;# OF SECTORS TO LOAD
38 ;
39 ; BEGIN THE LOAD OPERATION
40
41 COLD:
42 0000 010200 LXI B,2 ;B=0, C=SECTOR 2
43 0003 1632 MVI D,SECTS ;D=# SECTORS TO
44 ;LOAD
45 0005 210034 LXI H,CCP ;BASE TRANSFER
46 ;ADDRESS
47 LSECT: ;LOAD THE NEXT SECTOR
48
49 ; INSERT INLINE CODE AT THIS POINT TO
50 ; READ ONE 128 BYTE SECTOR FROM THE
51 ; TRACK GIVEN IN REGISTER B, SECTOR
52 ; GIVEN IN REGISTER C,
53 ; INTO THE ADDRESS GIVEN BY <HL>
54 ;BRANCH TO LOCATION "COLD" IF A READ ERROR OCCURS
55 ;
56 ;
57 ;
58 ;
59 ; USER SUPPLIED READ OPERATION GOES
60 ; HERE...
61 ;
62 ;
63 ;
64 ;
65 0008 C36B00 JMP PAST$PATCH ;REMOVE THIS
66 ;WHEN PATCHED
67 000B DS 60H
68
69 PAST$PATCH:
70 ;GO TO NEXT SECTOR IF LOAD IS INCOMPLETE
71 006B 15 DCR D ;SECTS=SECTS-1
72 006C CA004A JZ BOOT ;HEAD. FOR THE BIOS
73
74 ; MORE SECTORS TO LOAD
75 ;
76
77 ;WE AREN'T USING A STACK, SO USE <SP> AS SCRATCH
78 ;REGISTER
79 ; TO HOLD THE LOAD ADDRESS INCREMENT
80 006F 318000 LXI SP,128 ;128 BYTES PER
81 ;SECTOR
82 0072 39 DAD SP ;<HL> = <HL> + 128
83 0073 0C INR C ;SECTOR=SECTOR + 1
84 0074 79 MOV A,C
85 0075 FE1B CPI 27 ;LAST SECTOR OF
86 ;TRACK?
87 0077 DA0800 JC LSECT ;NO, GO READ
88 ;ANOTHER
89
90 ;END OF TRACK, INCREMENT TO NEXT TRACK
91
92 007A 0E01 MVI C,1 ;SECTOR = 1
93 007C 04 INR B ;TRACK = TRACK + 1
94 007D C30800 JMP LSECT ;FOR ANOTHER GROUP
95 0080 END ;OF BOOT LOADER
BIAS 0000 29# 31
BIOS 4A00 32# 34 35
BIOSL 0300 33# 35
BOOT 4A00 34# 72
CCP 3400 31# 32 35 45
COLD 0000 41#
LSECT 0008 47# 87 94
MSIZE 0014 27# 29
PASTPATCH 006B 65 69#
SECTS 0032 37# 43
SIZE 1900 35# 37
Back to title page
     Next