home *** CD-ROM | disk | FTP | other *** search
/ The Grapevine 14 / Grapevine_14_1995-02_TDR_Side_B.d64 / asm.packer < prev    next >
Text File  |  2023-02-26  |  10KB  |  530 lines

  1.  
  2. ;*** SIX-PACK ***
  3.  
  4. ;MULTIPLE & SIX BIT COMPRESSOR
  5.  
  6. ;Code and algorithm by Reiner Richter.
  7. ;Started on the 28/8/94
  8.  
  9. extra    = $4c  ;Extra byte is most
  10.                 ; common byte outside
  11.                 ; a six bit range.
  12. pointer  = $4d  ;6-bit pack ptr.
  13. range    = $4e  ;Current Range.
  14. lastone  = $4f
  15. temp     = $4f
  16. get      = $50
  17. put      = $52
  18. check    = $54
  19. loarea   = $0400 ;Used for scanning for
  20. hiarea   = $0500 ; 'Extra" byte.
  21. memstart = $fa
  22. memend   = $fc
  23. memtop   = $fe
  24. buffer   = $58
  25.  
  26.  
  27. ;CODE MEANING          (RANGE)
  28. ;0-57 Range Offset
  29. ; 58  Extra byte
  30. ; 59  Set to Range 0    0-57
  31. ; 60  Set to Range 1   48-105
  32. ; 61  Set to Range 2   97-154
  33. ; 62  Set to Range 3  140-197
  34. ; 63  Set to Range 4  198-255
  35.  
  36.          *= $080d
  37.  
  38.          jmp main
  39.  
  40.  
  41. getbyte  ldy #0
  42.          lda (get),y
  43.          inc get
  44.          bne getex
  45.          inc get+1
  46. getex    rts
  47.  
  48. putbyte  ldy #0
  49.          sta (put),y
  50.          inc put
  51.          bne getex
  52.          inc put+1
  53.          rts
  54.  
  55. rgetbyte ldy #0
  56.          lda get
  57.          bne skip1
  58.          dec get+1
  59. skip1    dec get
  60.          lda (get),y
  61.          rts
  62.  
  63. rputbyte ldy put
  64.          bne skip2
  65.          dec put+1
  66. skip2    dec put
  67.          ldy #0
  68.          sta (put),y
  69.          rts
  70.  
  71. getcheck ldy #0
  72.          lda (check),y
  73.          inc check
  74.          bne getchkex
  75.          inc check+1
  76. getchkex rts
  77.  
  78.  
  79. eqpack   ;Pack area from top.
  80.          ;Equal byte pack only.
  81.          ldy memend+1
  82.          ldx memend
  83.          stx get
  84.          sty get+1
  85.          ldy memtop+1
  86.          ldx memtop
  87.          stx put
  88.          sty put+1
  89.  
  90.          ldy #$ff     ;Ensure endbyte
  91.          dec get+1    ; is not same as
  92.          lda (get),y  ; end+1 byte.
  93.          inc get+1
  94.          eor #$0f
  95.          ldy #0
  96.          sta (put),y
  97.  
  98. movehilp jsr rgetbyte
  99.          jsr rputbyte
  100.          lda get
  101.          cmp memstart
  102.          beq skip5
  103.          bcs movehilp
  104. skip5    lda get+1
  105.          cmp memstart+1
  106.          bcs movehilp
  107.  
  108.          lda memtop
  109.          sec
  110.          sbc memend
  111.          tax
  112.          lda memtop+1
  113.          sbc memend+1
  114.          tay
  115.          txa
  116.          clc
  117.          adc memstart
  118.          tax
  119.          tya
  120.          adc memstart+1
  121.          tay
  122.          stx get
  123.          sty get+1
  124.          ldx memstart
  125.          ldy memstart+1
  126.          stx put
  127.          sty put+1
  128.  
  129. eqmain   jsr getbyte
  130.          sta lastone
  131. eqloop   jsr putbyte
  132.          ldx #1
  133. multloop ldy #$00
  134.          lda lastone
  135.          cmp (get),y
  136.          bne store
  137.          jsr getbyte
  138.          inx
  139.          bne multloop
  140. multstor jsr putbyte
  141.          txa
  142.          jmp eqloop
  143. store    cpx #1
  144.          bne multstor
  145.  
  146.          lda get+1
  147.          cmp memtop+1
  148.          bne eqmain
  149.          lda get
  150.          cmp memtop
  151.          bne eqmain
  152.  
  153.          ldx put
  154.          ldy put+1
  155.          rts
  156.  
  157. lorange  .byte 0,48,97,140,198
  158. hirange  .byte 57,105,154,197,255
  159.  
  160. inrange  ;Check if byte (A) is in
  161.          ; current range (X).
  162.          ;OUT: CLC=Yes, SEC=Y=New Range
  163.          ldx range
  164.          cmp hirange,x
  165.          beq skip05
  166.          bcs outside
  167. skip05   cmp lorange,x
  168.          bcc outside
  169. inside   sec
  170.          sbc lorange,x
  171.          clc
  172.          rts
  173. outside  ;Byte is outside required range
  174.          ; so need to calculate new.
  175.          ldx #0
  176. newrloop cmp hirange,x
  177.          bcc newrange
  178.          inx
  179.          cpx #4
  180.          bcc newrloop
  181. newrange sec
  182.          sbc lorange,x
  183.          pha
  184.          txa
  185.          clc
  186.          adc #59
  187.          tay
  188.          pla
  189.          sec
  190.          rts
  191.  
  192. extrachk ;Check memory for 'extra'.
  193.          lda #0
  194.          sta range
  195.          tax
  196. clrloop  sta loarea,x
  197.          sta hiarea,x
  198.          inx
  199.          bne clrloop
  200. chkloop  jsr getcheck
  201.          pha
  202.          jsr inrange
  203.          pla
  204.          bcc samerng
  205.          stx range
  206.          tax
  207.          inc loarea,x
  208.          bne samerng
  209.          inc hiarea,x
  210. samerng  lda check
  211.          cmp get
  212.          bne chkloop
  213.          lda check+1
  214.          cmp get+1
  215.          bne chkloop
  216.     ;Counted bytes.
  217.          ldx #0
  218. newloop  lda loarea,x
  219.          ldy hiarea,x
  220.          sta check
  221.          sty check+1
  222.          stx lastone
  223. toosmall inx
  224.          beq extrafnd
  225.          ldy hiarea,x
  226.          cmp check+1
  227.          bcc toosmall
  228.          lda loarea,x
  229.          cmp check
  230.          bcc toosmall
  231.          bcs newloop
  232. extrafnd lda lastone
  233.          ldx put
  234.          ldy put+1
  235.          rts
  236.  
  237. alstore  ;Store a byte according to
  238.          ; the algorithm.
  239.          ldx pointer
  240.          sta loarea,x
  241.          inc pointer
  242.          cpx #3
  243.          bcc alstorex
  244. packloop ldy #6
  245. sixpaklp lsr loarea,x ;Pack four bytes
  246.          ror hiarea   ; into three.
  247.          ror hiarea+1
  248.          ror hiarea+2
  249.          dey
  250.          bne sixpaklp
  251.          dex
  252.          bpl packloop
  253.          lda hiarea
  254.          jsr rputbyte
  255.          lda hiarea+1
  256.          jsr rputbyte
  257.          lda hiarea+2
  258.          jsr rputbyte
  259.          lda #0
  260.          sta pointer
  261. alstorex rts
  262.  
  263. compress
  264.          jsr eqpack  ;X&Y =end+1
  265.          stx get
  266.          sty get+1
  267.          ldx memstart
  268.          ldy memstart+1
  269.          stx check
  270.          sty check+1
  271.          ldx memtop
  272.          ldy memtop+1
  273.          stx put
  274.          sty put+1
  275.          lda #0
  276.          sta pointer
  277.          jsr extrachk
  278.          sta extra
  279.          jsr rputbyte ;1st byte is xtra
  280.  
  281.          lda #0
  282.          sta range
  283. mainloop jsr rgetbyte
  284.          jsr inrange
  285.          pha
  286.          bcc skip3
  287.          txa
  288.          sta range
  289.          tya
  290.          jsr alstore
  291. skip3    pla
  292.          jsr alstore
  293.          lda get+1
  294.          cmp memstart+1
  295.          bne mainloop
  296.          lda get
  297.          cmp memstart
  298.          bne mainloop
  299.  
  300. compex   lda #63
  301.          jsr alstore
  302.          lda #63
  303.          jsr alstore
  304.          lda #63
  305.          jsr alstore
  306.          ldx put
  307.          ldy put+1
  308.          stx get
  309.          sty get+1
  310.          ldx memstart
  311.          ldy memstart+1
  312.          stx put
  313.          sty put+1
  314. movelolp jsr getbyte
  315.          jsr putbyte
  316.          lda get
  317.          cmp memtop
  318.          bne movelolp
  319.          lda get+1
  320.          cmp memtop+1
  321.          bne movelolp
  322.          ldx put
  323.          ldy put+1
  324.          rts
  325.  
  326. ;---------------------------------------
  327.  
  328. dgetbyte ldy #0
  329.          lda (get),y
  330.          inc get
  331.          bne skipd1
  332.          inc get+1
  333. skipd1   rts
  334.  
  335. dputbyte ldy #0
  336.          sta (put),y
  337.          inc put
  338.          bne skipd2
  339.          inc put+1
  340. skipd2   rts
  341.  
  342. drget    ldy #0
  343.          lda get
  344.          bne skipd4
  345.          dec get+1
  346. skipd4   dec get
  347.          lda (get),y
  348.          rts
  349.  
  350. drput    ldy put
  351.          bne skipd5
  352.          dec put+1
  353. skipd5   dec put
  354.          ldy #0
  355.          sta (put),y
  356.          rts
  357.  
  358. decomp
  359.          ldx memend
  360.          ldy memend+1
  361.          stx get
  362.          sty get+1
  363.          jsr drget
  364.          sta extra
  365.          ldx memtop
  366.          ldy memtop+1
  367.          stx put
  368.          sty put+1
  369.          lda #0
  370.          sta range
  371.  
  372. maindlp  ldx #0
  373. dgetloop jsr drget
  374.          sta buffer,x
  375.          inx
  376.          cpx #3
  377.          bcc dgetloop
  378.  
  379.          ldx #4
  380. byteloop ldy #6
  381. roloop   asl buffer+2
  382.          rol buffer+1
  383.          rol buffer
  384.          rol temp
  385.          dey
  386.          bne roloop
  387.          lda temp
  388.          and #%00111111
  389.          cmp #58
  390.          bcc databyte
  391.          bne setrange
  392.          lda extra
  393.          clc
  394.          bcc storeit
  395. setrange sec
  396.          sbc #59
  397.          sta range
  398.          bpl nextbyte
  399. databyte ldy range
  400.          clc
  401.          adc lorange,y
  402. storeit  jsr drput
  403. nextbyte dex
  404.          bne byteloop
  405.  
  406.          lda get+1
  407.          cmp memstart+1
  408.          bne maindlp
  409.          lda get
  410.          cmp memstart
  411.          bne maindlp
  412.  
  413.          ldx put
  414.          ldy put+1
  415.          stx get
  416.          sty get+1
  417.          ldx memstart
  418.          ldy memstart+1
  419.          stx put
  420.          sty put+1
  421.  
  422.          jsr dgetbyte
  423.          sta lastone
  424.          jsr dputbyte
  425.  
  426. dmltloop ldx #2
  427.          jsr dgetbyte
  428.          cmp lastone
  429.          bne mstore
  430.          jsr dgetbyte
  431.          tax
  432.          lda lastone
  433. mstore   sta lastone
  434. mstorelp dex
  435.          beq dloopex
  436.          jsr dputbyte
  437.          jmp mstorelp
  438.  
  439. dloopex  lda get+1
  440.          cmp memtop+1
  441.          bne dmltloop
  442.          ldx put
  443.          ldy put+1
  444.          rts
  445.  
  446.  
  447. startxt  .byte 147,5,14
  448.          .text "            "
  449.          .text "*** SIX-PACK ***"
  450.          .byte 13,13,159
  451.          .text "Code & 6-bit algorithm"
  452.          .text " developed by "
  453.          .text "Reiner Richter."
  454.          .byte 13,13,158
  455.          .text "Enter name of file "
  456.          .text "to pack:"
  457.          .byte 13,5,0
  458.  
  459. newtxt   .byte 158,147,14,13
  460.          .text "Enter name to SAVE"
  461.          .text "packed file as:"
  462.          .byte 13,5,0
  463.  
  464.  
  465. main
  466.          lda #$36
  467.          sta $01
  468.          cli
  469.          jsr $ffe7
  470.          jsr $ff81
  471.          lda #0
  472.          sta $d020
  473.          sta $d021
  474.          ldx #0
  475. startlp  lda startxt,x
  476.          beq startex
  477.          jsr $ffd2
  478.          inx
  479.          bne startlp
  480. startex  jsr getname
  481.          ldx #0
  482.          ldy #$10
  483.          stx memstart
  484.          sty memstart+1
  485.          lda #0
  486.          jsr $ffd5
  487.          stx memend
  488.          sty memend+1
  489.          bcs main      ;Check if error.
  490.          ldx #0
  491.          ldy #$d0
  492.          stx memtop
  493.          sty memtop+1
  494.          jsr compress
  495.          stx memend
  496.          sty memend+1
  497.  
  498.          ldx #0
  499. newtloop lda newtxt,x
  500.          beq newex
  501.          jsr $ffd2
  502.          inx
  503.          bne newtloop
  504. newex    jsr getname
  505.          lda #memstart
  506.          ldx memend
  507.          ldy memend+1
  508.          jsr $ffd8
  509.          jmp main
  510.  
  511.  
  512.  
  513. getname  ;Get filename and SETLFS.
  514.          ldy #0
  515.          jsr $ffcf
  516. getnamlp sta $0200,y
  517.          cmp #13
  518.          beq getnamex
  519.          iny
  520.          bne getnamlp
  521. getnamex tya
  522.          ldx #0
  523.          ldy #2
  524.          jsr $ffbd
  525.          lda #8
  526.          tax
  527.          ldy #0
  528.          jmp $ffba
  529.  
  530.