;*************************** 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 ; [101] VCVT HEXLOD+2,OT$TRM TYPECR < ==> CRLF BYP LIN BNE 1$ TYPECR 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 ENDM CALL GETBYT ; record type TSTB D1 BEQ 10$ ; ERROR ; 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 BR ABORT 30$: TSTB RECSIZ(A5) JNE LOOP DONE: CRLF TYPECR 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 .