home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 26 / amigaformatcd26.iso / -screenplay- / otherstuff / adoom_src / c2p_030.s < prev    next >
Text File  |  1998-03-09  |  11KB  |  455 lines

  1.         mc68020
  2.         multipass
  3.     if (_eval(DEBUG)&$8000)
  4.         debug    on,lattice4
  5.     endc
  6.  
  7. ; This routine based on Mikael Kalms' 030-optimised CPU3BLIT1
  8. ; Mikael Kalms' email address is kalms@vasa.gavle.se
  9. ;
  10. ; Simplified and changed to use Signal()s by Peter McGavin, 14 Jan 98
  11.  
  12.         xdef    _c2p1x1_cpu3blit1_queue_init
  13.         xdef    _c2p1x1_cpu3blit1_queue
  14.  
  15.         xref    _GfxBase
  16.  
  17. ;-----------------------------------------------------------------------
  18. ;        IFND    CHUNKYXMAX
  19. ;CHUNKYXMAX    equ    320
  20. ;        ENDC
  21. ;        IFND    CHUNKYYMAX
  22. ;CHUNKYYMAX    equ    200
  23. ;        ENDC
  24.  
  25. ;-----------------------------------------------------------------------
  26. ; d0.w  chunkyx [chunky-pixels]
  27. ; d1.w  chunkyy [chunky-pixels]
  28. ; d3.w  scroffsy [screen-pixels]
  29. ; d5.l  bplsize [bytes] -- offset between one row in one bpl and the next bpl
  30. ; d6.l  signals1 mask
  31. ; d7.l  signals3 mask
  32. ; a2.l  this task to Signal(signals1) on cleanup
  33. ; a3.l  other task to Signal(signals3) on cleanup
  34. ; a4.l  chip buffer of at least size chunkyx * chunkyy
  35.  
  36. _c2p1x1_cpu3blit1_queue_init
  37.         movem.l    d2-d3,-(sp)
  38.         lea    (c2p_data,pc),a0
  39.         move.l    a4,(c2p_blitbuf-c2p_data,a0)
  40.         move.l    d6,(signals1-c2p_data,a0)
  41.         move.l    d7,(signals3-c2p_data,a0)
  42.         move.l    a2,(task-c2p_data,a0)
  43.         move.l    a3,(othertask-c2p_data,a0)
  44.         andi.l    #$ffff,d0
  45.         andi.l    #$ffff,d2
  46.         move.l    d5,(c2p_bplsize-c2p_data,a0)
  47.         move.w    d1,(c2p_chunkyy-c2p_data,a0)
  48.         add.w    d3,d1
  49.         mulu.w    d0,d1
  50.         lsr.l    #3,d1
  51.         subq.l    #2,d1
  52.         move.l    d1,(c2p_scroffs2-c2p_data,a0)
  53.         mulu.w    d0,d3
  54.         lsr.l    #3,d3
  55.         move.l    d3,(c2p_scroffs-c2p_data,a0)
  56.         move.w    (c2p_chunkyy-c2p_data,a0),d1
  57.         mulu.w    d0,d1
  58.         move.l    d1,(c2p_pixels-c2p_data,a0)
  59.         lsr.l    #4,d1
  60.         move.l    d1,(c2p_pixels16-c2p_data,a0)
  61.         movem.l    (sp)+,d2-d3
  62.         rts
  63.  
  64. ;-----------------------------------------------------------------------
  65. ; a0    c2pscreen
  66. ; a1    bitplanes
  67.  
  68. _c2p1x1_cpu3blit1_queue
  69.         movem.l    d2-d7/a2-a6,-(sp)
  70.  
  71.         lea    (c2p_data,pc),a2
  72.         move.l    a1,(c2p_screen-c2p_data,a2)
  73.  
  74.         move.l    #$0f0f0f0f,a4
  75.         move.l    #$00ff00ff,a5
  76.         move.l    #$55555555,a6
  77.  
  78.         movea.l    (c2p_blitbuf-c2p_data,a2),a1
  79.         move.l    (c2p_pixels-c2p_data,a2),a2
  80.         add.l    a0,a2
  81.         cmpa.l    a0,a2
  82.         beq    .none
  83.  
  84.         move.l    (a0)+,d0
  85.         move.l    (a0)+,d6
  86.         move.l    (a0)+,a3
  87.         move.l    (a0)+,d7
  88.         move.l    a4,d5
  89.         move.l    d6,d1            ; Swap 4x1
  90.         lsr.l    #4,d1
  91.         eor.l    d0,d1
  92.         and.l    d5,d1
  93.         eor.l    d1,d0
  94.         lsl.l    #4,d1
  95.         eor.l    d6,d1
  96.  
  97.         move.l    a3,d6
  98.         move.l    d7,d4
  99.         lsr.l    #4,d4
  100.         eor.l    d6,d4
  101.         and.l    d5,d4
  102.         eor.l    d4,d6
  103.         lsl.l    #4,d4
  104.         eor.l    d4,d7
  105.  
  106.         move.l    a5,d5
  107.         move.l    d6,d2            ; Swap 8x2, part 1
  108.         lsr.l    #8,d2
  109.         eor.l    d0,d2
  110.         and.l    d5,d2
  111.         eor.l    d2,d0
  112.         lsl.l    #8,d2
  113.         eor.l    d6,d2
  114.  
  115.         bra.b    .start
  116. .x
  117.         move.l    (a0)+,d0
  118.         move.l    (a0)+,d6
  119.         move.l    (a0)+,a3
  120.         move.l    (a0)+,d7
  121.         move.l    d1,(a1)+
  122.         move.l    a4,d5
  123.         move.l    d6,d1            ; Swap 4x1
  124.         lsr.l    #4,d1
  125.         eor.l    d0,d1
  126.         and.l    d5,d1
  127.         eor.l    d1,d0
  128.         lsl.l    #4,d1
  129.         eor.l    d6,d1
  130.  
  131.         move.l    a3,d6
  132.         move.l    d7,d4
  133.         lsr.l    #4,d4
  134.         move.l    d2,(a1)+
  135.         eor.l    d6,d4
  136.         and.l    d5,d4
  137.         eor.l    d4,d6
  138.         lsl.l    #4,d4
  139.         eor.l    d4,d7
  140.  
  141.         move.l    a5,d5
  142.         move.l    d6,d2            ; Swap 8x2, part 1
  143.         lsr.l    #8,d2
  144.         eor.l    d0,d2
  145.         and.l    d5,d2
  146.         eor.l    d2,d0
  147.         move.l    d3,(a1)+
  148.         lsl.l    #8,d2
  149.         eor.l    d6,d2
  150. .start
  151.         move.l    a6,d4
  152.         move.l    d2,d3            ; Swap 1x2, part 1
  153.         lsr.l    #1,d3
  154.         eor.l    d0,d3
  155.         and.l    d4,d3
  156.         eor.l    d3,d0
  157.         add.l    d3,d3
  158.         eor.l    d3,d2
  159.  
  160.         move.l    d7,d3            ; Swap 8x2, part 2
  161.         lsr.l    #8,d3
  162.         move.l    d0,(a1)+
  163.         eor.l    d1,d3
  164.         and.l    d5,d3
  165.         eor.l    d3,d1
  166.         lsl.l    #8,d3
  167.         eor.l    d7,d3
  168.  
  169.         move.l    d3,d6            ; Swap 1x2, part 2
  170.         lsr.l    #1,d6
  171.         eor.l    d1,d6
  172.         and.l    d4,d6
  173.         eor.l    d6,d1
  174.         add.l    d6,d6
  175.         eor.l    d6,d3
  176.  
  177.         move.l    (a0)+,d0
  178.         move.l    (a0)+,d6
  179.         move.l    (a0)+,a3
  180.         move.l    (a0)+,d7
  181.         move.l    d1,(a1)+
  182.         move.l    a4,d5
  183.         move.l    d6,d1            ; Swap 4x1
  184.         lsr.l    #4,d1
  185.         eor.l    d0,d1
  186.         and.l    d5,d1
  187.         eor.l    d1,d0
  188.         lsl.l    #4,d1
  189.         eor.l    d6,d1
  190.  
  191.         move.l    a3,d6
  192.         move.l    d7,d4
  193.         lsr.l    #4,d4
  194.         move.l    d2,(a1)+
  195.         eor.l    d6,d4
  196.         and.l    d5,d4
  197.         eor.l    d4,d6
  198.         lsl.l    #4,d4
  199.         eor.l    d4,d7
  200.  
  201.         move.l    a5,d5
  202.         move.l    d6,d2            ; Swap 8x2, part 1
  203.         lsr.l    #8,d2
  204.         eor.l    d0,d2
  205.         and.l    d5,d2
  206.         eor.l    d2,d0
  207.         move.l    d3,(a1)+
  208.         lsl.l    #8,d2
  209.         eor.l    d6,d2
  210.  
  211.         move.l    a6,d4
  212.         move.l    d2,d3            ; Swap 1x2, part 1
  213.         lsr.l    #1,d3
  214.         eor.l    d0,d3
  215.         and.l    d4,d3
  216.         eor.l    d3,d0
  217.         add.l    d3,d3
  218.         eor.l    d3,d2
  219.  
  220.         move.l    d7,d3            ; Swap 8x2, part 2
  221.         lsr.l    #8,d3
  222.         move.l    d0,(a1)+
  223.         eor.l    d1,d3
  224.         and.l    d5,d3
  225.         eor.l    d3,d1
  226.         lsl.l    #8,d3
  227.         eor.l    d7,d3
  228.  
  229.         move.l    d3,d6            ; Swap 1x2, part 2
  230.         lsr.l    #1,d6
  231.         eor.l    d1,d6
  232.         and.l    d4,d6
  233.         eor.l    d6,d1
  234.         add.l    d6,d6
  235.         eor.l    d6,d3
  236.  
  237.         cmp.l    a0,a2
  238.         bne        .x
  239. .x2
  240.         move.l    d1,(a1)+
  241.         move.l    d2,(a1)+
  242.         move.l    d3,(a1)+
  243.  
  244.         lea    (c2p_bltnode,pc),a1
  245.         move.l    #c2p1x1_cpu3blit1_queue_41,(c2p_bltroutptr-c2p_bltnode,a1)
  246.         movea.l    (_GfxBase),a6
  247.         jsr    (_LVOQBlit,a6)
  248.  
  249. .none
  250.         movem.l (sp)+,d2-d7/a2-a6
  251.         rts
  252.  
  253. ;-----------------------------------------------------------------------
  254. c2p1x1_cpu3blit1_queue_41            ; Pass 4, subpass 1, ascending
  255.         move.w    #-1,(bltafwm,a0)
  256.         move.w    #-1,(bltalwm,a0)
  257.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  258.         add.l    #12,d0
  259.         move.l    d0,(bltapt,a0)
  260.         addq.l    #2,d0
  261.         move.l    d0,(bltbpt,a0)
  262.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  263.         add.l    d0,d0
  264.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  265.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  266.         move.l    d0,(bltdpt,a0)
  267.         move.w    #14,(bltamod,a0)
  268.         move.w    #14,(bltbmod,a0)
  269.         move.w    #0,(bltdmod,a0)
  270.         move.w    #$cccc,(bltcdat,a0)
  271.         move.w    #$0de4,(bltcon0,a0)
  272.         move.w    #$2000,(bltcon1,a0)
  273.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  274.         move.w    #1,(bltsizh,a0)
  275.         move.l    #c2p1x1_cpu3blit1_queue_42,(c2p_bltroutptr-c2p_bltnode,a1)
  276.         rts
  277.  
  278. ;-----------------------------------------------------------------------
  279. c2p1x1_cpu3blit1_queue_42            ; Pass 4, subpass 2, ascending
  280.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  281.         addq.l    #8,d0
  282.         move.l    d0,(bltapt,a0)
  283.         addq.l    #2,d0
  284.         move.l    d0,(bltbpt,a0)
  285.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  286.         add.l    d0,d0
  287.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  288.         add.l    d0,d0
  289.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  290.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  291.         move.l    d0,(bltdpt,a0)
  292.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  293.         move.w    #1,(bltsizh,a0)
  294.         move.l    #c2p1x1_cpu3blit1_queue_43,(c2p_bltroutptr-c2p_bltnode,a1)
  295.         rts
  296.  
  297. ;-----------------------------------------------------------------------
  298. c2p1x1_cpu3blit1_queue_43            ; Pass 4, subpass 3, ascending
  299.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  300.         addq.l    #4,d0
  301.         move.l    d0,(bltapt,a0)
  302.         addq.l    #2,d0
  303.         move.l    d0,(bltbpt,a0)
  304.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  305.         add.l    d0,d0
  306.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  307.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  308.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  309.         move.l    d0,(bltdpt,a0)
  310.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  311.         move.w    #1,(bltsizh,a0)
  312.         move.l    #c2p1x1_cpu3blit1_queue_44,(c2p_bltroutptr-c2p_bltnode,a1)
  313.         rts
  314.  
  315. ;-----------------------------------------------------------------------
  316. c2p1x1_cpu3blit1_queue_44            ; Pass 4, subpass 4, ascending
  317.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  318.         move.l    d0,(bltapt,a0)
  319.         addq.l    #2,d0
  320.         move.l    d0,(bltbpt,a0)
  321.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  322.         lsl.l    #3,d0
  323.         sub.l    (c2p_bplsize-c2p_bltnode,a1),d0
  324.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  325.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  326.         move.l    d0,(bltdpt,a0)
  327.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  328.         move.w    #1,(bltsizh,a0)
  329.         move.l    #c2p1x1_cpu3blit1_queue_45,(c2p_bltroutptr-c2p_bltnode,a1)
  330.         rts
  331.  
  332. ;-----------------------------------------------------------------------
  333. c2p1x1_cpu3blit1_queue_45            ; Pass 4, subpass 5, descending
  334.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  335.         subq.l    #4,d0
  336.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  337.         move.l    d0,(bltapt,a0)
  338.         addq.l    #2,d0
  339.         move.l    d0,(bltbpt,a0)
  340.         move.l    (c2p_screen-c2p_bltnode,a1),d0
  341.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  342.         move.l    d0,(bltdpt,a0)
  343.         move.w    #$2de4,bltcon0(a0)
  344.         move.w    #$0002,bltcon1(a0)
  345.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  346.         move.w    #1,(bltsizh,a0)
  347.         move.l    #c2p1x1_cpu3blit1_queue_46,(c2p_bltroutptr-c2p_bltnode,a1)
  348.         rts
  349.  
  350. ;-----------------------------------------------------------------------
  351. c2p1x1_cpu3blit1_queue_46            ; Pass 4, subpass 6, descending
  352.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  353.         subq.l    #8,d0
  354.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  355.         move.l    d0,(bltapt,a0)
  356.         addq.l    #2,d0
  357.         move.l    d0,(bltbpt,a0)
  358.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  359.         lsl.l    #2,d0
  360.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  361.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  362.         move.l    d0,(bltdpt,a0)
  363.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  364.         move.w    #1,(bltsizh,a0)
  365.         move.l    #c2p1x1_cpu3blit1_queue_47,(c2p_bltroutptr-c2p_bltnode,a1)
  366.         rts
  367.  
  368. ;-----------------------------------------------------------------------
  369. c2p1x1_cpu3blit1_queue_47            ; Pass 4, subpass 7, descending
  370.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  371.         sub.l    #12,d0
  372.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  373.         move.l    d0,(bltapt,a0)
  374.         addq.l    #2,d0
  375.         move.l    d0,(bltbpt,a0)
  376.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  377.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  378.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  379.         move.l    d0,(bltdpt,a0)
  380.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  381.         move.w    #1,(bltsizh,a0)
  382.         move.l    #c2p1x1_cpu3blit1_queue_48,(c2p_bltroutptr-c2p_bltnode,a1)
  383.         rts
  384.  
  385. ;-----------------------------------------------------------------------
  386. c2p1x1_cpu3blit1_queue_48            ; Pass 4, subpass 8, descending
  387.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  388.         sub.l    #16,d0
  389.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  390.         move.l    d0,(bltapt,a0)
  391.         addq.l    #2,d0
  392.         move.l    d0,(bltbpt,a0)
  393.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  394.         lsl.l    #2,d0
  395.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  396.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  397.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  398.         move.l    d0,(bltdpt,a0)
  399.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  400.         move.w    #1,(bltsizh,a0)
  401.         moveq    #0,d0
  402.         rts
  403.  
  404. ;-----------------------------------------------------------------------
  405. c2p_blitcleanup
  406.         movem.l    a2/a6,-(sp)
  407.         lea    (c2p_bltnode,pc),a2
  408.         move.l    (task-c2p_bltnode,a2),a1 ; signal QBlit() has finished
  409.         move.l    (signals1-c2p_bltnode,a2),d0
  410.         move.l    (4).w,a6
  411.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  412.         move.l    (othertask-c2p_bltnode,a2),a1
  413.         move.l    (signals3-c2p_bltnode,a2),d0
  414.         jsr    (_LVOSignal,a6)        ; signal pass 4 has finished
  415.         movem.l    (sp)+,a2/a6
  416.         rts
  417.  
  418. ;-----------------------------------------------------------------------
  419.         cnop 0,4
  420. c2p_bltnode
  421.         dc.l    0
  422. c2p_bltroutptr
  423.         dc.l    0
  424.         dc.b    $40,0
  425.         dc.l    0
  426. c2p_bltroutcleanup
  427.         dc.l     c2p_blitcleanup
  428.  
  429. task        dc.l    0    ; ptr to task to Signal(signals1) on cleanup()
  430. othertask    dc.l    0    ; ptr to task to Signal(signals3) on cleanup()
  431. signals1    dc.l    0    ; signals to Signal() this task at cleanup
  432. signals3    dc.l    0    ; signals to Signal() othertask at cleanup
  433.  
  434.         cnop    0,4
  435.  
  436. c2p_data
  437. c2p_screen    dc.l    0
  438. c2p_scroffs    dc.l    0
  439. c2p_scroffs2    dc.l    0
  440. c2p_bplsize    dc.l    0
  441. c2p_pixels    dc.l    0
  442. c2p_pixels16    dc.l    0
  443. c2p_blitbuf    dc.l    0
  444. c2p_chunkyy    dc.w    0
  445.  
  446. ;-----------------------------------------------------------------------
  447. ;        section bss_c,bss_c,chip
  448. ;
  449. ;c2p_blitbuf
  450. ;        ds.b     CHUNKYXMAX*CHUNKYYMAX
  451.  
  452. ;-----------------------------------------------------------------------
  453.  
  454.         end
  455.