home *** CD-ROM | disk | FTP | other *** search
- ; lharc05.c
- ; ==========================================================================
- ; LHARC extraction/creation routines - Main Decode method
- ; ==========================================================================
-
- INSTXT "sfx.i"
-
- EXT InitGraph
- EXT UpdateGraph
- EXT text_buf
- EXT NewCRC ; New calculated CRC
- EXT InitCRC ; Initialize CRC routines
- EXT AdjCRC ; Merge .a into CRC
- EXT Prt
- EXT GetChar
- EXT StartHuff
- EXT InitCRC
- EXT AdjCRC
- EXT NewCRC
- EXT DecChar
- EXT DecPosition
- EXT Message
- EXT a2p
- EXT OutUnit
- EXT OutDrive
- EXT FirstTime
- EXT P_flag
- EXT AskDrives
- EXT CopyRight
-
-
- EXT open,close,setlfs,setnam,chkout,chrout,clrchn,getin
-
- RR EQU R0
- C EQU R0+2
- K EQU R1
- J EQU R1+2
- I EQU R2
- TEXTPTR EQU R2+2
- COUNT EQU R3
-
- DELAY EQU 1
- PAUSE EQU 0
-
- ;────────────────────────────────────────────────────────────
- ; void LzHead::Decode()
- ; {
- ; static int i, j, k, r, c;
- ; static long count;
- ; static word newcrc = 0;
- ;
- ; if (OriginalSize == 0)
- ; return;
- ;
- ; if (Put == obuf_putc)
- ; if(obuf_open(name)) {
- ; conout << obuf_Error() << "\n";
- ; return;
- ; }
- ;
- ; StartHuff();
- ;
- ; for (i = 0; i < N - F; i++)
- ; text_buf[i] = ' ';
- ;
- ; r = N - F;
- ;
- ; for (count = 0; count < OriginalSize; ) {
- ;
- ; c = DecChar();
- ;
- ; if (c < 256) {
- ; newcrc = ArcCRC(c,newcrc);
- ; Put(c);
- ; text_buf[r++] = c;
- ; r &= (N - 1);
- ; count++;
- ;
- ; } else {
- ;
- ; i = (r - DecPosition() - 1) & (N - 1);
- ; j = c - 255 + THRESHOLD;
- ;
- ; for (k = 0; k < j; k++) {
- ; c = text_buf[(i + k) & (N - 1)];
- ; newcrc = ArcCRC(c,newcrc);
- ; Put(c);
- ; text_buf[r++] = c;
- ; r &= (N - 1);
- ; count++;
- ; }
- ; }
- ;
- ; }
- ;
- ; if(newcrc != CRC)
- ; conout << "CRC error\n";
- ; else
- ; conout << "CRC ok\n";
- ;
- ; if(obuf_close())
- ; conout << "Error Closing Output File : " << obuf_Error() << "\n";
- ;
- ; conout << "\n";
- ; }
- ;───────────────────────────────────────────────────────────────────────────
- ; Error return codes:
- ;
- ; 0 = DecodeOK
- ; 1 = NullFile
- ; 2 = DiskError
- ; 3 = CRCError
- ; 4 = BadHeader
-
- PUBLIC ID
- PUBLIC CRC
-
- BSS Store,1
-
- DSEG
-
- ID fcb 0,0,0,0,0
- PackedSize fdb 0,0
- OriginalSize fdb 0,0
- Time fdb 0
- Date fdb 0
- Attr fdb 0
- FilenameLen fcb 1
- Filename fdb 0,0,0,0,0,0,0,0,0,0,0
- CRC fdb 0
- HeadEnd
-
- CSEG
-
- PUBLIC Decode
-
- PNT EQU T0
-
- Decode jsr InitCRC
- lda #0
- sta BITBUF
- sta P_flag
- jsr GetChar ; Get header size
- sta T0
- cmp #0
- beq EndOfArc
- cmp #HeadEnd-ID ; Make sure no lengthy filename
- bcs EndOfArc ; If so, we gotta quit
- jsr GetChar ; And checksum
- sta T0+1
- lda #0
- sta T1
- tay
- GetHead jsr GetChar
- sta ID,y
- clc
- adc T1
- sta T1
- iny
- cpy T0
- bne GetHead
- cmp T0+1
- beq HeaderOK
- EndOfArc lda #BadHeader
- fcb $2c
- DecodeError lda #255
- rts
-
- HeaderOK lda OriginalSize ; if(originalsize==0) return;
- ora OriginalSize+1
- ora OriginalSize+2
- ora OriginalSize+3
- bne dec1
- lda #1
- rts
-
- dec1 ldy #0
- Convert lda Filename,y
- jsr a2p
- sta Filename,y
- iny
- cpy FilenameLen
- bne Convert
- lda Filename,y
- sta CRC
- lda Filename+1,y
- sta CRC+1
- lda #0
- sta Filename,y
-
- ldy #0
- sty P_flag
- lda FirstTime
- bne SkipTitle
- inc FirstTime
- CheckTitle lda Filename,y
- beq GotTitle
- cmp title,y
- bne SkipTitle
- iny
- bne CheckTitle ; Always
-
- GotTitle dec P_flag
- jsr clrchn
- lda #0
- sta CopyRight ; Don't print copyright if title is there
- jmp dec2
-
- SkipTitle jsr AskDrives ; Get output dev (maybe)
- ldx #<Filename
- ldy #>Filename
- jsr Message
- ldy FilenameLen
- Spaces lda #' '
- jsr Prt
- iny
- cpy #20
- bcc Spaces
-
- ldy FilenameLen ; Copy CRC
- lda Filename-2,y ; check for 0 type
- beq HasType
- lda #','
- sta Filename,y
- iny
- lda #'P'
- sta Filename,y
- iny
- bne CommaW
-
- HasType lda #','
- sta Filename-2,y
- lda Filename-1,y
- and #$7f
- sta Filename-1,y
- CommaW lda #','
- sta Filename,y
- iny
- lda #'W'
- sta Filename,y
- iny
- iny
- iny
- lda #':'
- sta Filename-1
- lda OutDrive
- ora #$30
- sta Filename-2
- tya
- ldx #<Filename-2
- ldy #>Filename-2
- jsr setnam
- lda #8
- tay
- ldx OutUnit
- jsr setlfs
- jsr clrchn
- jsr open
- bit status
- bpl OpenOK
- lda #DiskError
- rts
-
- OpenOK ldx #8
- jsr chkout
- bcc dec2
- GoDiskErr lda #DiskError
- jmp ReturnA
-
- ;──────────────────────────────────────────────────────────────────────────
- ; Finished processsing header. Now test for stored file or compressed file
- ;──────────────────────────────────────────────────────────────────────────
-
- dec2 ldx #0 ; count = OriginalSize;
- dec6 lda OriginalSize,x
- sta COUNT,x
- inx
- cpx #4
- bne dec6
-
- bit P_flag
- bmi dec10
-
- lda COUNT+1
- ldx COUNT+2
- ldy COUNT+3
- jsr InitGraph
-
- dec10 lda #0
- sta Store
- lda ID+3
- cmp #'1'
- beq DeComp
- lda #$ff
- sta Store
- jmp for1
-
- DeComp jsr StartHuff
- ; r = N-F;
- lda #<N-F ; for(i=0; i<N-F; i++)
- sta I ; text_buf[i] = ' ';
- sta RR
- lda #>N-F
- sta I+1
- sta RR+1
- lda #<text_buf
- sta PNT
- lda #>text_buf
- sta PNT+1
- ldy #0
- dec3 lda #' '
- sta (PNT),y
- iny
- bne dec4
- inc PNT+1
- dec4 lda I
- bne dec5
- dec I+1
- dec5 dec I
- lda I
- ora I+1
- bne dec3
-
- for1 lda COUNT ; while(count)
- ora COUNT+1
- ora COUNT+2
- ora COUNT+3
- bne f1a
- endfor jmp endfor1
-
- f1a bit Store
- bpl f1aa
- jsr GetChar
- jsr put_c
- jmp for1
-
- f1aa lda COUNT+3 ; Negative length means went past end
- bmi endfor
-
- jsr DecChar ; c = DecChar();
-
- txa
- sta C
- tya ; if(c<256)
- sta C+1
- bne else
- jsr do_put
- jmp for1 ; and continue with for loop
-
- else jsr DecPosition ; i = (r-DecPosition()-1) & (N-1);
- inx
- bne f1f
- iny
- f1f stx T0
- sty T0+1
- sec
- lda RR
- sbc T0
- and #<N-1
- sta I
- sta TEXTPTR
- lda RR+1
- sbc T0+1
- and #>N-1
- sta I+1
- sta TEXTPTR+1
-
- sec ; j=c-255+THRESHOLD
- lda C
- sbc #255
- sta J
- lda C+1
- sbc #0
- sta J+1
- clc
- lda J
- adc #<THRESHOLD
- sta J
- lda J+1
- adc #>THRESHOLD
- sta J+1
-
- lda #0 ; for(k=0;
- sta K
- sta K+1
-
- for2 lda K ; k<j;
- cmp J
- lda K+1
- sbc J+1
- bcc f2a
- jmp endfor2
-
- f2a clc ; c=text_buf[(i+k)&(N-1)]
- lda TEXTPTR
- and #<N-1
- adc #<text_buf
- sta T0
- lda TEXTPTR+1
- and #>N-1
- adc #>text_buf
- sta T0+1
- ldy #0
- lda (T0),y
- sta C
- lda #0
- sta C+1
- jsr do_put ; Same code as above
-
- inc K ; k++
- bne f2b
- inc K+1
- f2b inc TEXTPTR
- bne f2c
- inc TEXTPTR+1
- f2c jmp for2
-
- endfor2 jmp for1
-
- endfor1 lda CRC
- cmp NewCRC
- bne badcrc
- lda CRC+1
- cmp NewCRC+1
- bne badcrc
- lda #DecodeOK
- fcb $2c
- badcrc lda #CRCError
- ReturnA pha
- jsr clrchn
- lda #8
- jsr close
- pla
- rts
-
-
- ;───────────────────────────
- ; Common code from if..else
- ;───────────────────────────
-
- do_put lda C
- put_c jsr AdjCRC
- bit P_flag
- bpl Printit
- cmp #PAUSE
- beq wait
- cmp #DELAY
- beq delay
-
- Printit jsr chrout
- bit P_flag
- bmi OutOK
- bit status
- bpl OutOK
- pla
- pla
- jmp GoDiskErr
-
- OutOK bit Store
- bmi Countpp
- clc ; text_buf[r++] = C;
- lda RR
- adc #<text_buf
- sta T0
- lda RR+1
- adc #>text_buf
- sta T0+1
- ldy #0
- lda C
- sta (T0),y
- inc RR
- bne f1b
- inc RR+1
- f1b lda RR ; r &= N-1;
- and #<N-1
- sta RR
- lda RR+1
- and #>N-1
- sta RR+1
-
- Countpp lda COUNT ; count++
- bne f1c
- lda COUNT+1
- bne f1d
- lda COUNT+2
- bne f1e
- dec COUNT+3
- f1e dec COUNT+2
- f1d dec COUNT+1
- bit P_flag
- bmi f1c
- jsr UpdateGraph
- f1c dec COUNT
- rts
-
- title fcc "TITLE"
- fcb 0
-
-
- wait jsr getin
- cmp #0
- bne wait
- wait1 jsr getin
- cmp #0
- beq wait1
- lda #PAUSE
- jmp OutOK
-
-
- delay ldy #0
- delay1 ldx #0
- delay2 dex
- bne delay2
- dey
- bne delay1
- lda #DELAY
- jmp OutOK
-
-
- END
-