; COPMRESS.ASM ; ; COMPRESS A FILE FRESHLY CREATED BY RESOURCE OR MSOURCE ; ; REMOVES COMMENTS FROM THE END OF A LINE WHICH IS ONLY ; A HEX ADDRESS AND WHEN A LABEL LINE IS ENCOUNTERED ; AND THE LINE CONTAINS ONLY A COMMENT AND NO OPCODE IT ; APPENDS THE NEXT LINE IN THE FILE ONE TAB AFTER THE ; LABEL. ; ; LABEL: ;1234H ; LXI H,L0234 ;0234H ; BECOMES ; ; LABEL: LXI H,L0234 ; ; ; LINES WITH COMMENTS ONLY ARE NOT AFFECTED. ; ; ANY LINES WHICH HAVE BEEN EDITED AND APPEAR AS: ; ; LABEL: OPCODE OPERAND ;COMMENT ; ; WILL ONLY HAVE THE COMMENT REMOVED. ; ; TO USE THE PROGRAM TYPE: ; ; A.COMPRESS FILENAME (NEWNAME) ; ; COMPRESS LOOKS FOR AN .ASM FILE AND CREATES A .$$$ FILE. ; ; PLEASE ADVISE ON ANY PROBLEMS: J.A.PREST ; 18704 GLASTONBURY RD ; DETROIT, MI. 48219 ; 313-538-1204 ; 2,26,80 J.A.P ; CPM: EQU 0 BDOS: EQU 5 FCB: EQU 5CH FCB2: EQU 6CH TBUFF: EQU 80H PRNSTR: EQU 9 OPEN: EQU 0FH CLOSE: EQU 10H DELETE: EQU 13H READ: EQU 14H WRITE: EQU 15H CREATE: EQU 16H SETBFR: EQU 1AH CR: EQU 0DH LF: EQU 0AH EOF: EQU 1AH BFRLEN: EQU 2000H ; ORG 100H COMPRS: LXI SP,STACK+20 ; MVI C,PRNSTR LXI D,SIGNON ; CALL BDOS ; LXI H,FCB ; LXI D,REAFCB ; MVI C,9 CALL MOVE ; ; ; INITIALIZE ; XRA A STA READEX ; STA READRC ; LXI H,BFRLEN SHLD RBFLEN ; SHLD REAPTR ; MVI C,OPEN LXI D,REAFCB ; CALL BDOS ; INR A JNZ COMP02 ; MVI C,PRNSTR LXI D,NOSMSG ; CALL BDOS ; JMP CPM COMP02: LDA FCB2+1 LXI H,FCB CPI ' ' JZ COMP04 LXI H,FCB2 ; COMP04: LXI D,WRIFCB ; MVI C,9 CALL MOVE ; XRA A STA WRITEX ; STA WRITRC ; LXI H,BFRLEN SHLD WBFLEN ; LXI H,0 SHLD WRIPTR ; MVI C,DELETE LXI D,WRIFCB ; CALL BDOS ; MVI C,CREATE LXI D,WRIFCB ; CALL BDOS ; INR A JNZ WORKLP ; MVI C,PRNSTR LXI D,NOSPMS ; CALL BDOS ; JMP CPM ; ; MAIN WORK LOOP. BRINGS EACH LINE INTO INTERMEDIATE ; BUFFER AND TESTS IT FOR THE PROPER COMPRESSION FEATURE. ; WORKLP: LXI H,INTBFR-1 CALL LODI02 XRA A STA COMSW LXI H,INTBFR-1 WORK02: INX H MOV A,M CPI ';' JNZ WORK03 STA COMSW JMP SNDIBF WORK03: CPI ' '+1 JNC WORK02 DCX H SHLD IBFPTR INX H WORK04: MOV A,M INX H CPI LF JZ WORK06 CPI ' '+1 JC WORK04 CPI ';' WORK06: CZ LODIBF SNDIBF: LXI H,SW MVI M,0FFH SHLD IBFPTR SIBF02: LXI H,SW MOV A,M CMA MOV M,A SIBF04: LHLD IBFPTR INX H SHLD IBFPTR MOV A,M SIBF06: CALL PUT CPI LF JZ WORKLP CPI 27H JZ SIBF02 CPI ';' JNZ SIBF04 LDA SW ORA A JNZ SIBF04 LDA COMSW ORA A JNZ SIBF04 MVI A,CR CALL PUT MVI A,LF JMP SIBF06 ; LODI02: SHLD IBFPTR LODIBF: CALL GET LHLD IBFPTR INX H SHLD IBFPTR MOV M,A CPI LF JNZ LODIBF RET ; ; DONE WITH THE READS SO SEND THE REST OF ; THE LINE TO THE WRITE BUFFER AND FILL THE ; SECTOR OUT WITH EOF'S. THEN CLOSE THE FILE. ; DONE: LHLD WRIPTR ; MOV A,L ANI 7FH JNZ DONE2 ; SHLD WBFLEN ; DONE2: MVI A,EOF PUSH PSW CALL PUT ; POP PSW JNZ DONE ; MVI C,CLOSE LXI D,WRIFCB ; CALL BDOS ; INR A JNZ DONE4 ; MVI C,PRNSTR LXI D,BADCMS ; CALL BDOS ; JMP CPM DONE4: LXI D,DONEMS MVI C,PRNSTR CALL BDOS JMP CPM ; ; GET A BYTE OF DATA FROM THE INPUT FILE ; GET: CALL SEQREA ; CPI EOF RNZ JMP DONE ; ; ; MOVE MEMORY (HL) TO (DE) FOR LENGTH (C) ; MOVE: MOV A,M STAX D INX H INX D DCR C JNZ MOVE ; RET ; ; SEQUENTIAL READ ROUTINE FROM SEQIO.LIB ; CALLING THIS ROUTINE RETURNS THE NEXT ; CHARACTER IN THE FILE OR A 1AH AT THE END ; OF THE FILE. ALL DISK OPERATIONS ARE AUTOMATIC. ; SEQREA: LHLD RBFLEN ; XCHG LHLD REAPTR ; MOV A,L SUB E MOV A,H SBB D JC READ08 ; LXI H,0 SHLD REAPTR ; READ02: XCHG LHLD RBFLEN ; MOV A,E SUB L MOV A,D SBB H JNC READ06 ; LHLD RBFLOC ; DAD D XCHG MVI C,SETBFR CALL BDOS ; LXI D,REAFCB ; MVI C,READ CALL BDOS ; ORA A JNZ READ04 ; LXI D,80H LHLD REAPTR ; DAD D SHLD REAPTR ; JMP READ02 ; ; READ04: LHLD REAPTR ; SHLD RBFLEN ; READ06: LXI D,TBUFF MVI C,SETBFR CALL BDOS ; LXI H,0 SHLD REAPTR ; READ08: XCHG LHLD RBFLOC ; DAD D XCHG LHLD RBFLEN ; MOV A,L ORA H MVI A,EOF RZ LDAX D LHLD REAPTR ; INX H SHLD REAPTR ; RET ; ; SEQUENTIAL WRITE ROUTING FROM SEQIO.LIB ; CALLING THIS ROUTINE WITH A CHARACTER IN ; THE A REGISTER WILL LOAD IT INTO THE ; WRITE FILE. ALL DISK OPERATION EXCEPT ; CLOSE IS AUTOMATIC. WHEN WRIPTR=WBFLEN ; THE BUFFER IS SENT TO THE DISK. ; PUT: PUSH PSW LHLD WBFLEN ; XCHG LHLD WRIPTR ; MOV A,L SUB E MOV A,H SBB D JC PUT08 ; LXI H,0 SHLD WRIPTR ; PUT02: XCHG LHLD WBFLEN ; MOV A,E SUB L MOV A,D SBB H JNC PUT06 ; LHLD WBFLOC ; DAD D XCHG MVI C,SETBFR CALL BDOS ; LXI D,WRIFCB ; MVI C,WRITE CALL BDOS ; ORA A JNZ PUT04 ; LXI D,80H LHLD WRIPTR ; DAD D SHLD WRIPTR ; JMP PUT02 ; ; PUT04: MVI C,PRNSTR LXI D,FULMSG ; CALL BDOS ; POP PSW JMP CPM ; PUT06: LXI D,TBUFF MVI C,SETBFR CALL BDOS ; LXI H,0 SHLD WRIPTR ; PUT08: XCHG LHLD WBFLOC ; DAD D XCHG POP PSW STAX D LHLD WRIPTR ; INX H SHLD WRIPTR ; RET ; SIGNON: DB CR,LF,'COMPRESSION PROGRAM, VER 1.0' DB CR,LF,'COMPRESSES RESOURCE FILE' DB CR,LF,'$' NOSMSG: DB CR,LF,'NO SOURCE FILE$' FULMSG: DB CR,LF,'DISK FULL: DEST$' NOSPMS: DB CR,LF,'NO DIR SPACE: DEST$' BADCMS: DB CR,LF,'CANNOT CLOSE DEST$' DONEMS: DB 'COMPRESSION COMPLETE$' ; ; READ BUFFER FILE CONTROL BLOCK AND VARIABLES ; REAFCB: DB 0,' ASM' READEX: DW 0,0,0,0,0,0,0,0,0,0 READRC: DB 0 RBFLOC: DW READBF RBFLEN: DW BFRLEN REAPTR: DW 0 ; ; WRITE BUFFER FILE CONTROL BLOCK AND VARIABLES ; WRIFCB: DB 0,' $$$' WRITEX: DW 0,0,0,0,0,0,0,0,0,0 WRITRC: DB 0 WBFLOC: DW WRITBF WBFLEN: DW BFRLEN WRIPTR: DW 0 IBFPTR: DS 2 COMSW: DS 1 SW: DS 1 INTBFR: DS 100H STACK: DS 20 READBF: DS BFRLEN WRITBF: DS BFRLEN END