home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 46 / af046.adf / ATOMS.ASM < prev    next >
Assembly Source File  |  1993-02-21  |  29KB  |  1,837 lines

  1.  
  2.  
  3. ; Watch out! It's The ATOMS game on the Amiga!!!! Done by Tom. Excellent.
  4.  
  5.  
  6. openlibrary = -552
  7. allocmem = -198
  8. freemem = -210
  9.  
  10. logosize = 40*44*3
  11. memsize = 40*200*4+logosize
  12.  
  13.  
  14. bplcon0 = $100
  15. bplcon1 = $102
  16. bplcon2 = $104
  17. bpl1mod = $108
  18. bpl2mod = $10a
  19. ddfstrt = $92
  20. ddfstop = $94
  21. diwstrt = $8e
  22. diwstop = $90
  23. bpl1pth = $e0
  24. bpl1ptl = $e2
  25. bpl2pth = $e4
  26. bpl2ptl = $e6
  27. bpl3pth = $e8
  28. bpl3ptl = $ea
  29. bpl4pth = $ec
  30. bpl4ptl = $ee
  31. col00 = $180
  32. col01 = $182
  33. col02 = $184
  34. col03 = $186
  35. col04 = $188
  36. col05 = $18a
  37. col06 = $18c
  38. col07 = $18e
  39. col08 = $190
  40. col09 = $192
  41. col10 = $194
  42. col11 = $196
  43. col12 = $198
  44. col13 = $19a
  45. col14 = $19c
  46. col15 = $19e
  47. col16 = $1a0
  48. col17 = $1a2
  49. col18 = $1a4
  50. col19 = $1a6
  51. spr0pth = $120
  52. spr0ptl = $122
  53. spr1pth = $124
  54. spr1ptl = $126
  55. spr2pth = $128
  56. spr2ptl = $12a
  57. spr3pth = $12c
  58. spr3ptl = $12e
  59. spr4pth = $130
  60. spr4ptl = $132
  61. spr5pth = $134
  62. spr5ptl = $136
  63. spr6pth = $138
  64. spr6ptl = $13a
  65. spr7pth = $13c
  66. spr7ptl = $13e
  67.  
  68.  
  69.  
  70.  
  71.  section Atoms+++++++++,CODE_C
  72.  
  73. start:
  74.  lea $dff000,a5
  75.  bsr killsystem
  76.  bsr waitblit
  77.  bsr allocate
  78.  tst.l d0
  79.  beq.s error
  80.  bsr initvars2
  81.  bsr newcopper
  82. playagain:
  83.  jsr mt_init
  84.  bsr initvariables
  85.  bsr askplayers
  86.  bsr initcolours
  87.  st musicflag
  88.  bsr startscreen
  89.  bsr mainloop
  90.  tst.b d4
  91.  beq.s playagain
  92.  bsr waitblit
  93.  bsr oldcopper
  94.  bsr free
  95.  jsr mt_end
  96. error:
  97.  bsr freesystem
  98.  clr.l d0
  99.  rts
  100. waitblit:
  101.  btst #14,2(a5)
  102.  bne.s waitblit
  103.  rts
  104. blankplane:
  105.  btst #14,2(a5)
  106.  bne.s blankplane
  107.  move.l planeaddr,$54(a5)
  108.  clr.w $42(a5)
  109.  clr.w $66(a5)
  110.  move.l #-1,$44(a5)
  111.  move.w #%100000000,$40(a5)
  112.  move.w #200*64+20,$58(a5)
  113.  rts
  114. blankplane2:
  115.  btst #14,2(a5)
  116.  bne.s blankplane2
  117.  move.l planeaddr,$54(a5)
  118.  clr.w $42(a5)
  119.  clr.w $66(a5)
  120.  move.l #-1,$44(a5)
  121.  move.w #%100000000,$40(a5)
  122.  move.w #800*64+20,$58(a5)
  123.  rts
  124.  
  125. askplayers:
  126.  bsr blankplane2
  127.  bsr waitblit
  128.  lea text1,a0
  129.  move.w #40*20,d0
  130.  bsr textoutput
  131.  lea text2,a0
  132.  move.w #40*50+16,d0
  133.  bsr textoutput
  134. wb:
  135.  btst #6,$bfe001
  136.  bne.s wb
  137.  move.w mousex,d0
  138.  move.w mousey,d1
  139.  cmp.w #45,d1
  140.  blt.s wb
  141.  cmp.w #60,d1
  142.  bgt.s wb
  143.  cmp.w #118,d0
  144.  blt.s wb
  145.  moveq #2,d4
  146.  cmp.w #145,d0
  147.  blt.s hit
  148.  moveq #3,d4
  149.  cmp.w #178,d0
  150.  blt.s hit
  151.  moveq #4,d4
  152.  cmp.w #208,d0
  153.  bgt.s wb
  154. hit:
  155.  subq #1,d4
  156.  move.w d4,players
  157.  move.w d4,playerno
  158.  rts
  159.  
  160. textoutput:
  161.  lea font,a2
  162.  move.l planeaddr,a1
  163.  add.w d0,a1
  164. nextchar:
  165.  clr.w d0
  166.  move.b (a0)+,d0
  167.  blt.s endtext
  168.  sub.b #'a',d0
  169.  blt.s space
  170.  add.w d0,d0
  171.  moveq #15,d7
  172.  move.l a1,a3
  173. textloop:
  174.  move.w 0(a2,d0.w),(a3)
  175.  add.w #480/8,d0
  176.  lea 40(a3),a3
  177.  dbf d7,textloop
  178. space:
  179.  lea 2(a1),a1
  180.  bra.s nextchar
  181. endtext:
  182.  rts
  183.  
  184. startscreen:
  185.  cmp.w #1,framecount
  186.  blt.s startscreen
  187.  clr.w framecount
  188.  move.w #1590,d0
  189.  sub.w distance,d0
  190.  move.w d0,rot
  191.  bsr rotateaxis
  192.  bsr blankplane
  193.  bsr drawgrid
  194.  add.w #20,distance
  195.  cmp.w #1610,distance
  196.  ble.s startscreen
  197.  bsr initscreen
  198.  rts
  199.  
  200. rotateaxis:
  201.  move.w rot,d0
  202.  add.w d0,d0
  203.  lea sinewave,a0
  204.  lea 1800(a0),a1
  205.  move.w 0(a1,d0.w),d1
  206.  move.w 0(a0,d0.w),d0
  207.  move.w d0,sin1+2
  208.  move.w d0,sin2+2
  209.  move.w d1,cos1+2
  210.  move.w d1,cos2+2
  211.  rts
  212.  
  213. rotate:
  214.  movem.w d0-1,-(sp)
  215.  move.w d2,d0
  216.  move.w d3,d1
  217. sin1 muls #0,d2
  218. cos1 muls #0,d3
  219.  add.l d2,d3
  220.  asr.l #7,d3
  221. sin2 muls #0,d1
  222. cos2 muls #0,d0
  223.  sub.l d1,d0
  224.  asr.l #7,d0
  225.  move.w d0,d2
  226.  movem.w (sp)+,d0-1
  227.  rts
  228.   
  229. drawgrid:
  230.  lea coords,a0
  231.  move.w (a0)+,d7
  232. nextline:
  233.  move.w (a0)+,d2
  234.  move.w (a0)+,d3
  235.  bsr rotate
  236.  move.w distance,d4
  237.  move.w d2,d0
  238.  move.w d3,d1
  239.  ext.l d0
  240.  ext.l d1
  241.  asl.l #8,d0
  242.  asl.l #8,d1
  243.  divs d4,d0
  244.  divs d4,d1
  245.  add.w #160,d0
  246.  add.w #96,d1
  247.  move.w (a0)+,d2
  248.  move.w (a0)+,d3
  249.  bsr rotate
  250.  move.w distance,d4
  251.  ext.l d2
  252.  ext.l d3
  253.  asl.l #8,d2
  254.  asl.l #8,d3
  255.  divs d4,d2
  256.  divs d4,d3
  257.  add.w #160,d2
  258.  add.w #96,d3
  259.  bsr drawline
  260.  dbf d7,nextline
  261.  rts
  262. initvars2:
  263.  clr.w musicflag
  264.  clr.w colours+6
  265.  st fadeflag
  266.  clr.w slider
  267.  clr.w framecount
  268.  move.w #-16,slider2
  269.  clr.w mousex
  270.  clr.w mousey
  271.  clr.w oldmousex
  272.  clr.w oldmousey
  273.  rts
  274.  
  275. initvariables:
  276.  clr.w xrot
  277.  move.w #650,yrot
  278.  clr.w rot
  279.  clr.w explosion
  280.  move.w #-1,winner
  281.  move.w #20,distance
  282.  clr.w quitflag
  283.  clr.w player
  284.  lea playersin,a0
  285.  move.l #$01010101,(a0)
  286.  lea startdata,a0
  287.  lea enddata,a1
  288. loop10:
  289.  clr.b (a0)+
  290.  cmp.l a0,a1
  291.  bne.s loop10
  292.  lea blocklookup,a0
  293.  lea tiles+32,a1
  294.  move.w #255,d7
  295.  clr.l d2
  296. loop13:
  297.  move.l d2,d3
  298.  divu #19,d3
  299.  move.l d3,d4
  300.  swap d4
  301.  add.w d4,d4
  302.  mulu #38*16,d3
  303.  add.w d4,d3
  304.  lea  0(a1,d3.w),a2
  305.  move.l a2,(a0)+
  306.  add.w #1,d2
  307.  dbf d7,loop13
  308.  rts
  309.  
  310. drawline:
  311.  movem.l d0-7/a0-6,-(sp)
  312.  bsr clipping
  313.  tst.w d5
  314.  bne noline
  315.  moveq #40,d4
  316.  muls d1,d4
  317.  moveq #-$10,d5
  318.  and.w d0,d5
  319.  asr.w #3,d5
  320.  add.w d5,d4
  321.  add.l planeaddr,d4
  322.  clr.l d5
  323.  sub.w d1,d3
  324.  roxl.b #1,d5
  325.  tst.w d3
  326.  bge.s y2gy1
  327.  neg.w d3
  328. y2gy1:
  329.  sub.w d0,d2
  330.  roxl.b #1,d5
  331.  tst.w d2
  332.  bge.s x2gx1
  333.  neg.w d2
  334. x2gx1:
  335.  move.w d3,d1
  336.  sub.w d2,d1
  337.  bge.s dygdx
  338.  exg d2,d3
  339. dygdx:
  340.  roxl.b #1,d5
  341.  tst.w d3
  342.  beq noline
  343. wblit:
  344.  btst #14,2(a5)
  345.  bne.s wblit
  346.  move.b octant_table(pc,d5.w),d5
  347.  add.w d2,d2
  348.  move.w d2,$62(a5)
  349.  sub.w d3,d2
  350.  bgt.s signn1
  351.  or.b #$40,d5
  352. signn1:
  353.  move.w d2,$52(a5)
  354.  sub.w d3,d2
  355.  move.w d2,$64(a5)
  356.  move.w #$8000,$74(a5)
  357.  move.w #$ffff,$72(a5)
  358.  move.w #$ffff,$44(a5)
  359.  and.w #$f,d0
  360.  ror.w #4,d0
  361.  or.w #$bca,d0
  362.  move.w d0,$40(a5)
  363.  move.w d5,$42(a5)
  364.  move.l d4,$54(a5)
  365.  move.l d4,$48(a5)
  366.  move.w #40,$66(a5)
  367.  move.w #40,$60(a5)
  368.  lsl.w #6,d3
  369.  addq #2,d3
  370.  move.w d3,$58(a5)
  371. noline:
  372.  movem.l (sp)+,d0-7/a0-6
  373.  rts
  374. octant_table    dc.b 1,17,9,21,5,25,13,29 
  375.  
  376. initscreen: 
  377.  lea blocksequ,a0
  378.  move.w #59,d7
  379. nextblock6:
  380.  cmp.w #1,framecount
  381.  blt.s nextblock6
  382.  clr.w framecount
  383.  move.w (a0)+,d0
  384.  ext.l d0
  385.  divu #10,d0
  386.  move.l d0,d1
  387.  swap d0
  388.  move.w #19*12,d2
  389.  bsr drawblock
  390.  dbf d7,nextblock6
  391.  lea playersin,a0
  392.  move.w #19*12+2,d2
  393.  clr.w d0
  394.  moveq #6,d1
  395.  move.w players,d7
  396. playerloop:
  397.  bsr drawblock
  398.  addq #1,d0
  399.  addq #1,d2
  400.  dbf d7,playerloop
  401.  rts
  402.  
  403. mainloop:
  404.  cmp.w #1,framecount
  405.  blt.s mainloop
  406.  clr.w framecount
  407.  bsr morphhandle
  408.  bsr leftclick
  409.  bsr playerhandler
  410.  btst #10,$16(a5)
  411.  beq nowinn
  412.  add.w #1,toggler
  413.  and.w #1,toggler
  414.  tst.w quitflag
  415.  beq.s mainloop
  416.  sf musicflag
  417.  jsr mt_end
  418.  lea text3,a0
  419.  move.w #40*8+12,d0
  420.  bsr textoutput
  421.  lea text4,a0
  422.  move.w #40*26+6,d0
  423.  bsr textoutput
  424. wb2:
  425.  btst #6,$bfe001
  426.  bne.s wb2
  427.  cmp.w #25,mousey
  428.  blt.s wb2
  429.  cmp.w #40,mousey
  430.  bgt.s wb2
  431.  cmp.w #230,mousex
  432.  blt.s wb2
  433.  clr.w d4
  434.  cmp.w #260,mousex
  435.  blt.s exit
  436.  st d4
  437.  cmp.w #290,mousex
  438.  bgt.s wb2
  439. exit:
  440.  rts
  441. nowinn:
  442.  st d4
  443.  rts
  444.  
  445. playerhandler:
  446.  move.w player,d0
  447.  lea collook,a0
  448.  add.w d0,d0
  449.  move.w 0(a0,d0.w),pointercol
  450.  rts
  451.  
  452. morphhandle:
  453.  lea sequences,a1
  454.  lea datatable,a2
  455.  lea inusetable,a4
  456.  lea morphtable,a0
  457.  tst.w (a0)
  458.  beq.s nomorphs
  459.  move.w 2(a0),d0
  460.  move.w 4(a0),d1
  461.  move.w d0,d4
  462.  move.w d1,d5
  463.  mulu #10,d5
  464.  add.w d5,d4
  465.  clr.l d5
  466.  move.b 0(a2,d4.w),d5
  467.  add.w d5,d5
  468.  add.w d5,d5
  469.  move.l 0(a1,d5.w),a3
  470.  add.w 6(a0),a3
  471.  add.w #2,6(a0)
  472.  move.w (a3),d2
  473.  blt.s endmorph
  474.  move.w 8(a0),d3
  475.  mulu #19*3,d3
  476.  add.w d3,d2
  477.  bsr drawblock
  478. nomorphs:
  479.  rts
  480. endmorph:
  481.  add.b #1,0(a2,d4.w)
  482.  clr.w (a0)
  483.  clr.b 0(a4,d4.w)
  484.  bsr checkreactions
  485.  bsr rubexplosion
  486.  lea playersin,a0
  487. playerout:
  488.  add.w #1,player
  489.  move.w players,d6
  490.  cmp.w player,d6
  491.  bge.s firstplayer
  492.  clr.w player
  493. firstplayer:
  494.  move.w player,d0
  495.  tst.b 0(a0,d0.w)
  496.  beq.s playerout
  497.  rts
  498.  
  499. noreact:
  500.  rts
  501. checkreactions:
  502.  tst.w quitflag
  503.  bne.s noreact
  504.  movem.l d0-7/a0-6,-(sp)
  505.  move.w d0,d2
  506.  move.w d1,d3
  507.  mulu #10,d3
  508.  add.w d2,d3
  509.  move.w d3,d4
  510.  move.w d0,d2
  511.  move.w d1,d3
  512.  ext.l d2
  513.  ext.l d3
  514.  divu #10,d2
  515.  divu #6,d3
  516.  swap d2
  517.  swap d3
  518.  tst.w d2
  519.  beq.s edge1
  520.  cmp.w #9,d2
  521.  beq.s edge1
  522.  tst.w d3
  523.  beq.s edge2
  524.  cmp.w #5,d3
  525.  beq.s edge2
  526. centre:
  527.  move.w #4,d3
  528.  bra.s checkexplode
  529. edge1:
  530.  tst.w d3
  531.  beq.s corner
  532.  cmp.w #5,d3
  533.  beq.s corner
  534.  bra.s edge3
  535. edge2:
  536.  tst.w d2
  537.  beq.s corner
  538.  cmp.w #9,d2
  539.  beq.s corner
  540. edge3:
  541.  move.w #3,d3
  542.  bra.s checkexplode
  543. corner:
  544.  move.w #2,d3
  545. checkexplode:
  546.  lea datatable,a2
  547.  cmp.b 0(a2,d4.w),d3
  548.  ble.s explode
  549.  movem.l (sp)+,d0-7/a0-6
  550.  rts
  551. explode:
  552.  bsr rubexplosion
  553.  lea ownertable,a3
  554.  lea inusetable,a4
  555.  clr.b 0(a2,d4.w)
  556.  clr.b 0(a4,d4.w)
  557.  clr.b 0(a3,d4.w)
  558.  move.w #19*12+1,d2
  559.  move.w #1,explosion
  560.  move.w d0,explosion+2
  561.  move.w d1,explosion+4
  562.  bsr drawblock
  563. waitframe:
  564.  cmp.w #5,framecount
  565.  blt.s waitframe
  566.  clr.w framecount
  567.  move.w d1,-(sp)
  568.  addq #1,d1
  569.  bsr spread
  570.  subq #2,d1
  571.  bsr spread
  572.  move.w (sp)+,d1
  573.  addq #1,d0
  574.  bsr spread
  575.  subq #2,d0
  576.  bsr spread
  577.  bsr checkforwinner
  578.  movem.l (sp)+,d0-7/a0-6
  579.  rts
  580.  
  581. rubexplosion:
  582.  tst.w explosion
  583.  beq.s oldexplosion
  584.  movem.w d0-2,-(sp)
  585.  move.w explosion+2,d0
  586.  move.w explosion+4,d1
  587.  move.w #19*12,d2
  588.  clr.w explosion
  589.  bsr drawblock
  590.  movem.w (sp)+,d0-2
  591. oldexplosion:
  592.  rts
  593.  
  594. checkforwinner:
  595.  movem.l d3-4/d7/a0,-(sp)
  596.  lea flags,a1
  597.  clr.l (a1)
  598.  lea ownertable,a0
  599.  move.w #10*6-1,d7
  600. loop19:
  601.  clr.w d4
  602.  move.b (a0)+,d4
  603.  subq #1,d4
  604.  blt.s emptysquare2
  605.  add.b #1,0(a1,d4.w)
  606. emptysquare2:
  607.  dbf d7,loop19
  608.  lea playersin,a0
  609.  move.w players,d7
  610.  clr.w d2
  611. loop21:
  612.  tst.b (a0)
  613.  beq.s stillthere
  614.  tst.b (a1)
  615.  bne.s stillthere
  616.  movem.w d0-2,-(sp)
  617.  move.w d2,d0
  618.  add.w #19*12+6,d2
  619.  moveq #6,d1
  620.  bsr drawblock
  621.  movem.w (sp)+,d0-2
  622.  clr.b (a0)
  623.  sub.w #1,playerno
  624.  bne.s stillthere
  625.  st quitflag
  626.  lea playersin,a0
  627.  clr.w d2
  628. testnext:
  629.  move.w d2,winner
  630.  tst.b (a0)+
  631.  bne.s gameover
  632.  addq #1,d2
  633.  bra.s testnext
  634. stillthere: 
  635.  add.l #1,a0
  636.  add.l #1,a1
  637.  addq #1,d2
  638.  dbf d7,loop21
  639. gameover:
  640.  movem.l (sp)+,d3-4/d7/a0
  641.  rts
  642.  
  643. spread:
  644.  movem.w d0-7/a0-2,-(sp)
  645.  tst.w d0
  646.  blt.s nospread
  647.  tst.w d1
  648.  blt.s nospread
  649.  cmp.w #5,d1
  650.  bgt.s nospread
  651.  cmp.w #9,d0
  652.  bgt.s nospread
  653.  move.w d0,d2
  654.  move.w d1,d3
  655.  mulu #10,d3
  656.  add.w d2,d3
  657.  lea ownertable,a0
  658.  lea datatable,a1
  659.  lea sequ,a2
  660.  move.w player,d4
  661.  move.w d4,d5
  662.  addq #1,d4
  663.  move.b d4,0(a0,d3.w)
  664.  add.b #1,0(a1,d3.w)
  665.  clr.w d2
  666.  move.b 0(a1,d3.w),d2
  667.  add.w d2,d2
  668.  move.w 0(a2,d2.w),d2
  669.  mulu #19*3,d5
  670.  add.w d5,d2
  671.  bsr drawblock
  672.  bsr checkreactions
  673. nospread:
  674.  movem.w (sp)+,d0-7/a0-2
  675.  rts
  676.  
  677.  
  678.  
  679. drawblock:
  680.  movem.l d0-7/a0-6,-(sp)
  681.  mulu #40*16,d1
  682.  add.w d0,d0
  683.  add.w d0,d1
  684.  move.l planeaddr,a0
  685.  add.w d1,a0
  686.  add.l #10+48*40,a0
  687.  lea blocklookup,a1
  688.  add.w d2,d2
  689.  add.w d2,d2
  690.  move.l 0(a1,d2.w),a1
  691.  move.w #15,d7
  692. loop12:
  693.  move.w (a1),(a0)
  694.  move.w 208*38(a1),200*40(a0)
  695.  move.w 2*208*38(a1),2*200*40(a0)
  696.  move.w 3*208*38(a1),3*200*40(a0)
  697.  lea 38(a1),a1
  698.  lea 40(a0),a0
  699.  dbf d7,loop12
  700.  movem.l (sp)+,d0-7/a0-6
  701.  rts
  702.  
  703. leftclick:
  704.  btst #6,$bfe001
  705.  beq.s buttondown
  706.  clr.w buttonflag
  707.  rts
  708. buttondown: 
  709.  tst.w buttonflag
  710.  bne.s nohit
  711.  st buttonflag
  712.  move.w mousex,d0
  713.  move.w mousey,d1
  714.  lsr.w #4,d0
  715.  lsr.w #4,d1
  716.  sub.w #5,d0
  717.  blt.s nohit
  718.  sub.w #3,d1
  719.  blt.s nohit
  720.  cmp.w #10,d0
  721.  bge.s nohit
  722.  cmp.w #6,d1
  723.  bge.s nohit
  724.  bsr startmorph
  725. nohit:
  726.  rts
  727.  
  728. startmorph:
  729.  move.w d0,d4
  730.  move.w d1,d5
  731.  mulu #10,d5
  732.  add.w d5,d4
  733.  lea inusetable,a1
  734.  lea datatable,a2
  735.  lea ownertable,a3
  736.  move.w player,d3
  737.  addq.w #1,d3
  738.  move.b 0(a3,d4.w),d2
  739.  beq.s emptysquare
  740.  cmp.b d3,d2
  741.  bne.s inusemate
  742. emptysquare:
  743.  cmp.b #4,0(a2,d4.w)
  744.  beq.s inusemate
  745.  tst.b 0(a1,d4.w)
  746.  bne.s inusemate
  747.  lea morphtable,a0
  748.  tst.w (a0)
  749.  beq.s foundspace
  750.  rts
  751. foundspace:
  752.  move.b #1,0(a1,d4.w)
  753.  move.w #1,(a0)
  754.  move.w d0,2(a0)
  755.  move.w d1,4(a0)
  756.  clr.w 6(a0)
  757.  move.w player,8(a0)
  758.  move.b d3,0(a3,d4.w)
  759. inusemate:
  760.  rts
  761.  
  762. allocate:
  763.  move.l #$10002,d1
  764.  move.l #memsize,d0
  765.  move.l 4,a6
  766.  jsr allocmem(a6)
  767.  move.l d0,planeaddr
  768.  move.l d0,d1
  769.  add.l #40*200*4,d1
  770.  move.l d1,logoaddr
  771.  rts
  772. free:
  773.  move.l planeaddr,a1
  774.  move.l #memsize,d0
  775.  move.l 4,a6
  776.  jsr freemem(a6)
  777.  rts
  778.  
  779. newcopper:
  780.  bsr initplanes
  781.  bsr initcolours2
  782.  bsr initsprites
  783.  move.l #copperlist,$80(a5)
  784.  clr.w $88(a5)
  785.  move.w #$83e0,$96(a5)
  786.  move.w #$c010,$9a(a5)
  787.  rts
  788.  
  789. initsprites:
  790.  lea sprites,a0
  791.  move.l #mousepointer,d0
  792.  move.w d0,2(a0)
  793.  swap d0
  794.  move.w d0,6(a0)
  795.  lea 8(a0),a0
  796.  move.l #blanksprite,d0
  797.  move.w #6,d7
  798. loop7:
  799.  move.w d0,2(a0)
  800.  swap d0
  801.  move.w d0,6(a0)
  802.  swap d0
  803.  lea 8(a0),a0
  804.  dbf d7,loop7
  805.  rts
  806.  
  807. initcolours:
  808.  lea colours,a0
  809.  lea tiles,a1
  810.  moveq #15,d7
  811. loop2:
  812.  move.w (a1)+,2(a0)
  813.  lea 4(a0),a0
  814.  dbf d7,loop2
  815.  rts
  816. initcolours2:
  817.  lea colours2,a0
  818.  moveq #7,d7
  819. loop91:
  820.  clr.w 2(a0)
  821.  lea 4(a0),a0
  822.  dbf d7,loop91
  823.  rts
  824.  
  825. initplanes:
  826.  lea planes,a0
  827.  move.l planeaddr,d0
  828.  moveq #3,d7
  829. loop1:
  830.  move.w d0,2(a0)
  831.  swap d0
  832.  move.w d0,6(a0)
  833.  swap d0
  834.  add.l #40*200,d0
  835.  lea 8(a0),a0
  836.  dbf d7,loop1
  837.  lea planes2,a0
  838.  move.l logoaddr,d0
  839.  moveq #2,d7
  840. loop90:
  841.  move.w d0,2(a0)
  842.  swap d0
  843.  move.w d0,6(a0)
  844.  swap d0
  845.  add.l #44*40,d0
  846.  lea 8(a0),a0
  847.  dbf d7,loop90
  848.  rts
  849.  
  850. oldcopper:
  851.  clr.l d0
  852.  lea grname,a1
  853.  move.l 4,a6
  854.  jsr openlibrary(a6)
  855.  move.l d0,a1
  856.  move.l 38(a1),$80(a5)
  857.  clr.w $88(a5)
  858.  rts
  859.  
  860.  
  861. killsystem:
  862.  move.w 2(a5),d0
  863.  or.w #$8000,d0
  864.  move.w d0,dmasave+2
  865.  move.w $1c(a5),d0
  866.  or.w #$c000,d0
  867.  move.w d0,intsave+2
  868.  move.l $6c,vecsave+2
  869.  move.w #$7fff,d0
  870.  move.w d0,$96(a5)
  871.  move.w d0,$9a(a5)
  872.  move.l #inter,$6c
  873.  rts
  874.  
  875. freesystem:
  876. vecsave move.l #0,$6c
  877. dmasave move.w #0,$96(a5)
  878. intsave move.w #0,$9a(a5)
  879.  rts
  880.  
  881. inter:
  882.  movem.l d0-7/a0-6,-(sp)
  883.  lea $dff000,a5
  884.  add.w #1,framecount
  885.  bsr readmouse
  886.  bsr drawlogo
  887.  bsr fades
  888.  move.w slider,colours+6
  889.  cmp.w #$fff,slider
  890.  beq.s white
  891.  add.w #$111,slider
  892. white:
  893.  tst.w musicflag
  894.  beq.s nomusic
  895.  jsr mt_music
  896. nomusic:
  897.  lea $dff000,a5
  898.  move.w #$10,$9c(a5)
  899.  movem.l (sp)+,d0-7/a0-6
  900.  rte
  901.  
  902. drawlogo:
  903.  btst #14,2(a5)
  904.  bne.s drawlogo
  905.  move.l logoaddr,d0
  906.  add.l #10,d0
  907.  move.l d0,$54(a5)
  908.  clr.w $42(a5)
  909.  move.w #%100000000,$40(a5)
  910.  move.l #-1,$44(a5)
  911.  move.w #40-20,$66(a5)
  912.  move.w #44*3*64+10,$58(a5)
  913.  lea sinewave,a0
  914.  lea 1800(a0),a1
  915.  move.w xrot,d0
  916.  move.w yrot,d2
  917.  add.w d0,d0
  918.  add.w d2,d2
  919.  move.w 0(a1,d0.w),d1
  920.  move.w 0(a0,d0.w),d0
  921.  move.w 0(a1,d2.w),d3
  922.  move.w 0(a1,d2.w),d2
  923.  move.l d2,-(sp)
  924.  add.w #128,d2
  925.  muls d0,d2
  926.  blt.s behind
  927.  move.l (sp)+,d2
  928.  bsr blitlogo
  929.  asr.w #3,d0
  930.  asr.w #3,d1
  931.  asr.w #3,d2
  932.  muls d2,d0
  933.  asr.w #4,d0
  934.  add.w #154,d0
  935.  add.w #16,d1
  936.  bsr bob
  937.  bra.s infront
  938. behind:
  939.  move.l (sp)+,d2
  940.  asr.w #3,d0
  941.  asr.w #3,d1
  942.  asr.w #3,d2
  943.  muls d2,d0
  944.  asr.w #4,d0
  945.  add.w #154,d0
  946.  add.w #16,d1
  947.  bsr bob
  948.  bsr blitlogo
  949. infront: 
  950.  sub.w #100,xrot
  951.  bge.s nolim
  952.  add.w #3600,xrot
  953. nolim:
  954.  sub.w #5,yrot
  955.  bge.s nolim2
  956.  add.w #3600,yrot
  957. nolim2:
  958.  rts
  959.  
  960. blitlogo:
  961.  movem.w d0-3,-(sp)
  962.  move.l #logo+16,d3
  963.  move.l #mask,d4
  964. wblit8:
  965.  btst #14,2(a5)
  966.  bne.s wblit8 
  967.  move.l logoaddr,d0
  968.  add.l #10,d0
  969.  move.l d3,$50(a5)
  970.  move.w #40-20,$60(a5)
  971.  clr.w $42(a5)
  972.  move.w #40-20,$66(a5)
  973.  move.w #4,$64(a5)
  974.  move.w #4,$62(a5)
  975.  move.l #-1,$44(a5)
  976.  move.w #%111111110010,$40(a5)
  977.  moveq #2,d7
  978. wblit7:
  979.  btst #14,2(a5)
  980.  bne.s wblit7
  981.  move.l d0,$54(a5)
  982.  move.l d0,$48(a5)
  983.  move.l d4,$4c(a5)
  984.  move.w #44*64+10,$58(a5)
  985.  add.l #44*40,d0
  986.  dbf d7,wblit7
  987.  movem.w (sp)+,d0-3
  988.  rts
  989.  
  990. bob:
  991.  movem.l d0-7/a0-6,-(sp)
  992. wblt9:
  993.  btst #14,2(a5)
  994.  bne.s wblt9
  995.  mulu #40,d1
  996.  move.l logoaddr,d2
  997.  add.l d1,d2
  998.  move.w d0,d3
  999.  lsr.w #3,d0
  1000.  bclr #0,d0
  1001.  add.w d0,d2
  1002.  and.w #15,d3
  1003.  ror.w #4,d3
  1004.  move.w d3,$42(a5)
  1005.  or.w #%111111110010,d3
  1006.  move.w d3,$40(a5)
  1007.  move.l #$ffff0000,$44(a5)
  1008.  move.l #logo+16+20,d0
  1009.  move.l #mask+20,d1
  1010.  move.w #40-4,$66(a5)
  1011.  move.w #40-4,$60(a5)
  1012.  move.w #20,$64(a5)
  1013.  move.w #20,$62(a5)
  1014.  moveq #2,d7
  1015. nextplane:
  1016.  btst #14,2(a5)
  1017.  bne.s nextplane
  1018.  move.l d0,$50(a5)
  1019.  move.l d1,$4c(a5)
  1020.  move.l d2,$54(a5)
  1021.  move.l d2,$48(a5)
  1022.  move.w #8*64+2,$58(a5)
  1023.  add.l #44*40,d2
  1024.  add.l #44*24,d0
  1025.  dbf d7,nextplane
  1026.  movem.l (sp)+,d0-7/a0-6
  1027.  rts
  1028.  
  1029. fades:
  1030.  tst.w fadeflag
  1031.  beq.s nomorefades
  1032.  tst.w slider2
  1033.  beq.s nomorefades
  1034.  add.w #1,slider2
  1035.  move.w slider2,d4
  1036.  lea logo,a0
  1037.  lea colours2,a1
  1038.  moveq #7,d7
  1039. loop901:
  1040.  move.w (a0)+,d0
  1041.  move.w d0,d1
  1042.  move.w d0,d2
  1043.  and.w #$f,d0
  1044.  and.w #$f0,d1
  1045.  and.w #$f00,d2
  1046.  lsr.w #4,d1
  1047.  lsr.w #8,d2
  1048.  add.w d4,d0
  1049.  bge.s norm1
  1050.  clr.w d0
  1051. norm1:
  1052.  add.w d4,d1
  1053.  bge.s norm2
  1054.  clr.w d1
  1055. norm2:
  1056.  add.w d4,d2
  1057.  bge.s norm3
  1058.  clr.w d2
  1059. norm3: 
  1060.  lsl.w #4,d1
  1061.  lsl.w #8,d2
  1062.  or.w d1,d0
  1063.  or.w d2,d0
  1064.  move.w d0,2(a1)
  1065.  lea 4(a1),a1
  1066.  dbf d7,loop901
  1067. nomorefades:
  1068.  rts
  1069.  
  1070. readmouse:
  1071.  move.w $a(a5),d0
  1072.  move.w d0,d1
  1073.  and.w #$ff,d0
  1074.  lsr.w #8,d1
  1075.  move.w oldmousex,d2
  1076.  move.w oldmousey,d3
  1077.  move.w d0,oldmousex
  1078.  move.w d1,oldmousey
  1079.  sub.w d2,d0
  1080.  sub.w d3,d1
  1081.  cmp.w #-127,d0
  1082.  bgt.s nounder1
  1083.  add.w #255,d0
  1084. nounder1:
  1085.  cmp.w #-127,d1
  1086.  bgt.s nounder2
  1087.  add.w #255,d1
  1088. nounder2:
  1089.  cmp.w #127,d0
  1090.  blt.s noover1
  1091.  sub.w #255,d0
  1092. noover1:
  1093.  cmp.w #127,d1
  1094.  blt.s noover2
  1095.  sub.w #255,d1
  1096. noover2:
  1097.  add.w mousex,d0
  1098.  bge.s border1
  1099.  clr.w d0
  1100. border1:
  1101.  add.w mousey,d1
  1102.  bge.s border2
  1103.  clr.w d1
  1104. border2:
  1105.  cmp.w #318,d0
  1106.  blt.s border3
  1107.  move.w #317,d0
  1108. border3:
  1109.  cmp.w #148,d1
  1110.  blt.s border4
  1111.  move.w #147,d1
  1112. border4:
  1113.  move.w d0,mousex
  1114.  move.w d1,mousey
  1115.  bsr setsprite
  1116.  rts
  1117.  
  1118. clipping:
  1119.  movem.l d6-7,-(sp)
  1120.  move.w d6,d7
  1121.  clr.w d5
  1122.  cmp.w d1,d3
  1123.  blt.s greater
  1124.  exg d1,d3
  1125.  exg d0,d2
  1126. greater:
  1127.  tst.w d1
  1128.  blt.s offscreen
  1129.  cmp.w #200,d3
  1130.  bge.s offscreen
  1131.  cmp.w #200,d1
  1132.  blt.s notd1down
  1133.  bsr clipd1down
  1134. notd1down:
  1135.  tst.w d3
  1136.  bge.s notd3up
  1137.  bsr clipd3up
  1138. notd3up:
  1139.  cmp.w d0,d2
  1140.  blt.s greater2
  1141.  exg d1,d3
  1142.  exg d0,d2
  1143. greater2:
  1144.  tst.w d0
  1145.  blt.s offscreen
  1146.  cmp.w #320,d2
  1147.  bge.s offscreen
  1148.  tst.w d2
  1149.  bge.s notd2left
  1150.  bsr clipd2left
  1151. notd2left:
  1152.  cmp.w #320,d0
  1153.  blt.s notd0right
  1154.  bsr clipd0right
  1155. notd0right:
  1156.  movem.l (sp)+,d6-7
  1157.  rts
  1158. offscreen:
  1159.  move.w #1,d5
  1160.  movem.l (sp)+,d6-7
  1161.  rts
  1162. clipd1down:
  1163.  move.w d3,d4
  1164.  sub.w d1,d3
  1165.  beq.s vertical2
  1166.  sub.w #200,d1
  1167.  move.w d0,d6
  1168.  sub.w d2,d6
  1169.  muls d1,d6
  1170.  divs d3,d6
  1171.  add.w d6,d0
  1172. vertical2:
  1173.  move.w #199,d1
  1174.  move.w d4,d3
  1175.  rts
  1176. clipd0right:
  1177.  move.w d2,d4
  1178.  sub.w d0,d2
  1179.  beq.s vertical4
  1180.  sub.w #320,d0
  1181.  move.w d1,d6
  1182.  move.w d1,d7
  1183.  sub.w d3,d6
  1184.  muls d0,d6
  1185.  divs d2,d6
  1186.  add.w d6,d1
  1187. vertical4:
  1188.  move.w #319,d0
  1189.  move.w d4,d2
  1190.  rts
  1191. clipd3up:
  1192.  move.w d1,d4
  1193.  sub.w d3,d1
  1194.  beq.s vertical1
  1195.  move.w d2,d6
  1196.  sub.w d0,d6
  1197.  muls d3,d6
  1198.  divs d1,d6
  1199.  add.w d6,d2
  1200. vertical1:
  1201.  clr.w d3
  1202.  move.w d4,d1
  1203.  rts
  1204. clipd2left:
  1205.  move.w d0,d4
  1206.  sub.w d2,d0
  1207.  beq.s vertical3
  1208.  move.w d3,d6
  1209.  sub.w d1,d6
  1210.  muls d2,d6
  1211.  divs d0,d6
  1212.  add.w d6,d3
  1213. vertical3:
  1214.  clr.w d2
  1215.  move.w d4,d0
  1216.  rts
  1217.  
  1218.  
  1219. setsprite:
  1220.  add.w #$2c+3*16,d1
  1221.  add.w #$81,d0
  1222.  move.w d1,d3
  1223.  clr.w d2
  1224.  lsl.w #8,d1
  1225.  roxl.b #1,d2
  1226.  add.w #19,d3
  1227.  lsl.w #8,d3
  1228.  roxl.b #1,d2
  1229.  lsr.w #1,d0
  1230.  roxl.b #1,d2
  1231.  or.w d2,d3
  1232.  or.w d0,d1
  1233.  lea mousepointer,a0
  1234.  move.w d3,2(a0)
  1235.  move.w d1,(a0)
  1236.  rts
  1237.   
  1238. copperlist:
  1239. sprites:
  1240.  dc.w spr0ptl,0,spr0pth,0,spr1ptl,0,spr1pth,0,spr2ptl,0,spr2pth,0,spr3ptl,0,spr3pth,0,spr4ptl,0,spr4pth,0,spr5ptl,0,spr5pth,0,spr6ptl,0,spr6pth,0,spr7ptl,0,spr7pth,0
  1241.  dc.w ddfstrt,$38,ddfstop,$d0
  1242.  dc.w diwstrt,$3081,diwstop,$0ac1
  1243.  dc.w bplcon0,$3000,bplcon1,0,bplcon2,0,bpl1mod,0,bpl2mod,0
  1244. planes2:
  1245.  dc.w bpl1ptl,0,bpl1pth,0,bpl2ptl,0,bpl2pth,0,bpl3ptl,0,bpl3pth,0
  1246. colours2:
  1247.  dc.w col00,0,col01,0,col02,0,col03,0,col04,0,col05,0,col06,0,col07,0
  1248.  dc.w $5ad9,$fffe
  1249.  dc.w bplcon0,$4000,bplcon1,0,bplcon2,%100100,bpl1mod,0,bpl2mod,0
  1250. planes:
  1251.  dc.w bpl1ptl,0,bpl1pth,0,bpl2ptl,0,bpl2pth,0,bpl3ptl,0,bpl3pth,0,bpl4ptl,0,bpl4pth,0
  1252. colours:
  1253.  dc.w col00,0,col01,0,col02,0,col03,0,col04,0,col05,0,col06,0,col07,0,col08,0,col09,0,col10,0,col11,0,col12,0,col13,0,col14,0,col15,0
  1254.  dc.w col16,0,col17
  1255. pointercol:
  1256.  dc.w $fff,col18,0,col19,0
  1257.  dc.w $d009,$fffe,$9c,$8010
  1258.  dc.w $ffff,$fffe
  1259.  
  1260. blanksprite    dc.w 0,0
  1261.  
  1262. mousepointer    dc.w 0,0
  1263.         dc.w %0000000000000000,%1100000000000000
  1264.         dc.w %0100000000000000,%1010000000000000
  1265.         dc.w %0110000000000000,%1001000000000000
  1266.         dc.w %0111000000000000,%1000100000000000
  1267.         dc.w %0111100000000000,%1000010000000000
  1268.         dc.w %0111110000000000,%1000001000000000
  1269.         dc.w %0111111000000000,%1000000100000000
  1270.         dc.w %0111111100000000,%1000000010000000
  1271.         dc.w %0111111110000000,%1000000001000000
  1272.         dc.w %0111111100000000,%1000000010000000
  1273.         dc.w %0111111000000000,%1000000100000000
  1274.         dc.w %0111111100000000,%1000000010000000
  1275.         dc.w %0111111100000000,%1000000010000000
  1276.         dc.w %0111011110000000,%1000100001000000
  1277.         dc.w %0110011110000000,%1001100001000000
  1278.         dc.w %0100001111000000,%1010010000100000
  1279.         dc.w %0000001110000000,%0100010001000000
  1280.         dc.w %0000000000000000,%0000001110000000
  1281.         dc.w 0,0
  1282.  
  1283. grname        dc.b 'graphics.library',0
  1284.         even
  1285. planeaddr    dc.l 0
  1286. logoaddr    dc.l 0
  1287. musicflag    dc.w 0
  1288. player        dc.w 0
  1289. oldmousex    dc.w 0
  1290. slider        dc.w 0
  1291. players        dc.w 0
  1292. rot        dc.w 0
  1293. winner        dc.w 0
  1294. distance    dc.w 0
  1295. oldmousey    dc.w 0
  1296. slider2        dc.w 0
  1297. fadeflag    dc.w 0
  1298. mousex        dc.w 0
  1299. mousey        dc.w 0
  1300. quitflag    dc.w 0
  1301. toggler        dc.w 0
  1302. buttonflag    dc.w 0
  1303. framecount    dc.w 0
  1304. xrot        dc.w 0
  1305. yrot        dc.w 0
  1306.  
  1307. startdata:
  1308. datatable    dcb.b 10*6,0
  1309. inusetable    dcb.b 10*6,0
  1310. ownertable    dcb.b 10*6,0
  1311. morphtable    dcb.w 1*10,0
  1312. enddata:
  1313.  
  1314. coords        dc.w 17,-500,-300,500,-300,-500,-200,500,-200,-500,-100,500,-100,-500,0,500,0,-500,100,500,100,-500,200,500,200,-500,300,500,300
  1315.         dc.w -500,-300,-500,300,-400,-300,-400,300,-300,-300,-300,300,-200,-300,-200,300,-100,-300,-100,300,0,-300,0,300,100,-300,100,300,200,-300,200,300,300,-300,300,300,400,-300,400,300,500,-300,500,300
  1316.  
  1317. blocksequ    dc.w 59,58,49,57,48,39,56,47,38,29,55,46,37,28,19,54,45,36,27,18,09,53,44,35,26,17,08
  1318.         dc.w 52,43,34,25,16,07,51,42,33,24,15,06,50,41,32,23,14,05,40,31,22,13,04,30,21,12,03
  1319.         dc.w 20,11,02,10,01,00
  1320. playersin    dc.b 0,0,0,0
  1321. flags        dc.b 0,0,0,0
  1322. playerno    dc.w 0
  1323. explosion    dc.w 0,0,0
  1324. collook        dc.w $f00,$0f0,$f80,$00f
  1325. sequences    dc.l sequence1,sequence2,sequence3,sequence4
  1326. sequence1    dc.w 0,-1
  1327. sequence2    dc.w 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,-1
  1328. sequence3    dc.w 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,-1
  1329. sequence4    dc.w 38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,-1
  1330. sequ        dc.w 0,0,18,37,56
  1331.  
  1332. text1        dc.b '  how many players',-1
  1333. text2        dc.b 124,0,125,0,126,-1
  1334. text3        dc.b 'well done ',-1
  1335. text4        dc.b 'play again  y n',-1
  1336.         even
  1337.  
  1338. blocklookup    dcb.l 256,0
  1339. tiles        incbin "ram:atomtiles.bitmap"
  1340. sinewave    incbin "ram:sinewavetable2"
  1341. logo        incbin "ram:atomslogo.bitmap"
  1342. mask        incbin "ram:atomslogo.mask"
  1343. font        incbin "ram:atomfont.bitmap"
  1344.  
  1345. mt_init:lea     mt_data,a0
  1346.     lea    $3b8(a0),a1
  1347.     moveq    #$7f,d0
  1348.     moveq    #0,d2
  1349.     moveq    #0,d1
  1350. mt_lop2:move.b    (a1)+,d1
  1351.     cmp.b    d2,d1
  1352.     ble.s    mt_lop
  1353.     move.l    d1,d2
  1354. mt_lop:    dbf    d0,mt_lop2
  1355.     addq.b    #1,d2
  1356.  
  1357.     asl.l    #8,d2
  1358.     asl.l    #2,d2
  1359.     lea    4(a1,d2.l),a2
  1360.     lea    mt_samplestarts(pc),a1
  1361.     add.w    #42,a0
  1362.     moveq    #$1e,d0
  1363. mt_lop3:clr.l    (a2)
  1364.     move.l    a2,(a1)+
  1365.     moveq    #0,d1
  1366.     move.w    (a0),d1
  1367.     clr.b    2(a0)
  1368.     asl.l    #1,d1
  1369.     add.l    d1,a2
  1370.     add.l    #$1e,a0
  1371.     dbf    d0,mt_lop3
  1372.  
  1373.     or.b    #2,$bfe001
  1374.     move.b    #6,mt_speed
  1375.     moveq    #0,d0
  1376.     lea    $dff000,a0
  1377.     move.w    d0,$a8(a0)
  1378.     move.w    d0,$b8(a0)
  1379.     move.w    d0,$c8(a0)
  1380.     move.w    d0,$d8(a0)
  1381.     clr.b    mt_songpos
  1382.     clr.b    mt_counter
  1383.     clr.w    mt_pattpos
  1384.     rts
  1385.  
  1386. mt_end:    clr.w    $dff0a8
  1387.     clr.w    $dff0b8
  1388.     clr.w    $dff0c8
  1389.     clr.w    $dff0d8
  1390.     move.w    #$f,$dff096
  1391.     rts
  1392.  
  1393. mt_music:
  1394.     lea     mt_data,a0
  1395.     addq.b    #1,mt_counter
  1396.     move.b    mt_counter(pc),d0
  1397.     cmp.b    mt_speed(pc),d0
  1398.     blt    mt_nonew
  1399.     clr.b    mt_counter
  1400.  
  1401.     lea     mt_data,a0
  1402.     lea    $c(a0),a3
  1403.     lea    $3b8(a0),a2
  1404.     lea    $43c(a0),a0
  1405.  
  1406.     moveq    #0,d0
  1407.     moveq    #0,d1
  1408.     move.b    mt_songpos(pc),d0
  1409.     move.b    (a2,d0.w),d1
  1410.     lsl.w    #8,d1
  1411.     lsl.w    #2,d1
  1412.     add.w    mt_pattpos(pc),d1
  1413.     clr.w    mt_dmacon
  1414.  
  1415.     lea    $dff0a0,a5
  1416.     lea    mt_voice1(pc),a4
  1417.     bsr    mt_playvoice
  1418.     addq.l    #4,d1
  1419.     lea    $dff0b0,a5
  1420.     lea    mt_voice2(pc),a4
  1421.     bsr    mt_playvoice
  1422.     addq.l    #4,d1
  1423.     lea    $dff0c0,a5
  1424.     lea    mt_voice3(pc),a4
  1425.     bsr    mt_playvoice
  1426.     addq.l    #4,d1
  1427.     lea    $dff0d0,a5
  1428.     lea    mt_voice4(pc),a4
  1429.     bsr    mt_playvoice
  1430.  
  1431.     move.w mt_dmacon(pc),d0
  1432.     beq.s    mt_nodma
  1433.     bsr    mt_wait
  1434.     or.w    #$8000,d0
  1435.     move.w    d0,$dff096
  1436.     bsr    mt_wait
  1437. mt_nodma:
  1438.     lea    mt_voice1(pc),a4
  1439.     lea    $dff000,a3
  1440.     move.l    $a(a4),$a0(a3)
  1441.     move.w    $e(a4),$a4(a3)
  1442.     move.l    $a+$1c(a4),$b0(a3)
  1443.     move.w    $e+$1c(a4),$b4(a3)
  1444.     move.l    $a+$38(a4),$c0(a3)
  1445.     move.w    $e+$38(a4),$c4(a3)
  1446.     move.l    $a+$54(a4),$d0(a3)
  1447.     move.w    $e+$54(a4),$d4(a3)
  1448.  
  1449.     add.w    #$10,mt_pattpos
  1450.     cmp.w    #$400,mt_pattpos
  1451.     bne.s    mt_exit
  1452. mt_next:clr.w    mt_pattpos
  1453.     clr.b    mt_break
  1454.     addq.b    #1,mt_songpos
  1455.     and.b    #$7f,mt_songpos
  1456.     move.b -2(a2),d0
  1457.     cmp.b    mt_songpos(pc),d0
  1458.     bne.s    mt_exit
  1459.     move.b    -1(a2),mt_songpos
  1460. mt_exit:tst.b    mt_break
  1461.     bne.s    mt_next
  1462.     rts
  1463.  
  1464. mt_wait:moveq    #3,d3        
  1465. mt_wai2:move.b    $dff006,d2    
  1466. mt_wai3:cmp.b    $dff006,d2    
  1467.     beq.s    mt_wai3
  1468.     dbf    d3,mt_wai2    
  1469.     moveq    #8,d2
  1470. mt_wai4:dbf    d2,mt_wai4
  1471.     rts
  1472.  
  1473. mt_nonew:
  1474.     lea    mt_voice1(pc),a4
  1475.     lea    $dff0a0,a5
  1476.     bsr    mt_com
  1477.     lea    mt_voice2(pc),a4
  1478.     lea    $dff0b0,a5
  1479.     bsr    mt_com
  1480.     lea    mt_voice3(pc),a4
  1481.     lea    $dff0c0,a5
  1482.     bsr    mt_com
  1483.     lea    mt_voice4(pc),a4
  1484.     lea    $dff0d0,a5
  1485.     bsr    mt_com
  1486.     bra.s    mt_exit
  1487.  
  1488. mt_mulu:
  1489.     dc.w    0,$1e,$3c,$5a,$78,$96,$b4,$d2,$f0,$10e,$12c,$14a
  1490.     dc.w    $168,$186,$1a4,$1c2,$1e0,$1fe,$21c,$23a,$258,$276
  1491.     dc.w    $294,$2b2,$2d0,$2ee,$30c,$32a,$348,$366,$384,$3a2
  1492.  
  1493. mt_playvoice:
  1494.     move.l    (a0,d1.l),(a4)
  1495.     moveq    #0,d2
  1496.     move.b    2(a4),d2
  1497.     lsr.b    #4,d2
  1498.     move.b    (a4),d0
  1499.     and.b    #$f0,d0
  1500.     or.b    d0,d2
  1501.     beq.s    mt_oldinstr
  1502.  
  1503.     lea    mt_samplestarts-4(pc),a1
  1504.     asl.w    #2,d2
  1505.     move.l    (a1,d2.l),4(a4)
  1506.     lsr.w    #1,d2
  1507.     move.w    mt_mulu(pc,d2.w),d2
  1508.     move.w    (a3,d2.w),8(a4)
  1509.     move.w    2(a3,d2.w),$12(a4)
  1510.     moveq    #0,d3
  1511.     move.w    4(a3,d2.w),d3
  1512.     tst.w    d3
  1513.     beq.s    mt_noloop
  1514.     move.l    4(a4),d0
  1515.     asl.w    #1,d3
  1516.     add.l    d3,d0
  1517.     move.l    d0,$a(a4)
  1518.     move.w    4(a3,d2.w),d0
  1519.     add.w    6(a3,d2.w),d0
  1520.     move.w    d0,8(a4)
  1521.     bra.s    mt_hejaSverige
  1522. mt_noloop:
  1523.     move.l    4(a4),d0
  1524.     add.l    d3,d0
  1525.     move.l    d0,$a(a4)
  1526. mt_hejaSverige:
  1527.     move.w    6(a3,d2.w),$e(a4)
  1528.     moveq    #0,d0
  1529.     move.b    $13(a4),d0
  1530.     move.w     d0,8(a5)
  1531.  
  1532. mt_oldinstr:
  1533.     move.w    (a4),d0
  1534.     and.w    #$fff,d0
  1535.     beq    mt_com2
  1536.     tst.w    8(a4)
  1537.     beq.s    mt_stopsound
  1538.     tst.b    $12(a4)
  1539.     bne.s    mt_stopsound
  1540.     move.b    2(a4),d0
  1541.     and.b    #$f,d0
  1542.     cmp.b    #5,d0
  1543.     beq.s    mt_setport
  1544.     cmp.b    #3,d0
  1545.     beq.s    mt_setport
  1546.  
  1547.     move.w    (a4),$10(a4)
  1548.     and.w    #$fff,$10(a4)
  1549.     move.w    $1a(a4),$dff096
  1550.     clr.b    $19(a4)
  1551.  
  1552.     move.l    4(a4),(a5)
  1553.     move.w    8(a4),4(a5)
  1554.     move.w    $10(a4),6(a5)
  1555.  
  1556.     move.w    $1a(a4),d0
  1557.     or.w    d0,mt_dmacon
  1558.     bra    mt_com2
  1559.  
  1560. mt_stopsound:
  1561.     move.w    $1a(a4),$dff096
  1562.     bra    mt_com2
  1563.  
  1564. mt_setport:
  1565.     move.w    (a4),d2
  1566.     and.w    #$fff,d2
  1567.     move.w    d2,$16(a4)
  1568.     move.w    $10(a4),d0
  1569.     clr.b    $14(a4)
  1570.     cmp.w    d0,d2
  1571.     beq.s    mt_clrport
  1572.     bge    mt_com2
  1573.     move.b    #1,$14(a4)
  1574.     bra    mt_com2
  1575. mt_clrport:
  1576.     clr.w    $16(a4)
  1577.     rts
  1578.  
  1579. mt_port:move.b    3(a4),d0
  1580.     beq.s    mt_port2
  1581.     move.b    d0,$15(a4)
  1582.     clr.b    3(a4)
  1583. mt_port2:
  1584.     tst.w    $16(a4)
  1585.     beq.s    mt_rts
  1586.     moveq    #0,d0
  1587.     move.b    $15(a4),d0
  1588.     tst.b    $14(a4)
  1589.     bne.s    mt_sub
  1590.     add.w    d0,$10(a4)
  1591.     move.w    $16(a4),d0
  1592.     cmp.w    $10(a4),d0
  1593.     bgt.s    mt_portok
  1594.     move.w    $16(a4),$10(a4)
  1595.     clr.w    $16(a4)
  1596. mt_portok:
  1597.     move.w    $10(a4),6(a5)
  1598. mt_rts:    rts
  1599.  
  1600. mt_sub:    sub.w    d0,$10(a4)
  1601.     move.w    $16(a4),d0
  1602.     cmp.w    $10(a4),d0
  1603.     blt.s    mt_portok
  1604.     move.w    $16(a4),$10(a4)
  1605.     clr.w    $16(a4)
  1606.     move.w    $10(a4),6(a5)
  1607.     rts
  1608.  
  1609. mt_sin:
  1610.     dc.b    0,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4
  1611.     dc.b    $fa,$fd
  1612.     dc.b    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61
  1613.     dc.b    $4a,$31,$18
  1614.  
  1615. mt_vib:    move.b    $3(a4),d0
  1616.     beq.s    mt_vib2
  1617.     move.b    d0,$18(a4)
  1618.  
  1619. mt_vib2:move.b    $19(a4),d0
  1620.     lsr.w    #2,d0
  1621.     and.w    #$1f,d0
  1622.     moveq    #0,d2
  1623.     move.b    mt_sin(pc,d0.w),d2
  1624.     move.b    $18(a4),d0
  1625.     and.w    #$f,d0
  1626.     mulu    d0,d2
  1627.     lsr.w    #7,d2
  1628.     move.w    $10(a4),d0
  1629.     tst.b    $19(a4)
  1630.     bmi.s    mt_vibsub
  1631.     add.w    d2,d0
  1632.     bra.s    mt_vib3
  1633. mt_vibsub:
  1634.     sub.w    d2,d0
  1635. mt_vib3:move.w    d0,6(a5)
  1636.     move.b    $18(a4),d0
  1637.     lsr.w    #2,d0
  1638.     and.w    #$3c,d0
  1639.     add.b    d0,$19(a4)
  1640.     rts
  1641.  
  1642. mt_arplist:
  1643.     dc.b    0,1,2,0,1,2,0,1,2,0,1,2,0
  1644.     dc.b    1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  1645.  
  1646. mt_arp:    moveq    #0,d0
  1647.     move.b    mt_counter(pc),d0
  1648.     move.b    mt_arplist(pc,d0.w),d0
  1649.     beq.s    mt_arp0
  1650.     cmp.b    #2,d0
  1651.     beq.s    mt_arp2
  1652. mt_arp1:moveq    #0,d0
  1653.     move.b    3(a4),d0
  1654.     lsr.b    #4,d0
  1655.     bra.s    mt_arpdo
  1656. mt_arp2:moveq    #0,d0
  1657.     move.b    3(a4),d0
  1658.     and.b    #$f,d0
  1659. mt_arpdo:
  1660.     asl.w    #1,d0
  1661.     move.w    $10(a4),d1
  1662.     and.w    #$fff,d1
  1663.     lea    mt_periods(pc),a0
  1664.     moveq    #$24,d2
  1665. mt_arp3:cmp.w    (a0)+,d1
  1666.     bge.s    mt_arpfound
  1667.     dbf    d2,mt_arp3
  1668. mt_arp0:move.w    $10(a4),6(a5)
  1669.     rts
  1670. mt_arpfound:
  1671.     move.w    -2(a0,d0.w),6(a5)
  1672.     rts
  1673.  
  1674. mt_normper:
  1675.     move.w    $10(a4),6(a5)
  1676.     rts
  1677.  
  1678. mt_com:    move.w    2(a4),d0
  1679.     and.w    #$fff,d0
  1680.     beq.s    mt_normper
  1681.     move.b    2(a4),d0
  1682.     and.b    #$f,d0
  1683.     tst.b    d0
  1684.     beq.s    mt_arp
  1685.     cmp.b    #1,d0
  1686.     beq.s    mt_portup
  1687.     cmp.b    #2,d0
  1688.     beq.s    mt_portdown
  1689.     cmp.b    #3,d0
  1690.     beq    mt_port
  1691.     cmp.b    #4,d0
  1692.     beq    mt_vib
  1693.     cmp.b    #5,d0
  1694.     beq.s    mt_volport
  1695.     cmp.b    #6,d0
  1696.     beq.s    mt_volvib
  1697.     move.w    $10(a4),6(a5)
  1698.     cmp.b    #$a,d0
  1699.     beq.s    mt_volslide
  1700.     rts
  1701.  
  1702. mt_portup:
  1703.     moveq    #0,d0
  1704.     move.b    3(a4),d0
  1705.     sub.w    d0,$10(a4)
  1706.     move.w    $10(a4),d0
  1707.     cmp.w    #$71,d0
  1708.     bpl.s    mt_portup2
  1709.     move.w    #$71,$10(a4)
  1710. mt_portup2:
  1711.     move.w    $10(a4),6(a5)
  1712.     rts
  1713.  
  1714. mt_portdown:
  1715.     moveq    #0,d0
  1716.     move.b    3(a4),d0
  1717.     add.w    d0,$10(a4)
  1718.     move.w    $10(a4),d0
  1719.     cmp.w    #$358,d0
  1720.     bmi.s    mt_portdown2
  1721.     move.w    #$358,$10(a4)
  1722. mt_portdown2:
  1723.     move.w    $10(a4),6(a5)
  1724.     rts
  1725.  
  1726. mt_volvib:
  1727.      bsr    mt_vib2
  1728.      bra.s    mt_volslide
  1729. mt_volport:
  1730.      bsr    mt_port2
  1731.  
  1732. mt_volslide:
  1733.     moveq    #0,d0
  1734.     move.b    3(a4),d0
  1735.     lsr.b    #4,d0
  1736.     beq.s    mt_vol3
  1737.     add.b    d0,$13(a4)
  1738.     cmp.b    #$40,$13(a4)
  1739.     bmi.s    mt_vol2
  1740.     move.b    #$40,$13(a4)
  1741. mt_vol2:moveq    #0,d0
  1742.     move.b    $13(a4),d0
  1743.     move.w    d0,8(a5)
  1744.     rts
  1745.  
  1746. mt_vol3:move.b    3(a4),d0
  1747.     and.b    #$f,d0
  1748.     sub.b    d0,$13(a4)
  1749.     bpl.s    mt_vol4
  1750.     clr.b    $13(a4)
  1751. mt_vol4:moveq    #0,d0
  1752.     move.b    $13(a4),d0
  1753.     move.w    d0,8(a5)
  1754.     rts
  1755.  
  1756. mt_com2:move.b    $2(a4),d0
  1757.     and.b    #$f,d0
  1758.     cmp.b    #$e,d0
  1759.     beq.s    mt_filter
  1760.     cmp.b    #$d,d0
  1761.     beq.s    mt_pattbreak
  1762.     cmp.b    #$b,d0
  1763.     beq.s    mt_songjmp
  1764.     cmp.b    #$c,d0
  1765.     beq.s    mt_setvol
  1766.     cmp.b    #$f,d0
  1767.     beq.s    mt_setspeed
  1768.     rts
  1769.  
  1770. mt_filter:
  1771.     move.b    3(a4),d0
  1772.     and.b    #1,d0
  1773.     asl.b    #1,d0
  1774.     and.b    #$fd,$bfe001
  1775.     or.b    d0,$bfe001
  1776.     rts
  1777.  
  1778. mt_pattbreak:
  1779.     move.b    #1,mt_break
  1780.     rts
  1781.  
  1782. mt_songjmp:
  1783.     move.b    #1,mt_break
  1784.     move.b    3(a4),d0
  1785.     subq.b    #1,d0
  1786.     move.b    d0,mt_songpos
  1787.     rts
  1788.  
  1789. mt_setvol:
  1790.     cmp.b    #$40,3(a4)
  1791.     bls.s    mt_sv2
  1792.     move.b    #$40,3(a4)
  1793. mt_sv2:    moveq    #0,d0
  1794.     move.b    3(a4),d0
  1795.     move.b    d0,$13(a4)
  1796.     move.w    d0,8(a5)
  1797.     rts
  1798.  
  1799. mt_setspeed:
  1800.     moveq    #0,d0
  1801.     move.b    3(a4),d0
  1802.     cmp.b    #$1f,d0
  1803.     bls.s    mt_sp2
  1804.     moveq    #$1f,d0
  1805. mt_sp2:    tst.w    d0
  1806.     bne.s    mt_sp3
  1807.     moveq    #1,d0
  1808. mt_sp3:    move.b    d0,mt_speed
  1809.     rts
  1810.  
  1811. mt_periods:
  1812.     dc.w    $358,$328,$2fa,$2d0,$2a6,$280,$25c,$23a,$21a,$1fc,$1e0
  1813.     dc.w    $1c5,$1ac,$194,$17d,$168,$153,$140,$12e,$11d,$10d,$fe
  1814.     dc.w    $f0,$e2,$d6,$ca,$be,$b4,$aa,$a0,$97,$8f,$87
  1815.     dc.w    $7f,$78,$71,0
  1816.  
  1817. mt_speed:    dc.b    6
  1818. mt_counter:    dc.b    0
  1819. mt_pattpos:    dc.w    0
  1820. mt_songpos:    dc.b    0
  1821. mt_break:    dc.b    0
  1822. mt_dmacon:    dc.w    0
  1823. mt_samplestarts:dcb.l    $1f,0
  1824. mt_voice1:    dcb.w    13,0
  1825.         dc.w    1
  1826. mt_voice2:    dcb.w    13,0
  1827.         dc.w    2
  1828. mt_voice3:    dcb.w    13,0
  1829.         dc.w    4
  1830. mt_voice4:    dcb.w    13,0
  1831.         dc.w    8
  1832. mt_data        incbin "df0:mod.mainmod"
  1833.  
  1834.  
  1835. end: 
  1836.  
  1837.