963
|
1 nam dmode
|
|
2
|
|
3 * DMode by Kevin K. Darling
|
|
4 * Disk descriptor utility.
|
|
5 *
|
|
6 * This version will do desc file on disk also.
|
|
7 * 23 Sept 86, 1 Oct 86, 2 Oct 86
|
|
8
|
|
9 * Modified by Roger A. Krupski (HARDWAREHACK)
|
|
10 * Fixes "lower case bug", allows "$" prefix for hex
|
|
11 * Last updated: 08-24-89 RAK
|
|
12
|
|
13 * Oversized and kludgy, but works.
|
|
14 * Apologies for lack of comments.
|
|
15 ************************************************
|
|
16 * RBF descriptor utility similar to xmode.
|
|
17 * Use: dmode </devicename> [options]
|
|
18 * dmode -<filename> [options]
|
|
19 * (allows dmode use on a saved desc)
|
|
20 * (-filename will use data dir for default)
|
|
21 * dmode -? will give bit definitions
|
|
22 * If no options given, just returns desc info.
|
|
23 * All numbers must be in HEX.
|
|
24 * dmode
|
|
25 * dmode /h0 cyl=0200 sas=8 ilv=4
|
|
26 * dmode /d0
|
|
27 * dmode -?
|
|
28 * dmode -/d1/modules/d2.dd cyl=0028
|
|
29
|
|
30 ifp1
|
|
31 use defsfile use defsfile
|
|
32 use rbfdefs
|
|
33 endc
|
|
34
|
|
35 mod size,name,$11,$81,entry,msiz
|
|
36
|
|
37 org 0
|
|
38 desc rmb $40 dev desc copy
|
|
39 dsize rmb 2 desc size
|
|
40 path rmb 1 file path
|
|
41 parmptr rmb 2 next name dataptr
|
|
42 module rmb 2 desc address
|
|
43 dataptr rmb 2 current option ptr
|
|
44 buffptr rmb 2 buffer address
|
|
45 txtptr rmb 2 option name ptr
|
|
46 hexin rmb 2 2 byte hex number
|
|
47 hexcnt rmb 1 number of option bytes
|
|
48 buffer rmb 10 output buffer
|
|
49 stack rmb 200
|
|
50 params rmb 150
|
|
51 msiz equ .
|
|
52
|
|
53 ************************************************
|
|
54 name fcs "Dmode"
|
|
55 fcb 8 version
|
|
56
|
|
57 helpmsg
|
|
58 fcb C$CR,C$LF
|
|
59 fcc "drv Drive Number 0...n"
|
|
60 fcb C$CR,C$LF
|
|
61 fcc "stp Step Rate 0=30, 1=20, 2=12, 3=6ms"
|
|
62 fcb C$CR,C$LF
|
|
63 fcb C$CR,C$LF
|
|
64 fcc 'typ Device Type bit0- 0=5" 1=8"'
|
|
65 fcb C$CR,C$LF
|
|
66 fcc " $20 bit5- 0=non 1=coco"
|
|
67 fcb C$CR,C$LF
|
|
68 fcc " $40 bit6- 0=std 1=non"
|
|
69 fcb C$CR,C$LF
|
|
70 fcc " $80 bit7- 0=flop 1=hard"
|
|
71 fcb C$CR,C$LF
|
|
72 fcb C$CR,C$LF
|
|
73 fcc "dns Density bit0- 0=SD 1=DD"
|
|
74 fcb C$CR,C$LF
|
|
75 fcc " bit1- 0=48 1=96 tpi"
|
|
76 fcb C$CR,C$LF
|
|
77 fcb C$CR,C$LF
|
|
78 fcc "cyl Cylinders (tracks) (in hex)"
|
|
79 fcb C$CR,C$LF
|
|
80 fcc "sid Sides (heads) (in hex)"
|
|
81 fcb C$CR,C$LF
|
|
82 fcc "vfy Verify (0=yes)"
|
|
83 fcb C$CR,C$LF
|
|
84 fcc "sct Sectors/Track (in hex)"
|
|
85 fcb C$CR,C$LF
|
|
86 fcc "tos Sectors/Track on track 0 (in hex)"
|
|
87 fcb C$CR,C$LF
|
|
88 fcc "ilv Interleave (in hex)"
|
|
89 fcb C$CR,C$LF
|
|
90 fcc "sas Minimum segment allocation (in hex)"
|
|
91 fcb C$CR,C$LF
|
|
92 helplen equ *-helpmsg
|
|
93
|
|
94 errmsg
|
|
95 fcb C$CR,C$LF
|
|
96 fcc "Use Dmode /<dev_name> [options...]"
|
|
97 fcb C$CR,C$LF
|
|
98 fcc " or Dmode -<filename> [options...]"
|
|
99 fcb C$CR,C$LF
|
|
100 fcc " or Dmode -? for options help"
|
|
101 fcb C$CR,C$LF
|
|
102 fcb C$CR,C$LF
|
|
103 fcc " NOTE: specify options in hex."
|
|
104 cr fcb C$CR,C$LF
|
|
105 msglen equ *-errmsg
|
|
106
|
|
107 synmsg
|
|
108 fcb C$CR,C$LF
|
|
109 fcc "Syntax Error: "
|
|
110 synlen equ *-synmsg
|
|
111
|
|
112
|
|
113 muchhelp
|
|
114 leax helpmsg,pc
|
|
115 ldy #helplen
|
|
116 bra helpprnt
|
|
117
|
|
118 rbfmsg
|
|
119 fcb C$CR,C$LF
|
|
120 fcc "NOT an RBF descriptor!"
|
|
121 fcb C$CR,C$LF
|
|
122 rbflen equ *-rbfmsg
|
|
123
|
|
124 notrbf
|
|
125 leax rbfmsg,pc
|
|
126 ldy #rbflen
|
|
127 lda #2
|
|
128 os9 I$Write
|
|
129
|
|
130 help
|
|
131 leax errmsg,pc
|
|
132 ldy #msglen
|
|
133
|
|
134 helpprnt
|
|
135 lda #2
|
|
136 os9 I$Write
|
|
137 lbra okayend2
|
|
138
|
|
139 ************************************************
|
|
140 entry
|
|
141 ldd #0
|
|
142 std module zero mod flag
|
|
143 sta path zero file flag
|
|
144 ldd ,x+ check for device name
|
|
145 cmpa #'- file option?
|
|
146 bne link
|
|
147 cmpb #'? help option?
|
|
148 beq muchhelp
|
|
149
|
|
150 * Use Filename to Get Desc:
|
|
151 lda #UPDAT. open path to desc file
|
|
152 os9 I$Open
|
|
153 bcs error
|
|
154 stx parmptr
|
|
155 sta path save path number
|
|
156
|
|
157 ldy #$40 max size
|
|
158 leax desc,u desc buff
|
|
159 os9 I$Read get it
|
|
160 bcc use10
|
|
161 cmpb #E$EOF
|
|
162 bne error
|
|
163
|
|
164 use10
|
|
165 sty dsize save desc size
|
|
166 bra gotit
|
|
167
|
|
168 link
|
|
169 cmpa #PDELIM else must be /<devicename>
|
|
170 bne help
|
|
171 pshs u
|
|
172 lda #Devic
|
|
173 os9 F$Link link to descriptor
|
|
174 bcs error
|
|
175 stx parmptr update after name
|
|
176 tfr u,x
|
|
177 puls u
|
|
178 stx module
|
|
179 ldd M$Size,x get desc size
|
|
180 std dsize
|
|
181 leay desc,u
|
|
182
|
|
183 mloop
|
|
184 lda ,x+
|
|
185 sta ,y+
|
|
186 decb
|
|
187 bne mloop
|
|
188
|
|
189 gotit
|
|
190 leax desc,u
|
|
191 lda $12,x test device type
|
|
192 cmpa #1 RBF?
|
|
193 bne notrbf
|
|
194
|
|
195 leax $13,x point to drive #
|
|
196 stx dataptr save mod option ptr
|
|
197
|
|
198 ldx parmptr point to input parms
|
|
199
|
|
200 skip
|
|
201 lda ,x+
|
|
202 cmpa #$20 skip blanks
|
|
203 beq skip
|
|
204
|
|
205 leax -1,x
|
|
206 cmpa #$0D no options?
|
|
207 lbeq info ..yes, give info
|
|
208 lbra findtxt else find options
|
|
209
|
|
210 okayend
|
|
211 lbsr outcr
|
|
212 okayend2
|
|
213 clrb okay
|
|
214 error
|
|
215 pshs b,cc
|
|
216 ldu module
|
|
217 beq bye
|
|
218 os9 F$UnLink
|
|
219 bye
|
|
220 puls b,cc
|
|
221 os9 F$Exit end dmode.
|
|
222
|
|
223 table
|
|
224 fcc " drv" option name
|
|
225 fcb IT.DRV,1 option offset & byte count
|
|
226 fcc " stp"
|
|
227 fcb IT.STP,1
|
|
228 fcc " typ"
|
|
229 fcb IT.TYP,1
|
|
230 fcc " dns"
|
|
231 fcb IT.DNS,1
|
|
232 fcc " cyl"
|
|
233 fcb IT.CYL,2
|
|
234 fcc " sid"
|
|
235 fcb IT.SID,1
|
|
236 fcc " vfy"
|
|
237 fcb IT.VFY,1
|
|
238 fcc " sct"
|
|
239 fcb IT.SCT,2
|
|
240 fcc " tos"
|
|
241 fcb IT.T0S,2
|
|
242 fcc " ilv"
|
|
243 fcb IT.ILV,1
|
|
244 fcc " sas"
|
|
245 fcb IT.SAS,1
|
|
246 fcc " t0s" extra so it parses, but doesn't print!
|
|
247 fcb IT.T0S,2
|
|
248 fcb $80 end of table
|
|
249
|
|
250 info equ * Output Current Desc Info:
|
|
251 ldb #11 eleven entries (we won't print #12)
|
|
252 pshs b
|
|
253 leax table,pc point to text table
|
|
254 stx txtptr
|
|
255 ilup
|
|
256 bsr outtext print label and =
|
|
257 lbsr outnum print value
|
|
258 ldx txtptr
|
|
259 leax 6,x
|
|
260 stx txtptr
|
|
261 dec ,s
|
|
262 lbeq okayend ..end of info
|
|
263 ldb ,s
|
|
264 cmpb #5 <cr> after 6th option
|
|
265 bne ilup
|
|
266 bsr outcr <cr>
|
|
267 bra ilup ..loop
|
|
268
|
|
269 outcr equ * Print a <CR/LF>:
|
|
270 leax cr,pc
|
|
271 ldy #2 byte count
|
|
272
|
|
273 output equ * Print generic
|
|
274 lda #1 std out
|
|
275 os9 I$Write
|
|
276 bcc okay
|
|
277 leas 2,s purge return
|
|
278 lbra error error
|
|
279 okay rts
|
|
280
|
|
281
|
|
282 * -----------------------
|
|
283 equal fcc "=$"
|
|
284 outtext equ * Print Option Name:
|
|
285 ldx txtptr
|
|
286 ldy #4
|
|
287 bsr output print option name
|
|
288 leax equal,pc
|
|
289 ldy #2
|
|
290 bsr output sorry, must be a bsr
|
|
291 rts return
|
|
292
|
|
293 * -----------------------
|
|
294 outnum equ * Print Hex Option Values:
|
|
295 ldx txtptr
|
|
296 ldb 5,x get # of digits
|
|
297 stb hexcnt
|
|
298 numlup
|
|
299 bsr outhex
|
|
300 dec hexcnt
|
|
301 bne numlup
|
|
302 rts
|
|
303
|
|
304 outhex equ * Print One Byte:
|
|
305 ldx dataptr
|
|
306 lda ,x+
|
|
307 stx dataptr
|
|
308 pshs a
|
|
309 lsra
|
|
310 lsra
|
|
311 lsra
|
|
312 lsra
|
|
313 bsr outone
|
|
314 puls a
|
|
315 anda #$0F
|
|
316
|
|
317 outone equ * Print 1/2 Byte Hex Char:
|
|
318 cmpa #10
|
|
319 bcs number
|
|
320 adda #$11-10 make alpha
|
|
321 number
|
|
322 adda #$30 make ASCII
|
|
323 sta buffer
|
|
324 leax buffer,u
|
|
325 ldy #1
|
|
326 lbra output
|
|
327
|
|
328 skipspc equ * Skip Spaces:
|
|
329 lda ,x+
|
|
330 cmpa #C$SPAC
|
|
331 beq skipspc
|
|
332 rts
|
|
333
|
|
334 ************************************************
|
|
335 * X=parmptr
|
|
336
|
|
337 findtxt equ * Find and Set Options:
|
|
338
|
|
339 flup10
|
|
340 bsr skipspc get next input param
|
|
341 stx parmptr save for syntax error use
|
|
342 cmpa #C$CR end?
|
|
343 lbeq verify ..yes, update desc CRC
|
|
344
|
|
345 ora #$20 force lower case first char
|
|
346 leay table-6,pc ready option table ptr
|
|
347 pshs d,u
|
|
348 ldd ,x++ get next two chars
|
|
349 ora #$20 force lower case
|
|
350 orb #$20 -ditto-
|
|
351 tfr d,u place two chars in U
|
|
352 puls d restore A&B (u is still pushed)
|
|
353
|
|
354 flup20
|
|
355 leay 6,y next option entry
|
|
356 tst ,y last entry?
|
|
357 lbmi syntax ..yes, bad option
|
|
358 cmpa 1,y
|
|
359 bne flup20 same name?
|
|
360 cmpu 2,y
|
|
361 bne flup20 ..no, loop
|
|
362
|
|
363 * Found Option
|
|
364 puls u
|
|
365 sty txtptr
|
|
366 lda ,x+ must be followed by "="
|
|
367 cmpa #'=
|
|
368 lbne syntax
|
|
369
|
|
370 bsr setnum set that option
|
|
371 bra flup10
|
|
372
|
|
373 * -------------
|
|
374 setnum equ * Get Hex Input and Set Option:
|
|
375 ldb 5,y get # of bytes
|
|
376 stb hexcnt
|
|
377 clr hexin zero hex input bytes
|
|
378 clr hexin+1
|
|
379
|
|
380 setloop
|
|
381 lda ,x+ get next #
|
|
382 cmpa #'$ optional hex $?
|
|
383 beq setloop yes, ignore
|
|
384 cmpa #C$SPAC end of number?
|
|
385 beq setnum2 ..yes, set option, rts
|
|
386 cmpa #C$CR end of line?
|
|
387 beq setnum1
|
|
388 bsr hexcnvt else, get next num
|
|
389 bra setloop ..loop
|
|
390
|
|
391 setnum1
|
|
392 leax -1,x reset so can find <cr>
|
|
393 setnum2
|
|
394 ldb 4,y get option offset
|
|
395 leay desc,u point to desc
|
|
396 leay b,y point to option
|
|
397 ldd hexin pick up hex input
|
|
398 dec hexcnt
|
|
399 beq setone
|
|
400 std ,y set two byte option
|
|
401 rts
|
|
402 setone
|
|
403 tsta
|
|
404 lbne syntax
|
|
405 stb ,y set one byte option
|
|
406 rts
|
|
407
|
|
408 hexcnvt equ * Convert ASCII Hex-->Byte:
|
|
409 suba #$30 make number from ASCII
|
|
410 lbmi syntax
|
|
411 cmpa #10 is it number?
|
|
412 bcs num
|
|
413 anda #$5F make uppercase
|
|
414 suba #$11-$0a make hex $A-$F
|
|
415 cmpa #$0A
|
|
416 lbcs syntax
|
|
417 cmpa #$10 not hex char?
|
|
418 lbcc syntax
|
|
419 num
|
|
420 ldb #16 fancy asl *4
|
|
421 mul
|
|
422 pshs b save top 4 bits
|
|
423 ldd hexin
|
|
424 rol ,s
|
|
425 rolb
|
|
426 rola
|
|
427 rol ,s
|
|
428 rolb
|
|
429 rola
|
|
430 rol ,s
|
|
431 rolb
|
|
432 rola
|
|
433 rol ,s
|
|
434 rolb
|
|
435 rola
|
|
436 std hexin
|
|
437 puls b,pc drop temp, rts.
|
|
438
|
|
439 verify equ * Update Descriptor CRC:
|
|
440 pshs u save data ptr
|
|
441 leau desc,u
|
|
442 tfr u,x X is mod address
|
|
443
|
|
444 ldy M$Size,x Y is mod size
|
|
445 leay -3,y beginning of chksum
|
|
446 tfr y,d Y is byte count
|
|
447 leau d,u set U to chksum
|
|
448
|
|
449 lda #$FF init chksum
|
|
450 sta ,u
|
|
451 sta 1,u
|
|
452 sta 2,u
|
|
453 pshs u
|
|
454 os9 F$CRC calc new crc
|
|
455 puls u
|
|
456 com ,u+ fix it up right
|
|
457 com ,u+
|
|
458 com ,u
|
|
459
|
|
460 lda path was it file?
|
|
461 beq memmod ..no, in memory
|
|
462 ldx #0
|
|
463 tfr x,u
|
|
464 os9 I$Seek go back to file begin
|
|
465 lbcs error
|
|
466 puls u
|
|
467 leax desc,u
|
|
468 ldy dsize
|
|
469 os9 I$Write update desc file
|
|
470 lbra okayend
|
|
471
|
|
472 memmod
|
|
473 puls u
|
|
474 leax desc,u
|
|
475 ldb dsize+1
|
|
476 ldy module
|
|
477
|
|
478 move
|
|
479 lda ,x+
|
|
480 sta ,y+
|
|
481 decb
|
|
482 bne move
|
|
483
|
|
484 lbra okayend2
|
|
485
|
|
486
|
|
487 syntax equ *
|
|
488 leax synmsg,pc
|
|
489 ldy #synlen
|
|
490 lda #2
|
|
491 os9 I$Write
|
|
492
|
|
493 ldx parmptr
|
|
494 leax -1,x
|
|
495 pshs x
|
|
496 ldy #0
|
|
497
|
|
498 slup
|
|
499 leay 1,y
|
|
500 lda ,x+
|
|
501 cmpa #C$CR
|
|
502 beq synsay
|
|
503 cmpa #C$SPAC
|
|
504 bne slup
|
|
505
|
|
506 synsay
|
|
507 puls x
|
|
508 lda #2
|
|
509 os9 I$Write output err
|
|
510 lbra okayend
|
|
511
|
|
512 emod
|
|
513 size equ *
|
|
514 end
|