;*************************** AMUS Program Label ******************************
; Filename: HEXLOD.M68                                      Date: 01/13/89
; Category: UTIL         Hash Code: 442-161-401-705      Version: 1.0(101)
; Initials: PHI/AM       Name: JIM DULANEY
; Company: SYSTEMS TECHNOLOGY                      Telephone #:
; Related Files: USES FILER.M68 (MACROS)
; Min. Op. Sys.:                               Expertise Level: INT
; Special:
; Description: Converts a intel hex file to a binary file.
; .HEXLOD filename.ext
;
;*****************************************************************************
;08/21/81 - TDW, SYSTEMS TECHNOLOGY
;10/23/82 - [100] CONVERT TO L
;11/01/82 - [101] Cosmetic improvements

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM
       SEARCH  FILER                   ; was copy              [101]

       VMAJOR=1
       VMINOR=0
       VEDIT=101.

       .OFINI
OFDEF   HEXDDB,D.DDB
OFDEF   OUTDDB,D.DDB
OFDEF   LODADR,2
OFDEF   SAVJCB,2
OFDEF   RECSIZ,2
OFDEF   CHKSUM,2
       .OFSIZ  IMPSIZ

HEXLOD: PHDR    -1,0,PH$REE!PH$REU
       CRLF                            ;                       [101]
       TYPE    <== AM-100>             ;                       [101]
       MOV     #'/,D1                  ;                       [101]
       TTY                             ;                       [101]
       TYPESP  <L Load file.HEX to file.BIN Version> ;         [101]
       VCVT    HEXLOD+2,OT$TRM
       TYPECR  < ==>
       CRLF
       BYP
       LIN
       BNE     1$
       TYPECR  <USAGE: HEXLOD filespec.HEX>
       EXIT
1$:
       GETIMP  IMPSIZ,A5,EXIT
       PUSH    A2                      ; save line index for output file
       OPNINP  HEXDDB(A5),HEX          ; do output
       POP     A2                      ; get line index
       OPNOUT  OUTDDB(A5),BIN, BIN     ; do input file

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

;D1 = work reg, char reg
;A5 --> work memory
LOOP:   CTRLC   DONE                    ; allow user to exit
       CALL    GETC
       CMPB    D1,#':                  ; this will bypass cr/lf's
       BNE     LOOP                    ; skip to start of header
       TYPE    <.>                     ; let him know we are alive
       CLRW    CHKSUM(A5)
       CALL    GETBYT                  ; first byte is record size
       MOVW    D1,RECSIZ(A5)
       CALL    GETWRD                  ; get address
       MOVW    D1,LODADR(A5)

DEFINE  ERROR   MSG
       CRLF
       BELL
       TYPECR  <MSG>
       ENDM

       CALL    GETBYT                  ; record type
       TSTB    D1
       BEQ     10$
;       ERROR   <Record Type Non-zero>
;       BR      ABORT
       BR      DONE
10$:
       MOVW    RECSIZ(A5),D0           ; loop counter
       BEQ     25$                     ; this is the last record
20$:    CALL    GETBYT                  ; get data bytes
       PUTCHR  OUTDDB(A5)
       SOB     D0,20$

25$:    CALL    GETBYT                  ; get checksum
       MOVW    CHKSUM(A5),D0
       AND     #377,D0
       BEQ     30$
       ERROR   <Loader Check-sum Error>
       BR      ABORT
30$:    TSTB    RECSIZ(A5)
       JNE     LOOP

DONE:
       CRLF
       TYPECR  <DONE>
ABORT:
       CRLF
       JOBIDX  A6
       MOVW    SAVJCB(A5),JOBTYP(A6)
       CLOSE   OUTDDB(A5)
       CLOSE   HEXDDB(A5)
EXIT:   EXIT

GETWRD:
       CALL    GETBYT                  ; get high byte of address
       SWAB    D1                      ; swap the bytes
       PUSH    D1
       CALL    GETBYT                  ; get low byte of address
       OR      (SP)+,D1                ; and put together
       RTN

GETBYT:
       CALL    GETHEX
       SWAD    D1
       PUSH    D1
       CALL    GETHEX
       OR      (SP)+,D1
       AND     #377,D1
       ADDW    D1,CHKSUM(A5)
       RTN
GETHEX:
       CALL    GETC                    ; get Ascii char
       BEQ     DONE                    ; is eof
       SUB     #'0,D1                  ; offset for 0-9
       CMP     D1,#10.                 ; is char a 0-9 digit
       BLT     1$                      ; yes, exit
       SUB     #7,D1                   ; must be A-F, correct
1$:     RTN

GETC:
       GETCHR  HEXDDB(A5)
       RTN

       END