home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 1: Collection A / 17Bit_Collection_A.iso / files / 290.dms / 290.adf / quickrif.source / unvscomp.asm < prev    next >
Assembly Source File  |  1989-01-31  |  5KB  |  145 lines

  1.  
  2. ; unvscomp.asm  Copyright 1987 Dancing Flame all rights reserved.
  3. ;
  4. ; This file contains a single function which is set up to be called from
  5. ; C.  Ie the parameters are on the stack instead of registers.
  6. ;       decode_vkplane(in, out, linebytes)
  7. ; where in is a bit-plane's worth of vertical-byte-run-with-skips data
  8. ; and out is a bit-plane that STILL has the image from last frame on it.
  9. ; Linebytes is the number of bytes-per-line in the out bitplane, and it
  10. ; should certainly be noted that the external pointer variable ytable
  11. ; must be initialized to point to a multiplication table of
  12. ; 0*linebytes, 1*linebytes ... n*linebytes  before this routine is called.
  13. ; The format of "in":
  14. ;   Each column of the bitplane is compressed separately.  A 320x200
  15. ;   bitplane would have 40 columns of 200 bytes each.  The linebytes
  16. ;   parameter is used to count through the columns, it is not in the
  17. ;   "in" data, which is simply a concatenation of columns.
  18. ;
  19. ;   Each columns is an op-count followed by a number of ops.
  20. ;   If the op-count is zero, that's ok, it just means there's no change
  21. ;   in this column from the last frame.
  22. ;   The ops are of three classes, and followed by a varying amount of
  23. ;   data depending on which class.
  24. ;       1. Skip ops - this is a byte with the hi bit clear that says how many
  25. ;          rows to move the "dest" pointer forward, ie to skip. It is non-
  26. ;          zero
  27. ;       2. Uniq ops - this is a byte with the hi bit set.  The hi bit is
  28. ;          masked down and the remainder is a count of the number of bytes
  29. ;          of data to copy literally.  It's of course followed by the
  30. ;          data to copy.
  31. ;       3. Same ops - this is a 0 byte followed by a count byte, followed
  32. ;          by a byte value to repeat count times.
  33. ;   Do bear in mind that the data is compressed vertically rather than
  34. ;   horizontally, so to get to the next byte in the destination (out)
  35. ;   we add linebytes instead of one!
  36. ;
  37.  
  38.     public _decode_vkplane
  39.  
  40. firstp    set    16
  41. in    set    4+firstp
  42. out    set    8+firstp
  43. linebytes    set    14+firstp
  44.  
  45. _decode_vkplane
  46.     movem.l    a2/a3/d4/d5,-(sp)  ; save registers for Aztec C
  47.     move.l    in(sp),a0
  48.     move.l    out(sp),a2
  49.     move.w    linebytes(sp),d2
  50.     move.l    _ytable,a3
  51.     move.w    d2,d4    ; make a copy of linebytes to use as a counter
  52.     bra    zdcp    ; And go to the "columns" loop
  53.  
  54. dcp
  55.     move.l    a2,a1     ; get copy of dest pointer
  56.     clr.w    d0    ; clear hi byte of op_count
  57.     move.b    (a0)+,d0  ; fetch number of ops in this column
  58.     bra    zdcvclp   ; and branch to the "op" loop.
  59.  
  60. dcvclp    clr.w    d1    ; clear hi byte of op
  61.     move.b    (a0)+,d1    ; fetch next op
  62.     bmi    dcvskuniq ; if hi-bit set branch to "uniq" decoder
  63.     beq dcvsame    ; if it's zero branch to "same" decoder
  64.  
  65. skip            ; otherwise it's just a skip
  66.     add.w    d1,d1    ; use amount to skip as index into word-table
  67.     adda.w    0(a3,d1),a1
  68.     dbra    d0,dcvclp ; go back to top of op loop
  69.     bra    z1dcp     ; go back to column loop
  70.  
  71. dcvsame            ;here we decode a "vertical same run"
  72.     move.b    (a0)+,d1    ;fetch the count
  73.     move.b    (a0)+,d3  ; fetch the value to repeat
  74.     move.w    d1,d5     ; and do what it takes to fall into a "tower"
  75.     asr.w    #3,d5     ; d5 holds # of times to loop through tower
  76.     and.w    #7,d1     ; d1 is the remainder
  77.     add.w    d1,d1
  78.     add.w    d1,d1
  79.     neg.w    d1
  80.     jmp    34+same_tower(pc,d1) ; why 34?  8*size of tower
  81.                                          ;instruction pair, but the extra 2's
  82.                                          ;pure voodoo.
  83. same_tower
  84.     move.b    d3,(a1)
  85.     adda.w    d2,a1
  86.     move.b    d3,(a1)
  87.     adda.w    d2,a1
  88.     move.b    d3,(a1)
  89.     adda.w    d2,a1
  90.     move.b    d3,(a1)
  91.     adda.w    d2,a1
  92.     move.b    d3,(a1)
  93.     adda.w    d2,a1
  94.     move.b    d3,(a1)
  95.     adda.w    d2,a1
  96.     move.b    d3,(a1)
  97.     adda.w    d2,a1
  98.     move.b    d3,(a1)
  99.     adda.w    d2,a1
  100.     dbra    d5,same_tower
  101.     dbra    d0,dcvclp
  102.     bra    z1dcp
  103.  
  104. dcvskuniq                     ; here we decode a "unique" run
  105.     and.b    #$7f,d1   ; setting up a tower as above....
  106.     move.w    d1,d5
  107.     asr.w    #3,d5
  108.     and.w    #7,d1
  109.     add.w    d1,d1
  110.     add.w    d1,d1
  111.     neg.w    d1
  112.     jmp    34+uniq_tower(pc,d1)
  113. uniq_tower
  114.     move.b    (a0)+,(a1)
  115.     adda.w    d2,a1
  116.     move.b    (a0)+,(a1)
  117.     adda.w    d2,a1
  118.     move.b    (a0)+,(a1)
  119.     adda.w    d2,a1
  120.     move.b    (a0)+,(a1)
  121.     adda.w    d2,a1
  122.     move.b    (a0)+,(a1)
  123.     adda.w    d2,a1
  124.     move.b    (a0)+,(a1)
  125.     adda.w    d2,a1
  126.     move.b    (a0)+,(a1)
  127.     adda.w    d2,a1
  128.     move.b    (a0)+,(a1)
  129.     adda.w    d2,a1
  130.     dbra    d5,uniq_tower  ; branch back up to "op" loop
  131. zdcvclp dbra    d0,dcvclp      ; branch back up to "column loop"
  132.  
  133.     ; now we've finished decoding a single column
  134. z1dcp    addq.l    #1,a2  ; so move the dest pointer to next column
  135. zdcp    dbra    d4,dcp ; and go do it again what say?
  136.     movem.l    (sp)+,a2/a3/d4/d5
  137.     rts
  138.  
  139.     dseg
  140.     public _ytable ; saves me 8 cycles/op ... a lookup table
  141.                    ; on the y addresses.
  142.  
  143.  
  144.