       .LISTOF
*
SAVE DUDOBJ.ED
*
* SOURCE TO DUDOBJ
* FOR S-C MACRO ASSEMBLER
* COPYRIGHT 1991 BY PHIL GOETZ
*
       .OR $1280    CLOSE TO APPLESOFT PROGRAM!
       .TF DUDOBJ
LOW    .EQ $1400    CLOSE TO END OF DUDOBJ!
HI     .EQ $1800    LEAVES ABOUT $180 FOR STRINGS. MUST BE PAGE START.
SECTORS .EQ $19      BASIC PROGRAM POKES #SECTORS/PASS INTO HERE
* NEXT 6 LINES MUST NOT BE CHANGED
* AS THEY PASS INFO TO BASIC PROGRAM
       JMP RWT
       JMP PACK
       JMP UNPACK
       .DA LOW
       .DA HI
FINDIOB JSR $3E3
       STY $6
       STA $7
RTS    RTS
RWT    JSR FINDIOB
       LDY #$5      SECTOR
       LDA #$F
       STA (6),Y
.1     JSR $3E3
       JSR $3D9
       LDY #9       BUFFER
       LDA (6),Y
       SEC
       SBC #1
       STA (6),Y
       LDY #5       SECTOR
       LDA (6),Y
       BEQ RTS
       SEC
       SBC #1
       STA (6),Y
       JMP .1
* RUN-LENGTH COMPRESSION
INPTR  .EQ 6
OUTPTR .EQ 8
PACK   LDA #HI
       STA INPTR
       LDA /HI
       STA INPTR+1
       LDA #LOW
       STA OUTPTR
       LDA /LOW
       STA OUTPTR+1
       LDA #0
       STA DONE
       LDA HI       1ST BYTE
       STA RECENT
       LDA #1
       STA COUNT
LOOP   LDY #0
       INC INPTR
       BNE .1
       INC INPTR+1
       LDA INPTR+1
       SEC
       SBC SECTORS
       CMP /HI
       BNE .1
       LDA #1
       STA DONE
       BNE .3
.1     LDA (INPTR),Y
       CMP RECENT
       BNE .3
* SOME IN A ROW
       INC COUNT
       BNE LOOP
       DEC COUNT
.3     PHA
       LDA RECENT
       LDX COUNT
       CMP #$37     IF FLAG BYTE,
       BEQ .4       RUN-LENGTH ENCODE NO MATTER HOW MANY
       CPX #4
       BCC OTTOUT
* >3 OUT
.4     JSR BYTEOUT
       TXA          COUNT
       JSR BYTEOUT
       LDA #$37     FLAG
       JSR BYTEOUT
NEXT   PLA
       STA RECENT
       LDA #1
       STA COUNT
       LDA DONE
       BEQ LOOP
       RTS
* 1 TO 3 OUT
OTTOUT JSR BYTEOUT
       DEX
       BNE OTTOUT
       BEQ NEXT
BYTEOUT LDY #0
       STA (OUTPTR),Y
       INC OUTPTR
       BNE .1
       INC OUTPTR+1
.1     RTS
REVOUT LDY #0
       STA (OUTPTR),Y
       DEC OUTPTR
       LDY OUTPTR
       CPY #$FF
       BNE .1
       DEC OUTPTR+1
.1     RTS
* UNPACK READS BACKWARDS
UNPACK
       LDA #HI-1
       STA OUTPTR
       LDA /HI-1
       CLC
       ADC SECTORS
       STA OUTPTR+1
       LDA #LOW-1
       CLC
       ADC $AA60    LENGTH OF FILE
       STA INPTR
       LDA /LOW-1
       ADC $AA61
       STA INPTR+1
.1     JSR GET
       PHP
.2     CMP #$37
       BNE .4
       JSR GET
* NO NEED TO CHECK FOR END OF INPUT
       TAX
       JSR GET
.3     JSR REVOUT
       DEX
       BNE .3
       BEQ .5
.4     JSR REVOUT
.5     PLP
       BCC .1       NOT DONE
       RTS
* MUST NOT CHANGE X
* ON EXIT, C=1 IF DONE WITH INPUT
GET    LDY #0
       LDA (INPTR),Y
       DEC INPTR
       LDY INPTR
       CPY #$FF
       BNE .0
       DEC INPTR+1
.0     DEC $AA60
       CLC
       BNE .1
       DEC $AA61
       LDY $AA61
       CPY #$FF
.1     RTS
RECENT .EQ *        LAST BYTE FOUND
COUNT  .EQ RECENT+1 # OF RECENT FOUND
DONE   .EQ COUNT+1
