mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 09:24:19 +00:00
356 lines
17 KiB
Plaintext
356 lines
17 KiB
Plaintext
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 1
|
||
|
||
1
|
||
2 ;****************************************************************
|
||
3 ;* *
|
||
4 ;* TCOPY - Example program to write the system track *
|
||
5 ;* for a Concurrent CP/M-86 Boot Disk on the *
|
||
6 ;* IBM Personel Computer *
|
||
7 ;* *
|
||
8 ;****************************************************************
|
||
9
|
||
10 ; This program is used to read a binary image file of
|
||
11 ; track 0. This track is used to bootstrap Concurrent
|
||
12 ; CP/M-86. The file TCOPY reads has no CMD header and
|
||
13 ; must be the same size as the track we are going
|
||
14 ; to write.
|
||
15
|
||
16 ; This program is intended to serve as an example
|
||
17 ; to be modified by the OEM for differently sized loaders,
|
||
18 ; and differently sized system track(s).
|
||
19
|
||
20 ; Note: TCOPY must be run under CP/M-86 and not Concurrent
|
||
21 ; CP/M-86 since TCOPY performs direct BIOS calls.
|
||
22
|
||
23 ; The command
|
||
24 ; GENCMD TCOPY
|
||
25 ; is used to generate the CMD form of this program.
|
||
26
|
||
27 title 'TCOPY - Copy Track 0'
|
||
28
|
||
29 ;CP/M-86, CCP/M-86 function names
|
||
30
|
||
31 ;console functions
|
||
32 0001 c_read equ 1
|
||
33 0009 c_writebuf equ 9
|
||
34
|
||
35 ;file functions
|
||
36 000F f_open equ 15
|
||
37 0021 f_readrand equ 33
|
||
38 001A f_setdma equ 26
|
||
39 0033 f_setdmaseg equ 51
|
||
40
|
||
41 ;drive functions
|
||
42 0019 drv_get equ 25
|
||
43
|
||
44 ;system functions
|
||
45 0000 s_termcpm equ 0
|
||
46 0032 s_dirbios equ 50
|
||
47
|
||
48 ;direct Bios Parameter Block
|
||
49 0000 bpb_func equ byte ptr 0
|
||
50 0001 bpb_cx equ word ptr 1
|
||
51 0003 bpb_dx equ word ptr 3
|
||
52
|
||
53
|
||
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 2
|
||
|
||
54
|
||
55 ;ASCII linefeed and carriage return
|
||
56 000A lf equ 10
|
||
57 000D cr equ 13
|
||
58
|
||
59 ;how many 128 byte records to read for a loader image
|
||
60 0020 records_to_read equ 8 * 4
|
||
61 ;8 = number of physical sectors per track
|
||
62 ;4 = number of 128 sectors per
|
||
63 ;physical sector
|
||
64
|
||
65 cseg ;use CCP stack
|
||
66 0000 B109 mov cl,c_writebuf ;display sign on message
|
||
67 0002 BA0001 mov dx,offset sign_on_msg
|
||
68 0005 CDE0 int 224
|
||
69 0007 B119 mov cl,drv_get ;get default drive number
|
||
70 0009 CDE0 int 224
|
||
71 000B 84C0 test al,al ;must run on drive A:
|
||
72 000D 7406 0015 jz drive_ok
|
||
73 000F BAAB01 mov dx,offset drive_msg
|
||
74 0012 E9D200 00E7 jmp error
|
||
75
|
||
76 drive_ok:
|
||
77 0015 B10F mov cl,f_open ;open the file given as
|
||
78 0017 BA5C00 mov dx,offset fcb ;the 1st command parameter,
|
||
79 001A CDE0 int 224 ;it is put at 05CH by
|
||
80 001C 3CFF cmp al,0ffh ;the program load
|
||
81 001E 7506 0026 jne file_ok
|
||
82 0020 BAC701 mov dx,offset open_msg
|
||
83 0023 E9C100 00E7 jmp error
|
||
84
|
||
85 file_ok:
|
||
86 0026 C7063A123502 mov current_dma,offset track0_buffer
|
||
87 002C C7067D000000 mov r0,0 ;start with sector 0, assume
|
||
88 0032 B92000 mov cx,records_to_read ;no CMD header in the file
|
||
89
|
||
90 file_read:
|
||
91 0035 51 push cx ;keep the record count
|
||
92 0036 B11A mov cl,f_setdma
|
||
93 0038 8B163A12 mov dx,current_dma
|
||
94 003C CDE0 int 224
|
||
95 003E B121 mov cl,f_readrand ;user r0,r1,r2 for random
|
||
96 0040 BA5C00 mov dx,offset fcb ;reads
|
||
97 0043 CDE0 int 224
|
||
98 0045 59 pop cx ;restore the record count
|
||
99 0046 84C0 test al,al
|
||
100 0048 7406 0050 jz read_ok
|
||
101 004A BA0402 mov dx,offset read_msg
|
||
102 004D E99700 00E7 jmp error
|
||
103 read_ok:
|
||
104 0050 81063A128000 add current_dma,128 ;set the DMA for the next sector
|
||
105 0056 FF067D00 inc r0 ;add one to the random record field
|
||
106 005A E2D9 0035 loop file_read
|
||
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 3
|
||
|
||
107
|
||
108
|
||
109 ; We have the Track 0 image in RAM
|
||
110 ; Ask for destination diskette
|
||
111
|
||
112 next_diskette:
|
||
113
|
||
114 005C B109 mov cl,c_writebuf
|
||
115 005E BA4A01 mov dx,offset new_disk_msg
|
||
116 0061 CDE0 int 224
|
||
117
|
||
118 0063 B101 mov cl,c_read ;wait for a keystroke
|
||
119 0065 CDE0 int 224
|
||
120
|
||
121 ; Using CP/M-86 function 50, Direct bios call,
|
||
122 ; write the track image in TRACK0_BUFFER to
|
||
123 ; track 0, on drive A:.
|
||
124
|
||
125 0067 E82F00 0099 call select_disk ;select A:
|
||
126 006A E83400 00A1 call set_track ;set track to 0
|
||
127 006D E83700 00A7 call set_dmaseg ;set DMA segment = DS
|
||
128
|
||
129 0070 C7063C120000 mov current_sector,0 ;sectors are relative to 0 in BIOS
|
||
130 0076 C7063A123502 mov current_dma,offset track0_buffer
|
||
131 007C B92000 mov cx,32 ;number of 128 byte sectors to write
|
||
132 next_sector:
|
||
133 007F 51 push cx ;save sector count
|
||
134 0080 E82A00 00AD call set_dmaoff
|
||
135 0083 E82F00 00B5 call set_sector
|
||
136 0086 E83400 00BD call write_sector
|
||
137 0089 81063A128000 add current_dma,128 ;next area of memory to write
|
||
138 008F FF063C12 inc current_sector ;next sector number
|
||
139 0093 59 pop cx ;restore sector count
|
||
140 0094 E2E9 007F loop next_sector
|
||
141 0096 E93A00 00D3 jmp track_ok
|
||
142
|
||
143 select_disk:
|
||
144 0099 B009 mov al,9 ;BIOS function number of seldsk
|
||
145 009B 33C9 xor cx,cx ;always drive A:
|
||
146 009D 8BD1 mov dx,cx
|
||
147 009F EB20 00C1 jmps bios
|
||
148 set_track:
|
||
149 00A1 B00A mov al,10 ;BIOS function number of settrk
|
||
150 00A3 33C9 xor cx,cx ;go to track 0
|
||
151 00A5 EB1A 00C1 jmps bios
|
||
152 set_dmaseg:
|
||
153 00A7 B011 mov al,17 ;BIOS function number of setdmab
|
||
154 00A9 8CD9 mov cx,ds ;dma segment we want to use
|
||
155 00AB EB14 00C1 jmps bios
|
||
156 set_dmaoff:
|
||
157 00AD B00C mov al,12 ;BIOS function number of setdma
|
||
158 00AF 8B0E3A12 mov cx,current_dma
|
||
159 00B3 EB0C 00C1 jmps bios
|
||
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 4
|
||
|
||
160
|
||
161 set_sector:
|
||
162 00B5 B00B mov al,11 ;BIOS function number of setsec
|
||
163 00B7 8B0E3C12 mov cx,current_sector
|
||
164 00BB EB04 00C1 jmps bios
|
||
165 write_sector:
|
||
166 00BD B00E mov al,14 ;BIOS function number of write sector
|
||
167 00BF EB00 00C1 jmps bios ;error checking can be added here
|
||
168 bios:
|
||
169 00C1 BB3512 mov bx,offset bpb ;fill in BIOS Paramenter Block
|
||
170 00C4 8807 mov bpb_func[bx],al
|
||
171 00C6 894F01 mov bpb_cx[bx],cx
|
||
172 00C9 895703 mov bpb_dx[bx],dx
|
||
173 00CC B132 mov cl,s_dirbios
|
||
174 00CE 8BD3 mov dx,bx
|
||
175 00D0 CDE0 int 224
|
||
176 00D2 C3 ret
|
||
177
|
||
178
|
||
179 track_ok:
|
||
180 00D3 B109 mov cl,c_writebuf ;does the user want to write
|
||
181 00D5 BA8701 mov dx,offset continue_msg ;to another diskette ?
|
||
182 00D8 CDE0 int 224
|
||
183 00DA B101 mov cl,c_read ;get response
|
||
184 00DC CDE0 int 224
|
||
185 00DE 245F and al,05FH ;make upper case
|
||
186 00E0 3C59 cmp al,'Y'
|
||
187 00E2 750C 00F0 jne done
|
||
188 00E4 E975FF 005C jmp next_diskette
|
||
189
|
||
190 error:
|
||
191 00E7 52 push dx
|
||
192 00E8 E80C00 00F7 call crlf
|
||
193 00EB 5A pop dx
|
||
194 00EC B109 mov cl,c_writebuf
|
||
195 00EE CDE0 int 224
|
||
196
|
||
197 done:
|
||
198 00F0 B90000 mov cx,s_termcpm
|
||
199 00F3 8BD1 mov dx,cx
|
||
200 00F5 CDE0 int 224
|
||
201
|
||
202 crlf:
|
||
203 00F7 BAA801 mov dx,offset crlf_msg
|
||
204 00FA B109 mov cl,c_writebuf
|
||
205 00FC CDE0 int 224
|
||
206 00FE C3 ret
|
||
207
|
||
208
|
||
209
|
||
210 dseg
|
||
211
|
||
212 org 5ch
|
||
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 5
|
||
|
||
213
|
||
214 005C fcb rb 33
|
||
215 007D 0000 r0 dw 0
|
||
216 007F 00 r3 db 0
|
||
217
|
||
218 org 100h
|
||
219 0100 4578616D706C sign_on_msg db 'Example TCOPY for IBM PC', cr, lf
|
||
220 652054434F50
|
||
221 5920666F7220
|
||
222 49424D205043
|
||
223 0D0A
|
||
224 011A 526561647320 db 'Reads track image file and writes '
|
||
225 747261636B20
|
||
226 696D61676520
|
||
227 66696C652061
|
||
228 6E6420777269
|
||
229 74657320
|
||
230 013C 6974206F6E20 db 'it on track 0$'
|
||
231 747261636B20
|
||
232 3024
|
||
233 014A 0D0A50757420 new_disk_msg db cr,lf,'Put destination diskette in A:'
|
||
234 64657374696E
|
||
235 6174696F6E20
|
||
236 6469736B6574
|
||
237 746520696E20
|
||
238 413A
|
||
239 016A 0D0A db cr,lf
|
||
240 016C 537472696B65 db 'Strike any key when ready $'
|
||
241 20616E79206B
|
||
242 657920776865
|
||
243 6E2072656164
|
||
244 792024
|
||
245 0187 0D0A57726974 continue_msg db cr,lf,'Write another Track 0 (Y/N) ? $'
|
||
246 6520616E6F74
|
||
247 686572205472
|
||
248 61636B203020
|
||
249 28592F4E2920
|
||
250 3F2024
|
||
251
|
||
252 01A8 0D0A24 crlf_msg db cr,lf,'$'
|
||
253
|
||
254
|
||
255 01AB 54434F505920 drive_msg db 'TCOPY runs only on drive A:$'
|
||
256 72756E73206F
|
||
257 6E6C79206F6E
|
||
258 206472697665
|
||
259 20413A24
|
||
260 01C7 476976652066 open_msg db 'Give file name containing track 0 '
|
||
261 696C65206E61
|
||
262 6D6520636F6E
|
||
263 7461696E696E
|
||
264 672074726163
|
||
265 6B203020
|
||
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 6
|
||
|
||
266
|
||
267 01E9 696D6167652C db 'image, after TCOPY command$'
|
||
268 206166746572
|
||
269 2054434F5059
|
||
270 20636F6D6D61
|
||
271 6E6424
|
||
272 0204 46696C652069 read_msg db 'File is not long enough$'
|
||
273 73206E6F7420
|
||
274 6C6F6E672065
|
||
275 6E6F75676824
|
||
276 021C 4572726F7220 write_msg db 'Error writing on track 0$'
|
||
277 77726974696E
|
||
278 67206F6E2074
|
||
279 7261636B2030
|
||
280 24
|
||
281
|
||
282 0235 track0_buffer rb 1000H ;4K tracks
|
||
283
|
||
284 1235 bpb rb 5 ;direct Bios Parameter Block
|
||
285
|
||
286 123A 0000 current_dma dw 0
|
||
287 123C 0000 current_sector dw 0
|
||
288
|
||
289
|
||
290 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 3%
|
||
CP/M ASM86 1.1 SOURCE: TCOPY.A86 TCOPY - Copy Track 0 PAGE 007
|
||
|
||
BIOS 00C1 L 147 151 155 159 164 167 168#
|
||
BPB 1235 V 169 284#
|
||
BPBCX 0001 N 50# 171
|
||
BPBDX 0003 N 51# 172
|
||
BPBFUNC 0000 N 49# 170
|
||
CONTINUEMSG 0187 V 181 245#
|
||
CR 000D N 57# 219 233 239 245 252
|
||
CREAD 0001 N 32# 118 183
|
||
CRLF 00F7 L 192 202#
|
||
CRLFMSG 01A8 V 203 252#
|
||
CS SREG V
|
||
CURRENTDMA 123A V 86 93 104 130 137 158 286#
|
||
CURRENTSECTOR 123C V 129 138 163 287#
|
||
CWRITEBUF 0009 N 33# 66 114 180 194 204
|
||
DONE 00F0 L 187 197#
|
||
DRIVEMSG 01AB V 73 255#
|
||
DRIVEOK 0015 L 72 76#
|
||
DRVGET 0019 N 42# 69
|
||
DS SREG V 154
|
||
ERROR 00E7 L 74 83 102 190#
|
||
ES SREG V
|
||
FCB 005C V 78 96 214#
|
||
FILEOK 0026 L 81 85#
|
||
FILEREAD 0035 L 90# 106
|
||
FOPEN 000F N 36# 77
|
||
FREADRAND 0021 N 37# 95
|
||
FSETDMA 001A N 38# 92
|
||
FSETDMASEG 0033 N 39#
|
||
LF 000A N 56# 219 233 239 245 252
|
||
NEWDISKMSG 014A V 115 233#
|
||
NEXTDISKETTE 005C L 112# 188
|
||
NEXTSECTOR 007F L 132# 140
|
||
OPENMSG 01C7 V 82 260#
|
||
R0 007D V 87 105 215#
|
||
R3 007F V 216#
|
||
READMSG 0204 V 101 272#
|
||
READOK 0050 L 100 103#
|
||
RECORDSTOREAD 0020 N 60# 88
|
||
SDIRBIOS 0032 N 46# 173
|
||
SELECTDISK 0099 L 125 143#
|
||
SETDMAOFF 00AD L 134 156#
|
||
SETDMASEG 00A7 L 127 152#
|
||
SETSECTOR 00B5 L 135 161#
|
||
SETTRACK 00A1 L 126 148#
|
||
SIGNONMSG 0100 V 67 219#
|
||
SS SREG V
|
||
STERMCPM 0000 N 45# 198
|
||
TRACK0BUFFER 0235 V 86 130 282#
|
||
TRACKOK 00D3 L 141 179#
|
||
WRITEMSG 021C V 276#
|
||
WRITESECTOR 00BD L 136 165#
|