mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-27 18:34:07 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,355 @@
|
||||
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#
|
||||
Reference in New Issue
Block a user