$TITLE(' OBJECT TO HEX CONVERTER - FLICKINGER - 07 JAN 81 17:25') ; .XLIST $INCLUDE HEADER.MAC .LIST ; ASEG ORG 100H ; LXI SP,STACK ; SET STACK POINTER ; LXI D,OMSG MVI C,PRSTR CALL BDOS JMP OMSG1 ; OMSG: DB KCR,KLF,KLF DB 'OBJECT $u$ v0 p% dG2@0 d~L+~fՠ d  I@.<0hҽ a\ʢ .FW@UP\0n2 @,: OUTPUT FILE LOAD ADDRESS ; OMSG1: CALL OPENI CALL OPENO LXI H,0100H ; ;MAIN LOOP ; UNLOOP: SHLD LODADR CALL GET ;GET NEXT BYTE JZ GEOF PUSH PSW MVI A,':' ;EACH OUTPUT LINE STARTS W/: CALL PUT ;PUT BYTE INTO OUTPUT FILE XRA A STA CHEKS ;SET CHECKSUM MVI A,10H ;16 BYTES IN EACH LINE CALL PUTBYT LDA LODADR+01 ;PUT HIGH-ORDER ADDRESS CALL PUTBYT LDA LODADR ;PUT LOW-ORDER ADDRESS CALL PUTBYT XRA A ;PUT ZERO (ABSOLUTE TYPE) CALL PUTBYT POP PSW ;RESTORE FIRST BYTE MVI B,10H UNL1: PUSH B CALL PUTBYT ;PLACE BYTE IN OUTPUT LINE POP B DCR B JZ NEXTL CALL GET ;GET NEXT BYTE JNZ UNL1 UNL2: XRA A ;A=0 -- END OF INPUT FILE PUSH B CALL PUTBYT ;FILL REST OF LINE W/ZEROES POP B DCR B ;COUNT DOWN JNZ UNL2 LDA CHEKS ;OUTPUT CHECKSUM CALL PUTBYT ;PUT IT MVI A,KCR ;ENDING CALL PUT MVI A,KLF CALL PUT JMP GEOF ;PROCESS END OF FILE ; ;START NEXT LINE ; NEXTL: LDA CHEKS ;OUTPUT CHECKSUM CALL PUTBYT MVI A,KCR ;ENDING CALL PUT MVI A,KLF CALL PUT LHLD LODADR ;UPDATE LOAD ADDRESS LXI D,10H DAD D JMP UNLOOP ; ;END OF INPUT FILE -- TERMINATE OUTPUT FILE ; GEOF: MVI A,':' CALL PUT ;PUT BYTE INTO OUTPUT FILE MVI B,05H GEOF1: XRA A PUSH B CALL PUTBYT POP B DCR B JNZ GEOF1 MVI A,KCR CALL PUT ;PUT BYTE INTO OUTPUT FILE MVI A,KLF CALL PUT ;PUT BYTE INTO OUTPUT FILE LDA OCOUNT ;FILL REST OF OUTPUT FILE W/CTRL-Z'S MOV B,A ;COUNT IN B MVI A,'Z'-40H GEOF2: CALL PUT ;PUT IT DCR B ;COUNT DOWN JNZ GEOF2 LXI D,FCBOUT ;CLOSE OUTPUT FILE MVI C,CLOSE ;CLOSE FILE CALL BDOS LXI D,EMSG MVI C,PRSTR CALL BDOS RST 0 ;END OF PROGRAM ; EMSG: DB KCR,KLF,KLF DB 'OBJECT TO HEX CONVERSION COMPLETE' DB KCR,KLF,KLF DB '$' ; ;CONVERT BYTE IN REG A TO HEX AND PLACE IN OUTPUT FILE ; PUTBYT: MOV C,A ;CONVERT BYTE IN A TO HEX AND OUTPUT AS HEX LDA CHEKS ;UPDATE CHECKSUM SUB C STA CHEKS MOV A,C RRC ;EXTRACT HIGH-ORDER NYBBLE RRC RRC RRC CALL PUTNIB MOV A,C ;GET LOW-ORDER NYBBLE PUTNIB: ANI 0FH ;CONVERT LOW-ORDER NYBBLE OF A TO ASCII HEX ADI '0' CPI '9'+1 JC PUTNB1 ADI 7 PUTNB1: PUSH B CALL PUT ;PUT BYTE INTO OUTPUT FILE POP B RET ; ;MOVE (HL) TO (DE) FOR (B) BYTES ; MOVE: MOV A,M ;GET CHAR STAX D ;PUT IT INX H ;INCR PTRS INX D DCR B ;COUNT DOWN JNZ MOVE RET ; ;ZERO OUT (B) BYTES PTED TO BY (HL) ; CLEAR: MVI M,0 ;STORE ZERO INX H ;PT TO NEXT DCR B ;COUNT DOWN JNZ CLEAR RET ; ;ROUTINE TO OPEN INPUT FILE ; OPENI: LXI H,FCB ;COPY FCB INTO FCBIN LXI D,FCBIN MVI B,10H ;16 BYTES CALL MOVE LXI H,COMEXT ;PLACE .COM FILE TYPE LXI D,FCBIN+09H MVI B,3 ;3 BYTES CALL MOVE LXI H,FCBIN+0CH ;CLEAR REST OF ENTRY MVI B,15H ;21 BYTES CALL CLEAR LXI D,FCBIN ;PT TO FCB MVI C,OPEN ;OPEN FILE CALL BDOS CPI 0FFH ;ERROR? JNZ RD LXI D,RMSGE MVI C,PRSTR CALL BDOS RST 0 ; RMSGE: DB KCR,KLF,KLF DB 'FILE NOT FOUND' DB KCR,KLF,KLF DB '$' ; ;ROUTINE TO READ NEXT BLOCK FROM DISK ; RD: LXI D,FCBIN ;PT TO FCB INPUT MVI C,READ ;READ XRA A ;SET ZERO COUNT FOR ERROR STA ICOUNT CALL BDOS ORA A ;OK? RNZ ;NZ=NO LXI H,BUFF ;PT TO INPUT BUFFER LXI D,IBUFF MVI B,80H ;128 BYTES CALL MOVE ;PLACE IN BUFFER MVI A,80H ;SET COUNT TO 128 BYTES STA ICOUNT LXI H,IBUFF ;SET PTR TO INPUT BUFFER SHLD IPTR RET ; ;ROUTINE TO OPEN OUTPUT FILE ; OPENO: LXI H,FCB ;COPY FCB INTO FCBOUT LXI D,FCBOUT MVI B,10H ;16 BYTES CALL MOVE LXI H,HEXEXT ;PLACE .HEX FILE TYPE LXI D,FCBOUT+09H MVI B,03H ;3 BYTES CALL MOVE LXI H,FCBOUT+0CH ;CLEAR REST OF ENTRY MVI B,15H ;21 BYTES CALL CLEAR LXI D,FCBOUT ;PT TO FCB MVI C,DELETE ;DELETE FILE IF PRESENT CALL BDOS MVI A,80H ;128 BYTES STA OCOUNT ;SET BYTE COUNT FOR PUT LXI H,OBUFF ;SET PTR TO OUTPUT BUFFER SHLD OPTR LXI D,FCBOUT ;PT TO FCB MVI C,16H ;MAKE FILE CALL BDOS CPI 0FFH ;ERROR? RNZ LXI D,WMSGE MVI C,PRSTR CALL BDOS RST 0 ; WMSGE: DB KCR,KLF,KLF DB 'CANNOT CREATE FILE -- NO DIRECTORY SPACE' DB KCR,KLF,KLF DB '$' ; ;WRITE NEXT BLOCK TO DISK ; WR: LXI H,OBUFF ;MOVE OUTPUT BUFFER TO CP/M BUFFER LXI D,BUFF MVI B,80H ;128 BYTES CALL MOVE LXI D,FCBOUT ;PT TO OUTPUT FCB MVI C,WRITE ;WRITE NEXT RECORD CALL BDOS ORA A ;ERROR? JZ WR1 LXI D,WMSG1 MVI C,PRSTR CALL BDOS RST 0 ; WMSG1: DB KCR,KLF,KLF DB 'CANNOT WRITE TO FILE' DB KCR,KLF,KLF DB '$' ; WR1: MVI A,80H ;SET COUNT TO 128 STA OCOUNT LXI H,OBUFF ;PT TO BEGINNING OF BUFFER SHLD OPTR RET ; ;PUT BYTE IN REG A TO DISK ; PUT: PUSH H PUSH D PUSH B PUSH PSW LHLD OPTR ;GET PTR TO NEXT BYTE MOV M,A ;PUT BYTE INX H ;PT TO NEXT SHLD OPTR LDA OCOUNT ;GET COUNT DCR A ;COUNT DOWN STA OCOUNT ;PUT COUNT JNZ PUTD CALL WR ;WRITE BUFFER PUTD: POP PSW POP B POP D POP H RET ; ;GET NEXT BYTE INTO REG A FROM DISK ; GET: PUSH H PUSH D PUSH B LHLD IPTR ;GET PTR MOV A,M ;GET BYTE STA BYTE ;SAVE TEMPORARILY INX H ;SET PTR TO NEXT SHLD IPTR LDA ICOUNT ;COUNT DOWN DCR A STA ICOUNT JNZ GETD CALL RD ;READ NEXT BLOCK GETD: LDA ICOUNT ;CHECK FOR DONE -- ZERO MEANS YES ORA A ;SET FLAGS LDA BYTE ;GET BYTE POP B POP D POP H RET ; COMEXT: DB 'COM' ;.COM FILE TYPE HEXEXT: DB 'HEX' ;.HEX FILE TYPE FCBIN: DS 33 ;INPUT FCB FCBOUT: DS 33 ;OUTPUT FCB ICOUNT: DS 1 ;INPUT BUFFER COUNTER OCOUNT: DS 1 ;OUTPUT BUFFER COUNTER IPTR: DS 2 ;INPUT BUFFER POINTER OPTR: DS 2 ;OUTPUT BUFFER POINTER BYTE: DS 1 ;TEMP BUFFER LODADR: DS 2 CHEKS: DS 1 IBUFF: DS 80H ;INPUT BUFFER OBUFF: DS 80H ;OUTPUT BUFFER DS 80H ;STACK SPACE ; STACK EQU $-10H ; BUFF EQU 80H ; FCB EQU 5CH ; END