home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / util / sfxsrc.arc / DECODE.A < prev    next >
Encoding:
Text File  |  1990-02-12  |  12.0 KB  |  521 lines

  1. ; lharc05.c
  2. ; ==========================================================================
  3. ;  LHARC extraction/creation routines - Main Decode method
  4. ; ==========================================================================
  5.  
  6.             INSTXT "sfx.i"
  7.  
  8.             EXT InitGraph
  9.             EXT UpdateGraph
  10.             EXT text_buf
  11.             EXT NewCRC              ; New calculated CRC
  12.             EXT InitCRC             ; Initialize CRC routines
  13.             EXT AdjCRC              ; Merge .a into CRC
  14.             EXT Prt
  15.             EXT GetChar
  16.             EXT StartHuff
  17.             EXT InitCRC
  18.             EXT AdjCRC
  19.             EXT NewCRC
  20.             EXT DecChar
  21.             EXT DecPosition
  22.             EXT Message
  23.             EXT a2p
  24.             EXT OutUnit
  25.             EXT OutDrive
  26.             EXT FirstTime
  27.             EXT P_flag
  28.             EXT AskDrives
  29.             EXT CopyRight
  30.  
  31.  
  32.             EXT open,close,setlfs,setnam,chkout,chrout,clrchn,getin
  33.  
  34. RR          EQU R0
  35. C           EQU R0+2
  36. K           EQU R1
  37. J           EQU R1+2
  38. I           EQU R2
  39. TEXTPTR     EQU R2+2
  40. COUNT       EQU R3
  41.  
  42. DELAY       EQU 1
  43. PAUSE       EQU 0
  44.  
  45. ;────────────────────────────────────────────────────────────
  46. ; void LzHead::Decode()
  47. ; {
  48. ;     static  int  i, j, k, r, c;
  49. ;     static  long count;
  50. ;     static  word newcrc = 0;
  51. ;
  52. ;     if (OriginalSize == 0)
  53. ;         return;
  54. ;
  55. ;     if (Put == obuf_putc)
  56. ;         if(obuf_open(name)) {
  57. ;             conout << obuf_Error() << "\n";
  58. ;             return;
  59. ;         }
  60. ;
  61. ;     StartHuff();
  62. ;
  63. ;     for (i = 0; i < N - F; i++)
  64. ;         text_buf[i] = ' ';
  65. ;
  66. ;     r = N - F;
  67. ;
  68. ;     for (count = 0; count < OriginalSize; ) {
  69. ;
  70. ;         c = DecChar();
  71. ;
  72. ;         if (c < 256) {
  73. ;             newcrc = ArcCRC(c,newcrc);
  74. ;             Put(c);
  75. ;             text_buf[r++] = c;
  76. ;             r &= (N - 1);
  77. ;             count++;
  78. ;
  79. ;         } else {
  80. ;
  81. ;             i = (r - DecPosition() - 1) & (N - 1);
  82. ;             j = c - 255 + THRESHOLD;
  83. ;
  84. ;             for (k = 0; k < j; k++) {
  85. ;                 c = text_buf[(i + k) & (N - 1)];
  86. ;                 newcrc = ArcCRC(c,newcrc);
  87. ;                 Put(c);
  88. ;                 text_buf[r++] = c;
  89. ;                 r &= (N - 1);
  90. ;                 count++;
  91. ;             }
  92. ;         }
  93. ;
  94. ;     }
  95. ;
  96. ;     if(newcrc != CRC)
  97. ;         conout << "CRC error\n";
  98. ;     else
  99. ;         conout << "CRC ok\n";
  100. ;
  101. ;     if(obuf_close())
  102. ;         conout << "Error Closing Output File : " << obuf_Error() << "\n";
  103. ;
  104. ;     conout << "\n";
  105. ; }
  106. ;───────────────────────────────────────────────────────────────────────────
  107. ; Error return codes:
  108. ;
  109. ;           0 = DecodeOK
  110. ;           1 = NullFile
  111. ;           2 = DiskError
  112. ;           3 = CRCError
  113. ;           4 = BadHeader
  114.  
  115.             PUBLIC ID
  116.             PUBLIC CRC
  117.  
  118.             BSS Store,1
  119.  
  120.             DSEG
  121.  
  122. ID           fcb 0,0,0,0,0
  123. PackedSize   fdb 0,0
  124. OriginalSize fdb 0,0
  125. Time         fdb 0
  126. Date         fdb 0
  127. Attr         fdb 0
  128. FilenameLen  fcb 1
  129. Filename     fdb 0,0,0,0,0,0,0,0,0,0,0
  130. CRC          fdb 0
  131. HeadEnd
  132.  
  133.             CSEG
  134.  
  135.             PUBLIC Decode
  136.  
  137. PNT         EQU T0
  138.  
  139. Decode      jsr InitCRC
  140.             lda #0
  141.             sta BITBUF
  142.             sta P_flag
  143.             jsr GetChar             ; Get header size
  144.             sta T0
  145.             cmp #0
  146.             beq EndOfArc
  147.             cmp #HeadEnd-ID         ; Make sure no lengthy filename
  148.             bcs EndOfArc            ; If so, we gotta quit
  149.             jsr GetChar             ; And checksum
  150.             sta T0+1
  151.             lda #0
  152.             sta T1
  153.             tay
  154. GetHead     jsr GetChar
  155.             sta ID,y
  156.             clc
  157.             adc T1
  158.             sta T1
  159.             iny
  160.             cpy T0
  161.             bne GetHead
  162.             cmp T0+1
  163.             beq HeaderOK
  164. EndOfArc    lda #BadHeader
  165.             fcb $2c
  166. DecodeError lda #255
  167.             rts
  168.  
  169. HeaderOK    lda OriginalSize        ; if(originalsize==0) return;
  170.             ora OriginalSize+1
  171.             ora OriginalSize+2
  172.             ora OriginalSize+3
  173.             bne dec1
  174.             lda #1
  175.             rts
  176.  
  177. dec1        ldy #0
  178. Convert     lda Filename,y
  179.             jsr a2p
  180.             sta Filename,y
  181.             iny
  182.             cpy FilenameLen
  183.             bne Convert
  184.             lda Filename,y
  185.             sta CRC
  186.             lda Filename+1,y
  187.             sta CRC+1
  188.             lda #0
  189.             sta Filename,y
  190.  
  191.             ldy #0
  192.             sty P_flag
  193.             lda FirstTime
  194.             bne SkipTitle
  195.             inc FirstTime
  196. CheckTitle  lda Filename,y
  197.             beq GotTitle
  198.             cmp title,y
  199.             bne SkipTitle
  200.             iny
  201.             bne CheckTitle          ; Always
  202.  
  203. GotTitle    dec P_flag
  204.             jsr clrchn
  205.             lda #0
  206.             sta CopyRight           ; Don't print copyright if title is there
  207.             jmp dec2
  208.  
  209. SkipTitle   jsr AskDrives           ; Get output dev (maybe)
  210.             ldx #<Filename
  211.             ldy #>Filename
  212.             jsr Message
  213.             ldy FilenameLen
  214. Spaces      lda #' '
  215.             jsr Prt
  216.             iny
  217.             cpy #20
  218.             bcc Spaces
  219.  
  220.             ldy FilenameLen         ; Copy CRC
  221.             lda Filename-2,y        ; check for 0 type
  222.             beq HasType
  223.             lda #','
  224.             sta Filename,y
  225.             iny
  226.             lda #'P'
  227.             sta Filename,y
  228.             iny
  229.             bne CommaW
  230.  
  231. HasType     lda #','
  232.             sta Filename-2,y
  233.             lda Filename-1,y
  234.             and #$7f
  235.             sta Filename-1,y
  236. CommaW      lda #','
  237.             sta Filename,y
  238.             iny
  239.             lda #'W'
  240.             sta Filename,y
  241.             iny
  242.             iny
  243.             iny
  244.             lda #':'
  245.             sta Filename-1
  246.             lda OutDrive
  247.             ora #$30
  248.             sta Filename-2
  249.             tya
  250.             ldx #<Filename-2
  251.             ldy #>Filename-2
  252.             jsr setnam
  253.             lda #8
  254.             tay
  255.             ldx OutUnit
  256.             jsr setlfs
  257.             jsr clrchn
  258.             jsr open
  259.             bit status
  260.             bpl OpenOK
  261.             lda #DiskError
  262.             rts
  263.  
  264. OpenOK      ldx #8
  265.             jsr chkout
  266.             bcc dec2
  267. GoDiskErr   lda #DiskError
  268.             jmp ReturnA
  269.  
  270. ;──────────────────────────────────────────────────────────────────────────
  271. ; Finished processsing header. Now test for stored file or compressed file
  272. ;──────────────────────────────────────────────────────────────────────────
  273.  
  274. dec2        ldx #0                  ; count = OriginalSize;
  275. dec6        lda OriginalSize,x
  276.             sta COUNT,x
  277.             inx
  278.             cpx #4
  279.             bne dec6
  280.  
  281.             bit P_flag
  282.             bmi dec10
  283.  
  284.             lda COUNT+1
  285.             ldx COUNT+2
  286.             ldy COUNT+3
  287.             jsr InitGraph
  288.  
  289. dec10       lda #0
  290.             sta Store
  291.             lda ID+3
  292.             cmp #'1'
  293.             beq DeComp
  294.             lda #$ff
  295.             sta Store
  296.             jmp for1
  297.  
  298. DeComp      jsr StartHuff
  299.                                     ; r = N-F;
  300.             lda #<N-F               ; for(i=0; i<N-F; i++)
  301.             sta I                   ;   text_buf[i] = ' ';
  302.             sta RR
  303.             lda #>N-F
  304.             sta I+1
  305.             sta RR+1
  306.             lda #<text_buf
  307.             sta PNT
  308.             lda #>text_buf
  309.             sta PNT+1
  310.             ldy #0
  311. dec3        lda #' '
  312.             sta (PNT),y
  313.             iny
  314.             bne dec4
  315.             inc PNT+1
  316. dec4        lda I
  317.             bne dec5
  318.             dec I+1
  319. dec5        dec I
  320.             lda I
  321.             ora I+1
  322.             bne dec3
  323.  
  324. for1        lda COUNT               ; while(count)
  325.             ora COUNT+1
  326.             ora COUNT+2
  327.             ora COUNT+3
  328.             bne f1a
  329. endfor      jmp endfor1
  330.  
  331. f1a         bit Store
  332.             bpl f1aa
  333.             jsr GetChar
  334.             jsr put_c
  335.             jmp for1
  336.  
  337. f1aa        lda COUNT+3             ; Negative length means went past end
  338.             bmi endfor
  339.  
  340.             jsr DecChar             ; c = DecChar();
  341.  
  342.             txa
  343.             sta C
  344.             tya                     ; if(c<256)
  345.             sta C+1
  346.             bne else
  347.             jsr do_put
  348.             jmp for1                ; and continue with for loop
  349.  
  350. else        jsr DecPosition         ; i = (r-DecPosition()-1) & (N-1);
  351.             inx
  352.             bne f1f
  353.             iny
  354. f1f         stx T0
  355.             sty T0+1
  356.             sec
  357.             lda RR
  358.             sbc T0
  359.             and #<N-1
  360.             sta I
  361.             sta TEXTPTR
  362.             lda RR+1
  363.             sbc T0+1
  364.             and #>N-1
  365.             sta I+1
  366.             sta TEXTPTR+1
  367.  
  368.             sec                     ; j=c-255+THRESHOLD
  369.             lda C
  370.             sbc #255
  371.             sta J
  372.             lda C+1
  373.             sbc #0
  374.             sta J+1
  375.             clc
  376.             lda J
  377.             adc #<THRESHOLD
  378.             sta J
  379.             lda J+1
  380.             adc #>THRESHOLD
  381.             sta J+1
  382.  
  383.             lda #0                  ; for(k=0;
  384.             sta K
  385.             sta K+1
  386.  
  387. for2        lda K                   ;           k<j;
  388.             cmp J
  389.             lda K+1
  390.             sbc J+1
  391.             bcc f2a
  392.             jmp endfor2
  393.  
  394. f2a         clc                     ; c=text_buf[(i+k)&(N-1)]
  395.             lda TEXTPTR
  396.             and #<N-1
  397.             adc #<text_buf
  398.             sta T0
  399.             lda TEXTPTR+1
  400.             and #>N-1
  401.             adc #>text_buf
  402.             sta T0+1
  403.             ldy #0
  404.             lda (T0),y
  405.             sta C
  406.             lda #0
  407.             sta C+1
  408.             jsr do_put              ; Same code as above
  409.  
  410.             inc K                   ; k++
  411.             bne f2b
  412.             inc K+1
  413. f2b         inc TEXTPTR
  414.             bne f2c
  415.             inc TEXTPTR+1
  416. f2c         jmp for2
  417.  
  418. endfor2     jmp for1
  419.  
  420. endfor1     lda CRC
  421.             cmp NewCRC
  422.             bne badcrc
  423.             lda CRC+1
  424.             cmp NewCRC+1
  425.             bne badcrc
  426.             lda #DecodeOK
  427.             fcb $2c
  428. badcrc      lda #CRCError
  429. ReturnA     pha
  430.             jsr clrchn
  431.             lda #8
  432.             jsr close
  433.             pla
  434.             rts
  435.  
  436.  
  437. ;───────────────────────────
  438. ; Common code from if..else
  439. ;───────────────────────────
  440.  
  441. do_put      lda C
  442. put_c       jsr AdjCRC
  443.             bit P_flag
  444.             bpl Printit
  445.             cmp #PAUSE
  446.             beq wait
  447.             cmp #DELAY
  448.             beq delay
  449.  
  450. Printit     jsr chrout
  451.             bit P_flag
  452.             bmi OutOK
  453.             bit status
  454.             bpl OutOK
  455.             pla
  456.             pla
  457.             jmp GoDiskErr
  458.  
  459. OutOK       bit Store
  460.             bmi Countpp
  461.             clc                     ; text_buf[r++] = C;
  462.             lda RR
  463.             adc #<text_buf
  464.             sta T0
  465.             lda RR+1
  466.             adc #>text_buf
  467.             sta T0+1
  468.             ldy #0
  469.             lda C
  470.             sta (T0),y
  471.             inc RR
  472.             bne f1b
  473.             inc RR+1
  474. f1b         lda RR                  ; r &= N-1;
  475.             and #<N-1
  476.             sta RR
  477.             lda RR+1
  478.             and #>N-1
  479.             sta RR+1
  480.  
  481. Countpp     lda COUNT               ; count++
  482.             bne f1c
  483.             lda COUNT+1
  484.             bne f1d
  485.             lda COUNT+2
  486.             bne f1e
  487.             dec COUNT+3
  488. f1e         dec COUNT+2
  489. f1d         dec COUNT+1
  490.             bit P_flag
  491.             bmi f1c
  492.             jsr UpdateGraph
  493. f1c         dec COUNT
  494.             rts
  495.  
  496. title       fcc "TITLE"
  497.             fcb 0
  498.  
  499.  
  500. wait        jsr getin
  501.             cmp #0
  502.             bne wait
  503. wait1       jsr getin
  504.             cmp #0
  505.             beq wait1
  506.             lda #PAUSE
  507.             jmp OutOK
  508.  
  509.  
  510. delay       ldy #0
  511. delay1      ldx #0
  512. delay2      dex
  513.             bne delay2
  514.             dey
  515.             bne delay1
  516.             lda #DELAY
  517.             jmp OutOK
  518.  
  519.  
  520.             END
  521.