;****************************************************************************
;
; FDUMP.M68 - "File Dump"
;
; Written by: Dave Heyliger - AMUS Staff
;
; Purpose: to dump files NOT to the screen but to a VUEable, PRINTable,
; file.
;
; Usage: FDUMP filespec TO output-filespec
; Defaults on both filespecs are .TXT
; Output always in HEX (easy to read)
; or
;
; Usage: FDUMP filespec
; Default on first filespec is .TXT
; Output filespec is FDUMP.TXT
; Output is always in HEX (Dave is right!)
;
;
;****************************************************************************
; [101] - 04/09/88
; [101] - made output look like output from plain old DUMP
; seperated every 2cnd display byte with 2 spaces like DUMP
; Makes it easier to read HEX representations
; [102] - 04/10/88
; [102] - Fixed potential problem if user did not enter '_TO_'
; A2 was pushed up 4 bytes. If buffer garbage was past the
; 4th byte FDUMP would pick it up as intended filespec.
; Pushing A2 up 4 bytes without checking for possible short end
; could cause eratic file output names.
; Also added default of FDUMP.TXT for ease (lazyness)
; [103] - 04/10/88
; [103] - Added display of next block link on title output line
SEARCH SYS ;get the usuals
SEARCH SYSSYM
SEARCH TRM
SEARCH AAA ;AAA.M68 in 100,133
;define edit version
VMAJOR=1 ;original by Dave Heyliger
VMINOR=0
VEDIT=100. ; good program Dave !
VEDIT=101. ; 04/09/88 ;Modified by James A. Jarboe IV
VEDIT=102. ; 04/10/88 ;Modified by James A. Jarboe IV
VEDIT=103. ; 04/10/88 ;Modified by James A. Jarboe IV
; all in a days work !
;define variables
.OFINI ;define some variable space
.OFDEF IDDB,D.DDB ;input file DDB
.OFDEF ODDB,D.DDB ;output file DDB
.OFDEF BUFFER,20 ;ascii buffer space for UNPACK
.OFDEF FS,4 ;number of blocks in file
.OFDEF FT,2 ;flag: 1 = seq, 0 = random
.OFDEF FBN,2 ;block number
.OFSIZ IMPSIZ
;define some macros
DEFINE BEEP ;a "beep" macro
MOV #7,D1 ;get a bell
TTY ;beep!
ENDM
DEFINE BRIGHT=PRTTAB -1,12. ;output in bright
DEFINE DIM=PRTTAB -1,11. ;output in dim
;START OF PROGRAM
PHDR -1,0,PH$REE!PH$REU ;re-entrant, reusable
GETIMP IMPSIZ,A3 ;A3 points to variable space
;process the input line "FDUMP filespec TO output-filespec"
;or process "FDUMP filespec"
BYP ;A2 points to first filespec
LIN ;just a cr?
BEQ FERR ;yup, no good
LEA A4,IDDB(A3) ;point to input DDB w/ A4
MOVB #D$ERC!D$BYP,IDDB+D.FLG(A3) ;trap errors
FSPEC @A4,TXT ;default is .TXT
CMPB IDDB+D.ERR(A3),#D$ESPC ;filespec error?
JNE OK1 ;nope, looks good Lewis!
;filespec not a good one, give error message
FERR: BEEP ;"beep"
DIM ;dim output
TYPE <Usage: FDUMP >
BRIGHT ;bright output
TYPE <filespec >
DIM
TYPE <TO >
BRIGHT
TYPECR <output-filespec>
DIM
TYPECR
TYPECR <or >
TYPECR
DIM
TYPE <Usage: FDUMP >
BRIGHT
TYPECR <filespec>
DIM
TYPECR
TYPECR <Both input filespec and output filespec defaults are .TXT>
TYPECR <and output will always be in HEX.>
TYPECR <If no output file is designated then the default output>
TYPE <file is >
BRIGHT
TYPE <FDUMP.TXT>
DIM
TYPECR < .>
BRIGHT
EXIT
;first filespec OK, now look at second one
; '_TO_' doesn't really have to be typed in. Just 4 positions
; between infile and outfile file specs, but we do need
; to check for carriage returns in case operator short changed
; us and we don't want to bypass the end of the input line
; and get garbage from A2 would point to if we just added 4
; bytes to it. Not all users are programmers they do make mistakes!
MERR: ; [102] ; maybe an error, maybe not
CMPB D2,#3 ; [102] ; first check ?
JNE FERR ; [102] ; no..then it is an error
LEA A2,DEFFIL ; [102] ; load the default file
BR DOFIL ; [102] ; no do it
OK1:
MOV #3,D2 ; [102] ; counter = 3
5$:
CMMB @A2,#13. ; [102] ; a carriage return maybe ?
JEQ MERR ; [102] ; tell'em how
ADD #1,A2 ; [102] ; move up along the input line
CMPB D2,#0 ; [102] ; past the '_TO_' yet ?
BEQ DOFIL ; [102] ; yes.. then lets see filename
DEC D2 ; [102] ; subtract 1 from counter
BR 5$ ; [102] ; try next place
DOFIL:
CLR D2 ; [102] ; clear counter someone may need it
CMMB @A2,#13. ; [102] ; are you sure we aren't at end?
JEQ FERR ; [102] ; well tell'em how to do it
LEA A5,ODDB(A3) ;point A5 to output DDB
MOVB #D$ERC!D$BYP,ODDB+D.FLG(A3) ;trap errors
FSPEC @A5,TXT ;default is .TXT
CMPB ODDB+D.ERR(A3),#D$ESPC ;filespec error?
JEQ FERR ;yup, give directions
;setup both files for I/O
INIT @A4 ;setup a block buffer
LOOKUP @A4 ;find input file?
BEQ 10$ ;yup
BEEP ;nope, error
TYPE <Shoot! I can't find >
PRNAM IDDB+D.FIL(A3)
TYPECR <!>
EXIT ;and quit
;found first file, see if output file exists
10$: INIT @A5 ;setup a block buffer
LOOKUP @A5 ;there?
BNE IOSET ;nope, that's good
BEEP ;yup, warn them and quit
TYPE <Hey! >
PRNAM ODDB+D.FIL(A3)
TYPECR < already exists!>
EXIT
;let the user know this thing is working..
IOSET: TYPE <Creating > ;portion of message
PRNAM ODDB+D.FIL(A3) ;print output filespec
TYPE <.> ;fancy dot output
;both files looking real good now, get em ready for I/O
CLRW FT(A3) ;clear file type flag
MOV IDDB+D.WRK(A3),FS(A3) ;save number of input blocks
CMPW IDDB+D.WRK+6(A3),#-1 ;random input file?
BNE 10$ ;nope
MOVW IDDB+D.REC+2(A3),FBN(A3) ;yup, save first block
BR LOOP ;and bypass below
10$: MOVW #1,FT(A3) ;else set sequential flag
;now for each block, READ and translate til done
LOOP: OPENO @A5 ;open A5 for seq. output
READ @A4 ;read first block of input
;set HEX for easy programming (HEX is best anyway!)
10$: JOBIDX A6 ;get this JOB
LEA A6,JOBTYP(A6) ;A6 points to JOBTYP word
PUSH A6 ;save JOBTYP word on stack
HEX ;now safe to SET HEX
;type "Block dump of filespec"
BLKDMP: LEA A2,FILMSG ;A2 points to file message
10$: MOVB (A2)+,D1 ;get the message
CMPB D1,#'. ;at end of message?
BEQ 20$ ;yup
FILOTB @A5 ;nope, type out message
BR 10$ ;and get next character
;get the filespec
20$: LEA A2,BUFFER(A3) ;point to buffer space
PUSH A2 ;save start location
LEA A1,IDDB+D.FIL(A3) ;point to RAD50 filename
UNPACK ;get ascii filename
UNPACK
UNPACK ;and extension
MOV @SP,A2 ;retrieve start location
;now move it to the file
MOV #6,D2 ;ascii counter
30$: MOVB (A2)+,D1 ;get a character
FILOTB @A5 ;type it out
CMPB @A2,#40 ;at a space?
BEQ 40$ ;yup, get ".ext"
DEC D2 ;one less character
BNE 30$ ;with more to go
40$: MOV #'.,D1 ;get the dot
FILOTB @A5 ;type it out
POP A2 ;get start location
ADD #6,A2 ;point to extension
MOV #3,D2 ;counter
45$: MOVB (A2)+,D1 ;get a character
FILOTB @A5 ;type it out
CMPB @A2,#40 ;space?
BEQ 50$ ;yup
DEC D2 ;one less character
BNE 45$ ;with more to go
;finish header with " - block ####"
50$: LEA A2,BLKMSG ;A2 points to block message
55$: MOVB (A2)+,D1 ;get the message
CMPB D1,#'. ;end?
BEQ 60$ ;yup
FILOTB @A5 ;nope, type out message
BR 55$ ;and get next character
60$: LEA A2,ODDB(A3) ;setup A2 to point to ODDB
MOV IDDB+D.BUF(A3),A1 ;A1 points to block read
MOVW IDDB+D.REC+2(A3),D1 ;get block number
OCVT 4,OT$DDB ;type out the block number
; if sequential then print block link
; for us simple minded ones
CMPW FT(A3),#1 ;[103] ;sequential file?
BNE 68$ ;[103] ;nope.. then can't print it
LEA A2,NXTMSG ;[103] ; load next link message
65$:
MOVB (A2)+,D1 ;[103] ; set it up
CMPB D1,#'. ;[103] ; until the "."
BEQ 66$ ;[103] ; then go on
FILOTB @A5 ;[103] ; spit it out
BR 65$ ;[103] ; do it again
66$:
MOVW @A1,D1 ;[103] ; move block link to D1
LEA A2,ODDB(A3) ;[103] ; set up output DDB
OCVT 4,OT$DDB ;[103] ; convert that sucker
68$:
MOV #15,D1 ;get CR
FILOTB @A5 ;type it out
MOV #12,D1 ;get LF
FILOTB @A5 ;type it out
MOV #15,D1 ;get CR
FILOTB @A5 ;type it out
MOV #12,D1 ;get LF
FILOTB @A5 ;type it out
;save block pointer if sequential
CMPW FT(A3),#1 ;sequential file?
BNE 70$ ;nope
MOVW @A1,FBN(A3) ;yup, save ptr to next block
70$: MOV #0,D5 ;D5 contains byte count offset
;create 32 lines of 16 bytes/line (just like DUMP)
;on each new line, first output offset
NEWLIN: MOV A5,A2 ;A2 points to output DDB
MOV D5,D1 ;byte count to D1
OCVT 6,OT$DDB ;output the offset to DDB
MOV #':,D1 ;get a fancy colon
FILOTB @A5 ;type it out
MOV #0,D4 ;D4 contains line byte count
;save start of line pointer on stack, then output 16 bytes
PUSH A1 ;save pointer
MOVB #-1,D2 ; [101] ;set space counter to -1
HEXLIN:
MOV #40,D1 ;get a space
FILOTB @A5 ;type out the space
INC D2 ; [101] ; add 1 to counter
CMPB D2,#2 ; [101] ; we at second space ?
BNE 10$ ; [101] ; no... then output byte
MOV #40,D1 ; [101] ; move space into D1
FILOTB @A5 ; [101] ; spit it out
MOVB #0,D2 ; [101] ; clear space counter
10$: ;
MOVB (A1)+,D1 ;get a byte
OCVT 2,OT$DDB ;output the byte
INC D4 ;one less byte to do
INC D5 ;increment total count
CMP D4,#16. ;at end of line?
BNE HEXLIN ;nope
;now for each line, get the line again but "translate" if you can
POP A1 ;repoint to start
CLR D4 ;clear count again too
MOV #40,D1 ;get a space
FILOTB @A5 ;type it out
ASCLIN: CMPB @A1,#40 ;space or less?
BLT 20$ ;yup
CMPB @A1,#176 ;"~" or more?
BGT 20$ ;yup
MOVB (A1)+,D1 ;nope, typeable!
FILOTB @A5 ;type it out
BR NXTBYT ;and setup for next byte
20$: INC A1 ;bypass character
MOV #'.,D1 ;get "non-typable"
FILOTB @A5 ;and type it out
NXTBYT: INC D4 ;count the byte (NOT D5!)
CMP D4,#16. ;at end of line?
BNE ASCLIN ;no, get next character
CMP D5,#512. ;at the end of block
BEQ GNB ;yup, grab next block
MOV #15,D1 ;get at CR
FILOTB @A5 ;output it
MOV #12,D1 ;get a LF
FILOTB @A5 ;output it
JMP NEWLIN ;output new line
;come here to get next block
GNB: TYPE <.> ;let em know it's working
MOV #15,D1 ;get CR
FILOTB @A5 ;type it out
MOV #12,D1 ;get LF
FILOTB @A5 ;type it out
MOV #15,D1 ;get CR
FILOTB @A5 ;type it out
MOV #12,D1 ;get LF
FILOTB @A5 ;type it out
MOV #15,D1 ;get CR
FILOTB @A5 ;type it out
MOV #12,D1 ;get LF
FILOTB @A5 ;type it out
CMPW FT(A3),#1 ;sequential file?
BNE 10$ ;nope
CMPW FBN(A3),#0 ;end of file?
BEQ EXIT ;yup, all done
MOVW FBN(A3),IDDB+D.REC+2(A3) ;yup, set next block number
READ @A4 ;read it
JMP BLKDMP ;and "dump" the next block
;here if random file
10$: SUB #1,FS(A3) ;one less block to do
CMP FS(A3),#0 ;last block?
BEQ EXIT ;yup, quit
INCW IDDB+D.REC+2(A3) ;nope, point to next block
READ @A4 ;read it
JMP BLKDMP ;and dump some more
EXIT: CLOSE @A5
CRLF
EXIT
;misc ascii messages
DEFFIL: ASCII /FDUMP/ ; [102]
EVEN
FILMSG: ASCII /Block dump of ./
EVEN
BLKMSG: ASCII / - block number ./
EVEN
NXTMSG: ASCII /, next block link is ./ ; [103]
EVEN
END