TITLE HEXIFY .COM FILE TO .HEX FILE ; Bruce Tanner, Cerritos College, Norwalk CA; May 1983 T1=1 T2=2 T3=3 T4=4 I=5 O=6 PC=7 CNT=10 CHK=11 PTR=12 P=17 COM==1 HEX==2 START: RESET RESCAN ;RESCAN THE COMMAND LINE FOR "HEXIFY FOO" MOVE T2,[POINT 6,COMFIL] LSPACE: INCHWL T1 CAIN T1,40 JRST LSPACE SKIPA RDCHAR: INCHWL T1 CAIN T1,15 ;NO ARG SUPPLIED JRST ASK CAIE T1,40 CAIN T1,11 JRST RDNAME JRST RDCHAR ASK: INCHWL T1 ;EAT LF OUTSTR [ASCIZ/File name: /] RDNAME: INCHWL T1 CAIN T1,"." ;EXT? JRST RDEXT CAIL T1,140 SUBI T1,40 ;LC TO UC SUBI T1,40 ;ASCII TO SIXBIT JUMPLE T1,OPNFIL ;CONTROL CHAR IDPB T1,T2 ;STICK IT JRST RDNAME RDEXT: MOVE T2,[POINT 6,COMFIL+1] JRST RDNAME OPNFIL: CLRBFI MOVE T1,COMFIL ;OUTPUT FILE IS SAME AS INPUT FILE MOVEM T1,HEXFIL MOVSI T1,'HEX' ;BUT WITH A .HEX EXT MOVEM T1,HEXFIL+1 MOVSI T1,'COM' SKIPN COMFIL+1 ;.COM BY DEFAULT MOVEM T1,COMFIL+1 OPEN COM,COMSPC ;OPEN THE FILES HALT OPEN HEX,HEXSPC HALT LOOKUP COM,COMFIL JRST NOFILE ENTER HEX,HEXFIL JRST BADFIL MOVSI T1,(POINT 8,0) ;.COM FILE IS 8 BIT BYTES MOVEM T1,IBUF+1 MOVE P,[IOWD 20,STACK] MOVEI PC,400 ;ALL .COM FILES START AT 100H LOOP0: SETZ CNT, MOVE PTR,[POINT 8,BUFFER] LOOP: PUSHJ P,INCH ;READ SOME BYTES JRST EOF IDPB I,PTR ;PUT THEM IN A BUFFER CAIGE CNT,^D30 ;WHEN WE GET 30 BYTES, JRST LOOP PUSHJ P,WRTBUF ;WRITE THE BUFFER OUT JRST LOOP0 ;AND LOOP WRTBUF: MOVEI O,":" ;START WITH A : PUSHJ P,OUCH MOVE T1,CNT ;MOVE THE BYTE COUNT TO T1 SETZ CHK, ;ZERO THE CHECKSUM PUSHJ P,HEXBYT ;WRITE THE BYTE COUNT IN HEX MOVE T1,PC LSH T1,-10 PUSHJ P,HEXBYT ;HIGH BYTE OF PC MOVE T1,PC PUSHJ P,HEXBYT ;LOW BYTE OF PC ADD PC,CNT ;UPDATE THE PC FOR NEXT TIME SETZ T1, PUSHJ P,HEXBYT ;TYPE 0 (CODE) MOVE T4,CNT MOVE PTR,[POINT 8,BUFFER] WRT1: ILDB T1,PTR ;WRITE OUT ALL THE BYTES IN THE BUFFER PUSHJ P,HEXBYT SOJG T4,WRT1 ANDI CHK,377 ;CHECKSUM MODULO 256 MOVN T1,CHK ;NEGATE IT PUSHJ P,HEXBYT ;WRITE OUT CHECKSUM MOVEI O,15 PUSHJ P,OUCH ;CRLF MOVEI O,12 JRST OUCH HEXBYT: PUSH P,T1 ADD CHK,T1 ;UPDATE CHECKSUM LSH T1,-4 ;HIGH NYBBLE PUSHJ P,NYBBLE POP P,T1 NYBBLE: ANDI T1,17 ;JUST 4 BITS MOVE O,T1 CAIL O,^D10 ;IF NUMERIC JRST .+3 ADDI O,"0" ;JUST MAKE ASCII JRST OUCH ;AND OUTPUT ADDI O,"A"-^D10 ;ELSE MAKE A THRU F JRST OUCH ;AND OUTPUT INCH: SOSGE IBUF+2 ;INPUT A CHAR IN I JRST INCH1 ILDB I,IBUF+1 AOJ CNT, AOS (P) POPJ P, INCH1: IN COM, JRST INCH POPJ P, OUCH: SOSGE OBUF+2 ;OUTPUT A CHAR IN O JRST OUCH1 IDPB O,OBUF+1 POPJ P, OUCH1: OUTPUT HEX, JRST OUCH EOF: SKIPE CNT ;IF ANYTHING IN THE BUFFER AT EOF PUSHJ P,WRTBUF ;WRITE IT OUT MOVEI O,":" ;WRITE :0000000000 TO MAKE IT LOOK LIKE ASM PUSHJ P,OUCH MOVEI T1,^D10 MOVEI O,"0" PUSHJ P,OUCH SOJG T1,.-1 MOVEI O,15 PUSHJ P,OUCH MOVEI O,12 PUSHJ P,OUCH RELEAS COM, RELEAS HEX, EXIT NOFILE: OUTSTR [ASCIZ/?File not found /] EXIT BADFIL: OUTSTR [ASCIZ/?Enter error /] EXIT COMSPC: 14 ;BINARY BUFFERED SIXBIT /DSK/ IBUF HEXSPC: 0 SIXBIT /DSK/ OBUF,,0 COMFIL: 0 0 0 0 HEXFIL: EXP 0,0,0,0 IBUF: BLOCK 3 OBUF: BLOCK 3 BUFFER: BLOCK 50 STACK: BLOCK 20 END START