1 |
22 |
dilbert57 |
Assembler release DWC_2.0 version 2.11
|
2 |
|
|
May 6, 2004 (c) Motorola (free ware)
|
3 |
|
|
0001 *
|
4 |
|
|
0002 ** FLEX 9 COMPACT FLASH FORMAT PROGRAM
|
5 |
|
|
0003 *
|
6 |
|
|
0004 * FOR B5-X300 and CF with 8 Bit Transfer interface
|
7 |
|
|
0005 *
|
8 |
|
|
0006 *
|
9 |
|
|
0007 0001 CFLAG EQU $01 CARRY FLAG
|
10 |
|
|
0008 0002 VFLAG EQU $02 OVERFLOW FLAG
|
11 |
|
|
0009 0004 ZFLAG EQU $04 ZERO FLAG
|
12 |
|
|
0010 0008 NFLAG EQU $08 NEGATIVE FLAG
|
13 |
|
|
0011 0010 IFLAG EQU $10 IRQ MASK CC
|
14 |
|
|
0012 0020 HFLAG EQU $20 HALF CARRY
|
15 |
|
|
0013 0040 FFLAG EQU $40 FIRQ MASK CC
|
16 |
|
|
0014 0080 EFLAG EQU $80 ENTIRE FLAG
|
17 |
|
|
0015 *
|
18 |
|
|
0016 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
|
19 |
|
|
0017 *
|
20 |
|
|
0018 * Serial Port
|
21 |
|
|
0019 *
|
22 |
|
|
0020 E000 ACIAS EQU $E000
|
23 |
|
|
0021 E000 ACIAC1 EQU ACIAS
|
24 |
|
|
0022 E001 ACIAD1 EQU ACIAS+1
|
25 |
|
|
0023 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50)
|
26 |
|
|
0024 *
|
27 |
|
|
0025 * XMODEM Control characters
|
28 |
|
|
0026 *
|
29 |
|
|
0027 0001 SOH EQU $01
|
30 |
|
|
0028 0004 EOT EQU $04
|
31 |
|
|
0029 0006 ACK EQU $06
|
32 |
|
|
0030 0015 NAK EQU $15
|
33 |
|
|
0031 0018 CAN EQU $18
|
34 |
|
|
0032 *
|
35 |
|
|
0033 * Some dummy Constants
|
36 |
|
|
0034 *
|
37 |
|
|
0035 0040 RMAXTRK EQU 64
|
38 |
|
|
0036 00FF RMAXSEC EQU 255
|
39 |
|
|
0037 3EC1 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
|
40 |
|
|
0038 *
|
41 |
|
|
0039 * Start
|
42 |
|
|
0040 *
|
43 |
|
|
0041 0100 ORG $0100
|
44 |
|
|
0042 0100 17 02 9E START LBSR UFSUB
|
45 |
|
|
0043 0103 6E 9F F8 00 JMP [$F800] Jump to monitor on Completion.
|
46 |
|
|
0044 *
|
47 |
|
|
0045 *
|
48 |
|
|
0046 * RAM SPACE
|
49 |
|
|
0047 *
|
50 |
|
|
0048 0107 00 DRVNUM FCB 0
|
51 |
|
|
0049 0108 00 TRACK FCB 0
|
52 |
|
|
0050 0109 00 SECTOR FCB 0
|
53 |
|
|
0051 010A 00 CHKSUM FCB 0
|
54 |
|
|
0052 010B 00 BLKNUM FCB 0 Xmodem block number
|
55 |
|
|
0053 010C 00 BYTCNT FCB 0 Xmodem byte count
|
56 |
|
|
0054 010D 00 00 XSTATE FDB 0 Xmodem State Vector
|
57 |
|
|
0055 010F 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer
|
58 |
|
|
0056 0112 00 MAXTRK FCB 0
|
59 |
|
|
0057 0113 00 MAXSEC FCB 0
|
60 |
|
|
0058 0200 ORG $0200
|
61 |
|
|
0059 *
|
62 |
|
|
0060 * SECTOR BUFFER
|
63 |
|
|
0061 *
|
64 |
|
|
0062 0200 BUFFER RMB 256
|
65 |
|
|
0063 *
|
66 |
|
|
0064 *
|
67 |
|
|
0065 * recieve char from remote drive.
|
68 |
|
|
0066 * timeout if no response for approx 1s.
|
69 |
|
|
0067 * Entry: no parameters
|
70 |
|
|
0068 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
71 |
|
|
0069 *
|
72 |
|
|
0070 0300 34 30 RCHAR PSHS X,Y
|
73 |
|
|
0071 *
|
74 |
|
|
0072 0302 8E 03 E8 LDX #1000 1000x inner loop
|
75 |
|
|
0073 0305 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
76 |
|
|
0074 0309 B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char
|
77 |
|
|
0075 030C 47 ASRA
|
78 |
|
|
0076 030D 25 0A BCS RCHAR3 get character
|
79 |
|
|
0077 030F 31 3F LEAY -1,Y else, continue to count delay
|
80 |
|
|
0078 0311 26 F6 BNE RCHAR2
|
81 |
|
|
0079 0313 30 1F LEAX -1,X
|
82 |
|
|
0080 0315 26 EE BNE RCHAR1
|
83 |
|
|
0081 0317 35 B0 PULS X,Y,PC return with error if timed out
|
84 |
|
|
0082 *
|
85 |
|
|
0083 0319 B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set)
|
86 |
|
|
0084 031C 35 B0 PULS X,Y,PC
|
87 |
|
|
0085 *
|
88 |
|
|
0086 *
|
89 |
|
|
0087 * transmit char to remote drive.
|
90 |
|
|
0088 * timeout if no response for approx 1s. (allows for use of hardware flow control)
|
91 |
|
|
0089 * Entry: (A) = char to transmit
|
92 |
|
|
0090 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
93 |
|
|
0091 *
|
94 |
|
|
0092 031E 34 30 SCHAR PSHS X,Y
|
95 |
|
|
0093 0320 34 02 PSHS A
|
96 |
|
|
0094 *
|
97 |
|
|
0095 0322 8E 03 E8 LDX #1000 1000x inner loop
|
98 |
|
|
0096 0325 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
99 |
|
|
0097 0329 B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO
|
100 |
|
|
0098 032C 47 ASRA
|
101 |
|
|
0099 032D 47 ASRA
|
102 |
|
|
0100 032E 25 0C BCS SCHAR3 send character
|
103 |
|
|
0101 0330 31 3F LEAY -1,Y else, continue to count delay
|
104 |
|
|
0102 0332 26 F5 BNE SCHAR2
|
105 |
|
|
0103 0334 30 1F LEAX -1,X
|
106 |
|
|
0104 0336 26 ED BNE SCHAR1
|
107 |
|
|
0105 0338 35 02 PULS A
|
108 |
|
|
0106 033A 35 B0 PULS X,Y,PC return with error if timed out
|
109 |
|
|
0107 *
|
110 |
|
|
0108 033C 35 02 SCHAR3 PULS A
|
111 |
|
|
0109 033E B7 E0 01 STA ACIAD1 send data (carry bit still set)
|
112 |
|
|
0110 0341 35 B0 PULS X,Y,PC
|
113 |
|
|
0111 *
|
114 |
|
|
0112 * Print Data
|
115 |
|
|
0113 *
|
116 |
|
|
0114 0343 8D D9 PDATA0 BSR SCHAR
|
117 |
|
|
0115 0345 A6 80 PDATA1 LDA ,X+
|
118 |
|
|
0116 0347 81 04 CMPA #$04
|
119 |
|
|
0117 0349 26 F8 BNE PDATA0
|
120 |
|
|
0118 034B 39 RTS
|
121 |
|
|
0119 *
|
122 |
|
|
0120 ** 'UF' Format RAMdisc to FLEX standard.
|
123 |
|
|
0121 *
|
124 |
|
|
0122 034C 0A 0D DISFOS FCB $0A,$0D
|
125 |
|
|
0123 034E 46 6F 72 6D 61 74 FCC 'Formating RAMdisk... '
|
126 |
|
|
69 6E 67 20 52 41
|
127 |
|
|
4D 64 69 73 6B 2E
|
128 |
|
|
2E 2E 20
|
129 |
|
|
0124 0363 0A 0D FCB $0A,$0D
|
130 |
|
|
0125 0365 44 72 69 76 65 20 FCC 'Drive Number ?'
|
131 |
|
|
4E 75 6D 62 65 72
|
132 |
|
|
20 3F
|
133 |
|
|
0126 0373 04 FCB 4
|
134 |
|
|
0127 0374 0A 0D 04 MESS6 FCB $0A,$0D,4
|
135 |
|
|
0128 0377 52 61 6D 64 69 73 FCC 'Ramdisk not allocated! '
|
136 |
|
|
6B 20 6E 6F 74 20
|
137 |
|
|
61 6C 6C 6F 63 61
|
138 |
|
|
74 65 64 21 20
|
139 |
|
|
0129 038E 04 FCB 4
|
140 |
|
|
0130 038F 0A 0D UFMSG1 FCB $0A,$0D
|
141 |
|
|
0131 0391 46 6F 72 6D 61 74 FCC 'Format Complete'
|
142 |
|
|
20 43 6F 6D 70 6C
|
143 |
|
|
65 74 65
|
144 |
|
|
0132 03A0 04 FCB 4
|
145 |
|
|
0133 *
|
146 |
|
|
0134 03A1 BD 04 B1 UFSUB JSR INITDR
|
147 |
|
|
0135 03A4 8E 03 4C LDX #DISFOS
|
148 |
|
|
0136 03A7 BD 03 45 JSR PDATA1
|
149 |
|
|
0137 03AA 17 FF 53 UFSUB1 LBSR RCHAR
|
150 |
|
|
0138 03AD 24 FB BCC UFSUB1
|
151 |
|
|
0139 03AF 17 FF 6C LBSR SCHAR
|
152 |
|
|
0140 03B2 81 30 CMPA #'0'
|
153 |
|
|
0141 03B4 10 25 00 F3 LBLO UFEXIT
|
154 |
|
|
0142 03B8 81 33 CMPA #'3'
|
155 |
|
|
0143 03BA 10 22 00 ED LBHI UFEXIT
|
156 |
|
|
0144 03BE 80 30 SUBA #'0'
|
157 |
|
|
0145 03C0 1F 89 TFR A,B
|
158 |
|
|
0146 03C2 F7 01 07 STB DRVNUM
|
159 |
|
|
0147 03C5 8E 01 04 LDX #DRVNUM-3
|
160 |
|
|
0148 03C8 BD 05 22 JSR DRVSEL
|
161 |
|
|
0149 *
|
162 |
|
|
0150 * set up free chain
|
163 |
|
|
0151 *
|
164 |
|
|
0152 03CB 8E 02 00 LDX #BUFFER clear out buffer
|
165 |
|
|
0153 03CE 4F CLRA
|
166 |
|
|
0154 03CF 5F CLRB
|
167 |
|
|
0155 03D0 A7 80 DFL1 STA 0,X+
|
168 |
|
|
0156 03D2 5A DECB
|
169 |
|
|
0157 03D3 26 FB BNE DFL1
|
170 |
|
|
0158 *
|
171 |
|
|
0159 03D5 7F 01 08 CLR TRACK
|
172 |
|
|
0160 03D8 86 01 LDA #1
|
173 |
|
|
0161 03DA B7 01 09 STA SECTOR
|
174 |
|
|
0162 03DD 8E 02 00 DFL2 LDX #BUFFER
|
175 |
|
|
0163 03E0 B6 01 08 LDA TRACK
|
176 |
|
|
0164 03E3 A7 84 STA 0,X
|
177 |
|
|
0165 03E5 B6 01 09 LDA SECTOR
|
178 |
|
|
0166 03E8 4C INCA
|
179 |
|
|
0167 03E9 81 00 CMPA #RMAXSEC+1 last sector on track?
|
180 |
|
|
0168 03EB 26 04 BNE DFL3
|
181 |
|
|
0169 03ED 6C 84 INC 0,X
|
182 |
|
|
0170 03EF 86 01 LDA #1
|
183 |
|
|
0171 03F1 A7 01 DFL3 STA 1,X
|
184 |
|
|
0172 03F3 B6 01 08 LDA TRACK
|
185 |
|
|
0173 03F6 F6 01 09 LDB SECTOR
|
186 |
|
|
0174 03F9 BD 04 FE JSR WRITSC
|
187 |
|
|
0175 03FC 7C 01 09 INC SECTOR
|
188 |
|
|
0176 03FF B6 01 09 LDA SECTOR
|
189 |
|
|
0177 0402 81 00 CMPA #RMAXSEC+1
|
190 |
|
|
0178 0404 26 D7 BNE DFL2
|
191 |
|
|
0179 0406 86 01 LDA #1
|
192 |
|
|
0180 0408 B7 01 09 STA SECTOR
|
193 |
|
|
0181 040B 7C 01 08 INC TRACK
|
194 |
|
|
0182 040E B6 01 08 LDA TRACK
|
195 |
|
|
0183 0411 81 40 CMPA #RMAXTRK
|
196 |
|
|
0184 0413 26 C8 BNE DFL2
|
197 |
|
|
0185 * break free chain at last track/sector
|
198 |
|
|
0186 0415 8E 02 00 LDX #BUFFER
|
199 |
|
|
0187 0418 86 3F LDA #RMAXTRK-1
|
200 |
|
|
0188 041A C6 FF LDB #RMAXSEC
|
201 |
|
|
0189 041C BD 04 DD JSR READSC
|
202 |
|
|
0190 041F 8E 02 00 LDX #BUFFER
|
203 |
|
|
0191 0422 6F 84 CLR 0,X
|
204 |
|
|
0192 0424 6F 01 CLR 1,X
|
205 |
|
|
0193 0426 86 3F LDA #RMAXTRK-1
|
206 |
|
|
0194 0428 C6 FF LDB #RMAXSEC
|
207 |
|
|
0195 042A BD 04 FE JSR WRITSC
|
208 |
|
|
0196 * set up sector structure, SIR, directory etc
|
209 |
|
|
0197 042D 8E 02 00 LDX #BUFFER
|
210 |
|
|
0198 0430 4F CLRA
|
211 |
|
|
0199 0431 C6 FF LDB #RMAXSEC
|
212 |
|
|
0200 0433 BD 04 DD JSR READSC
|
213 |
|
|
0201 0436 8E 02 00 LDX #BUFFER
|
214 |
|
|
0202 0439 6F 84 CLR 0,X break end of directory chain
|
215 |
|
|
0203 043B 6F 01 CLR 1,X
|
216 |
|
|
0204 043D 4F CLRA
|
217 |
|
|
0205 043E C6 FF LDB #RMAXSEC
|
218 |
|
|
0206 0440 BD 04 FE JSR WRITSC
|
219 |
|
|
0207 *
|
220 |
|
|
0208 0443 8E 02 00 LDX #BUFFER
|
221 |
|
|
0209 0446 4F CLRA
|
222 |
|
|
0210 0447 C6 03 LDB #3 set up SIR
|
223 |
|
|
0211 0449 BD 04 DD JSR READSC
|
224 |
|
|
0212 044C 8E 02 00 LDX #BUFFER
|
225 |
|
|
0213 044F 6F 84 CLR 0,X break forward link
|
226 |
|
|
0214 0451 6F 01 CLR 1,X
|
227 |
|
|
0215 0453 CC 52 41 LDD #$5241 set volume name (RAMDISK )
|
228 |
|
|
0216 0456 ED 88 10 STD 16,X
|
229 |
|
|
0217 0459 CC 4D 44 LDD #$4D44
|
230 |
|
|
0218 045C ED 88 12 STD 18,X
|
231 |
|
|
0219 045F CC 49 53 LDD #$4953
|
232 |
|
|
0220 0462 ED 88 14 STD 20,X
|
233 |
|
|
0221 0465 CC 4B 20 LDD #$4B20
|
234 |
|
|
0222 0468 ED 88 16 STD 22,X
|
235 |
|
|
0223 046B CC 00 01 LDD #1 volume number
|
236 |
|
|
0224 046E ED 88 1B STD 27,X
|
237 |
|
|
0225 0471 CC 01 01 LDD #$0101 first trk/sec 01-01
|
238 |
|
|
0226 0474 ED 88 1D STD 29,X
|
239 |
|
|
0227 0477 86 3F LDA #RMAXTRK-1
|
240 |
|
|
0228 0479 C6 FF LDB #RMAXSEC
|
241 |
|
|
0229 047B ED 88 1F STD 31,X
|
242 |
|
|
0230 047E ED 88 26 STD 38,X
|
243 |
|
|
0231 0481 CC 3E C1 LDD #RTOTSEC total DATA sectors (2912-14)
|
244 |
|
|
0232 0484 ED 88 21 STD 33,X
|
245 |
|
|
0233 *
|
246 |
|
|
0234 0487 86 01 LDA #01 month set default creation date (SYS09's birthday!)
|
247 |
|
|
0235 0489 A7 88 23 STA 35,X
|
248 |
|
|
0236 048C 86 07 LDA #07 day
|
249 |
|
|
0237 048E A7 88 24 STA 36,X
|
250 |
|
|
0238 0491 86 07 LDA #07 year
|
251 |
|
|
0239 0493 A7 88 25 STA 37,X
|
252 |
|
|
0240 *
|
253 |
|
|
0241 0496 4F RF3 CLRA
|
254 |
|
|
0242 0497 C6 03 LDB #3
|
255 |
|
|
0243 0499 BD 04 FE JSR WRITSC
|
256 |
|
|
0244 *
|
257 |
|
|
0245 * LDX #BUFFER
|
258 |
|
|
0246 * CLRA
|
259 |
|
|
0247 * LDB #1
|
260 |
|
|
0248 * JSR READSC
|
261 |
|
|
0249 * LDX #BUFFER
|
262 |
|
|
0250 * LDA #$AA set the init flag
|
263 |
|
|
0251 * STA 0,X
|
264 |
|
|
0252 * LDA #$55
|
265 |
|
|
0253 * STA 1,X
|
266 |
|
|
0254 * CLRA
|
267 |
|
|
0255 * LDB #1
|
268 |
|
|
0256 * JSR WRITSC
|
269 |
|
|
0257 *
|
270 |
|
|
0258 * Write Boot sector
|
271 |
|
|
0259 *
|
272 |
|
|
0260 049C 8E C0 00 LDX #$C000
|
273 |
|
|
0261 049F 4F CLRA TRACK 0
|
274 |
|
|
0262 04A0 C6 01 LDB #$01 SECTOR 1
|
275 |
|
|
0263 04A2 B7 01 08 STA TRACK
|
276 |
|
|
0264 04A5 F7 01 09 STB SECTOR
|
277 |
|
|
0265 04A8 17 00 53 LBSR WRITSC
|
278 |
|
|
0266 *
|
279 |
|
|
0267 04AB 8E 03 8F UFEXIT LDX #UFMSG1
|
280 |
|
|
0268 04AE 7E 03 45 JMP PDATA1
|
281 |
|
|
0269 *
|
282 |
|
|
0270 *
|
283 |
|
|
0271 ** FLEX 9 COMPACT FLASH DISK DRIVERS
|
284 |
|
|
0272 *
|
285 |
|
|
0273 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300
|
286 |
|
|
0274 * WITH I/O MAPPED AT $XE000
|
287 |
|
|
0275 * AND ROM MAPPED AT $XF000
|
288 |
|
|
0276 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM
|
289 |
|
|
0277 * THE FIRST 64K IS USED BY FLEX,
|
290 |
|
|
0278 * THE SECOND 192K MAY BE USED AS A RAM DISK
|
291 |
|
|
0279 *
|
292 |
|
|
0280 *
|
293 |
|
|
0281 0010 IMASK EQU $10 IRQ MASK CC
|
294 |
|
|
0282 0040 FMASK EQU $40 FIRQ MASK CC
|
295 |
|
|
0283 FFF0 DATREG EQU $FFF0 DAT REGISTERS
|
296 |
|
|
0284 *
|
297 |
|
|
0285 E040 CF_BASE EQU $E040
|
298 |
|
|
0286 E040 CF_DATA EQU CF_BASE+0
|
299 |
|
|
0287 E041 CF_ERROR EQU CF_BASE+1 ; read error
|
300 |
|
|
0288 E041 CF_FEATURE EQU CF_BASE+1 ; write feature
|
301 |
|
|
0289 E042 CF_SCNT EQU CF_BASE+2
|
302 |
|
|
0290 E043 CF_SNUM EQU CF_BASE+3
|
303 |
|
|
0291 E044 CF_CLO EQU CF_BASE+4
|
304 |
|
|
0292 E045 CF_CHI EQU CF_BASE+5
|
305 |
|
|
0293 E046 CF_HEAD EQU CF_BASE+6
|
306 |
|
|
0294 E047 CF_STATUS EQU CF_BASE+7 ; read status
|
307 |
|
|
0295 E047 CF_COMAND EQU CF_BASE+7 ; write command
|
308 |
|
|
0296 *
|
309 |
|
|
0297 * Command Equates
|
310 |
|
|
0298 *
|
311 |
|
|
0299 0020 CMDREAD EQU $20 ; Read Single sector
|
312 |
|
|
0300 0030 CMDWRITE EQU $30 ; Write Single sector
|
313 |
|
|
0301 00EF CMDFEATURE EQU $EF
|
314 |
|
|
0302 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers
|
315 |
|
|
0303 00E0 HEADLBA EQU $E0
|
316 |
|
|
0304 *
|
317 |
|
|
0305 * Status bit equates
|
318 |
|
|
0306 *
|
319 |
|
|
0307 0080 BSY EQU $80
|
320 |
|
|
0308 0040 DRDY EQU $40
|
321 |
|
|
0309 0008 DRQ EQU $08
|
322 |
|
|
0310 0001 ERR EQU $01
|
323 |
|
|
0311 *
|
324 |
|
|
0312 *
|
325 |
|
|
0313 * INITIALIZE CF CARD FOR 8 BIT LBA MODE
|
326 |
|
|
0314 *
|
327 |
|
|
0315 04B1 8D 7F INITDR BSR WAITRDY
|
328 |
|
|
0316 04B3 86 E0 LDA #HEADLBA
|
329 |
|
|
0317 04B5 B7 E0 46 STA CF_HEAD
|
330 |
|
|
0318 04B8 86 01 LDA #FEAT8BIT
|
331 |
|
|
0319 04BA B7 E0 41 STA CF_FEATURE
|
332 |
|
|
0320 04BD 86 EF LDA #CMDFEATURE
|
333 |
|
|
0321 04BF B7 E0 47 STA CF_COMAND
|
334 |
|
|
0322 04C2 20 6E BRA WAITRDY
|
335 |
|
|
0323 *
|
336 |
|
|
0324 * RESTORE DISK DRIVER (SEEK TRACK 00)
|
337 |
|
|
0325 *
|
338 |
|
|
0326 04C4 8D 5C RESTR1 BSR DRVSEL
|
339 |
|
|
0327 04C6 4F CLRA ; Track 0
|
340 |
|
|
0328 04C7 C6 01 LDB #$01 ; Sector 1
|
341 |
|
|
0329 *
|
342 |
|
|
0330 * Seek track and sector
|
343 |
|
|
0331 * A holds track number (0 - ??)
|
344 |
|
|
0332 * B holds sector number (1 - ??)
|
345 |
|
|
0333 * Sector numbers starts from 1
|
346 |
|
|
0334 * subtract 1 to start from sector 0 on CF
|
347 |
|
|
0335 *
|
348 |
|
|
0336 04C9 5A SEEKTS DECB
|
349 |
|
|
0337 04CA F7 E0 43 STB CF_SNUM
|
350 |
|
|
0338 04CD B7 E0 44 STA CF_CLO
|
351 |
|
|
0339 04D0 F6 01 07 LDB DRVNUM
|
352 |
|
|
0340 04D3 F7 E0 45 STB CF_CHI
|
353 |
|
|
0341 04D6 C6 01 LDB #$01
|
354 |
|
|
0342 04D8 F7 E0 42 STB CF_SCNT
|
355 |
|
|
0343 04DB 5F CLRB
|
356 |
|
|
0344 04DC 39 RTS
|
357 |
|
|
0345 *
|
358 |
|
|
0346 * READ SECTORS FROM CF
|
359 |
|
|
0347 *
|
360 |
|
|
0348 *
|
361 |
|
|
0349 04DD 8D EA READSC BSR SEEKTS
|
362 |
|
|
0350 04DF 86 20 LDA #CMDREAD ; IDE READ MULTIPLE
|
363 |
|
|
0351 04E1 B7 E0 47 STA CF_COMAND
|
364 |
|
|
0352 04E4 8D 4C BSR WAITRDY
|
365 |
|
|
0353 *
|
366 |
|
|
0354 * READ LOOP
|
367 |
|
|
0355 *
|
368 |
|
|
0356 04E6 5F CLRB
|
369 |
|
|
0357 04E7 8D 58 RDLP1 BSR WAITDRQ
|
370 |
|
|
0358 04E9 B6 E0 40 LDA CF_DATA
|
371 |
|
|
0359 04EC A7 80 STA ,X+
|
372 |
|
|
0360 04EE 5A DECB
|
373 |
|
|
0361 04EF 26 F6 BNE RDLP1
|
374 |
|
|
0362 *
|
375 |
|
|
0363 04F1 5F CLRB
|
376 |
|
|
0364 04F2 8D 4D RDLP2 BSR WAITDRQ
|
377 |
|
|
0365 04F4 B6 E0 40 LDA CF_DATA
|
378 |
|
|
0366 04F7 5A DECB
|
379 |
|
|
0367 04F8 26 F8 BNE RDLP2
|
380 |
|
|
0368 *
|
381 |
|
|
0369 04FA 8D 36 BSR WAITRDY
|
382 |
|
|
0370 04FC 5F CLRB
|
383 |
|
|
0371 04FD 39 RTS
|
384 |
|
|
0372 *
|
385 |
|
|
0373 * WRITE SECTOR TO CF
|
386 |
|
|
0374 *
|
387 |
|
|
0375 04FE 8D C9 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
388 |
|
|
0376 0500 86 30 LDA #CMDWRITE ; IDE WRITE MULTIPLE
|
389 |
|
|
0377 0502 B7 E0 47 STA CF_COMAND
|
390 |
|
|
0378 0505 8D 2B BSR WAITRDY
|
391 |
|
|
0379 *
|
392 |
|
|
0380 * WRITE LOOP
|
393 |
|
|
0381 *
|
394 |
|
|
0382 0507 5F CLRB
|
395 |
|
|
0383 0508 8D 37 WRTLP1 BSR WAITDRQ
|
396 |
|
|
0384 050A A6 80 LDA ,X+
|
397 |
|
|
0385 050C B7 E0 40 STA CF_DATA
|
398 |
|
|
0386 050F 5A DECB
|
399 |
|
|
0387 0510 26 F6 BNE WRTLP1
|
400 |
|
|
0388 *
|
401 |
|
|
0389 0512 5F CLRB
|
402 |
|
|
0390 0513 8D 2C WRTLP2 BSR WAITDRQ
|
403 |
|
|
0391 0515 4F CLRA
|
404 |
|
|
0392 0516 B7 E0 40 STA CF_DATA
|
405 |
|
|
0393 0519 5A DECB
|
406 |
|
|
0394 051A 26 F7 BNE WRTLP2
|
407 |
|
|
0395 *
|
408 |
|
|
0396 051C 8D 14 BSR WAITRDY
|
409 |
|
|
0397 051E 5F CLRB
|
410 |
|
|
0398 051F 39 RTS
|
411 |
|
|
0399 *
|
412 |
|
|
0400 * CHECK FOR BUSY
|
413 |
|
|
0401 * Doubles as VERIFY
|
414 |
|
|
0402 *
|
415 |
|
|
0403 0520 5F BUSY CLRB Never busy
|
416 |
|
|
0404 0521 39 RTS
|
417 |
|
|
0405 *
|
418 |
|
|
0406 * DRIVE SELECT DISK DRIVER
|
419 |
|
|
0407 *
|
420 |
|
|
0408 0522 A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB
|
421 |
|
|
0409 0524 81 03 CMPA #3
|
422 |
|
|
0410 0526 23 01 BLS DRVS2 IF > 3, SET IT TO 0
|
423 |
|
|
0411 0528 4F CLRA
|
424 |
|
|
0412 0529 B7 01 07 DRVS2 STA DRVNUM
|
425 |
|
|
0413 052C 5F CLRB ; SET Z, CLEAR C
|
426 |
|
|
0414 052D 39 RTS
|
427 |
|
|
0415 *
|
428 |
|
|
0416 * CHECK DRIVE READY DISK DRIVER
|
429 |
|
|
0417 *
|
430 |
|
|
0418 052E A6 03 CHKDRV LDA 3,X
|
431 |
|
|
0419 0530 5F CLRB ; CLEAR C, SET Z
|
432 |
|
|
0420 0531 39 RTS
|
433 |
|
|
0421 *
|
434 |
|
|
0422 * WAIT UNTIL READY
|
435 |
|
|
0423 *
|
436 |
|
|
0424 0532 B6 E0 47 WAITRDY LDA CF_STATUS
|
437 |
|
|
0425 0535 85 80 BITA #BSY
|
438 |
|
|
0426 0537 26 F9 BNE WAITRDY
|
439 |
|
|
0427 0539 B6 E0 47 LDA CF_STATUS
|
440 |
|
|
0428 053C 85 40 BITA #DRDY
|
441 |
|
|
0429 053E 27 F2 BEQ WAITRDY
|
442 |
|
|
0430 0540 39 RTS
|
443 |
|
|
0431 *
|
444 |
|
|
0432 * WAIT FOR DATA REQUEST
|
445 |
|
|
0433 *
|
446 |
|
|
0434 0541 B6 E0 47 WAITDRQ LDA CF_STATUS
|
447 |
|
|
0435 0544 85 08 BITA #DRQ
|
448 |
|
|
0436 0546 27 F9 BEQ WAITDRQ
|
449 |
|
|
0437 0548 39 RTS
|
450 |
|
|
0438 *
|
451 |
|
|
0439 *******************************************************
|
452 |
|
|
0440 *
|
453 |
|
|
0441 * Bootstrap FLEX Loader
|
454 |
|
|
0442 *
|
455 |
|
|
0443 * SBUG1.8 loads the bootstap loader at $C000
|
456 |
|
|
0444 * however the Flex adaption manual has the
|
457 |
|
|
0445 * bootstrap loader residing at $C100
|
458 |
|
|
0446 *
|
459 |
|
|
0447 ******************************************************
|
460 |
|
|
0448 *
|
461 |
|
|
0449 * Equates
|
462 |
|
|
0450 *
|
463 |
|
|
0451 C0FF STACK EQU $C0FF
|
464 |
|
|
0452 C300 SCTBUF EQU $C300
|
465 |
|
|
0453 *
|
466 |
|
|
0454 * Start of Utility
|
467 |
|
|
0455 *
|
468 |
|
|
0456 C000 ORG $C000
|
469 |
|
|
0457 C000 20 0B BOOT BRA LOAD0
|
470 |
|
|
0458 C002 00 00 00 FCB 0,0,0
|
471 |
|
|
0459 C005 00 TRK FCB 0 File start track
|
472 |
|
|
0460 C006 00 SCT FCB 0 File start sector
|
473 |
|
|
0461 C007 00 DNS FCB 0 Density Flag (not used)
|
474 |
|
|
0462 C008 C0 00 TADR FDB $C000 Transfer address
|
475 |
|
|
0463 C00A 00 00 LADR FDB 0 Load Address
|
476 |
|
|
0464 C00C 00 DRNUM FCB 0 Drive number 0
|
477 |
|
|
0465 *
|
478 |
|
|
0466 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack
|
479 |
|
|
0467 C011 FC C0 05 LDD TRK Set up start track and sector
|
480 |
|
|
0468 C014 FD C3 00 STD SCTBUF
|
481 |
|
|
0469 C017 10 8E C4 00 LDY #SCTBUF+256
|
482 |
|
|
0470 *
|
483 |
|
|
0471 * Perform actual file load
|
484 |
|
|
0472 *
|
485 |
|
|
0473 C01B 8D 35 LOAD1 BSR GETCH Get acharcater
|
486 |
|
|
0474 C01D 81 02 CMPA #$02 Data record hearder ?
|
487 |
|
|
0475 C01F 27 10 BEQ LOAD2 Skip, is so
|
488 |
|
|
0476 C021 81 16 CMPA #$16 Xfr address hearder ?
|
489 |
|
|
0477 C023 26 F6 BNE LOAD1 Loop if neither
|
490 |
|
|
0478 *
|
491 |
|
|
0479 * Get transfer address
|
492 |
|
|
0480 *
|
493 |
|
|
0481 C025 8D 2B BSR GETCH
|
494 |
|
|
0482 C027 B7 C0 08 STA TADR
|
495 |
|
|
0483 C02A 8D 26 BSR GETCH
|
496 |
|
|
0484 C02C B7 C0 09 STA TADR+1
|
497 |
|
|
0485 C02F 20 EA BRA LOAD1
|
498 |
|
|
0486 *
|
499 |
|
|
0487 * Load data record
|
500 |
|
|
0488 *
|
501 |
|
|
0489 C031 8D 1F LOAD2 BSR GETCH Get load address
|
502 |
|
|
0490 C033 B7 C0 0A STA LADR
|
503 |
|
|
0491 C036 8D 1A BSR GETCH
|
504 |
|
|
0492 C038 B7 C0 0B STA LADR+1
|
505 |
|
|
0493 C03B 8D 15 BSR GETCH Get Bytes count
|
506 |
|
|
0494 C03D 1F 89 TFR A,B
|
507 |
|
|
0495 C03F 5D TSTB
|
508 |
|
|
0496 C040 27 D9 BEQ LOAD1 Loop if count = 0
|
509 |
|
|
0497 C042 BE C0 0A LDX LADR Get load address
|
510 |
|
|
0498 C045 34 14 LOAD3 PSHS B,X
|
511 |
|
|
0499 C047 8D 09 BSR GETCH Get data character
|
512 |
|
|
0500 C049 35 14 PULS B,X
|
513 |
|
|
0501 C04B A7 80 STA ,X+ Store at load address
|
514 |
|
|
0502 C04D 5A DECB
|
515 |
|
|
0503 C04E 26 F5 BNE LOAD3 Loop until count = 0
|
516 |
|
|
0504 C050 20 C9 BRA LOAD1
|
517 |
|
|
0505 *
|
518 |
|
|
0506 * Get Character routine
|
519 |
|
|
0507 * Reads a sector if needed
|
520 |
|
|
0508 *
|
521 |
|
|
0509 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ?
|
522 |
|
|
0510 C056 26 0F BNE GETCH4 Go read Character if not
|
523 |
|
|
0511 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer
|
524 |
|
|
0512 C05B EC 84 LDD 0,X Get forward Link
|
525 |
|
|
0513 C05D 27 0B BEQ GO if zero, file is loaded
|
526 |
|
|
0514 C05F 8D 21 BSR READ Read next sector
|
527 |
|
|
0515 C061 26 9D BNE BOOT start over if error
|
528 |
|
|
0516 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link
|
529 |
|
|
0517 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character
|
530 |
|
|
0518 C069 39 RTS
|
531 |
|
|
0519 *
|
532 |
|
|
0520 * File is loaded, Jump to it
|
533 |
|
|
0521 *
|
534 |
|
|
0522 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address
|
535 |
|
|
0523
|
536 |
|
|
0524 *
|
537 |
|
|
0525 ** FLEX 9 COMPACT FLASH DISK DRIVERS
|
538 |
|
|
0526 *
|
539 |
|
|
0527 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300
|
540 |
|
|
0528 * WITH I/O MAPPED AT $XE000
|
541 |
|
|
0529 * AND ROM MAPPED AT $XF000
|
542 |
|
|
0530 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM
|
543 |
|
|
0531 * THE FIRST 64K IS USED BY FLEX,
|
544 |
|
|
0532 * THE SECOND 192K MAY BE USED AS A RAM DISK
|
545 |
|
|
0533 *
|
546 |
|
|
0534 *
|
547 |
|
|
0535 *IMASK EQU $10 IRQ MASK CC
|
548 |
|
|
0536 *FMASK EQU $40 FIRQ MASK CC
|
549 |
|
|
0537 *DATREG EQU $FFF0 DAT REGISTERS
|
550 |
|
|
0538 *
|
551 |
|
|
0539 *CF_BASE EQU $E040
|
552 |
|
|
0540 *CF_DATA EQU CF_BASE+0
|
553 |
|
|
0541 *CF_ERROR EQU CF_BASE+1 ; read error
|
554 |
|
|
0542 *CF_FEATURE EQU CF_BASE+1 ; write feature
|
555 |
|
|
0543 *CF_SCNT EQU CF_BASE+2
|
556 |
|
|
0544 *CF_SNUM EQU CF_BASE+3
|
557 |
|
|
0545 *CF_CLO EQU CF_BASE+4
|
558 |
|
|
0546 *CF_CHI EQU CF_BASE+5
|
559 |
|
|
0547 *CF_HEAD EQU CF_BASE+6
|
560 |
|
|
0548 *CF_STATUS EQU CF_BASE+7 ; read status
|
561 |
|
|
0549 *CF_COMAND EQU CF_BASE+7 ; write command
|
562 |
|
|
0550 *
|
563 |
|
|
0551 * Command Equates
|
564 |
|
|
0552 *
|
565 |
|
|
0553 *CMDREAD EQU $20 ; Read Single sector
|
566 |
|
|
0554 *CMDWRITE EQU $30 ; Write Single sector
|
567 |
|
|
0555 *CMDFEATURE EQU $EF
|
568 |
|
|
0556 *FEAT8BIT EQU $01 ; enable 8 bit transfers
|
569 |
|
|
0557 *HEADLBA EQU $E0
|
570 |
|
|
0558 *
|
571 |
|
|
0559 * Status bit equates
|
572 |
|
|
0560 *
|
573 |
|
|
0561 *BSY EQU $80
|
574 |
|
|
0562 *DRDY EQU $40
|
575 |
|
|
0563 *DRQ EQU $08
|
576 |
|
|
0564 *ERR EQU $01
|
577 |
|
|
0565 *
|
578 |
|
|
0566 * Seek track and sector
|
579 |
|
|
0567 * A holds track number (0 - ??)
|
580 |
|
|
0568 * B holds sector number (1 - ??)
|
581 |
|
|
0569 * Sector numbers starts from 1
|
582 |
|
|
0570 * subtract 1 to start from sector 0 on CF
|
583 |
|
|
0571 *
|
584 |
|
|
0572 C06E 5A SEEK DECB
|
585 |
|
|
0573 C06F F7 E0 43 STB CF_SNUM
|
586 |
|
|
0574 C072 B7 E0 44 STA CF_CLO
|
587 |
|
|
0575 C075 F6 C0 0C LDB DRNUM
|
588 |
|
|
0576 C078 F7 E0 45 STB CF_CHI
|
589 |
|
|
0577 C07B C6 01 LDB #$01
|
590 |
|
|
0578 C07D F7 E0 42 STB CF_SCNT
|
591 |
|
|
0579 C080 5F CLRB
|
592 |
|
|
0580 C081 39 RTS
|
593 |
|
|
0581 *
|
594 |
|
|
0582 * READ SECTORS FROM CF
|
595 |
|
|
0583 *
|
596 |
|
|
0584 *
|
597 |
|
|
0585 C082 8D EA READ BSR SEEK
|
598 |
|
|
0586 C084 86 20 LDA #CMDREAD ; IDE READ MULTIPLE
|
599 |
|
|
0587 C086 B7 E0 47 STA CF_COMAND
|
600 |
|
|
0588 C089 8D 18 BSR WTRDY
|
601 |
|
|
0589 *
|
602 |
|
|
0590 * READ LOOP
|
603 |
|
|
0591 *
|
604 |
|
|
0592 C08B 5F CLRB
|
605 |
|
|
0593 C08C 8D 24 READ1 BSR WTDRQ
|
606 |
|
|
0594 C08E B6 E0 40 LDA CF_DATA
|
607 |
|
|
0595 C091 A7 80 STA ,X+
|
608 |
|
|
0596 C093 5A DECB
|
609 |
|
|
0597 C094 26 F6 BNE READ1
|
610 |
|
|
0598 *
|
611 |
|
|
0599 C096 5F CLRB
|
612 |
|
|
0600 C097 8D 19 READ2 BSR WTDRQ
|
613 |
|
|
0601 C099 B6 E0 40 LDA CF_DATA
|
614 |
|
|
0602 C09C 5A DECB
|
615 |
|
|
0603 C09D 26 F8 BNE READ2
|
616 |
|
|
0604 *
|
617 |
|
|
0605 C09F 8D 02 BSR WTRDY
|
618 |
|
|
0606 C0A1 5F CLRB
|
619 |
|
|
0607 C0A2 39 RTS
|
620 |
|
|
0608 *
|
621 |
|
|
0609 * WAIT UNTIL READY
|
622 |
|
|
0610 *
|
623 |
|
|
0611 C0A3 B6 E0 47 WTRDY LDA CF_STATUS
|
624 |
|
|
0612 C0A6 85 80 BITA #BSY
|
625 |
|
|
0613 C0A8 26 F9 BNE WTRDY
|
626 |
|
|
0614 C0AA B6 E0 47 LDA CF_STATUS
|
627 |
|
|
0615 C0AD 85 40 BITA #DRDY
|
628 |
|
|
0616 C0AF 27 F2 BEQ WTRDY
|
629 |
|
|
0617 C0B1 39 RTS
|
630 |
|
|
0618 *
|
631 |
|
|
0619 * WAIT FOR DATA REQUEST
|
632 |
|
|
0620 *
|
633 |
|
|
0621 C0B2 B6 E0 47 WTDRQ LDA CF_STATUS
|
634 |
|
|
0622 C0B5 85 08 BITA #DRQ
|
635 |
|
|
0623 C0B7 27 F9 BEQ WTDRQ
|
636 |
|
|
0624 C0B9 39 RTS
|
637 |
|
|
0625 *
|
638 |
|
|
0626 END START
|
639 |
|
|
Program + Init Data = 791 bytes
|
640 |
|
|
Error count = 0
|