;       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