home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / dev / c2p.lha / C2P / CPU_Only / c2p_020.s < prev    next >
Text File  |  1994-07-01  |  7KB  |  287 lines

  1. ; Chunky2Planar algorithm. [writes pipelined a little]
  2. ;
  3. ;     Cpu only solution
  4. ;    Optimised for 020+fastram
  5. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  6. ;
  7. ;
  8. ; NOTE: uses hardcoded values for screen size
  9. ;     assumes planes are allocated contiguously
  10. ;
  11. ; -------------------------------------------------------------------
  12. ;
  13. ; void __asm c2p_020(    register __a0 UBYTE *chunky,
  14. ;            register __a1 PLANEPTR raster );
  15. ;
  16. ; -------------------------------------------------------------------
  17. ;
  18. ; see c2p_020_test.c for example of usage
  19.  
  20.  
  21.     opt    o-,l+,d+
  22.     
  23.     xdef    _c2p_020
  24.         
  25. WIDTH        equ    320        ; MUST be multiple of 32
  26. HEIGHT        equ    200
  27. plsiz        equ    (WIDTH/8)*HEIGHT
  28.  
  29.  
  30.         cnop    0,4
  31.  
  32. _c2p_020:
  33.  
  34.     movem.l    d2-d7/a2-a6,-(sp)
  35.     move.l    a0,a2
  36.     add.l    #plsiz*8,a2    ;a2 = end of chunky buffer
  37.     
  38.     ;; Sweep thru the whole chunky data once,
  39.     ;; Performing 3 merge operations on it.
  40.     
  41.     move.l    #$00ff00ff,a3    ; load byte merge mask
  42.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  43.     
  44. firstsweep
  45.  movem.l (a0),d0-d7      ;8+4n   40      cycles
  46.  move.l  d4,a6           a6 = CD
  47.  move.w  d0,d4           d4 = CB
  48.  swap    d4              d4 = BC
  49.  move.w  d4,d0           d0 = AC
  50.  move.w  a6,d4           d4 = BD
  51.  move.l  d5,a6           a6 = CD
  52.  move.w  d1,d5           d5 = CB
  53.  swap    d5              d5 = BC
  54.  move.w  d5,d1           d1 = AC
  55.  move.w  a6,d5           d5 = BD
  56.  move.l  d6,a6           a6 = CD
  57.  move.w  d2,d6           d6 = CB
  58.  swap    d6              d6 = BC
  59.  move.w  d6,d2           d2 = AC
  60.  move.w  a6,d6           d6 = BD
  61.  move.l  d7,a6           a6 = CD
  62.  move.w  d3,d7           d7 = CB
  63.  swap    d7              d7 = BC
  64.  move.w  d7,d3           d3 = AC
  65.  move.w  a6,d7           d7 = BD
  66.  move.l  d7,a6
  67.  move.l  d6,a5
  68.  move.l  a3,d6   ; d6 = 0x0x
  69.  move.l  a3,d7   ; d7 = 0x0x
  70.  and.l   d0,d6   ; d6 = 0b0r
  71.  and.l   d2,d7   ; d7 = 0j0z
  72.  eor.l   d6,d0   ; d0 = a0q0
  73.  eor.l   d7,d2   ; d2 = i0y0
  74.  lsl.l   #8,d6   ; d6 = b0r0
  75.  lsr.l   #8,d2   ; d2 = 0i0y
  76.  or.l    d2,d0           ; d0 = aiqy
  77.  or.l    d7,d6           ; d2 = bjrz
  78.  move.l  a3,d7   ; d7 = 0x0x
  79.  move.l  a3,d2   ; d2 = 0x0x
  80.  and.l   d1,d7   ; d7 = 0b0r
  81.  and.l   d3,d2   ; d2 = 0j0z
  82.  eor.l   d7,d1   ; d1 = a0q0
  83.  eor.l   d2,d3   ; d3 = i0y0
  84.  lsl.l   #8,d7   ; d7 = b0r0
  85.  lsr.l   #8,d3   ; d3 = 0i0y
  86.  or.l    d3,d1           ; d1 = aiqy
  87.  or.l    d2,d7           ; d3 = bjrz
  88.  
  89.  move.l  a4,d2   ; d2 = 0x0x
  90.  move.l  a4,d3   ; d3 = 0x0x
  91.  and.l   d0,d2   ; d2 = 0b0r
  92.  and.l   d1,d3   ; d3 = 0j0z
  93.  eor.l   d2,d0   ; d0 = a0q0
  94.  eor.l   d3,d1   ; d1 = i0y0
  95.  lsr.l   #4,d1   ; d1 = 0i0y
  96.  or.l    d1,d0           ; d0 = aiqy
  97.  move.l  d0,(a0)+
  98.  lsl.l    #4,d2
  99.  or.l    d3,d2           ; d1 = bjrz
  100.  move.l    d2,(a0)+
  101.  
  102.  move.l  a4,d3   ; d3 = 0x0x
  103.  move.l  a4,d1   ; d1 = 0x0x
  104.  and.l   d6,d3   ; d3 = 0b0r
  105.  and.l   d7,d1   ; d1 = 0j0z
  106.  eor.l   d3,d6   ; d6 = a0q0
  107.  eor.l   d1,d7   ; d7 = i0y0
  108.  lsr.l   #4,d7   ; d7 = 0i0y
  109.  or.l    d7,d6           ; d6 = aiqy
  110.  move.l    d6,(a0)+
  111.  lsl.l    #4,d3
  112.  or.l    d1,d3           ; d7 = bjrz
  113.  move.l    d3,(a0)+
  114.  
  115. ; move.l  d0,(a0)+
  116. ; move.l  d2,(a0)+
  117. ; move.l  d6,(a0)+
  118. ; move.l  d3,(a0)+
  119.  move.l  a6,d7
  120.  move.l  a5,d6
  121.  move.l  a3,d0   ; d0 = 0x0x
  122.  move.l  a3,d1   ; d1 = 0x0x
  123.  and.l   d4,d0   ; d0 = 0b0r
  124.  and.l   d6,d1   ; d1 = 0j0z
  125.  eor.l   d0,d4   ; d4 = a0q0
  126.  eor.l   d1,d6   ; d6 = i0y0
  127.  lsl.l   #8,d0   ; d0 = b0r0
  128.  lsr.l   #8,d6   ; d6 = 0i0y
  129.  or.l    d6,d4           ; d4 = aiqy
  130.  or.l    d1,d0           ; d6 = bjrz
  131.  move.l  a3,d1   ; d1 = 0x0x
  132.  move.l  a3,d6   ; d6 = 0x0x
  133.  and.l   d5,d1   ; d1 = 0b0r
  134.  and.l   d7,d6   ; d6 = 0j0z
  135.  eor.l   d1,d5   ; d5 = a0q0
  136.  eor.l   d6,d7   ; d7 = i0y0
  137.  lsl.l   #8,d1   ; d1 = b0r0
  138.  lsr.l   #8,d7   ; d7 = 0i0y
  139.  or.l    d7,d5           ; d5 = aiqy
  140.  or.l    d6,d1           ; d7 = bjrz
  141.  move.l  a4,d6   ; d6 = 0x0x
  142.  move.l  a4,d7   ; d7 = 0x0x
  143.  and.l   d4,d6   ; d6 = 0b0r
  144.  and.l   d5,d7   ; d7 = 0j0z
  145.  eor.l   d6,d4   ; d4 = a0q0
  146.  eor.l   d7,d5   ; d5 = i0y0
  147.  lsr.l   #4,d5   ; d5 = 0i0y
  148.  or.l    d5,d4           ; d4 = aiqy
  149.  move.l  d4,(a0)+
  150.  lsl.l   #4,d6   ; d6 = b0r0
  151.  or.l    d7,d6           ; d5 = bjrz
  152.  move.l  d6,(a0)+
  153.  
  154.  move.l  a4,d7   ; d7 = 0x0x
  155.  move.l  a4,d5   ; d5 = 0x0x
  156.  and.l   d0,d7   ; d7 = 0b0r
  157.  and.l   d1,d5   ; d5 = 0j0z
  158.  eor.l   d7,d0   ; d0 = a0q0
  159.  eor.l   d5,d1   ; d1 = i0y0
  160.  lsr.l   #4,d1   ; d1 = 0i0y
  161.  or.l    d1,d0           ; d0 = aiqy
  162.  move.l  d0,(a0)+
  163.  lsl.l   #4,d7   ; d7 = b0r0
  164.  or.l    d5,d7           ; d1 = bjrz
  165.  move.l  d7,(a0)+
  166.  cmp.l   a0,a2           ;; 4c
  167.  bne.w   firstsweep      ;; 6c
  168.  
  169.  sub.l   #plsiz*8,a0
  170.  move.l  #$33333333,a5
  171.  move.l  #$55555555,a6
  172.  lea     plsiz*4(a1),a1  ;a2 = plane4
  173.  
  174. secondsweep
  175.  move.l  (a0),d0
  176.  move.l  8(a0),d1
  177.  move.l  16(a0),d2
  178.  move.l  24(a0),d3
  179.  
  180.  move.l  a5,d6   ; d6 = 0x0x
  181.  move.l  a5,d7   ; d7 = 0x0x
  182.  and.l   d0,d6   ; d6 = 0b0r
  183.  and.l   d2,d7   ; d7 = 0j0z
  184.  eor.l   d6,d0   ; d0 = a0q0
  185.  eor.l   d7,d2   ; d2 = i0y0
  186.  lsl.l   #2,d6   ; d6 = b0r0
  187.  lsr.l   #2,d2   ; d2 = 0i0y
  188.  or.l    d2,d0           ; d0 = aiqy
  189.  or.l    d7,d6           ; d2 = bjrz
  190.  move.l  a5,d7   ; d7 = 0x0x
  191.  move.l  a5,d2   ; d2 = 0x0x
  192.  and.l   d1,d7   ; d7 = 0b0r
  193.  and.l   d3,d2   ; d2 = 0j0z
  194.  eor.l   d7,d1   ; d1 = a0q0
  195.  eor.l   d2,d3   ; d3 = i0y0
  196.  lsl.l   #2,d7   ; d7 = b0r0
  197.  lsr.l   #2,d3   ; d3 = 0i0y
  198.  or.l    d3,d1           ; d1 = aiqy
  199.  or.l    d2,d7           ; d3 = bjrz
  200.  move.l  a6,d2   ; d2 = 0x0x
  201.  move.l  a6,d3   ; d3 = 0x0x
  202.  and.l   d0,d2   ; d2 = 0b0r
  203.  and.l   d1,d3   ; d3 = 0j0z
  204.  eor.l   d2,d0   ; d0 = a0q0
  205.  eor.l   d3,d1   ; d1 = i0y0
  206.  lsr.l   #1,d1   ; d1 = 0i0y
  207.  or.l    d1,d0           ; d0 = aiqy
  208.  move.l  d0,plsiz*3(a1)
  209.  add.l   d2,d2
  210.  or.l    d3,d2           ; d1 = bjrz
  211.  move.l  d2,plsiz*2(a1)
  212.  
  213.  move.l  a6,d3   ; d3 = 0x0x
  214.  move.l  a6,d1   ; d1 = 0x0x
  215.  and.l   d6,d3   ; d3 = 0b0r
  216.  and.l   d7,d1   ; d1 = 0j0z
  217.  eor.l   d3,d6   ; d6 = a0q0
  218.  eor.l   d1,d7   ; d7 = i0y0
  219.  lsr.l   #1,d7   ; d7 = 0i0y
  220.  or.l    d7,d6           ; d6 = aiqy
  221.  move.l  d6,plsiz*1(a1)
  222.  add.l   d3,d3
  223.  or.l    d1,d3           ; d7 = bjrz
  224.  move.l  d3,(a1)+
  225.  
  226.  move.l  4(a0),d0
  227.  move.l  12(a0),d1
  228.  move.l  20(a0),d2
  229.  move.l  28(a0),d3
  230.  
  231.  move.l  a5,d6   ; d6 = 0x0x
  232.  move.l  a5,d7   ; d7 = 0x0x
  233.  and.l   d0,d6   ; d6 = 0b0r
  234.  and.l   d2,d7   ; d7 = 0j0z
  235.  eor.l   d6,d0   ; d0 = a0q0
  236.  eor.l   d7,d2   ; d2 = i0y0
  237.  lsl.l   #2,d6   ; d6 = b0r0
  238.  lsr.l   #2,d2   ; d2 = 0i0y
  239.  or.l    d2,d0           ; d0 = aiqy
  240.  or.l    d7,d6           ; d2 = bjrz
  241.  move.l  a5,d7   ; d7 = 0x0x
  242.  move.l  a5,d2   ; d2 = 0x0x
  243.  and.l   d1,d7   ; d7 = 0b0r
  244.  and.l   d3,d2   ; d2 = 0j0z
  245.  eor.l   d7,d1   ; d1 = a0q0
  246.  eor.l   d2,d3   ; d3 = i0y0
  247.  lsl.l   #2,d7   ; d7 = b0r0
  248.  lsr.l   #2,d3   ; d3 = 0i0y
  249.  or.l    d3,d1           ; d1 = aiqy
  250.  or.l    d2,d7           ; d3 = bjrz
  251.  move.l  a6,d2   ; d2 = 0x0x
  252.  move.l  a6,d3   ; d3 = 0x0x
  253.  and.l   d0,d2   ; d2 = 0b0r
  254.  and.l   d1,d3   ; d3 = 0j0z
  255.  eor.l   d2,d0   ; d0 = a0q0
  256.  eor.l   d3,d1   ; d1 = i0y0
  257.  lsr.l   #1,d1   ; d1 = 0i0y
  258.  or.l    d1,d0           ; d0 = aiqy
  259.  move.l  d0,-4-plsiz*1(a1)
  260.  add.l   d2,d2
  261.  or.l    d3,d2           ; d1 = bjrz
  262.  move.l  d2,-4-plsiz*2(a1)
  263.  
  264.  move.l  a6,d3   ; d3 = 0x0x
  265.  move.l  a6,d1   ; d1 = 0x0x
  266.  and.l   d6,d3   ; d3 = 0b0r
  267.  and.l   d7,d1   ; d1 = 0j0z
  268.  eor.l   d3,d6   ; d6 = a0q0
  269.  eor.l   d1,d7   ; d7 = i0y0
  270.  lsr.l   #1,d7   ; d7 = 0i0y
  271.  or.l    d7,d6           ; d6 = aiqy
  272.  move.l  d6,-4-plsiz*3(a1)
  273.  add.l   d3,d3
  274.  or.l    d1,d3           ; d7 = bjrz
  275.  move.l  d3,-4-plsiz*4(a1)
  276.  add.w   #32,a0  ;;4c
  277.  cmp.l   a0,a2   ;;4c
  278.  bne.w   secondsweep     ;;6c
  279.  
  280.     ;300
  281.     
  282. exit    
  283.     movem.l    (sp)+,d2-d7/a2-a6
  284.     rts
  285.     
  286.  
  287.