home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / chopper.lha / copasm.a < prev    next >
Encoding:
Text File  |  1994-03-22  |  8.4 KB  |  417 lines

  1. ;/*
  2.   *    COPASM.A        by Patrick van Logchem (v912152@si.hhs.nl)
  3.   *    last changed on 16 march 1994
  4.   */
  5.  
  6.     SECTION    copasm,CODE
  7.  
  8.     XDEF    _leftmouse
  9.     XDEF    _rightmouse
  10.     XDEF    _chopper
  11.     XDEF    _setcopper
  12.     XDEF    _setcolor
  13.     XDEF    _getcolor
  14.     XDEF    _ytab
  15.     XDEF    _xoff
  16.  
  17. NEXTROW    EQU    40
  18. ROWS    EQU    80
  19.  
  20. HIGH_E    EQU    3
  21. HIGH_O    EQU    2
  22. WIDTH    EQU    2
  23.  
  24. TEST    EQU    0
  25.  
  26. _leftmouse:
  27.     moveq    #0,d0
  28.     btst    #6,$bfe001
  29.     seq    d0
  30.     rts
  31.  
  32. _rightmouse:
  33.     moveq    #0,d0
  34.     btst    #7,$bfe001
  35.     seq    d0
  36.     rts
  37.  
  38. _ytab    dc.l    0
  39. _xoff    dc.l    0
  40.  
  41. ; 'chopper' fills all what's needed for a chunky-copper-screen.
  42. _chopper:
  43.     ; a0 = adres first bitplane
  44.     ; d0 = offset next bitplane
  45.     ; a1 = adres copperlist
  46.     ; a2 = adres y-adres-table
  47.     ; a3 = adres x-offset-table
  48.     movem.l    d0-d7/a0-a6,-(a7)
  49.  
  50.     move.l    a2,_ytab
  51.     move.l    a3,_xoff
  52.  
  53. ; Setup copper to display screen:
  54.     move.l    #$01800000,(a1)+    ; color0  = $0000
  55.     move.l    #$010c0011,(a1)+    ; bplcon4 = $0011
  56.     move.l    #$008e2269,(a1)+    ; diwstrt = $2269
  57.     move.l    #$01000210,(a1)+    ; bplcon0 = $0210
  58.     move.l    #$01040224,(a1)+    ; bplcon2 = $0224
  59.     move.l    #$009022a9,(a1)+    ; diwstop = $22a9
  60.     move.l    #$00920018,(a1)+    ; ddfstrt = $0018
  61.     move.l    #$009400b8,(a1)+    ; ddfstop = $00b8
  62.     move.l    #$01028888,(a1)+    ; bplcon1 = $8888
  63.     move.l    #$0108fff8,(a1)+    ; bpl1mod = $fff8
  64.     move.l    #$010afff8,(a1)+    ; bpl2mod = $fff8
  65.     move.l    #$01e42100,(a1)+    ; diwhigh = $2100
  66.     move.l    #$01fc0003,(a1)+    ; fmode   = $0003
  67.  
  68.     move.l    a0,d1
  69.     move.w    #$00e0,d2        ; d2.w = first planes' high-pointer
  70.     moveq    #8-1,d7            ; do 8 bitplanes
  71. ploop:
  72.     move.w    d2,(a1)+        ; place this planes' high-pointer
  73.     addq    #2,d2            ; d2.w = low-pointer
  74.     swap.w    d1            ; d1.w = high-adres
  75.     move.w    d1,(a1)+        ; place high-adres
  76.  
  77.     move.w    d2,(a1)+        ; place this planes' low-pointer
  78.     addq    #2,d2            ; d2.w = next planes' high-pointer
  79.     swap.w    d1            ; d1.w = low-adres
  80.     move.w    d1,(a1)+        ; place low-adres
  81.  
  82.     add.l    d0,d1            ; goto next bitplane
  83.     dbf    d7,ploop        ; loop
  84.  
  85. ; fill rest of copper with color-bank-fills (and do adres-table meanwhile):
  86.     move.l    #$00020000,d4        ; next color add
  87.     move.l    #$2007fffe,d2        ; starting row
  88.     move.l    #HIGH_E<<24,d3        ; even row add
  89.     move.l    #HIGH_O<<24,d5        ; odd row add
  90.  
  91.     move.l    #(ROWS/2)-1,d6        ; do ROWS/2 lines (even & odd)
  92.  
  93. rloop:
  94.     move.l    d2,(a1)+        ; place wait-instruction
  95.     add.l    d3,d2            ; next row
  96.     move.l    a1,(a2)+        ; place adres in y-adres table
  97.  
  98.     move.l    #$01060c60,(a1)+    ; select bank 0
  99.     move.l    #$01800000,d1
  100.     moveq    #32-1,d7
  101. cloop0:    move.l    d1,(a1)+
  102.     add.l    d4,d1
  103.     dbf    d7,cloop0        ; place all 32 colors
  104.  
  105.     move.l    #$01062c60,(a1)+    ; select bank 1
  106.     move.l    #$01800000,d1
  107.     moveq    #32-1,d7
  108. cloop1:    move.l    d1,(a1)+
  109.     add.l    d4,d1
  110.     dbf    d7,cloop1        ; place all 32 colors
  111.  
  112.     move.l    #$01064c60,(a1)+    ; select bank 2
  113.     move.l    #$01800000,d1
  114.     moveq    #32-1,d7
  115. cloop2:    move.l    d1,(a1)+
  116.     add.l    d4,d1
  117.     dbf    d7,cloop2        ; place all 32 colors
  118.  
  119.     move.l    d2,(a1)+        ; place wait-instruction
  120.     add.l    d5,d2            ; next row
  121.     move.l    a1,(a2)+        ; place adres in y-adres table
  122.  
  123.     move.l    #$01068c60,(a1)+    ; select bank 4
  124.     move.l    #$01800000,d1
  125.     moveq    #32-1,d7
  126. cloop4:    move.l    d1,(a1)+
  127.     add.l    d4,d1
  128.     dbf    d7,cloop4        ; place all 32 colors
  129.  
  130.     move.l    #$0106ac60,(a1)+    ; select bank 5
  131.     move.l    #$01800000,d1
  132.     moveq    #32-1,d7
  133. cloop5:    move.l    d1,(a1)+
  134.     add.l    d4,d1
  135.     dbf    d7,cloop5        ; place all 32 colors
  136.  
  137.     move.l    #$0106cc60,(a1)+    ; select bank 6
  138.     move.l    #$01800000,d1
  139.     moveq    #32-1,d7
  140. cloop6:    move.l    d1,(a1)+
  141.     add.l    d4,d1
  142.     dbf    d7,cloop6        ; place all 32 colors
  143.  
  144.   ifeq TEST-1
  145.     move.l    #$01060c60,(a1)+
  146.     move.l    #$01800888,(a1)+    ; test time left
  147.   endc
  148.  
  149.     dbf    d6,rloop
  150.  
  151. ; fill x_offset table:
  152.     moveq    #6,d4            ; first offset is 6 (after bank-select)
  153.     moveq    #3-1,d6            ; do 3 banks
  154. bloop    moveq    #32-1,d7        ; do 32 colors
  155. oloop    move.w    d4,(a3)+        ; place offset
  156.     addq    #4,d4            ; next offset
  157.     dbf    d7,oloop        ; do all offsets
  158.  
  159.     addq    #4,d4            ; skip bank-select statement
  160.     dbf    d6,bloop        ; do all banks
  161.  
  162. ; plot pixels in the bitplanes:
  163. pln0:    move.l    a0,a2
  164.     move.l    #(ROWS/2)-1,d7
  165. ylp0:    moveq    #HIGH_E+HIGH_O-1,d6
  166. blp0:    move.l    a2,a3
  167.   ifeq WIDTH-3
  168.     move.l    #$1c71c71c,(a3)+
  169.     move.l    #$71c71c71,(a3)+
  170.     move.l    #$c71c71c7,(a3)+
  171.     move.l    #$1c71c71c,(a3)+
  172.     move.l    #$71c71c71,(a3)+
  173.     move.l    #$c71c71c7,(a3)+
  174.     move.l    #$1c71c71c,(a3)+
  175.     move.l    #$71c71c71,(a3)+
  176.     move.l    #$c71c71c7,(a3)+
  177.   else
  178.     move.l    #$33333333,(a3)+
  179.     move.l    #$33333333,(a3)+
  180.     move.l    #$33333333,(a3)+
  181.     move.l    #$33333333,(a3)+
  182.     move.l    #$33333333,(a3)+
  183.     move.l    #$33333333,(a3)+
  184.   endc
  185.     lea    NEXTROW(a2),a2
  186.     dbf    d6,blp0
  187.     dbf    d7,ylp0
  188.     lea    (a0,d0.l),a0
  189.  
  190. pln1:    move.l    a0,a2
  191.     move.l    #(ROWS/2)-1,d7
  192. ylp1:    moveq    #HIGH_E+HIGH_O-1,d6
  193. blp1:    move.l    a2,a3
  194.   ifeq WIDTH-3
  195.     move.l    #$03f03f03,(a3)+
  196.     move.l    #$f03f03f0,(a3)+
  197.     move.l    #$3f03f03f,(a3)+
  198.     move.l    #$03f03f03,(a3)+
  199.     move.l    #$f03f03f0,(a3)+
  200.     move.l    #$3f03f03f,(a3)+
  201.     move.l    #$03f03f03,(a3)+
  202.     move.l    #$f03f03f0,(a3)+
  203.     move.l    #$3f03f03f,(a3)+
  204.   else
  205.     move.l    #$0f0f0f0f,(a3)+
  206.     move.l    #$0f0f0f0f,(a3)+
  207.     move.l    #$0f0f0f0f,(a3)+
  208.     move.l    #$0f0f0f0f,(a3)+
  209.     move.l    #$0f0f0f0f,(a3)+
  210.     move.l    #$0f0f0f0f,(a3)+
  211.   endc
  212.     lea    NEXTROW(a2),a2
  213.     dbf    d6,blp1
  214.     dbf    d7,ylp1
  215.     lea    (a0,d0.w),a0
  216.  
  217. pln2:    move.l    a0,a2
  218.     move.l    #(ROWS/2)-1,d7
  219. ylp2:    moveq    #HIGH_E+HIGH_O-1,d6
  220. blp2:    move.l    a2,a3
  221.   ifeq WIDTH-3
  222.     move.l    #$000fff00,(a3)+
  223.     move.l    #$0fff000f,(a3)+
  224.     move.l    #$ff000fff,(a3)+
  225.     move.l    #$000fff00,(a3)+
  226.     move.l    #$0fff000f,(a3)+
  227.     move.l    #$ff000fff,(a3)+
  228.     move.l    #$000fff00,(a3)+
  229.     move.l    #$0fff000f,(a3)+
  230.     move.l    #$ff000fff,(a3)+
  231.   else
  232.     move.l    #$00ff00ff,(a3)+
  233.     move.l    #$00ff00ff,(a3)+
  234.     move.l    #$00ff00ff,(a3)+
  235.     move.l    #$00ff00ff,(a3)+
  236.     move.l    #$00ff00ff,(a3)+
  237.     move.l    #$00ff00ff,(a3)+
  238.   endc
  239.     lea    NEXTROW(a2),a2
  240.     dbf    d6,blp2
  241.     dbf    d7,ylp2
  242.     lea    (a0,d0.w),a0
  243.  
  244. pln3:    move.l    a0,a2
  245.     move.l    #(ROWS/2)-1,d7
  246. ylp3:    moveq    #HIGH_E+HIGH_O-1,d6
  247. blp3:    move.l    a2,a3
  248.   ifeq WIDTH-3
  249.     move.l    #$000000ff,(a3)+
  250.     move.l    #$ffff0000,(a3)+
  251.     move.l    #$00ffffff,(a3)+
  252.     move.l    #$000000ff,(a3)+
  253.     move.l    #$ffff0000,(a3)+
  254.     move.l    #$00ffffff,(a3)+
  255.     move.l    #$000000ff,(a3)+
  256.     move.l    #$ffff0000,(a3)+
  257.     move.l    #$00ffffff,(a3)+
  258.   else
  259.     move.l    #$0000ffff,(a3)+
  260.     move.l    #$0000ffff,(a3)+
  261.     move.l    #$0000ffff,(a3)+
  262.     move.l    #$0000ffff,(a3)+
  263.     move.l    #$0000ffff,(a3)+
  264.     move.l    #$0000ffff,(a3)+
  265.   endc
  266.     lea    NEXTROW(a2),a2
  267.     dbf    d6,blp3
  268.     dbf    d7,ylp3
  269.     lea    (a0,d0.w),a0
  270.  
  271. pln4:    move.l    a0,a2
  272.     move.l    #(ROWS/2)-1,d7
  273. ylp4:    moveq    #HIGH_E+HIGH_O-1,d6
  274. blp4:    move.l    a2,a3
  275.   ifeq WIDTH-3
  276.     move.l    #$00000000,(a3)+
  277.     move.l    #$0000ffff,(a3)+
  278.     move.l    #$ffffffff,(a3)+
  279.     move.l    #$00000000,(a3)+
  280.     move.l    #$0000ffff,(a3)+
  281.     move.l    #$ffffffff,(a3)+
  282.     move.l    #$00000000,(a3)+
  283.     move.l    #$0000ffff,(a3)+
  284.     move.l    #$ffffffff,(a3)+
  285.   else
  286.     move.l    #$00000000,(a3)+
  287.     move.l    #$ffffffff,(a3)+
  288.     move.l    #$00000000,(a3)+
  289.     move.l    #$ffffffff,(a3)+
  290.     move.l    #$00000000,(a3)+
  291.     move.l    #$ffffffff,(a3)+
  292.   endc
  293.     lea    NEXTROW(a2),a2
  294.     dbf    d6,blp4
  295.     dbf    d7,ylp4
  296.     lea    (a0,d0.w),a0
  297.  
  298. pln5:    move.l    a0,a2
  299.     move.l    #(ROWS/2)-1,d7
  300. ylp5:    moveq    #HIGH_E+HIGH_O-1,d6
  301. blp5:    move.l    a2,a3
  302.     move.l    #$00000000,(a3)+
  303.     move.l    #$00000000,(a3)+
  304.   ifeq WIDTH-3
  305.     move.l    #$00000000,(a3)+
  306.     move.l    #$ffffffff,(a3)+
  307.   endc
  308.     move.l    #$ffffffff,(a3)+
  309.     move.l    #$ffffffff,(a3)+
  310.     move.l    #$00000000,(a3)+
  311.     move.l    #$00000000,(a3)+
  312.   ifeq WIDTH-3
  313.     move.l    #$00000000,(a3)+
  314.   endc
  315.     lea    NEXTROW(a2),a2
  316.     dbf    d6,blp5
  317.     dbf    d7,ylp5
  318.     lea    (a0,d0.w),a0
  319.  
  320. pln6:    move.l    a0,a2
  321.     move.l    #(ROWS/2)-1,d7
  322. ylp6:    moveq    #HIGH_E+HIGH_O-1,d6
  323. blp6:    move.l    a2,a3
  324.     move.l    #$00000000,(a3)+
  325.     move.l    #$00000000,(a3)+
  326.     move.l    #$00000000,(a3)+
  327.     move.l    #$00000000,(a3)+
  328.   ifeq WIDTH-3
  329.     move.l    #$00000000,(a3)+
  330.     move.l    #$00000000,(a3)+
  331.     move.l    #$ffffffff,(a3)+
  332.   endc
  333.     move.l    #$ffffffff,(a3)+
  334.     move.l    #$ffffffff,(a3)+
  335.     lea    NEXTROW(a2),a2
  336.     dbf    d6,blp6
  337.     dbf    d7,ylp6
  338.     lea    (a0,d0.w),a0
  339.  
  340. pln7:    move.l    a0,a2
  341.     move.l    #(ROWS/2)-1,d7
  342. ylp7:    moveq    #HIGH_E-1,d6
  343. blp71:    move.l    a2,a3
  344.     move.l    #$00000000,(a3)+
  345.     move.l    #$00000000,(a3)+
  346.     move.l    #$00000000,(a3)+
  347.     move.l    #$00000000,(a3)+
  348.     move.l    #$00000000,(a3)+
  349.     move.l    #$00000000,(a3)+
  350.   ifeq WIDTH-3
  351.     move.l    #$00000000,(a3)+
  352.     move.l    #$00000000,(a3)+
  353.     move.l    #$00000000,(a3)+
  354.   endc
  355.     lea    NEXTROW(a2),a2
  356.     dbf    d6,blp71
  357.  
  358.     move.l    #HIGH_O-1,d6
  359. blp72:    move.l    a2,a3
  360.     move.l    #$ffffffff,(a3)+
  361.     move.l    #$ffffffff,(a3)+
  362.     move.l    #$ffffffff,(a3)+
  363.     move.l    #$ffffffff,(a3)+
  364.     move.l    #$ffffffff,(a3)+
  365.     move.l    #$ffffffff,(a3)+
  366.   ifeq WIDTH-3
  367.     move.l    #$ffffffff,(a3)+
  368.     move.l    #$ffffffff,(a3)+
  369.     move.l    #$ffffffff,(a3)+
  370.   endc
  371.     lea    NEXTROW(a2),a2
  372.     dbf    d6,blp72
  373.     dbf    d7,ylp7
  374.  
  375. ; end copper-list:
  376.     move.l    #-2,(a1)+
  377.     move.l    #-2,(a1)+
  378.     movem.l    (a7)+,d0-d7/a0-a6
  379.  
  380. ; start de copper with adres in a1:
  381.     move.l    a1,a0
  382.  
  383. _setcopper:
  384.     move.l    a0,$dff080
  385.     clr.l    $dff088
  386.     rts
  387.  
  388. _setcolor:
  389.     movem.l    d0/a0/a1,-(a7)
  390.  
  391.     move.l    _ytab(pc),a0
  392.     move.l    (a0,d1.w*4),a0
  393.  
  394.     move.l    _xoff(pc),a1
  395.     move.w    (a1,d0.w*2),d0
  396.  
  397.     move.w    d2,(a0,d0.w)
  398.  
  399.     movem.l    (a7)+,d0/a0/a1
  400.     rts
  401.  
  402. _getcolor:
  403.     movem.l    a0/a1,-(a7)
  404.  
  405.     move.l    _ytab(pc),a0
  406.     move.l    (a0,d1.w*4),a0
  407.  
  408.     move.l    _xoff(pc),a1
  409.     move.w    (a1,d0.w*2),d0
  410.  
  411.     move.w    (a0,d0.w),d0
  412.  
  413.     movem.l    (a7)+,a0/a1
  414.     rts
  415.  
  416.     END
  417.