home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / debuggers / barfl105.lha / Barfly / Source / Demo.S < prev    next >
Encoding:
Text File  |  1994-07-16  |  32.9 KB  |  1,869 lines

  1. ;-----------------------------------------------------------------------------
  2. ; FUNCTION:    NONE
  3. ;
  4. ; INPUT:    NONE
  5. ;
  6. ; OUTPUT:    NONE
  7. ;
  8. ; REQUIREMENT:
  9. ;    - V2.x : Because 1.x is a pain
  10. ;    - 020+ : Because I wanted too
  11. ;
  12. ; NOTE:    - There was no point to make this code resident, so the program
  13. ;      variables are in the XDATA to save us from an Allocmem.
  14. ;    - Because the code require a bit of CPU power there was no point
  15. ;      to take the time to make it 68000 compatible.
  16. ;    - I removed the 3.x WB support, cause I was not happy with it.
  17. ;    - On my basic 3.1 A3000 blitting the image to the window take ~50%
  18. ;      of the machine time, the C2P ~20%.Think what you want of this fact.
  19. ;    - All drawing routines are custom but use bltbitmap to display
  20. ;      the result in a window.(With a prior c2p pass is needed)
  21. ;
  22. ;-----------------------------------------------------------------------------
  23. ;    ADDSYM
  24.     MC68020
  25.     OUTPUT    T:DEMO
  26.     BOPT    x+,O+,wo-    ;,OG+
  27.  
  28. ;--------------------------------------
  29.     INCDIR    "includes:"
  30.     INCLUDE "exec/execbase.i"
  31.     INCLUDE "exec/memory.i"
  32.     INCLUDE    "intuition/intuition.i"
  33.     INCLUDE    "all_lvo.i"            ;File auto created with LK FDINCLUDE option
  34.  
  35. ;-----------------------------------------------------------------------------
  36. GSTRING    MACRO                    ;This macro should be SECTION based
  37.     bsr.b    \@
  38.     db    "\1",0
  39.     EVEN
  40. \@    movea.l    (sp)+,\2
  41.     ENDM
  42.  
  43. TRUE    = 1
  44. FALSE    = 0
  45.  
  46.     RSRESET                    ;Program Variable
  47. DEMO_Stack        RS.L    1
  48. DEMO_EBase        RS.L    1
  49. DEMO_DBase        RS.L    1
  50. DEMO_IBase        RS.L    1
  51. DEMO_GBase        RS.L    1
  52. DEMO_Error        RS.L    1
  53. DEMO_Screen        RS.L    1
  54. DEMO_WindowXPos        RS.W    1
  55. DEMO_WindowYPos        RS.W    1
  56. DEMO_PolyWindow        RS.L    1
  57. DEMO_BoxWindow        RS.L    1
  58. DEMO_PixelWindow    RS.L    1
  59. DEMO_FireWindow        RS.L    1
  60. DEMO_RingWindow        RS.L    1
  61. DEMO_WeirdWindow    RS.L    1
  62. DEMO_ZoomWindow        RS.L    1
  63. DEMO_DiscWindow        RS.L    1
  64. DEMO_RND        RS.L    1
  65. DEMO_WBVP        RS.L    1
  66. DEMO_ColorMap        RS.L    1
  67. DEMO_HScroll        RS.L    1
  68. DEMO_HSize        RS.W    1
  69. DEMO_VSize        RS.W    1
  70. DEMO_MouseX        RS.W    1
  71. DEMO_MouseY        RS.W    1
  72. DEMO_Dist        RS.L    1
  73. DEMO_Chunky1        RS.L    1
  74. DEMO_Chunky2        RS.L    1
  75. DEMO_SinTable        RS.L    1
  76. DEMO_Pens        RS.B    16
  77. DEMO_AvailPens        RS.B    16
  78. DEMO_BitMap        RS.B    bm_SIZEOF
  79. DEMO_Maping        RS.B    256
  80. DEMO_Points        RS.W    32*3*2
  81. DEMO_SIZEOF        RS.L    0
  82.  
  83. ;    SECTION    DEMOCode,CODE            ;Read ONLY
  84.  
  85. ;--------------------------------------
  86. DEMO_Startup
  87.     lea    (DEMO_BSS,pc),a4
  88.     ml    a7,(DEMO_Stack,a4)
  89.  
  90.     bsr    DEMO_AllocLib
  91.     beq    DEMO_Exit
  92.  
  93.     mw    ([DEMO_EBase,a4],AttnFlags),d0
  94.     btst    #AFB_68020,d0
  95.     beq    DEMO_Exit
  96.  
  97. DEMO_Main
  98.     GSTRING    <Demo Screen>,a0
  99.     bsr    DEMO_AllocScreen
  100.     ml    d0,(DEMO_Screen,a4)
  101.     beq    DEMO_Quit
  102.     movea.l    d0,a0
  103.     mq    #0,d0
  104.     mb    (sc_BarHeight,a0),d0
  105.     add.b    (sc_BarVBorder,a0),d0
  106.     mw    d0,(DEMO_WindowYPos,a4)
  107.  
  108.     GSTRING    <Fire>,a0
  109.     bsr    DEMO_AllocWindow
  110.     ml    d0,(DEMO_FireWindow,a4)
  111.     beq    DEMO_Quit
  112.  
  113.     GSTRING    <Zoom>,a0
  114.     bsr    DEMO_AllocWindow
  115.     ml    d0,(DEMO_ZoomWindow,a4)
  116.     beq    DEMO_Quit
  117.  
  118.     GSTRING    <Poly>,a0
  119.     bsr    DEMO_AllocWindow
  120.     ml    d0,(DEMO_PolyWindow,a4)
  121.     beq    DEMO_Quit
  122.  
  123.     GSTRING    <Box>,a0
  124.     bsr    DEMO_AllocWindow
  125.     ml    d0,(DEMO_BoxWindow,a4)
  126.     beq    DEMO_Quit
  127.  
  128.     GSTRING    <Pixel>,a0
  129.     bsr    DEMO_AllocWindow
  130.     ml    d0,(DEMO_PixelWindow,a4)
  131.     beq    DEMO_Quit
  132.  
  133.     GSTRING    <Disc>,a0
  134.     bsr    DEMO_AllocWindow
  135.     ml    d0,(DEMO_DiscWindow,a4)
  136.     beq    DEMO_Quit
  137.  
  138.     GSTRING    <Weird>,a0
  139.     bsr    DEMO_AllocWindow
  140.     ml    d0,(DEMO_WeirdWindow,a4)
  141.     beq    DEMO_Quit
  142.  
  143.     GSTRING    <Ring>,a0
  144.     bsr    DEMO_AllocWindow
  145.     ml    d0,(DEMO_RingWindow,a4)
  146.     beq    DEMO_Quit
  147.  
  148.     movea.l    (DEMO_Screen,a4),a0
  149.     movea.l    (DEMO_IBase,a4),a6
  150.     jsr    (_LVOScreenToFront,a6)        ;Show screen with all window opened
  151.  
  152. .Loop    pea    .Loop(pc)
  153.     mq    #0,D0
  154.     lea    (DEMO_FireWindow,a4),a0
  155.     bsr    .SetBit
  156.     lea    (DEMO_WeirdWindow,a4),a0
  157.     bsr    .SetBit
  158.     lea    (DEMO_PolyWindow,a4),a0
  159.     bsr    .SetBit
  160.     lea    (DEMO_BoxWindow,a4),a0
  161.     bsr    .SetBit
  162.     lea    (DEMO_PixelWindow,a4),a0
  163.     bsr    .SetBit
  164.     lea    (DEMO_DiscWindow,a4),a0
  165.     bsr    .SetBit
  166.     lea    (DEMO_ZoomWindow,a4),a0
  167.     bsr    .SetBit
  168.     lea    (DEMO_RingWindow,a4),a0
  169.     bsr    .SetBit
  170.     beq    DEMO_Quit
  171.     movea.l    (DEMO_EBase,a4),a6
  172.     jsr    (_LVOWait,a6)            ;Wait on any window left opened
  173.  
  174.     ml    #IDCMP_ACTIVEWINDOW,d2
  175.  
  176.     lea    (DEMO_RingWindow,a4),a0
  177.     bsr    DEMO_GetWindowInput
  178.     cmp.l    d2,d0
  179.     beq    DEMO_Ring
  180.  
  181.     lea    (DEMO_FireWindow,a4),a0
  182.     bsr    DEMO_GetWindowInput
  183.     cmp.l    d2,d0
  184.     beq    DEMO_Fire
  185.  
  186.     lea    (DEMO_WeirdWindow,a4),a0
  187.     bsr    DEMO_GetWindowInput
  188.     cmp.l    d2,d0
  189.     beq    DEMO_Weird
  190.  
  191.     lea    (DEMO_ZoomWindow,a4),a0
  192.     bsr    DEMO_GetWindowInput
  193.     cmp.l    d2,d0
  194.     beq    DEMO_Zoom
  195.  
  196.     lea    (DEMO_PolyWindow,a4),a0
  197.     bsr    DEMO_GetWindowInput
  198.     cmp.l    d2,d0
  199.     beq    DEMO_Poly
  200.  
  201.     lea    (DEMO_BoxWindow,a4),a0
  202.     bsr    DEMO_GetWindowInput
  203.     cmp.l    d2,d0
  204.     beq    DEMO_Box
  205.  
  206.     lea    (DEMO_PixelWindow,a4),a0
  207.     bsr    DEMO_GetWindowInput
  208.     cmp.l    d2,d0
  209.     beq    DEMO_Pixel
  210.  
  211.     lea    (DEMO_DiscWindow,a4),a0
  212.     bsr    DEMO_GetWindowInput
  213.     cmp.l    d2,d0
  214.     beq    DEMO_Disc
  215.  
  216.     rts
  217.  
  218. .SetBit    ml    (a0),d1
  219.     beq.b    .TstBit
  220.     movea.l    d1,a0
  221.     mb    ([wd_UserPort,a0],MP_SIGBIT),d1
  222.     bset    d1,d0
  223. .TstBit    tst.l    d0
  224.     rts
  225.  
  226. DEMO_Quit
  227.     ml    (DEMO_Screen,a4),d0
  228.     beq.b    DEMO_Exit
  229.     movea.l    d0,a0
  230.     movea.l    (DEMO_IBase,a4),a6
  231.     jsr    (_LVOScreenToBack,a6)
  232.     bsr    DEMO_FreeBuffer
  233.     lea    (DEMO_FireWindow,a4),a0
  234.     bsr    DEMO_FreeWindow
  235.     lea    (DEMO_RingWindow,a4),a0
  236.     bsr    DEMO_FreeWindow
  237.     lea    (DEMO_ZoomWindow,a4),a0
  238.     bsr    DEMO_FreeWindow
  239.     lea    (DEMO_WeirdWindow,a4),a0
  240.     bsr    DEMO_FreeWindow
  241.     lea    (DEMO_PolyWindow,a4),a0
  242.     bsr    DEMO_FreeWindow
  243.     lea    (DEMO_BoxWindow,a4),a0
  244.     bsr    DEMO_FreeWindow
  245.     lea    (DEMO_PixelWindow,a4),a0
  246.     bsr    DEMO_FreeWindow
  247.     lea    (DEMO_DiscWindow,a4),a0
  248.     bsr    DEMO_FreeWindow
  249.     bsr    DEMO_FreeScreen
  250. DEMO_Exit
  251.     bsr    DEMO_FreeLib
  252.     ml    (DEMO_Stack,a4),a7
  253.     ml    (DEMO_Error,a4),d0
  254.     rts
  255.  
  256. ;--------------------------------------
  257. DEMO_AllocLib
  258.     ml    ($4).w,(DEMO_EBase,a4)
  259.     movea.l    (DEMO_EBase,a4),a6
  260.     lea    (DName,pc),a1
  261.     mq    #0,d0
  262.     jsr    (_LVOOpenLibrary,a6)
  263.     ml    d0,(DEMO_DBase,a4)
  264.     beq.b    .Fail
  265.     lea    (IName,pc),a1
  266.     mq    #37,d0
  267.     jsr    (_LVOOpenLibrary,a6)
  268.     ml    d0,(DEMO_IBase,a4)
  269.     beq.b    .Fail
  270.     lea    (GName,pc),a1
  271.     mq    #37,d0
  272.     jsr    (_LVOOpenLibrary,a6)
  273.     ml    d0,(DEMO_GBase,a4)
  274.     beq.b    .Fail
  275. .Exit    mq    #TRUE,d0
  276.     rts
  277. .Fail    mq    #FALSE,d0
  278.     rts
  279.  
  280. DEMO_FreeLib
  281.     lea    (DEMO_IBase,a4),a0
  282.     bsr.b    .Close
  283.     lea    (DEMO_GBase,a4),a0
  284.     bsr.b    .Close
  285.     lea    (DEMO_DBase,a4),a0
  286. .Close    ml    (a0),d0
  287.     beq.b    .Rts
  288.     clr.l    (a0)
  289.     movea.l    d0,a1
  290.     movea.l    (DEMO_EBase,a4),a6
  291.     jmp    (_LVOCloseLibrary,a6)
  292. .Rts    rts
  293.  
  294. IName        DC.B    "intuition.library",0
  295. GName        DC.B    "graphics.library",0
  296. DName        DC.B    "dos.library",0
  297.     EVEN
  298.  
  299. ;--------------------------------------
  300. DEMO_AllocScreen
  301.     ml    a7,d2
  302.     ml    #-1,-(sp)
  303.     ml    a7,d3
  304.     ml    #TAG_END,-(sp)
  305.     ml    #5,-(sp)
  306.     ml    #SA_Depth,-(sp)
  307.     ml    a0,-(sp)
  308.     ml    #SA_Title,-(sp)
  309.     ml    #CUSTOMSCREEN,-(sp)
  310.     ml    #SA_Type,-(sp)
  311.     ml    #TRUE,-(sp)
  312.     ml    #SA_Behind,-(sp)
  313.     ml    d3,-(sp)
  314.     ml    #SA_Pens,-(sp)
  315.     suba.l    a0,a0
  316.     movea.l    a7,a1
  317.     movea.l    (DEMO_IBase,a4),a6
  318.     jsr    (_LVOOpenScreenTagList,a6)
  319.     ml    d2,a7
  320.     rts
  321.  
  322. DEMO_FreeScreen
  323.     lea    (DEMO_Screen,a4),a0
  324. .Close    ml    (a0),d0
  325.     beq    .Rts
  326.     clr.l    (a0)
  327.     movea.l    d0,a0
  328.     movea.l    (DEMO_IBase,a4),a6
  329.     jmp    (_LVOCloseScreen,a6)
  330. .Rts    rts
  331.  
  332. ;--------------------------------------
  333. DEMO_AllocWindow
  334.     ml    a7,d2
  335.     mq    #0,d0
  336.     ml    #TAG_END,-(sp)
  337.     mw    (DEMO_WindowYPos,a4),d0
  338.     ml    d0,-(sp)
  339.     ml    #WA_Top,-(sp)
  340.     mw    (DEMO_WindowXPos,a4),d0
  341.     ml    d0,-(sp)
  342.     ml    #WA_Left,-(sp)
  343.     ml    #256,-(sp)
  344.     ml    #WA_MaxWidth,-(sp)
  345.     ml    #200,-(sp)
  346.     ml    #WA_MaxHeight,-(sp)
  347.     ml    #32,-(sp)
  348.     ml    #WA_InnerWidth,-(sp)
  349.     ml    #32,-(sp)
  350.     ml    #WA_InnerHeight,-(sp)
  351.     ml    #IDCMP_CLOSEWINDOW!IDCMP_NEWSIZE!IDCMP_ACTIVEWINDOW!IDCMP_INACTIVEWINDOW,-(sp)
  352.     ml    #WA_IDCMP,-(sp)
  353.     ml    #WFLG_SIZEGADGET!WFLG_CLOSEGADGET!WFLG_DRAGBAR!WFLG_DEPTHGADGET,-(sp)
  354.     ml    #WA_Flags,-(sp)
  355.     ml    a0,-(sp)
  356.     ml    #WA_Title,-(sp)
  357.     ml    (DEMO_Screen,a4),-(sp)
  358.     ml    #WA_CustomScreen,-(sp)
  359.     suba.l    a0,a0
  360.     movea.l    a7,a1
  361.     movea.l    (DEMO_IBase,a4),a6
  362.     jsr    (_LVOOpenWindowTagList,a6)
  363.     ml    d2,a7
  364.     tst.l    d0
  365.     beq.b    .Rts
  366.     movea.l    d0,a0
  367.     mw    (wd_Width,a0),d1
  368.     add.w    d1,(DEMO_WindowXPos,a4)
  369.     cmpi.w    #256,(DEMO_WindowXPos,a4)
  370.     ble.b    .Rts
  371.     clr.w    (DEMO_WindowXPos,a4)
  372.     mw    (wd_TopEdge,a0),d1
  373.     add.w    (wd_Height,a0),d1
  374.     mw    d1,(DEMO_WindowYPos,a4)
  375. .Rts    rts
  376.  
  377. DEMO_FreeWindow
  378. .Close    ml    (a0),d0
  379.     beq    .Rts
  380.     clr.l    (a0)
  381.     movea.l    d0,a0
  382.     movea.l    (DEMO_IBase,a4),a6
  383.     jmp    (_LVOCloseWindow,a6)
  384. .Rts    rts
  385.  
  386. ;--------------------------------------
  387. DEMO_GetWindowInput
  388.     ml    (a0),d0
  389.     beq.b    .Rts
  390.     movea.l    d0,a0
  391.     movem.l    d2-d3,-(a7)
  392.     movea.l    (DEMO_EBase,a4),a6
  393.     movea.l    (wd_UserPort,a0),a0
  394.     mq    #0,d2
  395.     jsr    (_LVOGetMsg,a6)
  396.     tst.l    d0
  397.     beq.b    .Done
  398.     movea.l    d0,a1
  399.     ml    (im_Class,a1),d2
  400.     mw    (im_Code,a1),d3
  401.     jsr    (_LVOReplyMsg,a6)
  402. .Done    ml    d2,d0
  403.     mw    d3,d1
  404. .Exit    movem.l    (a7)+,d2-d3
  405. .Rts    rts
  406.  
  407. ;--------------------------------------
  408. DEMO_AllocBuffer
  409.     mw    (DEMO_HSize,a4),d0
  410.     lsr.w    #3,d0
  411.     mw    d0,(DEMO_BitMap+bm_BytesPerRow,a4)
  412.     mw    (DEMO_VSize,a4),(DEMO_BitMap+bm_Rows,a4)
  413.     mb    #4,(DEMO_BitMap+bm_Depth,a4)
  414.     lea    (DEMO_BitMap+bm_Planes,a4),a2
  415.     mq    #4-1,d2
  416.     movea.l    (DEMO_GBase,a4),a6
  417. ..    mw    (DEMO_HSize,a4),d0
  418.     mw    (DEMO_VSize,a4),d1
  419.     jsr    (_LVOAllocRaster,a6)
  420.     ml    d0,(a2)+
  421.     beq.b    .Fail
  422.     dbra    d2,..
  423.  
  424.     mw    (DEMO_HSize,a4),d0
  425.     mulu.w    (DEMO_VSize,a4),d0
  426.     ml    #MEMF_CLEAR,d1
  427.     movea.l    (DEMO_EBase,a4),a6
  428.     jsr    (_LVOAllocMem,a6)
  429.     ml    d0,(DEMO_Chunky1,a4)
  430.     beq.b    .Fail
  431.  
  432.     mw    (DEMO_HSize,a4),d0
  433.     mulu.w    (DEMO_VSize,a4),d0
  434.     ml    #0,d1
  435.     jsr    (_LVOAllocMem,a6)
  436.     ml    d0,(DEMO_Chunky2,a4)
  437.     beq.b    .Fail
  438.  
  439.     mq    #TRUE,d0
  440.     rts
  441. .Fail    mq    #FALSE,d0
  442.     rts
  443.  
  444. .AllocBitMap
  445.     movea.l    (DEMO_GBase,a4),a6
  446.     rts
  447.  
  448. DEMO_FreeBuffer
  449.     lea    (DEMO_BitMap+bm_Planes,a4),a2
  450.     movea.l    (DEMO_GBase,a4),a6
  451.     mq    #4-1,d2
  452. ..    ml    (a2)+,d0
  453.     beq.b    0$
  454.     clr.l    -4(a2)
  455.     movea.l    d0,a0
  456.     mw    (DEMO_HSize,a4),d0
  457.     mw    (DEMO_VSize,a4),d1
  458.     jsr    (_LVOFreeRaster,a6)
  459. 0$    dbra    d2,..
  460.     mw    (DEMO_HSize,a4),d0
  461.     mulu.w    (DEMO_VSize,a4),d0
  462.     lea    (DEMO_Chunky1,a4),a0
  463.     bsr.b    .Free
  464.     mw    (DEMO_HSize,a4),d0
  465.     mulu.w    (DEMO_VSize,a4),d0
  466.     lea    (DEMO_Chunky2,a4),a0
  467. .Free    ml    (a0),d1
  468.     beq.b    .Rts
  469.     clr.l    (a0)
  470.     movea.l    d1,a1
  471.     movea.l    (DEMO_EBase,a4),a6
  472.     jmp    (_LVOFreeMem,a6)
  473. .Rts    rts
  474.  
  475. ;--------------------------------------
  476. DEMO_LoadColor
  477.     adda.w    #16*2,a1
  478.     mq    #8-1,d0
  479. ..    ml    -(a1),-(a7)
  480.     dbra    d0,..
  481.     ml    (DEMO_Screen,a4),a0
  482.     lea    (sc_ViewPort,a0),a0
  483.     movea.l    (vp_ColorMap,a0),a1
  484.     lea    ([cm_ColorTable,a1],16*2),a1
  485.     mq    #8-1,d0
  486. ..    ml    -(a1),-(a7)
  487.     dbra    d0,..
  488.     movea.l    a7,a1
  489.     mq    #32,d0
  490.     movea.l    (DEMO_GBase,a4),a6
  491.     jsr    (_LVOLoadRGB4,a6)
  492.     adda.w    #32*2,a7
  493.     rts
  494.  
  495. ;------------------------------------------------------------------------------
  496. DEMO_Poly
  497.     lea    (PolyColors,pc),a1
  498.     bsr    DEMO_LoadColor
  499.  
  500.     movea.l    (DEMO_PolyWindow,a4),a0
  501.     bsr    DEMO_Resize
  502.  
  503.     ml    #$87654321,(DEMO_RND,a4)
  504.  
  505. .Loop    bsr.b    .Poly
  506.  
  507.     movea.l    (DEMO_PolyWindow,a4),a0
  508.     bsr    DEMO_Display
  509.     lea    (DEMO_PolyWindow,a4),a0
  510.     bsr    DEMO_HandleWindow
  511.     bne.b    .Loop
  512.     rts
  513.  
  514. .Poly    ml    (DEMO_RND,a4),d0
  515.     mq    #0,d1
  516.     lea    (DEMO_Points,a4),a0
  517.     mq    #0,d2
  518.     mq    #0,d3
  519.     mw    (DEMO_HSize,a4),d2
  520.     mw    (DEMO_VSize,a4),d3
  521.     mw    #32*3-1,d4
  522. ..    add.l    d1,d0
  523.     mq    #0,d5
  524.     swap    d0
  525.     add.l    d0,d1
  526.     mw    d0,d5
  527.     mq    #0,d6
  528.     divu.w    d2,d5
  529.     mw    d1,d6
  530.     divu.w    d3,d6
  531.     swap    d6
  532.     mw    d6,d5
  533.     ml    d5,(a0)+
  534.     dbra    d4,..
  535.     ml    d0,(DEMO_RND,a4)
  536.  
  537.     lea    (DEMO_Points,a4),a2
  538.     lea    (DEMO_DrawTriangleDraw,pc),a5
  539.     bsr.b    .Draw
  540.     lea    (DEMO_DrawTriangleErase,pc),a5
  541. .Draw    mq    #16-1,d3
  542. ..    movem.l    (a2)+,d0-d2
  543.     movem.l    d3/a2/a4-a5,-(sp)
  544.     and.w    #%11,d3
  545.     lea    (DEMO_BitMap,a4),a1
  546.     movea.l    (bm_Planes,a1,d3.w*4),a0
  547.     bsr    DEMO_DrawTriangle
  548.     movem.l    (sp)+,d3/a2/a4-a5
  549.     dbra    d3,..
  550.     rts
  551.  
  552. ;------------------------------------------------------------------------------
  553. DEMO_Box
  554.     lea    (BoxColors,pc),a1
  555.     bsr    DEMO_LoadColor
  556.  
  557.     movea.l    (DEMO_BoxWindow,a4),a0
  558.     bsr    DEMO_Resize
  559.  
  560.     ml    #$1,(DEMO_RND,a4)
  561.  
  562. .Loop    bsr.b    .Box
  563.  
  564.     movea.l    (DEMO_BoxWindow,a4),a0
  565.     bsr    DEMO_Display
  566.     lea    (DEMO_BoxWindow,a4),a0
  567.     bsr    DEMO_HandleWindow
  568.     bne.b    .Loop
  569.     rts
  570.  
  571. .Box    ml    (DEMO_RND,a4),d0
  572.     mq    #0,d1
  573.     lea    (DEMO_Points,a4),a0
  574.     mq    #0,d2
  575.     mq    #0,d3
  576.     mw    (DEMO_HSize,a4),d2
  577.     mw    (DEMO_VSize,a4),d3
  578.     mq    #32-1,d4
  579. ..    add.l    d1,d0
  580.     swap    d0
  581.     add.l    d0,d1
  582.     mq    #0,d5
  583.     mw    d0,d5
  584.     divu.w    d2,d5
  585.     mq    #0,d7
  586.     mw    d1,d7
  587.     divu.w    d3,d7
  588.     swap    d7
  589.     mw    d7,d5
  590.     add.l    d1,d0
  591.     swap    d0
  592.     add.l    d0,d1
  593.     mq    #0,d6
  594.     mw    d0,d6
  595.     divu.w    d2,d6
  596.     mq    #0,d7
  597.     mw    d1,d7
  598.     divu.w    d3,d7
  599.     swap    d7
  600.     mw    d7,d6
  601.     cmp.l    d5,d6
  602.     bge.b    0$
  603.     exg.l    d5,d6
  604. 0$    cmp.w    d5,d6
  605.     bge.b    1$
  606.     eor.w    d5,d6
  607.     eor.w    d6,d5
  608.     eor.w    d5,d6
  609. 1$    ml    d5,(a0)+
  610.     ml    d6,(a0)+
  611.     dbra    d4,..
  612.     ml    d0,(DEMO_RND,a4)
  613.  
  614.     lea    (DEMO_Points,a4),a2
  615.     lea    (DEMO_DrawBox,pc),a5
  616.     bsr.b    .Draw
  617.     lea    (DEMO_EraseBox,pc),a5
  618. .Draw    mq    #16-1,d4
  619. ..    movem.w    (a2)+,d0-d3
  620.     movem.l    d4/a2/a4-a5,-(sp)
  621.     and.w    #%11,d4
  622.     lea    (DEMO_BitMap,a4),a1
  623.     movea.l    (bm_Planes,a1,d4.w*4),a0
  624.     jsr    (a5)
  625.     movem.l    (sp)+,d4/a2/a4-a5
  626.     dbra    d4,..
  627.     rts
  628.  
  629. ;------------------------------------------------------------------------------
  630. DEMO_Pixel
  631.     lea    (PixelColors,pc),a1
  632.     bsr    DEMO_LoadColor
  633.  
  634.     movea.l    (DEMO_PixelWindow,a4),a0
  635.     bsr    DEMO_Resize
  636.  
  637.     ml    #$87654321,(DEMO_RND,a4)
  638.  
  639. .Loop    bsr.b    .Pixel
  640.  
  641.     movea.l    (DEMO_PixelWindow,a4),a0
  642.     bsr    DEMO_Display
  643.     lea    (DEMO_PixelWindow,a4),a0
  644.     bsr    DEMO_HandleWindow
  645.     bne.b    .Loop
  646.     rts
  647.  
  648. .Pixel    ml    (DEMO_RND,a4),d0
  649.     mq    #0,d1
  650.     mq    #0,d5
  651.     mw    (DEMO_HSize,a4),d2
  652.     mulu.w    (DEMO_VSize,a4),d2
  653.     movem.l    (DEMO_BitMap+bm_Planes,a4),a0-a3
  654.     mw    #512-1,d4
  655. ..    add.l    d1,d0
  656.     swap    d0
  657.     add.l    d0,d1
  658.     mw    d0,d5
  659.     divu.w    d2,d5
  660.     sub.w    d5,d5
  661.     swap    d5
  662.     mq    #%11,d3
  663.     and.w    d4,d3
  664.     bfchg    (a0){d5:1}
  665.     mw    d1,d5
  666.     divu.w    d2,d5
  667.     sub.w    d5,d5
  668.     swap    d5
  669.     bfchg    (a1){d5:1}
  670.     add.l    d1,d0
  671.     swap    d0
  672.     add.l    d0,d1
  673.     mw    d0,d5
  674.     divu.w    d2,d5
  675.     sub.w    d5,d5
  676.     swap    d5
  677.     mq    #%11,d3
  678.     and.w    d4,d3
  679.     bfchg    (a2){d5:1}
  680.     mw    d1,d5
  681.     divu.w    d2,d5
  682.     sub.w    d5,d5
  683.     swap    d5
  684.     bfchg    (a3){d5:1}
  685.     dbra    d4,..
  686.  
  687.     ml    d0,(DEMO_RND,a4)
  688.     rts
  689.  
  690. ;------------------------------------------------------------------------------
  691. DEMO_Disc
  692.     lea    (DiscColors,pc),a1
  693.     bsr    DEMO_LoadColor
  694.  
  695.     movea.l    (DEMO_DiscWindow,a4),a0
  696.     bsr    DEMO_Resize
  697.  
  698.     ml    #$87654321,(DEMO_RND,a4)
  699.  
  700. .Loop    bsr.b    .Disc
  701.  
  702.     movea.l    (DEMO_DiscWindow,a4),a0
  703.     bsr    DEMO_Display
  704.     lea    (DEMO_DiscWindow,a4),a0
  705.     bsr    DEMO_HandleWindow
  706.     bne.b    .Loop
  707.     rts
  708.  
  709. .Disc    ml    (DEMO_RND,a4),d0
  710.     mq    #0,d1
  711.     lea    (DEMO_Points,a4),a0
  712.     mq    #0,d2
  713.     mq    #0,d3
  714.     mw    (DEMO_HSize,a4),d2
  715.     mw    (DEMO_VSize,a4),d3
  716.     subq.w    #1,d2
  717.     subq.w    #1,d3
  718.     mw    #32-1,d4
  719. ..    add.l    d1,d0
  720.     swap    d0
  721.     add.l    d0,d1
  722.     mq    #0,d5
  723.     mw    d0,d5
  724.     divu.w    d2,d5
  725.     swap    d5
  726.     mw    d5,(a0)+
  727.     mq    #0,d6
  728.     mw    d1,d6
  729.     divu.w    d3,d6
  730.     swap    d6
  731.     mw    d6,(a0)+
  732.  
  733.     add.l    d1,d0
  734.     swap    d0
  735.     add.l    d0,d1
  736.     mq    #0,d7
  737.     mw    d0,d7
  738.     divu.w    d3,d7
  739.     swap    d7
  740.     cmp.w    d7,d5
  741.     bgt.b    0$
  742.     mw    d5,d7
  743. 0$    add.w    d7,d5
  744.     cmp.w    d5,d2
  745.     bgt.b    1$
  746.     sub.w    d7,d5
  747.     mw    d2,d7
  748.     sub.w    d5,d7
  749. 1$    cmp.w    d7,d6
  750.     bgt.b    2$
  751.     mw    d6,d7
  752. 2$    add.w    d7,d6
  753.     cmp.w    d6,d3
  754.     bgt.b    3$
  755.     sub.w    d7,d6
  756.     mw    d3,d7
  757.     sub.w    d6,d7
  758. 3$    mw    d7,(a0)+
  759.  
  760.     dbra    d4,..
  761.     ml    d0,(DEMO_RND,a4)
  762.  
  763.     lea    (DEMO_Points,a4),a2
  764.     lea    (DEMO_DrawDisc,pc),a3
  765.     bsr.b    .Draw
  766.     lea    (DEMO_EraseDisc,pc),a3
  767. .Draw    mq    #16-1,d3
  768. ..    mw    (a2)+,d0
  769.     mw    (a2)+,d1
  770.     mw    (a2)+,d2
  771.     beq.b    .Next2
  772.     movem.l    d3/a2-a4,-(sp)
  773.     and.w    #%11,d3
  774.     lea    (DEMO_BitMap,a4),a1
  775.     movea.l    (bm_Planes,a1,d3.w*4),a0
  776.     mw    (bm_BytesPerRow,a1),d3
  777.     jsr    (a3)
  778.     movem.l    (sp)+,d3/a2-a4
  779. .Next2    dbra    d3,..
  780.     rts
  781.  
  782. ;------------------------------------------------------------------------------
  783. DEMO_Ring
  784.     lea    (RingColors,pc),a1
  785.     bsr    DEMO_LoadColor
  786.  
  787.     movea.l    (DEMO_RingWindow,a4),a0
  788.     bsr    DEMO_Resize
  789.  
  790.     bsr    DEMO_Map2
  791.  
  792. .Loop    movea.l    (DEMO_RingWindow,a4),a0
  793.     mw    (wd_MouseX,a0),(DEMO_MouseX,a4)
  794.     mw    (wd_MouseY,a0),(DEMO_MouseY,a4)
  795.     bsr.b    .Ring
  796.  
  797.     movea.l    (DEMO_RingWindow,a4),a0
  798.     bsr    DEMO_DisplayChunky
  799.     lea    (DEMO_RingWindow,a4),a0
  800.     bsr    DEMO_HandleWindow
  801.     bne.b    .Loop
  802.     rts
  803.  
  804. .Ring    movea.l    (DEMO_Chunky2,a4),a1
  805.     lea    (DEMO_Maping,a4),a0
  806.     mw    (DEMO_VSize,a4),d1
  807.     subq.w    #1,d1
  808.     mw    (DEMO_MouseY,a4),d3
  809.     lsl.w    #3,d3
  810.     mq    #0,d4
  811.     mq    #0,d2
  812. .YLoop    mw    (DEMO_HSize,a4),d0
  813.     subq.w    #1,d0
  814.     mw    d4,d5
  815.     mw    (DEMO_MouseX,a4),d7
  816.     lsl.w    #3,d7
  817. .XLoop    add.w    d7,d5
  818.     subq.w    #8,d7
  819.     mw    d5,d2
  820.     lsr.w    #8,d2
  821.     mb    (a0,d2.w),(a1)+
  822.     dbra    d0,.XLoop
  823.     add.w    d3,d4
  824.     subq.w    #8,d3
  825.     dbra    d1,.YLoop
  826.     rts
  827.  
  828. ;------------------------------------------------------------------------------
  829. DEMO_Zoom
  830.     lea    (ZoomColors,pc),a1
  831.     bsr    DEMO_LoadColor
  832.  
  833.     movea.l    (DEMO_ZoomWindow,a4),a0
  834.     bsr    DEMO_Resize
  835.  
  836.     bsr    DEMO_Map2
  837.  
  838. .Loop    movea.l    (DEMO_ZoomWindow,a4),a0
  839.     mw    (wd_MouseX,a0),(DEMO_MouseX,a4)
  840.     mw    (wd_MouseY,a0),(DEMO_MouseY,a4)
  841.     bsr.b    .Zoom
  842.  
  843.     movea.l    (DEMO_ZoomWindow,a4),a0
  844.     bsr    DEMO_DisplayChunky
  845.     lea    (DEMO_ZoomWindow,a4),a0
  846.     bsr    DEMO_HandleWindow
  847.     bne.b    .Loop
  848.     rts
  849.  
  850. .Zoom    movea.l    (DEMO_Chunky2,a4),a0
  851.     lea    (DEMO_Maping,a4),a1
  852.     add.l    (DEMO_Dist,a4),a2
  853.     add.l    #$1000,(DEMO_Dist,a4)
  854.     mq    #0,d0
  855.     mq    #0,d3
  856.     mq    #0,d4
  857.     mw    (DEMO_VSize,a4),d1
  858.     subq.w    #1,d1
  859. .YLoop    mw    (DEMO_HSize,a4),d0
  860.     subq.w    #1,d0
  861.     ml    d4,d5
  862.     mq    #0,d7
  863. .XLoop    add.l    d7,d5
  864.     add.l    a2,d7
  865.     ml    d5,d2
  866.     sub.w    d2,d2
  867.     rol.l    #8,d2
  868.     mb    (a1,d2.w),(a0)+
  869.     dbra    d0,.XLoop
  870.     add.l    d3,d4
  871.     add.l    a2,d3
  872.     dbra    d1,.YLoop
  873.     rts
  874.  
  875. ;------------------------------------------------------------------------------
  876. DEMO_Weird
  877.     lea    (WeirdColors,pc),a1
  878.     bsr    DEMO_LoadColor
  879.  
  880.     movea.l    (DEMO_WeirdWindow,a4),a0
  881.     bsr    DEMO_Resize
  882.  
  883.     bsr    DEMO_Map2
  884.  
  885. .Loop    movea.l    (DEMO_WeirdWindow,a4),a0
  886.     mw    (wd_MouseX,a0),(DEMO_MouseX,a4)
  887.     mw    (wd_MouseY,a0),(DEMO_MouseY,a4)
  888.     bsr.b    .Weird
  889.  
  890.     movea.l    (DEMO_WeirdWindow,a4),a0
  891.     bsr    DEMO_DisplayChunky
  892.     lea    (DEMO_WeirdWindow,a4),a0
  893.     bsr    DEMO_HandleWindow
  894.     bne.b    .Loop
  895.     rts
  896.  
  897. .Weird    movea.l    (DEMO_Chunky2,a4),a0
  898.     lea    (DEMO_Maping,a4),a1
  899.     ml    #$10000,(DEMO_HScroll,a4)
  900.     mq    #0,d0
  901.     mq    #0,d1
  902.     mq    #0,d2
  903.     mq    #0,d3
  904.     mw    (DEMO_MouseY,a4),d0
  905.     mw    (DEMO_VSize,a4),d2
  906.     subq.w    #1,d2
  907.     ml    d0,d4
  908. .YLoop    swap    d4
  909.     add.l    (DEMO_HScroll,a4),d4
  910.     swap    d4
  911.     ml    d2,d0
  912.     mw    (DEMO_HSize,a4),d1
  913.     subq.w    #1,d1
  914.     lsl.l    #8,d2
  915. .XLoop    mw    d0,d6
  916.     and.w    d2,d6
  917.     lsr.w    #4,d6
  918.     and.w    #$f0,d6
  919.     add.w    d4,d0
  920.     sub.w    d1,d0
  921.     mb    (a1,d6.w),(a0)+
  922.     dbra    d1,.XLoop
  923.     lsr.l    #8,d2
  924.     dbra    d2,.YLoop
  925.     rts
  926.  
  927. ;------------------------------------------------------------------------------
  928. DEMO_Fire
  929.     lea    (FireColors,pc),a1
  930.     bsr    DEMO_LoadColor
  931.  
  932.     movea.l    (DEMO_FireWindow,a4),a0
  933.     bsr    DEMO_Resize
  934.  
  935.     bsr    DEMO_Map1
  936.  
  937.     ml    #$f0f0f0f0,(DEMO_RND,a4)
  938.  
  939. .Loop    bsr.b    .Fire
  940.  
  941.     movea.l    (DEMO_FireWindow,a4),a0
  942.     bsr    DEMO_DisplayChunky
  943.     lea    (DEMO_FireWindow,a4),a0
  944.     bsr    DEMO_HandleWindow
  945.     bne.b    .Loop
  946. .Rts    rts
  947.  
  948. .Fire    mw    (DEMO_VSize,a4),d0
  949.     subq.w    #2,d0
  950.     mulu.w    (DEMO_HSize,a4),d0
  951.     lea    ([DEMO_Chunky1,a4],d0.l),a0
  952.     mw    (DEMO_HSize,a4),d2
  953.     lsr.w    #2,d2
  954.     subq.w    #1,d2
  955.     ml    (DEMO_RND,a4),d0
  956.     mq    #0,d1
  957. ..    add.l    d1,d0
  958.     swap    d0
  959.     add.l    d0,d1
  960.     ml    d0,(a0)+
  961.     dbra    d2,..
  962.     ml    d0,(DEMO_RND,a4)
  963.  
  964.     mw    (DEMO_HSize,a4),d0
  965.     lea    ([DEMO_Chunky1,a4],d0.w),a0
  966.     lea    (a0,d0.w),a1
  967.     lea    (DEMO_Maping,a4),a2
  968.     movea.l    (DEMO_Chunky2,a4),a3
  969.     mw    (DEMO_VSize,a4),d3
  970.     subq.w    #3,d3
  971.     mq    #3,d4
  972.     mq    #0,d0
  973.     mb    (a2),d5
  974. .YLoop    mw    (DEMO_HSize,a4),d2
  975.     subq.w    #1,d2
  976. .XLoop    mb    (a1)+,d0
  977.     add.b    (a0),d0
  978.     roxr.b    #1,d0
  979.     sub.b    d4,d0
  980.     bcs.b    0$
  981.     mb    d0,(a0)+
  982.     mb    (a2,d0.w),(a3)+
  983.     dbra    d2,.XLoop
  984.     dbra    d3,.YLoop
  985.     rts
  986. 0$    mb    d4,(a0)+
  987.     mb    d5,(a3)+
  988.     dbra    d2,.XLoop
  989.     dbra    d3,.YLoop
  990.     rts
  991.  
  992. ;------------------------------------------------------------------------------
  993. DEMO_Map1
  994.     lea    (DEMO_Maping+256,a4),a0
  995.     mw    #(256)-1,d0
  996. ..    mb    d0,d1
  997.     and.b    #$f0,d1
  998.     mb    d1,-(a0)
  999.     dbra    d0,..
  1000.     rts
  1001.  
  1002. DEMO_Map2
  1003.     lea    (DEMO_Maping+256,a4),a0
  1004.     mw    #(256/2)-1,d0
  1005.     mq    #0,d1
  1006. ..    mb    d1,d2
  1007.     and.b    #$f0,d2
  1008.     mb    d2,-(a0)
  1009.     addq.b    #2,d1
  1010.     dbra    d0,..
  1011.     mw    #(256/2)-1,d0
  1012. ..    subq.b    #2,d1
  1013.     mb    d1,d2
  1014.     and.b    #$f0,d2
  1015.     mb    d2,-(a0)
  1016.     dbra    d0,..
  1017.     rts
  1018.  
  1019. ;------------------------------------------------------------------------------
  1020. DEMO_HandleWindow
  1021.     pea    (a0)
  1022.     movea.l    (DEMO_GBase,a4),a6
  1023.     jsr    (_LVOWaitTOF,a6)
  1024. .Next    movea.l    (sp),a0
  1025.     bsr    DEMO_GetWindowInput
  1026.     movea.l    (sp),a0
  1027.     cmp.l    #IDCMP_INACTIVEWINDOW,d0
  1028.     beq.b    .Fail
  1029.     cmp.l    #IDCMP_NEWSIZE,d0
  1030.     bne.b    .Close
  1031.     movea.l    (a0),a0
  1032.     bsr    DEMO_Resize
  1033.     bra    .True
  1034. .Close    cmp.l    #IDCMP_CLOSEWINDOW,d0
  1035.     bne    .True
  1036.     bsr    DEMO_FreeWindow
  1037. .Fail    movea.l    (sp)+,a0
  1038.     mq    #FALSE,d0
  1039.     rts
  1040. .True    movea.l    (sp)+,a0
  1041.     mq    #TRUE,d0
  1042.     rts
  1043.  
  1044. ;------------------------------------------------------------------------------
  1045. DEMO_Resize
  1046.     pea    (a0)
  1047.     bsr    DEMO_FreeBuffer
  1048.     movea.l    (sp)+,a0
  1049.     mb    (wd_BorderLeft,a0),d0
  1050.     add.b    (wd_BorderRight,a0),d0
  1051.     ext.w    d0
  1052.     neg.w    d0
  1053.     add.w    (wd_Width,a0),d0
  1054.     add.w    #31,d0
  1055.     and.w    #-32,d0
  1056.     mw    d0,(DEMO_HSize,a4)
  1057.     mb    (wd_BorderTop,a0),d0
  1058.     add.b    (wd_BorderBottom,a0),d0
  1059.     ext.w    d0
  1060.     neg.w    d0
  1061.     add.w    (wd_Height,a0),d0
  1062.     mw    d0,(DEMO_VSize,a4)
  1063.     pea    (a0)
  1064.     bsr    DEMO_AllocBuffer
  1065.     movea.l    (sp)+,a0
  1066.     beq    DEMO_Quit
  1067.  
  1068.     mq    #0,d0
  1069.     mq    #0,d1
  1070.     mq    #0,d2
  1071.     mq    #0,d3
  1072.     mb    (wd_BorderLeft,a0),d0
  1073.     mb    (wd_BorderTop,a0),d1
  1074.     mb    (wd_BorderRight,a0),d2
  1075.     mb    (wd_BorderBottom,a0),d3
  1076.     not.w    d2
  1077.     not.w    d3
  1078.     add.w    (wd_Width,a0),d2
  1079.     add.w    (wd_Height,a0),d3
  1080.     movea.l    (wd_RPort,a0),a1
  1081.     mb    (rp_Mask,a1),d4
  1082.     mb    #%10000,(rp_Mask,a1)
  1083.     movea.l    (DEMO_GBase,a4),a6
  1084.     movem.l    d4/a1,-(sp)
  1085.     jsr    (_LVORectFill,a6)
  1086.     movem.l    (sp)+,d4/a1
  1087.     mb    d4,(rp_Mask,a1)
  1088.     rts
  1089.  
  1090. ;------------------------------------------------------------------------------
  1091. DEMO_DisplayChunky
  1092.     movem.l    a0/a4,-(sp)
  1093.     movea.l    (DEMO_Chunky2,a4),a0
  1094.     mw    (DEMO_HSize,a4),d0
  1095.     mulu.w    (DEMO_VSize,a4),d0
  1096.     lea    (a0,d0.l),a5
  1097.     movem.l    (DEMO_BitMap+bm_Planes,a4),a1-a4
  1098.     bsr    C8TOP4
  1099.     movem.l    (sp)+,a0/a4
  1100.  
  1101. DEMO_Display
  1102.     mq    #0,d0
  1103.     mq    #0,d1
  1104.     mq    #0,d2
  1105.     mq    #0,d3
  1106.     mb    (wd_BorderLeft,a0),d2
  1107.     mb    (wd_BorderTop,a0),d3
  1108.     ml    d2,d4
  1109.     mq    #0,d5
  1110.     add.b    (wd_BorderRight,a0),d4
  1111.     neg.w    d4
  1112.     add.w    (wd_Width,a0),d4
  1113.     mw    (DEMO_VSize,a4),d5
  1114.     mw    #$c0,d6
  1115.     movea.l    (wd_RPort,a0),a1
  1116.     lea    (DEMO_BitMap,a4),a0
  1117.     movea.l    (DEMO_GBase,a4),a6
  1118.     jmp    (_LVOBltBitMapRastPort,a6)
  1119.  
  1120. ;------------------------------------------------------------------------------
  1121. ; INPUT:    A0.l = Source chunky buffer START
  1122. ;        A1.l = Pointer to Planes0
  1123. ;        A2.l = Pointer to Planes1
  1124. ;        A3.l = Pointer to Planes2
  1125. ;        A4.l = Pointer to Planes3
  1126. ;        a5.l = Source chunky buffer END
  1127. ;
  1128. ; OUTPUT:    A0.l = Pointer to chunky buffer + 32*4
  1129. ;        A1.l = Pointer to Planes0 + 4
  1130. ;        A2.l = Pointer to Planes1 + 4
  1131. ;        A3.l = Pointer to Planes2 + 4
  1132. ;        A4.l = Pointer to Planes3 + 4
  1133. ;
  1134. C8TOP4
  1135. ..    ml    (a0)+,d4
  1136.     ml    (a0)+,d0
  1137.     lsr.l    #4,d0
  1138.     add.l    d0,d4
  1139.     ml    (a0)+,d5
  1140.     ml    (a0)+,d0
  1141.     lsr.l    #4,d0
  1142.     add.l    d0,d5
  1143.     ml    (a0)+,d6
  1144.     ml    (a0)+,d0
  1145.     lsr.l    #4,d0
  1146.     add.l    d0,d6
  1147.     ml    (a0)+,d7
  1148.     ml    (a0)+,d0
  1149.     lsr.l    #4,d0
  1150.     add.l    d0,d7
  1151.     ml    d4,d0
  1152.     ml    d5,d1
  1153.     swap    d0
  1154.     swap    d1
  1155.     mw    d6,d0
  1156.     mw    d7,d1
  1157.     swap    d6
  1158.     swap    d7
  1159.     mw    d6,d4
  1160.     mw    d7,d5
  1161.     ml    #$00FF00FF,d7
  1162.     ml    d7,d6
  1163.     ml    d7,d2
  1164.     ml    d7,d3
  1165.     and.l    d0,d7
  1166.     and.l    d1,d2
  1167.     and.l    d4,d6
  1168.     and.l    d5,d3
  1169.     sub.l    d7,d0
  1170.     sub.l    d2,d1
  1171.     sub.l    d6,d4
  1172.     sub.l    d3,d5
  1173.     lsl.l    #8,d7
  1174.     lsr.l    #8,d1
  1175.     lsl.l    #8,d6
  1176.     lsr.l    #8,d5
  1177.     add.l    d2,d7
  1178.     add.l    d1,d0
  1179.     add.l    d3,d6
  1180.     add.l    d5,d4
  1181.     ml    #$CCCCCCCC,d5
  1182.     ml    d5,d1
  1183.     ml    d5,d2
  1184.     ml    d5,d3
  1185.     and.l    d4,d5
  1186.     and.l    d0,d1
  1187.     and.l    d6,d2
  1188.     and.l    d7,d3
  1189.     sub.l    d5,d4
  1190.     sub.l    d1,d0
  1191.     sub.l    d2,d6
  1192.     sub.l    d3,d7
  1193.     lsl.l    #2,d4
  1194.     lsr.l    #2,d1
  1195.     lsl.l    #2,d6
  1196.     lsr.l    #2,d3
  1197.     add.l    d0,d4
  1198.     add.l    d1,d5
  1199.     add.l    d7,d6
  1200.     add.l    d3,d2
  1201.     ml    #$AAAAAAAA,d1
  1202.     ml    d1,d3
  1203.     ml    d1,d0
  1204.     ml    d1,d7
  1205.     and.l    d5,d1
  1206.     and.l    d2,d3
  1207.     sub.l    d1,d5
  1208.     sub.l    d3,d2
  1209.     lsr.l    #1,d3
  1210.     add.l    d1,d3
  1211.     ml    d3,(a4)+
  1212.     add.l    d5,d5
  1213.     add.l    d2,d5
  1214.     and.l    d4,d0
  1215.     sub.l    d0,d4
  1216.     ml    d5,(a3)+
  1217.     and.l    d6,d7
  1218.     sub.l    d7,d6
  1219.     lsr.l    #1,d7
  1220.     add.l    d7,d0
  1221.     ml    d0,(a2)+
  1222.     add.l    d4,d4
  1223.     add.l    d4,d6
  1224.     ml    d6,(a1)+
  1225.     cmp.l    a0,a5
  1226.     bne.b    ..
  1227.     rts
  1228.  
  1229. ;------------------------------------------------------------------------------
  1230. ; FUNCTION:    Draw a 1 bitplane triangle
  1231. ;
  1232. ; INPUT:    D0.l = TP Top 2d Point? (x/y)
  1233. ;        D1.l = MP Middle 2d Point? (x/y)
  1234. ;        D2.l = BP Bottom 2d Point? (x/y)
  1235. ;        A0.l = Destination bitplane
  1236. ;        A1.l = bm_ Bitmap
  1237. ;
  1238. DEMO_DrawTriangle:
  1239.     cmp.w    d0,d1
  1240.     bgt.b    0$
  1241.     beq    .Single1            ;Special case: Only 2 slope /\ or \/
  1242.     exg    d0,d1
  1243. 0$    cmp.w    d1,d2
  1244.     bgt.b    .Double
  1245.     beq    .Single2            ;Special case: Only 2 slope /\
  1246.     exg    d1,d2
  1247. 1$    cmp.w    d0,d1
  1248.     bgt.b    .Double
  1249.     beq    .Single3            ;Special case: Only 2 slope \/
  1250.     exg    d0,d1
  1251. .Double    ml    d0,d5                ;d0.l = TP, d1.l = MP, d2.l = BP <\ or />
  1252.     clr.w    d5                ;TPX
  1253.     ml    d1,d7
  1254.     clr.w    d7                ;MPX
  1255.     ml    d2,d6
  1256.     clr.w    d6                ;BPX
  1257.     ml    d5,d3
  1258.     sub.l    d6,d3
  1259.     mw    d0,d4
  1260.     sub.w    d2,d4
  1261.     ext.l    d4
  1262.     divs.l    d4,d3                ;D3.l = Slope TP-BP
  1263.     ml    d7,d4
  1264.     sub.l    d6,d4
  1265.     mw    d1,d6
  1266.     sub.w    d2,d6
  1267.     ext.l    d6
  1268.     divs.l    d6,d4                ;D4.l = Slope MP-BP
  1269.     movea.l    d4,a4
  1270.     ml    d5,d4
  1271.     sub.l    d7,d4
  1272.     mw    d0,d7                ;d7.l = YPos
  1273.     sub.w    d1,d0
  1274.     ext.l    d0
  1275.     divs.l    d0,d4                ;D4.l = Slope TP-MP
  1276.     swap    d6
  1277.     mw    d0,d6
  1278.     ml    d6,d0
  1279.     not.l    d0                ;d0.l:0.l:= (BYSize-1):(TYSize-1)
  1280.     mulu.w    (bm_BytesPerRow,a1),d7
  1281.     adda.l    d7,a0
  1282.     movea.w    (bm_BytesPerRow,a1),a1
  1283.     clr.w    d1
  1284.     mq    #32,d2
  1285.     ml    d3,-(sp)
  1286.     movea.l    d5,a6                ; X2Pos
  1287.     cmp.l    d3,d4
  1288.     bge.b    .D
  1289.     exg    d3,d4
  1290.     movea.l    d4,a2
  1291.     jsr    (a5)
  1292.     ml    d1,d5                ;New X1    (Middle point)
  1293.     swap    d0
  1294.     ml    a4,d3
  1295.     movea.l    (sp)+,a2
  1296.     jmp    (a5)
  1297. .D    movea.l    d4,a2
  1298.     jsr    (a5)
  1299.     movea.l    d1,a6                ;New X2    (Middle point)
  1300.     swap    d0
  1301.     ml    (sp)+,d3
  1302.     movea.l    a4,a2
  1303.     jmp    (a5)
  1304.  
  1305. .Single3
  1306.     ml    d0,d5                ;d0.l = TP, d1.l = MP, d2.l = BP
  1307.     clr.w    d5                ;d5.l = X1Pos
  1308.     ml    d5,d3
  1309.     ml    d2,d6
  1310.     clr.w    d6
  1311.     sub.l    d6,d3
  1312.     mw    d0,d7                ;d7.l = YPos
  1313.     sub.w    d2,d0
  1314.     ext.l    d0
  1315.     divs.l    d0,d3                ;D3.l = Slope TP-BP
  1316.     ml    d1,d0
  1317.     clr.w    d0
  1318.     movea.l    d0,a6                ;d7.l = X2Pos
  1319.     sub.l    d6,d0
  1320.     sub.w    d2,d1
  1321.     ext.l    d1
  1322.     divs.l    d1,d0
  1323.     movea.l    d0,a2                ;A2.l = Slope MP-BP
  1324.     not.w    d1
  1325.     mw    d1,d0
  1326.     mulu.w    (bm_BytesPerRow,a1),d7
  1327.     adda.l    d7,a0
  1328.     movea.w    (bm_BytesPerRow,a1),a1
  1329.     cmpa.l    d5,a6
  1330.     bge.b    .S3
  1331.     exg    d5,a6
  1332.     exg    d3,a2
  1333. .S3    mq    #32,d2
  1334.     jmp    (a5)
  1335. .Exit    rts
  1336.  
  1337. .Single1                    ;d0=d1
  1338.     cmp.w    d0,d2
  1339.     bgt.b    .Single3
  1340.     beq.b    .Exit
  1341.     exg    d0,d2
  1342. .Single2
  1343.     ml    d0,d5                ;d0.l = TP, d1.l = MP, d2.l = BP
  1344.     clr.w    d5                ;d5.l = X1Pos
  1345.     ml    d5,d3
  1346.     ml    d2,d6
  1347.     clr.w    d6
  1348.     sub.l    d6,d3
  1349.     mw    d0,d7
  1350.     sub.w    d2,d7
  1351.     ext.l    d7
  1352.     divs.l    d7,d3                ;D3.l = Slope TP-BP
  1353.     ml    d1,d7
  1354.     clr.w    d7
  1355.     ml    d5,d4
  1356.     sub.l    d7,d4
  1357.     mw    d0,d7                ;d7.l = YPos
  1358.     sub.w    d2,d0
  1359.     ext.l    d0
  1360.     divs.l    d0,d4                ;D4.l = Slope TP-MP
  1361.     movea.l    d5,a6                ;d7.l = X2Pos
  1362.     not.w    d0
  1363.     mulu.w    (bm_BytesPerRow,a1),d7
  1364.     adda.l    d7,a0
  1365.     movea.w    (bm_BytesPerRow,a1),a1
  1366.     cmp.l    d3,d4
  1367.     bge.b    .S1
  1368.     exg    d3,d4
  1369. .S1    movea.l    d4,a2
  1370.     mq    #32,d2
  1371.     jmp    (a5)
  1372.  
  1373. DEMO_DrawTriangleDraw
  1374. .Loop    ml    d5,d6
  1375.     ml    a6,d7
  1376.     clr.w    d6
  1377.     swap    d6
  1378.     swap    d7
  1379.     sub.w    d6,d7
  1380.     ble.b    32$
  1381.     sub.w    d2,d7
  1382.     bgt.b    .Full
  1383.     bfset    (a0){d6:d7}
  1384. 32$    add.l    d3,d5
  1385.     adda.l    a2,a6
  1386.     adda.l    a1,a0
  1387.     dbra    d0,.Loop
  1388.     rts
  1389. .Full    mq    #%11111,d4            ;Get The 32 multiple
  1390.     and.w    d6,d4
  1391.     neg.w    d4
  1392.     bfset    (a0){d6:d4}            ;Left mask
  1393.     lsr.w    #5,d6
  1394.     lea    (4.b,a0,d6.w*4),a3        ;Start pos in plane
  1395.     add.w    d2,d4
  1396.     sub.w    d4,d7                ;Sub to lengh what we just wrote
  1397.     blt.b    .Right
  1398.     mq    #-1,d6
  1399. ..    ml    d6,(a3)+            ;Middle
  1400.     sub.w    d2,d7
  1401.     bge.b    ..
  1402.     add.w    d2,d7
  1403.     beq.b    32$
  1404. .Right    bfset    (a3){0:d7}
  1405.     add.l    d3,d5
  1406.     adda.l    a2,a6
  1407.     adda.l    a1,a0
  1408.     dbra    d0,.Loop
  1409.     rts
  1410.  
  1411. DEMO_DrawTriangleErase
  1412. .Loop    ml    d5,d6
  1413.     ml    a6,d7
  1414.     clr.w    d6
  1415.     swap    d6
  1416.     swap    d7
  1417.     sub.w    d6,d7
  1418.     ble.b    32$
  1419.     sub.w    d2,d7
  1420.     bgt.b    .Full
  1421.     bfclr    (a0){d6:d7}
  1422. 32$    add.l    d3,d5
  1423.     adda.l    a2,a6
  1424.     adda.l    a1,a0
  1425.     dbra    d0,.Loop
  1426.     rts
  1427. .Full    mq    #%11111,d4            ;Get The 32 multiple
  1428.     and.w    d6,d4
  1429.     neg.w    d4
  1430.     bfclr    (a0){d6:d4}            ;Left mask
  1431.     lsr.w    #5,d6
  1432.     lea    (4.b,a0,d6.w*4),a3        ;Start pos in plane
  1433.     add.w    d2,d4
  1434.     sub.w    d4,d7                ;Sub to lengh what we just wrote
  1435.     blt.b    .Right
  1436.     mq    #0,d6
  1437. ..    ml    d6,(a3)+            ;Middle
  1438.     sub.w    d2,d7
  1439.     bge.b    ..
  1440.     add.w    d2,d7
  1441.     beq.b    32$
  1442. .Right    bfclr    (a3){0:d7}
  1443.     add.l    d3,d5
  1444.     adda.l    a2,a6
  1445.     adda.l    a1,a0
  1446.     dbra    d0,.Loop
  1447.     rts
  1448.  
  1449. ;------------------------------------------------------------------------------
  1450. ; FUNCTION:    
  1451. ;
  1452. ; INPUT:    D0.w = XPos
  1453. ;        D1.w = YPos
  1454. ;        D2.w = Radius
  1455. ;        D3.w = XSize
  1456. ;
  1457. ; OUTPUT:    NONE
  1458. ;
  1459. DEMO_DrawDisc:
  1460.     movea.w    d3,a5
  1461.     ext.l    d2
  1462.     mq    #1,d5
  1463.     sub.l    d2,d5                ;d=1-radius
  1464.     movea.l    #3,a6                ;DeltaE=3
  1465.     mq    #-2,d7
  1466.     muls.w    d2,d7
  1467.     addq.l    #5,d7                ;DeltaSE=-2*radius+5
  1468.     movea.l    d7,a4
  1469.     mw    d2,d4
  1470.     mulu.w    d3,d1
  1471.     mulu.w    d3,d4
  1472.     mw    d0,d3
  1473.     swap    d0
  1474.     mw    d3,d0
  1475.     swap    d0    
  1476.     mw    d1,d3                ;D1 = YPos
  1477.     swap    d3
  1478.     mw    d1,d3                ;D3 = YPos/YPos
  1479.     swap    d1
  1480.     mw    d3,d1                ;D1 = YPos/YPos
  1481.     sub.w    d4,d1
  1482.     add.w    d4,d3
  1483.     swap    d1
  1484.     swap    d3
  1485.     sub.w    d2,d0
  1486.     add.w    d2,d2
  1487.     suba.l    a2,a2
  1488. .Loop                        ;d0,d1=XYPos,d2/d3=Radius,D4=Color,d5=D
  1489.     bsr.b    .HLine
  1490.     sub.w    a5,d1
  1491.     add.w    a5,d3
  1492.     cmp.w    a2,d2
  1493.     ble.b    .Done
  1494.     addq.l    #2,a2
  1495.     tst.l    d5
  1496.     bpl.b    .SE
  1497. .E    add.l    a6,d5                ;d=d+deltaE
  1498.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1499.     addq.l    #2,a4                ;DeltaSE=DeltaSE+2
  1500.     sub.l    #$10000,d0            ;XPos
  1501.     add.l    #$20000,d2            ;XSize
  1502.     bra.b    .Loop
  1503. .Done    rts
  1504.  
  1505. .SE    add.l    a4,d5                ;d=d+deltaSE
  1506.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1507.     addq.l    #4,a4                ;DeltaSE=DeltaSE+4
  1508.     addq.w    #1,d0                ;XPos
  1509.     subq.w    #2,d2                ;XSize
  1510.     swap    d0
  1511.     swap    d1
  1512.     swap    d2
  1513.     swap    d3
  1514.     bsr.b    .HLine
  1515.     add.w    a5,d1
  1516.     sub.w    a5,d3
  1517.     subq.w    #1,d0                ;XPos
  1518.     addq.w    #2,d2                ;XSize
  1519.     swap    d0
  1520.     swap    d1
  1521.     swap    d2
  1522.     swap    d3
  1523.     bra.b    .Loop
  1524.  
  1525. .HLine    ml    d0,-(sp)
  1526.     ml    d2,-(sp)
  1527.     add.w    d0,d2
  1528.     lea    (a0,d1.w),a1
  1529.     lea    (a0,d3.w),a3
  1530.     mq    #%11111,d6            ;Get The 32 multiple
  1531.     and.w    d0,d6                ;Mask Left
  1532.     sub.w    d6,d0                ;XSize minus Left Mask
  1533.     mq    #%11111,d7            ;Get The 32 multiple
  1534.     and.w    d2,d7                ;Mask Right
  1535.     sub.w    d7,d2                ;XSize minus Left Mask
  1536.     sub.w    d0,d2                ;Get Copysize
  1537.     ble.b    .Quick                ;(Interchange on triangle type demand)
  1538. .Full    lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1539.     adda.w    d0,a1
  1540.     adda.w    d0,a3
  1541.     mq    #32,d0
  1542.     sub.w    d6,d0
  1543.     bfset    (a1){d6:d0}
  1544.     addq.l    #4,a1
  1545.     lsr.w    #5,d2                ;XSize in Byte Multyple of 32 pix
  1546.     bfset    (a3){d6:d0}
  1547.     addq.l    #4,a3
  1548.     subq.w    #2,d2
  1549.     bmi.b    .Right
  1550.     mq    #-1,d0
  1551. ..9    ml    d0,(a1)+            ;Middle
  1552.     ml    d0,(a3)+            ;Middle
  1553.     dbra    d2,..9
  1554. .Right    mq    #0,d0
  1555.     mq    #0,d6
  1556. .Quick    sub.w    d6,d7
  1557.     beq.b    32$
  1558.     lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1559.     bfset    (a1,d0.w){d6:d7}
  1560.     bfset    (a3,d0.w){d6:d7}
  1561. 32$    ml    (sp)+,d2
  1562.     ml    (sp)+,d0
  1563.     rts
  1564.  
  1565.  
  1566. ;------------------------------------------------------------------------------
  1567. ; FUNCTION:    
  1568. ;
  1569. ; INPUT:    D0.w = XPos
  1570. ;        D1.w = YPos
  1571. ;        D2.w = Radius
  1572. ;        D3.w = XSize
  1573. ;
  1574. ; OUTPUT:    NONE
  1575. ;
  1576. DEMO_EraseDisc:
  1577.     movea.w    d3,a5
  1578.  
  1579.     ext.l    d2
  1580.     mq    #1,d5
  1581.     sub.l    d2,d5                ;d=1-radius
  1582.     movea.l    #3,a6                ;DeltaE=3
  1583.     mq    #-2,d7
  1584.     muls.w    d2,d7
  1585.     addq.l    #5,d7                ;DeltaSE=-2*radius+5
  1586.  
  1587.     movea.l    d7,a4
  1588.     mw    d2,d4
  1589.     mulu.w    d3,d1
  1590.     mulu.w    d3,d4
  1591.  
  1592.     mw    d0,d3
  1593.     swap    d0
  1594.     mw    d3,d0
  1595.     swap    d0    
  1596.  
  1597.     mw    d1,d3                ;D1 = YPos
  1598.     swap    d3
  1599.     mw    d1,d3                ;D3 = YPos/YPos
  1600.     swap    d1
  1601.     mw    d3,d1                ;D1 = YPos/YPos
  1602.     sub.w    d4,d1
  1603.     add.w    d4,d3
  1604.     swap    d1
  1605.     swap    d3
  1606.     sub.w    d2,d0
  1607.     add.w    d2,d2
  1608.     suba.l    a2,a2
  1609. .Loop                        ;d0,d1=XYPos,d2/d3=Radius,D4=Color,d5=D
  1610.     bsr.b    .HLine
  1611.     sub.w    a5,d1
  1612.     add.w    a5,d3
  1613.  
  1614.     cmp.w    a2,d2
  1615.     ble.b    .Done
  1616.     addq.l    #2,a2
  1617.  
  1618.     tst.l    d5
  1619.     bpl.b    .SE
  1620. .E    add.l    a6,d5                ;d=d+deltaE
  1621.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1622.     addq.l    #2,a4                ;DeltaSE=DeltaSE+2
  1623.     sub.l    #$10000,d0            ;XPos
  1624.     add.l    #$20000,d2            ;XSize
  1625.     bra.b    .Loop
  1626. .Done    rts
  1627.  
  1628. .SE    add.l    a4,d5                ;d=d+deltaSE
  1629.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1630.     addq.l    #4,a4                ;DeltaSE=DeltaSE+4
  1631.     addq.w    #1,d0                ;XPos
  1632.     subq.w    #2,d2                ;XSize
  1633.     swap    d0
  1634.     swap    d1
  1635.     swap    d2
  1636.     swap    d3
  1637.     bsr.b    .HLine
  1638.     add.w    a5,d1
  1639.     sub.w    a5,d3
  1640.     subq.w    #1,d0                ;XPos
  1641.     addq.w    #2,d2                ;XSize
  1642.     swap    d0
  1643.     swap    d1
  1644.     swap    d2
  1645.     swap    d3
  1646.     bra.b    .Loop
  1647.  
  1648. .HLine    ml    d0,-(sp)
  1649.     ml    d2,-(sp)
  1650.     add.w    d0,d2
  1651.     lea    (a0,d1.w),a1
  1652.     lea    (a0,d3.w),a3
  1653.     mq    #%11111,d6            ;Get The 32 multiple
  1654.     and.w    d0,d6                ;Mask Left
  1655.     sub.w    d6,d0                ;XSize minus Left Mask
  1656.     mq    #%11111,d7            ;Get The 32 multiple
  1657.     and.w    d2,d7                ;Mask Right
  1658.     sub.w    d7,d2                ;XSize minus Left Mask
  1659.     sub.w    d0,d2                ;Get Copysize
  1660.     ble.b    .Quick                ;(Interchange on triangle type demand)
  1661. .Full    lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1662.     adda.w    d0,a1
  1663.     adda.w    d0,a3
  1664.     mq    #32,d0
  1665.     sub.w    d6,d0
  1666.     bfclr    (a1){d6:d0}
  1667.     addq.l    #4,a1
  1668.     lsr.w    #5,d2                ;XSize in Byte Multyple of 32 pix
  1669.     bfclr    (a3){d6:d0}
  1670.     addq.l    #4,a3
  1671.     subq.w    #2,d2
  1672.     bmi.b    .Right
  1673.     mq    #0,d0
  1674. ..9    ml    d0,(a1)+            ;Middle
  1675.     ml    d0,(a3)+            ;Middle
  1676.     dbra    d2,..9
  1677. .Right    mq    #0,d0
  1678.     mq    #0,d6
  1679. .Quick    sub.w    d6,d7
  1680.     beq.b    32$
  1681.     lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1682.     bfclr    (a1,d0.w){d6:d7}
  1683.     bfclr    (a3,d0.w){d6:d7}
  1684. 32$    ml    (sp)+,d2
  1685.     ml    (sp)+,d0
  1686.     rts
  1687.  
  1688. ;------------------------------------------------------------------------------
  1689. ; INPUT:    a1 = rp_Bitmap
  1690. ;        d0 = XPos
  1691. ;        d1 = YPos
  1692. ;        d2 = XSize
  1693. ;        d3 = YSize
  1694. ;
  1695. DEMO_DrawBox
  1696.     sub.w    d1,d3
  1697.     subq.w    #1,d3                ;Could test for zero size...
  1698.     bmi.b    .Exit
  1699.     add.w    d0,d2                ;Create x2
  1700.  
  1701.     lea    BMask(pc),a6
  1702.  
  1703.     mq    #%11111,d5
  1704.     and.w    d0,d5                ;Mask Left
  1705.     sub.w    d5,d0
  1706.     lsr.w    #3,d0                ;XPos in Byte Multyple of 32 pixels
  1707.     mq    #%11111,d6
  1708.     and.w    d2,d6                ;Mask Right
  1709.     sub.w    d6,d2                ;XSize minus Left Mask
  1710.     lsr.w    #3,d2
  1711.  
  1712.     mw    (bm_BytesPerRow,a1),d4
  1713.     mulu.w    d4,d1
  1714.     ext.l    d0
  1715.     add.l    d0,d1
  1716.     adda.l    d1,a0
  1717.  
  1718.     sub.w    d0,d2                ;Width of middle copy
  1719.     bne.b    .Full                ;Not Quick
  1720.     ml    (a6,d6.w*4),d1
  1721.     not.l    d1
  1722.     and.l    (a6,d5.w*4),d1
  1723.     movea.l    d4,a5
  1724. ..    or.l    d1,(a0)
  1725.     adda.w    a5,a0
  1726.     dbra    d3,..
  1727. .Exit    rts
  1728. .Full    exg    d4,a5
  1729.     lsr.w    #2,d2
  1730.     ml    (a6,d5.w*4),d1
  1731.     bmi.b    0$
  1732.     movem.l    d3/a0,-(a7)
  1733. ..    or.l    d1,(a0)
  1734.     adda.w    a5,a0
  1735.     dbra    d3,..
  1736.     movem.l    (a7)+,d3/a0
  1737.     subq.w    #1,d2
  1738.     addq.l    #4,a0
  1739. 0$
  1740.     subq.w    #1,d2
  1741.     bmi.b    1$
  1742.     mw    d2,d5
  1743.     addq.l    #1,d5
  1744.     lsl.w    #2,d5
  1745.     movem.l    d3/d5/a0/a5,-(a7)
  1746.     suba.w    d5,a5
  1747.     mq    #-1,d1
  1748. .Loop    mw    d2,d5
  1749. ..    ml    d1,(a0)+
  1750.     dbra    d5,..
  1751.     adda.w    a5,a0
  1752.     dbra    d3,.Loop
  1753.  
  1754.     movem.l    (a7)+,d3/d5/a0/a5
  1755.     adda.w    d5,a0
  1756. 1$    ml    (a6,d6.w*4),d1
  1757.     bmi.b    2$
  1758.     not.l    d1
  1759. ..    or.l    d1,(a0)
  1760.     adda.w    a5,a0
  1761.     dbra    d3,..
  1762. 2$    rts
  1763.  
  1764. ;------------------------------------------------------------------------------
  1765. ; INPUT:    a1 = rp_Bitmap
  1766. ;        d0 = X1
  1767. ;        d1 = Y1
  1768. ;        d2 = X2
  1769. ;        d3 = Y2
  1770. ;
  1771. DEMO_EraseBox
  1772.     sub.w    d1,d3
  1773.     subq.w    #1,d3                ;Could test for zero size...
  1774.     bmi.b    .Exit
  1775.  
  1776.     lea    BMask(pc),a6
  1777.  
  1778.     mq    #%11111,d5
  1779.     and.w    d0,d5                ;Mask Left
  1780.     sub.w    d5,d0
  1781.     lsr.w    #3,d0                ;XPos in Byte Multyple of 32 pixels
  1782.     mq    #%11111,d6
  1783.     and.w    d2,d6                ;Mask Right
  1784.     sub.w    d6,d2                ;XSize minus Left Mask
  1785.     lsr.w    #3,d2
  1786.  
  1787.     mw    (bm_BytesPerRow,a1),d4
  1788.     mulu.w    d4,d1
  1789.     ext.l    d0
  1790.     add.l    d0,d1
  1791.     adda.l    d1,a0
  1792.  
  1793.     sub.w    d0,d2                ;Width of middle copy
  1794.     bne.b    .Full                ;Not Quick
  1795.     ml    (a6,d6.w*4),d0
  1796.     not.l    d0
  1797.     and.l    (a6,d5.w*4),d0
  1798.     not.l    d0
  1799.     movea.l    d4,a5
  1800. ..    and.l    d0,(a0)
  1801.     adda.w    a5,a0
  1802.     dbra    d3,..
  1803. .Exit    rts
  1804. .Full    exg    d4,a5
  1805.     lsr.w    #2,d2
  1806.     ml    (a6,d5.w*4),d1
  1807.     bmi.b    0$
  1808.     movem.l    d3/a0,-(a7)
  1809.     ml    d1,d0
  1810.     not.l    d0
  1811. ..    and.l    d0,(a0)
  1812.     adda.w    a5,a0
  1813.     dbra    d3,..
  1814.     movem.l    (a7)+,d3/a0
  1815.     subq.w    #1,d2
  1816.     addq.l    #4,a0
  1817. 0$
  1818.     subq.w    #1,d2
  1819.     bmi.b    1$
  1820.     mw    d2,d5
  1821.     addq.l    #1,d5
  1822.     lsl.w    #2,d5
  1823.     movem.l    d3/d5/a0/a5,-(a7)
  1824.     suba.w    d5,a5
  1825.     mq    #0,d0
  1826.     mq    #-1,d1
  1827. .Loop    mw    d2,d5
  1828. ..    ml    d0,(a0)+
  1829.     dbra    d5,..
  1830.     adda.w    a5,a0
  1831.     dbra    d3,.Loop
  1832.  
  1833.     movem.l    (a7)+,d3/d5/a0/a5
  1834.     adda.w    d5,a0
  1835. 1$    ml    (a6,d6.w*4),d0
  1836.     bmi.b    2$
  1837. ..    and.l    d0,(a0)
  1838.     adda.w    a5,a0
  1839.     dbra    d3,..
  1840. 2$    rts
  1841.  
  1842. BMask:    dl    $ffffffff,$7fffffff,$3fffffff,$1fffffff,$0fffffff,$07ffffff,$03ffffff,$01ffffff
  1843.     dl    $00ffffff,$007fffff,$003fffff,$001fffff,$000fffff,$0007ffff,$0003ffff,$0001ffff
  1844.     dl    $0000ffff,$00007fff,$00003fff,$00001fff,$00000fff,$000007ff,$000003ff,$000001ff
  1845.     dl    $000000ff,$0000007f,$0000003f,$0000001f,$0000000f,$00000007,$00000003,$00000001
  1846.  
  1847. ;------------------------------------------------------------------------------
  1848. FireColors
  1849.     dw    $000,$100,$200,$300,$400,$500,$600,$700
  1850.     dw    $811,$922,$a33,$b44,$c55,$d66,$e77,$f88
  1851. RingColors
  1852.     dw    $000,$001,$002,$003,$004,$005,$006,$007
  1853.     dw    $118,$229,$33a,$44b,$55c,$66d,$77e,$88f
  1854. WeirdColors
  1855.     dw    $000,$111,$222,$333,$444,$555,$666,$777
  1856.     dw    $887,$996,$aa5,$bb4,$cc3,$dd2,$ee1,$ff0
  1857. ZoomColors
  1858.     dw    $000,$010,$020,$030,$040,$050,$060,$070
  1859.     dw    $181,$292,$3a3,$4b4,$5c5,$6d6,$7e7,$8f8
  1860. DiscColors
  1861. BoxColors
  1862. PolyColors
  1863. PixelColors
  1864.     dw    $000,$800,$080,$880,$008,$808,$088,$888
  1865.     dw    $888,$F88,$8F8,$ff8,$88f,$f8f,$8ff,$fff
  1866.  
  1867. ;    SECTION    RTGData,DATA            ;Read/Write
  1868. DEMO_BSS    dx.b    DEMO_SIZEOF
  1869.