home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 25 / amigaformatcd25.iso / websites / amidoom / adoom_src-0.7.lha / ADoom_src / c2p_030.s < prev    next >
Text File  |  1998-01-16  |  11KB  |  450 lines

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