;*************************** AMUS Program Label ****************************** ; Filename: HEXCVT.M68 Date: 01/13/89 ; Category: UTIL Hash Code: 151-620-647-741 Version: 1.0(102) ; 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 binary file to a intel hex file. ; .HEXCVT filename.ext ; ;***************************************************************************** ;08/21/81 - TDW, SYSTEMS TECHNOLOGY ;10/23/82 - [100] Converted to L ;11/01/82 - [101] Cosmetic improvements ;03/12/83 - [102] Bug in incrementing current address SEARCH SYS SEARCH SYSSYM SEARCH TRM SEARCH FILER ; was copy [101] VMAJOR=1 VMINOR=0 VEDIT=102. RECLNG = 16. ; standard rec length ;Storage areas .OFINI .OFDEF INPDDB,D.DDB .OFDEF HEXDDB,D.DDB .OFDEF LODADR,2 .OFDEF CURADR,2 .OFDEF SAVJCB,2 .OFDEF RECSIZ,2 .OFDEF CHKSUM,2 .OFDEF STRBUF,10 .OFDEF RECBUF,RECLNG .OFSIZ IMPSIZ HEXCVT: PHDR -1,0,PH$REE!PH$REU CRLF ; [101] TYPE <== AM-100> ; [101] MOV #'/,D1 ; [101] TTY ; [101] TYPESP <L Convert file to Intel HEX Format Version> ; [101] VCVT HEXCVT+2,OT$TRM TYPECR < ==> CRLF ; [101] BYP LIN BNE 1$ TYPECR <USAGE: HEXCVT filespec.LIT,load-bias(HEX)> EXIT 1$: GETIMP IMPSIZ,A5,EXIT PUSH A2 ; save line index for output file OPNINP INPDDB(A5),LIT ; do input file POP A2 ; get line index OPNOUT HEXDDB(A5),HEX,HEX ; do output ;set hex for numeric conversions JOBIDX A6 MOVW JOBTYP(A6),SAVJCB(A5) ORW #J.HEX,JOBTYP(A6) CLRW LODADR(A5) CLRW CURADR(A5) INC A2 ; skip commas if any BYP LIN BEQ 2$ GTOCT ; this will get a hex value BMI 3$ MOVW D1,LODADR(A5) ; set load bias MOVW D1,CURADR(A5) BR 2$ 3$: TYPECR <Load bias error.> JMP DONE 2$: ;D1 = work reg, char reg ;A2 --> hex strbuf ;A5 --> work memory LOOP: CTRLC DONE ; allow user to exit TYPE <.> ; let him know we are alive MOVB #':,D1 ; record mark frame 0 CALL PUTC CLRW CHKSUM(A5) ; start with zero CALL GETREC ; get a record MOVW RECSIZ(A5),D1 ; get the record size BEQ LSTREC ADDW D1,CHKSUM(A5) ; and add to CALL OCVT2 MOVW CURADR(A5),D1 ; load address fr 3-6 SWAB D1 ADDW D1,CHKSUM(A5) SWAB D1 ADDW D1,CHKSUM(A5) ; place both bytes in checksum CALL OCVT4 CLR D1 ; record type 0 TSTW RECSIZ(A5) BNE 5$ MOV #1,D1 5$: ADDW D1,CHKSUM(A5) CALL OCVT2 LEA A3,RECBUF(A5) MOVW RECSIZ(A5),D0 ; loop counter BEQ 20$ 10$: MOVB (A3)+,D1 ADDW D1,CHKSUM(A5) CALL OCVT2 SOB D0,10$ 20$: MOVW CHKSUM(A5),D1 NEG D1 AND #377,D1 CALL OCVT2 CALL NEWLIN MOVW RECSIZ(A5),D7 ADDW D7,CURADR(A5) ; increment load address by recsiz [102] JMP LOOP LSTREC: CLR D1 CALL OCVT2 MOVW LODADR(A5),D1 ; orginal load address is execute adr SWAB D1 ADDW D1,CHKSUM(A5) SWAB D1 ADDW D1,CHKSUM(A5) CALL OCVT4 MOV #1,D1 ; record type 1 ADDW D1,CHKSUM(A5) CALL OCVT2 MOVW CHKSUM(A5),D1 ; and check sum record NEG D1 AND #377,D1 CALL OCVT2 CALL NEWLIN DONE: CRLF TYPECR <DONE> JOBIDX A6 MOVW SAVJCB(A5),JOBTYP(A6) CLOSE INPDDB(A5) CLOSE HEXDDB(A5) EXIT: EXIT NEWLIN: MOVB #CR,D1 ; cr CALL PUTC MOVB #LF,D1 ; lf PUTC: PUTCHR HEXDDB(A5) RTN GETREC: MOV #RECLNG,D0 ; standard record length LEA A1,RECBUF(A5) ; point to rec buffer CLRW RECSIZ(A5) ; start with zero 10$: GETCHR INPDDB(A5),(A1)+ ; get a chr into buffer BEQ 20$ ; z flag is eof INCW RECSIZ(A5) ; recsiz one more SOB D0,10$ ; loop until done 20$: RTN ;flags for OCVT will be bit 3, with number in D1, A2->STRBUF ; OCVT 2,OT$MEM OCVT4: LEA A2,STRBUF(A5) OCVT 4,OT$MEM BR OCVT11 OCVT2: LEA A2,STRBUF(A5) OCVT 2,OT$MEM ; record length fr 1,2 OCVT11: CLRB @A2 LEA A2,STRBUF(A5) PUTSTR HEXDDB(A5) RTN END