CP/M Operating System Manual
Appendix C
A Skeletal GETSYS/PUTSYS Program
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 ; COMBINED GETSYS AND PUTSYS PROGRAMS FROM
2 ; SEC 6.4
3 ;
4 ; START THE PROGRAMS AT THE BASE OF THE TPA
5 0100 ORG 0100H
6
7 0014 = MSIZE EQU 20 ;SIZE OF CP/M IN KBYTES
8
9 ;"BIAS" IS THE AMOUNT TO ADD TO ADDRESSES FOR > 20K
10 ; (REFERRED TO AS"B" THROUGHOUT THE TEXT)
11 0000 = BIAS EQU (MSIZE-20)*1024
12 3400 = CCP EQU 3400H+BIAS
13 3C00 = BDOS EQU CCP+0800H
14 4A00 = BIOS EQU CCP+1600H
15
16 ; GETSYS PROGRAMS TRACKS 0 AND 1 TO MEMORY AT 3880H + BIAS
17 ; REGISTER USAGE
18 ; A (SCRATCH REGISTER)
19 ; B TRACK COUNT (0...76)
20 ; C SECTOR COUNT (1...26)
21 ; D,E (SCRATCH REGISTER PAIR)
22 ; H,L LOAD ADDRESS
23 ; SP SET TO TRACK ADDRESS
24
25 GSTART: ;START OF GETSYS
26 0100 318033 LXI SP,CCP-0080H ;CONVENIENT PLACE
27 0103 218033 LXI H,CCP-0080H ;SET INITIAL LOAD
28 0106 0600 MVI B,0 ;START WITH TRACK
29 RD$TRK: ;READ NEXT TRACK
30 0108 0E01 MVI C,1 ;EACH TRACK START
31 RD$SEC:
32 010A CD0003 CALL READ$SEC ;GET THE NEXT SECTOR
33 010D 118000 LXI D,128 ;OFFSET BY ONE SECTOR
34 0110 19 DAD D ; (HL=HL+128)
35 0111 0C INR C ;NEXT SECTOR
36 0112 79 MOV A,C ;FETCH SECTOR NUMBER
37 0113 FE1B CPI 27 ;AND SEE IF LAST
38 0115 DA0A01 JC RDSEC ;<, DO ONE MORE
39
40 ;ARRIVE HERE AT END OF TRACK, MOVE TO NEXT TRACK
41
42 0118 04 INR B ;TRACK = TRACK+1
43 0119 78 MOV A,B ;CHECK FOR LAST
44 011A FE02 CPI 2 ;TRACK = 2 ?
45 011C DA0801 JC RD$TRK ;<, DO ANOTHER
46
47 ;ARRIVE HERE AT END OF LOAD, HALT FOR LACK OF ANYTHING
48 ;BETTER
49
50 011F FB EI
51 0120 76 HLT
52
53 ; PUTSYS PROGRAM, PLACES MEMORY IMAGE
54 ; STARTING AT
55 ; 3880H + BIAS BACK TO TRACKS 0 AND 1
56 ; START THIS PROGRAM AT THE NEXT PAGE BOUNDARY
57 0200 ORG ($+0100H) AND 0FF00H
58 PUT$SYS:
59 0200 318033 LXI SP,CCP-0080H ;CONVENIENT PLACE
60 0203 218033 LXI H,CCP-0080H ;START OF DUMP
61 0206 0600 MVI B,0 ;START WITH TRACK
62 WR$TRK:
63 0208 0605 MVI B,L ;START WITH SECTOR
64 WR$SEC:
65 020A CD0004 CALL WRITE$SEC ;WRITE ONE SECTOR
66 020D 118000 LXI D,128 ;LENGTH OF EACH
67 0210 19 DAD D ;<HL>=<HL> + 128
68 0211 0C INR C ; <C>=<C> + 1
69 0212 79 MOV A,C ;SEE IF
70 0213 FE1B CPI 27 ;PAST END OF TRACK
71 0215 DA0A02 JC WR$SEC ;NO, DO ANOTHER
72
73 ;ARRIVE HERE AT END OF TRACK, MOVE TO NEXT TRACK
74
75 0218 04 INR B ;TRACK = TRACK+1
76 0219 78 MOV A,B ;SEE IF
77 021A FE02 CPI 2 ;LAST TRACK
78 021C DA0802 JC WR$TRK ;NO, DO ANOTHER
79
80
81 ; DONE WITH PUTSYS, HALT FOR LACK OF ANYTHING
82 ; BETTER
83 021F FB EI
84 0220 76 HLT
85
86
87 ;USER SUPPLIED SUBROUTINES FOR SECTOR READ AND WRITE
88
89 ; MOVE TO NEXT PAGE BOUNDARY
90 0300 ORG ($+0100H) AND 0FF00H
91
92 READ$SEC:
93 ;READ THE NEXT SECTOR
94 ;TRACK IN <B>,
95 ;SECTOR IN <C>
96 ;DMAADDR IN<HL>
97
98 0300 C5 PUSH B
99 0301 E5 PUSH H
100
101 ;USER DEFINED READ OPERATION GOES HERE
102 0302 DS 64
103 0342 E1 POP H
104 0343 C1 POP B
105 0344 C9 RET
106
107 0400 ORG ($+100H) AND 0FF00H ;ANOTHER PAGE
108 ; BOUNDARY
109 WRITE$SEC:
110
111 ;SAME PARAMETERS AS READ$SEC
112
113 0400 C5 PUSH B
114 0401 E5 PUSH H
115
116 ;USER DEFINED WRITE OPERATION GOES HERE
117 0402 DS 64
118 0442 E1 POP H
119 0443 C1 POP B
120 0444 C9 RET
121
122 ;END OF GETSYS/PUTSYS PROGRAM
123
124 0445 END
BDOS 3C00 13#
BIAS 0000 11# 12
BIOS 4A00 14#
CCP 3400 12# 13 14 26 27 59 60
GSTART 0100 25#
MSIZE 0014 7# 11
PUTSYS 0200 58#
RDSEC 010A 31# 38
RDTRK 0108 29# 45
READSEC 0300 32 92#
WRITESEC 0400 65 109#
WRSEC 020A 64# 71
WRTRK 0208 62# 78
Back to title page
     Next