home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / JAGDEV_1.LZH / DEVELOP.JAG / VECTRONI.X! / LZJAG / DELZJAG.S next >
Text File  |  1994-09-21  |  5KB  |  215 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;; JAGUAR Multimedia Entertainment System Source Code
  3. ;;;
  4. ;;;    COPYRIGHT (c)1994 Atari Computer Corporation
  5. ;;;    UNAUTHORIZED REPRODUCTION, ADAPTATION, DISTRIBUTION,
  6. ;;;    PERFORMANCE OR DISPLAY OF THIS COMPUTER PROGRAM OR
  7. ;;;    THE ASSOCIATED AUDIOVISUAL WORK IS STRICTLY PROHIBITED.
  8. ;;;    ALL RIGHTS RESERVED.
  9. ;;;
  10. ;;;    Module: delzjag.s
  11. ;;;        GPU Code to Un-LZSS a Block of Memory
  12. ;;;
  13. ;;;   History: 09/20/94 - Created (SDS)
  14. ;;;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16.  
  17.         .include    "jaguar.inc"
  18.  
  19. ;;; Exposed Globals
  20.         .globl        _dlzstart
  21.         .globl        _dlzend
  22.         
  23.         .globl        delzss
  24.  
  25.         .globl        lzinbuf
  26.         .globl        lzoutbuf
  27.         .globl        lzworkbuf
  28.  
  29. ;;; Equates
  30. INDEX_BIT_COUNT    .equ    13
  31. LENGTH_BIT_COUNT    .equ    4
  32. BREAK_EVEN        .equ    ((1+INDEX_BIT_COUNT+LENGTH_BIT_COUNT)/9)        
  33.  
  34.         .68000
  35.         .phrase
  36. _dlzstart:
  37.         .gpu
  38.         .org    G_RAM+$100
  39.  
  40. ;;; Register Equates
  41. lzinbufptr    .equr    r0
  42. lzoutbufptr    .equr    r1
  43. lzworkbufptr    .equr    r2
  44.  
  45. currentpos    .equr    r3
  46. ch        .equr    r4
  47.  
  48. addr        .equr    r5
  49. temp        .equr    r6
  50.  
  51. matchlen    .equr    r7
  52. matchpos    .equr    r8
  53. mask        .equr    r9
  54. rack        .equr    r10
  55. bufmask    .equr    r11
  56. bigmask    .equr    r12
  57. startmask    .equr    r13
  58.  
  59. rbigloop    .equr    r14
  60. mreg        .equr    r15
  61. preg        .equr    r16
  62. inner        .equr    r17
  63. compressed    .equr    r18
  64. done        .equr    r19
  65.  
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  67. ;;; INPUT_BITS destreg,num_bits
  68.  
  69. MACRO    INPUT_BITS    destreg, num_bits
  70.         moveq    #1,bigmask        ; bigmask = 1 << (bit_count - 1)
  71.         moveq    #0,\destreg
  72.  
  73.         shlq    #\num_bits-1,bigmask
  74.  
  75.         movei    #.m\~,mreg
  76.         movei    #.p\~,preg
  77. .m\~:
  78.         cmpq    #0,bigmask        ; If bigmask == 0 we're done
  79.         jump    EQ,(preg)        ; (1 wait)
  80.         nop
  81.         
  82.         cmp    startmask,mask        ; (1 wait)
  83.         jr    NE,.n\~
  84.         nop
  85.  
  86.         load    (lzinbufptr),rack    ; Load new input byte
  87.         addq    #4,lzinbufptr
  88. .n\~:
  89.         move    rack,temp        ; if( rack & mask ) destreg |= bigmask
  90.         and    mask,temp        ; (1 wait)
  91.  
  92.         jr    EQ,.o\~            ; (1 wait)
  93.         nop
  94.  
  95.         or    bigmask,\destreg
  96. .o\~:
  97.         shrq    #1,bigmask        ; bigmask >>= 1
  98.         shrq    #1,mask            ; mask >>= 1
  99.         
  100.         jump    NE,(mreg)        ; (1 wait )
  101.         nop
  102.  
  103.         move    startmask,mask
  104.         jump    T,(mreg)
  105.         nop
  106. .p\~:
  107. ENDM
  108.  
  109. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  110. ;;; This is our routine entry point (instructions are interleaved for speed)
  111. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  112. delzss:
  113.         movei    #lzinbuf,addr        ; Address of variables
  114.         movei    #$80000000,mask          ; Mask to shift
  115.         movei    #cstream,compressed    
  116.  
  117.         load    (addr),lzinbufptr    
  118.         addq    #4,addr            ; Next long variable
  119.  
  120.         movei    #$1FFF,bufmask        ; Mask for 8k buffer
  121.         load    (addr),lzoutbufptr
  122.         addq    #4,addr            ; Next long buffer
  123.  
  124.         load    (addr),lzworkbufptr
  125.  
  126.         movei    #bigloop,rbigloop    ; Put in register for quick access
  127.         move    mask,startmask        ; Copy for later compares
  128.         movei    #getchs,inner
  129.         moveq    #1,currentpos        ; Current position in window
  130.         movei    #alldone,done
  131. bigloop:
  132.         cmp    startmask,mask        ; Is mask $80?
  133.         jr    NE,noreread
  134.         nop
  135.  
  136.         load    (lzinbufptr),rack    ; Get a new byte
  137.         addq    #4,lzinbufptr
  138. noreread:
  139.         move    rack,temp        ; Make a copy
  140.         and    mask,temp        ; Isolate bit (1 wait)
  141.  
  142.         shrq    #1,mask            ; mask >>= 1
  143.         jr    NE,havemask        ; (1 wait)
  144.         nop
  145.  
  146.         move    startmask,mask        ; If mask == 0, mask = $80
  147. havemask:
  148.         cmpq    #0,temp            ; Do final test to set ZERO flag
  149.         jump    EQ,(compressed)        ; If 0, get compressed stream    
  150.         nop
  151.  
  152.         INPUT_BITS    ch,8
  153.  
  154.         storeb    ch,(lzoutbufptr)    ; store byte
  155.         addq    #1,lzoutbufptr        ; go to next buffer pos
  156.  
  157.         and    bufmask,currentpos    ; force range of 0-8191
  158.  
  159.         move    lzworkbufptr,addr      ; get address of window
  160.         add    currentpos,addr        ; add offset (1 wait)
  161.         addq    #1,currentpos        ; increment window pointer
  162.         storeb    ch,(addr)        ; update window
  163.  
  164.         jump    T,(rbigloop)        
  165.         nop
  166. cstream:
  167.         INPUT_BITS    matchpos,13    ; Get Index into Window
  168.  
  169.         cmpq    #0,matchpos        ; END_OF_STREAM???
  170.         jump    EQ,(done)        ; (1 wait)
  171.         nop
  172.         
  173.         INPUT_BITS    matchlen,4    ; Get Length of Match
  174.         addq    #BREAK_EVEN,matchlen
  175. getchs:
  176.         and    bufmask,matchpos
  177.         move    lzworkbufptr,addr      ; Get Window Address + Offset
  178.         and    bufmask,currentpos    ; Range check currentpos
  179.         add    matchpos,addr        ; ^ avoids 1 wait
  180.  
  181.         loadb    (addr),ch        ; Load a byte from window
  182.         or    ch,ch            ; (1 wait on purpose)
  183.         storeb    ch,(lzoutbufptr)    ; Store it to our buffer
  184.         addq    #1,lzoutbufptr
  185.                        
  186.         move    lzworkbufptr,temp      ; Store byte in window
  187.         add    currentpos,temp        ; @ currentpos (1 wait)
  188.         addq    #1,currentpos        ; Update Window Position
  189.         storeb    ch,(temp)        ; Update Buffer
  190.         
  191.         addq    #1,matchpos        ; Increment window read addr
  192.         subq    #1,matchlen        ; Decrement loop counter
  193.  
  194.         jump    PL,(inner)        ; ->getchs (1 wait)
  195.         nop
  196.  
  197.         jump    T,(rbigloop)
  198.         nop
  199.  
  200. ;;; Ok, we're done... now leave.
  201. alldone:
  202.         moveq    #0,temp
  203.         movei    #G_CTRL,addr
  204.         store    temp,(addr)
  205.         nop
  206.  
  207.         .long
  208.  
  209. lzinbuf:     .dc.l    0        ; Pointer to Compressed Data
  210. lzoutbuf:    .dc.l    0        ; Pointer of Destination Buffer
  211. lzworkbuf:    .dc.l    0        ; Pointer to 8k LZSS Window
  212.  
  213.         .68000
  214. _dlzend:
  215.         .end