;*************************** AMUS Program Label ******************************
; Filename: HEXDMP.M68                                      Date: 01/12/89
; Category: UTIL         Hash Code: 655-503-251-756      Version: 1.0(100)
; Initials: PHI/AM       Name: JIM DULANEY
; Company: SYSTEMS TECHNOLOGY                      Telephone #:
; Related Files: FILER.M68 (MACRO FILES USED IN HEXDMP)
; Min. Op. Sys.:                               Expertise Level: INT
; Special:
; Description: DUMP-like utility which redirects the output to a file called
; filename.dmp. Output is in hex format.  (.HEXDMP filename.ext)
;
;*****************************************************************************
;08/21/81 - TDW, SYSTEMS TECHNOLOGY

;11/07/82 - [100] Converted to L processor

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM
       SEARCH  FILER

       VMAJOR=1
       VMINOR=0
       VEDIT=100.

;Storage areas
OFINI
RECLNG  =       16.                     ; standard rec length
       .OFDEF  INPDDB,D.DDB
       .OFDEF  HEXDDB,D.DDB
       .OFDEF  DMPADR,4
       .OFDEF  SAVJCB,2
       .OFDEF  RECSIZ,4
       .OFDEF  COL,2
       .OFDEF  RECBUF,RECLNG
       .OFDEF  STRBUF,24.
OFSIZ   IMPSIZ


HEXDMP:
       PGMHDR  <Hex Dump File>,<HEXDMP filespec(.LIT)>
       GETIMP  IMPSIZ,A5
       PUSH    A2                      ; save line index for output file
       OPNINP  INPDDB(A5),LIT          ; do input file
       POP     A2                      ; get line index
       OPNOUT  HEXDDB(A5),,DMP         ; do output

;set hex for numeric conversions
       JOBIDX  A6
       MOVW    JOBTYP(A6),SAVJCB(A5)
       ORW     #J.HEX,JOBTYP(A6)
       CLR     DMPADR(A5)


;D1,D4 = work reg, char reg
;A2 --> hex string buffer
;A3 --> RECBUF
;A5 --> work memory

       CALL    HDRLIN

LOOP:   CTRLC   DONE                    ; allow user to exit
       TYPE    <.>
       CALL    GETREC                  ; get a record
       TST     RECSIZ(A5)              ; if this record is zero, then eof
       JEQ     LSTREC
       MOV     DMPADR(A5),D1
       LEA     A2,HEXDDB(A5)           ; point to ddb for ocvt
       OCVT    6.,OT$DDB

       MOVB    #':,D1
       CALL    PUTC

       LEA     A3,RECBUF(A5)
       MOV     RECSIZ(A5),D0           ; loop counter
       MOVW    #RECLNG,COL(A5)
10$:
       MOVW    COL(A5),D7
       AND     #3,D7
       BNE     15$
       CALL    SPACE
15$:    MOVB    (A3)+,D1                ; get a data byte

       LEA     A2,HEXDDB(A5)
       OCVT    2,OT$DDB                ; data byte to hex
       CALL    SPACE
       DECW    COL(A5)
       SOB     D0,10$

       MOV     #RECLNG,D0
       SUB     RECSIZ(A5),D0
       BEQ     30$

20$:
       MOVW    COL(A5),D7
       AND     #3,D7
       BNE     25$
       CALL    SPACE
25$:    CALL    SPACE2                  ; fill with trailing spaces
       CALL    SPACE
       DECW    COL(A5)
       SOB     D0,20$

30$:
       CALL    SPACE
DMPASC: LEA     A3,RECBUF(A5)           ; point to buffer again
       MOV     RECSIZ(A5),D0

10$:    MOVB    (A3)+,D1
       CMPB    D1,#40
       BLT     20$
       CMPB    D1,#177
       BGT     20$
15$:    CALL    PUTC
       SOB     D0,10$
       BR      30$
20$:    MOVB    #'.,D1
       BR      15$
30$:
       CALL    NEWLIN
       MOV     RECSIZ(A5),D7
       ADD     D7,DMPADR(A5)   ; increment load address by recsiz
       JMP     LOOP

LSTREC:
       CALL    NEWLIN
DONE:
       CRLF


       TYPECR  <DONE>
       JOBIDX  A6
       MOVW    SAVJCB(A5),JOBTYP(A6)

       CLOSE   HEXDDB(A5)
       EXIT

NEWLIN: MOVB    #CR,D1                  ; cr
       CALL    PUTC
       MOVB    #LF,D1                  ; lf
       BR      PUTC

SPACE2: CALL    SPACE
SPACE:  MOVB    #40,D1
PUTC:   PUTCHR  HEXDDB(A5)
       RTN

GETREC: MOV     #RECLNG,D0              ; standard record length
       LEA     A1,RECBUF(A5)           ; point to rec buffer
       CLR     RECSIZ(A5)              ; start with zero
10$:    GETCHR  INPDDB(A5),(A1)+        ; get a chr into buffer
       BEQ     20$                     ; z flag is eof
       INC     RECSIZ(A5)              ; recsiz one more
       SOB     D0,10$                  ; loop until done
20$:    RTN

HDRLIN: JOBIDX  A0
       CALL    NEWLIN
       CALL    SPACE2
       LEA     A2,DMPMSG
       CALL    PUTS
       LEA     A2,STRBUF(A5)
       LEA     A1,D.DEV+INPDDB(A5)
       TSTW    @A1
       BNE     1$
       LEA     A1,JOBDEV(A0)
1$:     UNPACK
       MOVW    D.DRV+INPDDB(A5),D1
       BPL     2$
       MOVW    JOBDRV(A0),D1
2$:     DCVT    1,OT$MEM
       MOVB    #':,(A2)+
       LEA     A1,D.FIL+INPDDB(A5)
       UNPACK
       UNPACK

100$:   CMMB    #40,-1(A2)
       BNE     101$
       DEC     A2
       BR      100$
101$:
       MOVB    #'.,(A2)+
       UNPACK
102$:   CMMB    #40,-1(A2)
       BNE     103$
       DEC     A2
       BR      102$
103$:
       MOVB    #'[,(A2)+

       ANDW    #^C<J.HEX>,JOBTYP(A0)

       MOVW    D.PPN+INPDDB(A5),D1
       BNE     3$
       MOVW    JOBUSR(A0),D1
3$:     SWAB    D1
       AND     #377,D1
       OCVT    0,OT$MEM

       MOVB    #',,(A2)+

       MOVW    D.PPN+INPDDB(A5),D1
       BNE     4$
       MOVW    JOBUSR(A0),D1
4$:     AND     #377,D1
       OCVT    0,OT$MEM

       ORW     #J.HEX,JOBTYP(A0)

       MOVB    #'],(A2)+

       CLRB    @A2
       LEA     A2,STRBUF(A5)
       CALL    PUTS
       CALL    NEWLIN
       CALL    NEWLIN
       RTN

PUTS:   PUTSTR  HEXDDB(A5),A2
       RTN


DMPMSG: ASCIZ   <Hex Dump Utility Version 1.0 - Dumping >
       END