home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / ZSPHERE.SO < prev    next >
Text File  |  2003-01-02  |  32KB  |  1,675 lines

  1. ; Z buffered molecule display. A screen for delta.
  2. ; Features some feedback, and 'thermal' vibration.
  3.  
  4. ;======= OBJECT EQUATES ========
  5.  
  6. ZSphere.MAX_RADIUS:    =    80
  7. ZSphere.SQRTTABLESIZE:    =    ZSphere.MAX_RADIUS*ZSphere.MAX_RADIUS*2
  8.  
  9.             RSRESET
  10. ZSphere.SQRTTABLE:    RS.B    ZSphere.SQRTTABLESIZE
  11. ZSphere.SQUARETABLE:    RS.W    ZSphere.MAX_RADIUS*2
  12. ZSphere.PALOFFSETTABLE:    RS.L    ZSphere.MAX_RADIUS
  13. ZSphere.WHITEBUFFER:    RS.W    3320                ; 81(81+1)/2 -1
  14. ZSphere.REDBUFFER:    RS.W    3320                ; 81(81+1)/2 -1
  15. ZSphere.ZBUFFER:    RS.W    160*100
  16. ZSphere.BUF:        RS.W    160*100
  17. ZSphere.BUF2:        RS.W    160*100
  18. ZSphere.BLOCK_SIZE:    RS.B    0
  19.  
  20. ;======= OBJECT TABLE ========
  21.  
  22. * Must be first in object!!
  23. ZSphere.table:
  24.     DC.L    ZSphere.mainLoop
  25.     DC.L    ZSphere.init
  26.     DC.L    ZSphere.setRes
  27.     DC.L    ZSphere.setWaterModel
  28.     DC.L    ZSphere.setMethaneModel
  29.     DC.L    ZSphere.setClearScreen
  30.     DC.L    ZSphere.setFeedbackScreen
  31.     DC.L    ZSphere.setSingle
  32.     DC.L    ZSphere.setDouble
  33.     DC.L    ZSphere.setBounce
  34.     DC.L    ZSphere.setBounce2
  35.     DC.L    ZSphere.setBounce3
  36.     DC.L    ZSphere.setBounce4
  37.     DC.L    ZSphere.setMoveOff
  38.     DC.L    0
  39.  
  40. ;======= RESOLUTION SETTING ROUTINE ========
  41.  
  42. ZSphere.setRes:
  43.     IFEQ    testmode
  44.     move.l    frmcnt,d0
  45.     sub.l    lastframecount,d0
  46.     beq.s    .end
  47.  
  48.     move.l    #rts,vbl_gfx
  49.  
  50.     move.w    monitormode,d0
  51.     cmpi.w    #vga60,d0
  52.     beq.s    .vga60
  53.     cmpi.w    #vga100,d0
  54.     beq.s    .vga100
  55.     cmpi.w    #rgb50,d0
  56.     beq.s    .rgb50
  57. * Unknown monitormode..
  58.     rts
  59. .vga60:    bra.l    vga60_16bit_160_200
  60. .vga100:bra.l    vga100_16bit_160_100
  61. .rgb50:    bra.l    rgb50_16bit_320_100
  62.     ENDC
  63. .end:    rts
  64.  
  65. ;======= INIT SUBROUTINE ========
  66.  
  67. * OUTPUT: d0.l: 0   = All clear.
  68. *               neg = Error! Not initialized!
  69. ZSphere.init:
  70.     move.l    #ZSphere.BLOCK_SIZE,d0
  71.     bsr.l    Mem.register
  72.  
  73. .success:
  74.     moveq    #0,d0
  75.     rts
  76. .error:    moveq    #-1,d0
  77.     rts
  78.  
  79. ;======= REALTIME INIT SUBROUTINE ========
  80.  
  81. ZSphere.realtimeInit:
  82.     move.l    #ZSphere.setRes,vbl_gfx
  83.  
  84.     bsr.l    Mem.getBlock
  85.     move.l    d0,ZSphere.baseAdr
  86.  
  87.     bsr.w    ZSphere.initBallCols
  88.     bsr.w    ZSphere.initSqrtTable
  89.     bsr.w    ZSphere.initSquareTable
  90.     bsr.w    ZSphere.initWhitePalettes
  91.     bsr.w    ZSphere.initRedPalettes
  92.  
  93.     bsr    ZSphere.setWaterModel
  94.     bsr    ZSphere.setClearScreen
  95.     bsr    ZSphere.setSingle
  96.     clr.w    ZSphere.moveOff
  97.  
  98.     move.w    monitormode,d0
  99.     cmpi.w    #vga60,d0
  100.     beq.s    .vga60
  101.     cmpi.w    #rgb50,d0
  102.     beq.s    .rgb50
  103. ; Unknown monitormode.. take 1*1 (vga100)
  104.     move.l    #scr,ZSphere.scrAdrAdr
  105.     move.l    #scr+8,ZSphere.oldScrAdrAdr
  106.     move.l    #rts,ZSphere.copyRout
  107.     rts
  108. .vga60:    move.l    #ZSphere.bufAdr,ZSphere.scrAdrAdr
  109.     move.l    #ZSphere.bufAdr2,ZSphere.oldScrAdrAdr
  110.     move.l    #ZSphere.copyVga60,ZSphere.copyRout
  111.     rts
  112. .rgb50:    move.l    #ZSphere.bufAdr,ZSphere.scrAdrAdr
  113.     move.l    #ZSphere.bufAdr2,ZSphere.oldScrAdrAdr
  114.     move.l    #ZSphere.copyRgb50,ZSphere.copyRout
  115.     rts
  116.  
  117. ;======= SCREENINIT SUBROUTINE ========
  118.  
  119. ZSphere.initScreen:
  120.     rts
  121.  
  122. ;======= MAINLOOP SUBROUTINE ========
  123.  
  124. ZSphere.mainLoop:
  125.     move.w    $0468.w,.old468
  126.  
  127.     move.l    frmcnt,d0
  128.     sub.l    lastframecount,d0
  129.     bne.s    .end_realtime_init
  130.     move.l    d0,-(sp)
  131.     bsr    ZSphere.realtimeInit
  132.      move.l    (sp)+,d0
  133. .end_realtime_init:
  134.     cmpi.l    #3,d0
  135.     bhs.s    .end_screeninit
  136.     bsr    ZSphere.initScreen
  137. .end_screeninit:
  138.  
  139.     movea.l    ZSphere.clearRout,a0
  140.     jsr    (a0)
  141.  
  142.     bsr    ZSphere.clearZBuffer
  143.  
  144.     movea.l    ZSphere.paintRout,a0
  145.     jsr    (a0)
  146.  
  147.     movea.l    ZSphere.copyRout,a0
  148.     jsr    (a0)
  149.  
  150.     cmpi.w    #vga100,monitormode
  151.     beq.s    .swap_done
  152.     move.l    ZSphere.oldScrAdrAdr,d0
  153.     move.l    ZSphere.scrAdrAdr,ZSphere.oldScrAdrAdr
  154.     move.l    d0,ZSphere.scrAdrAdr
  155. .swap_done:
  156.  
  157.     IFEQ    testmode
  158.     lea    scr,a0
  159.     move.l    (a0)+,d0
  160.     move.l    (a0)+,d1
  161.     move.l    (a0),-4(a0)
  162.     move.l    d0,(a0)
  163.     move.l    d1,-8(a0)
  164.     move.l    d0,d1
  165.     lsr.w    #8,d0
  166.     move.l    d0,$ffff8200.w
  167.     move.b    d1,$ffff820d.w
  168.  
  169.     move.w    .old468(pc),d0
  170. .wait:    cmp.w    $0468.w,d0
  171.     beq.s    .wait
  172.     ENDC
  173.  
  174.     rts
  175.  
  176. .old468:DC.W    0
  177.  
  178. ;======= OBJECT SUBROUTINES ========
  179.  
  180. ZSphere.setWaterModel:
  181.     move.l    #ZSphere.waterModel,ZSphere.model
  182.     rts
  183.  
  184. ZSphere.setMethaneModel:
  185.     move.l    #ZSphere.methaneModel,ZSphere.model
  186.     rts
  187.  
  188. ZSphere.setClearScreen:
  189.     move.l    #ZSphere.clearScreen,ZSphere.clearRout
  190.     rts
  191.  
  192. ZSphere.setFeedbackScreen:
  193.     move.l    #ZSphere.feedbackScreen,ZSphere.clearRout
  194.     rts
  195.  
  196. ZSphere.setSingle:
  197.     move.l    #ZSphere.paintSingle,ZSphere.paintRout
  198.     rts
  199.  
  200. ZSphere.setDouble:
  201.     move.l    #ZSphere.paintDoubleVibr,ZSphere.paintRout
  202.     rts
  203.  
  204. ; lower
  205. ZSphere.setBounce:
  206.     move.l    #ZSphere.paintBouncing,ZSphere.paintRout
  207.     move.w    #+$0500,ZSphere.yOffset
  208.     move.w    #-1,ZSphere.bounceDir
  209.     move.w    #+1,ZSphere.walkDir
  210.     move.l    $04BA.w,ZSphere.bounceStart
  211.     clr.w    ZSphere.swapCoords
  212.     rts
  213.  
  214. ; right
  215. ZSphere.setBounce2:
  216.     move.l    #ZSphere.paintBouncing,ZSphere.paintRout
  217.     move.w    #+$0500,ZSphere.yOffset
  218.     move.w    #-1,ZSphere.bounceDir
  219.     move.w    #-1,ZSphere.walkDir
  220.     move.l    $04BA.w,ZSphere.bounceStart
  221.     st    ZSphere.swapCoords
  222.     rts
  223.  
  224. ; upper
  225. ZSphere.setBounce3:
  226.     move.l    #ZSphere.paintBouncing,ZSphere.paintRout
  227.     move.w    #-$0500,ZSphere.yOffset
  228.     move.w    #+1,ZSphere.bounceDir
  229.     move.w    #-1,ZSphere.walkDir
  230.     move.l    $04BA.w,ZSphere.bounceStart
  231.     clr.w    ZSphere.swapCoords
  232.     rts
  233.  
  234. ; left
  235. ZSphere.setBounce4:
  236.     move.l    #ZSphere.paintBouncing,ZSphere.paintRout
  237.     move.w    #-$0500,ZSphere.yOffset
  238.     move.w    #+1,ZSphere.bounceDir
  239.     move.w    #+1,ZSphere.walkDir
  240.     move.l    $04BA.w,ZSphere.bounceStart
  241.     st    ZSphere.swapCoords
  242.     rts
  243.  
  244. ZSphere.setMoveOff:
  245.     st    ZSphere.moveOff
  246.     move.l    $04BA.w,ZSphere.bounceStart
  247.     rts
  248.  
  249. ZSphere.initBallCols:
  250.     lea    ZSphere.ballColTable,a0
  251.     move.l    ZSphere.baseAdr,d0
  252.     move.l    d0,d2
  253.     move.l    d0,d3
  254.     move.l    d0,d1
  255.     addi.l    #ZSphere.WHITEBUFFER,d0
  256.     addi.l    #ZSphere.REDBUFFER,d1
  257.     move.l    d0,(a0)+
  258.     move.l    d1,(a0)+
  259.  
  260.     addi.l    #ZSphere.BUF,d2
  261.     addi.l    #ZSphere.BUF2,d3
  262.     move.l    d2,ZSphere.bufAdr
  263.     move.l    d3,ZSphere.bufAdr2
  264.     rts
  265.  
  266. ZSphere.initSqrtTable:
  267.     movea.l    ZSphere.baseAdr,a0
  268.     adda.l    #ZSphere.SQRTTABLE,a0
  269.     move.w    #ZSphere.SQRTTABLESIZE-1,d7
  270.     clr.l    d6
  271.  
  272. .loop:    move.l    d6,d1
  273.     bsr.l    Math.sqrt
  274.     swap    d0
  275.     move.w    d0,(a0)+
  276.     addq.w    #1,d6
  277.     dbra    d7,.loop
  278.     rts
  279.  
  280. ZSphere.initSquareTable:
  281.     movea.l    ZSphere.baseAdr,a0
  282.     adda.l    #ZSphere.SQUARETABLE,a0
  283.     move.w    #ZSphere.MAX_RADIUS-1,d7
  284.  
  285. .loop:    move.w    d7,d0
  286.     mulu.w    d7,d0
  287.     neg.l    d0
  288.     move.w    d0,(a0)+
  289.     dbf    d7,.loop
  290.  
  291.     move.w    #ZSphere.MAX_RADIUS-1,d7
  292.     movea.l    a0,a1
  293. .mirror_loop:
  294.     move.w    -(a1),(a0)+
  295.     dbf    d7,.mirror_loop
  296.     rts
  297.  
  298. ZSphere.initWhitePalettes:
  299.     moveq    #1,d7
  300.     movea.l    ZSphere.baseAdr,a0
  301.     movea.l    a0,a1
  302.     adda.l    #ZSphere.WHITEBUFFER,a0
  303.     adda.l    #ZSphere.PALOFFSETTABLE,a1
  304.  
  305. .loop:    move.w    d7,-(sp)
  306.     bsr    ZSphere.initColorTable
  307.     move.w    (sp)+,d7
  308.     move.l    a0,d0
  309.     sub.l    ZSphere.baseAdr,d0
  310.     subi.l    #ZSphere.WHITEBUFFER,d0
  311.     move.l    d0,(a1)+
  312.     addq.w    #1,d7
  313.     cmpi.w    #ZSphere.MAX_RADIUS,d7
  314.     bls.s    .loop
  315.     rts
  316.  
  317. ZSphere.initRedPalettes:
  318.     moveq    #1,d7
  319.     movea.l    ZSphere.baseAdr,a0
  320.     movea.l    a0,a1
  321.     adda.l    #ZSphere.REDBUFFER,a0
  322.     adda.l    #ZSphere.PALOFFSETTABLE,a1
  323.  
  324. .loop:    move.w    d7,-(sp)
  325.     bsr    ZSphere.initRedColorTable
  326.     move.w    (sp)+,d7
  327.     move.l    a0,d0
  328.     sub.l    ZSphere.baseAdr,d0
  329.     subi.l    #ZSphere.REDBUFFER,d0
  330.     move.l    d0,(a1)+
  331.     addq.w    #1,d7
  332.     cmpi.w    #ZSphere.MAX_RADIUS,d7
  333.     bls.s    .loop
  334.     rts
  335.  
  336. ; INPUT:
  337. ; d7.w: tablesize
  338. ; a0: colortable
  339. ZSphere.initColorTable:
  340.     clr.l    d0
  341.  
  342. .loop:    move.l    d0,d1
  343.     move.l    d0,d2
  344.     move.l    d0,d3
  345.     lsl.l    #5,d1
  346.     divu.w    d7,d1
  347.     lsl.l    #5,d2
  348.     lsl.l    #6,d2
  349.     divu.w    d7,d2
  350.     swap    d3
  351.     divu.w    d7,d3
  352.     andi.w    #$001f,d1
  353.     andi.w    #$07e0,d2
  354.     andi.w    #$f800,d3
  355.     or.w    d1,d3
  356.     or.w    d2,d3
  357.     move.w    d3,(a0)+
  358.     addq.w    #1,d0
  359.     cmp.w    d7,d0
  360.     blt.s    .loop
  361.     rts
  362.  
  363. ; INPUT:
  364. ; d7.w: tablesize
  365. ; a0: colortable
  366. ZSphere.initRedColorTable:
  367.     clr.l    d0
  368.  
  369. .loop:    move.l    d0,d3
  370.     swap    d3
  371.     divu.w    d7,d3
  372.     andi.w    #$f800,d3
  373.     move.w    d3,(a0)+
  374.     addq.w    #1,d0
  375.     cmp.w    d7,d0
  376.     blt.s    .loop
  377.     rts
  378.  
  379. ZSphere.clearZBuffer:
  380.     movea.l    ZSphere.baseAdr,a0
  381.     adda.l    #ZSphere.ZBUFFER,a0
  382.     move.w    #160*100/8-1,d7
  383.     move.l    #$80008000,d0
  384.  
  385. .yloop:
  386.     REPT    4
  387.     move.l    d0,(a0)+
  388.     ENDR
  389.     dbra    d7,.yloop
  390.     rts
  391.  
  392. ZSphere.paintSingle:
  393.     movea.l    ZSphere.model,a1
  394.     bsr    ZSphere.addModel
  395.     rts
  396.  
  397. ZSphere.paintDoubleVibr:
  398.     clr.w    d0
  399.     tst.w    ZSphere.moveOff
  400.     beq.s    .no_d0_fuk
  401.     move.w    $04BC.w,d0
  402.     sub.w    ZSphere.bounceStart+2,d0
  403. .no_d0_fuk:
  404.     addi.w    #1000,d0
  405.     move.w    d0,-(sp)
  406.     neg.w    d0
  407.     movea.l    ZSphere.model,a1
  408.     bsr    ZSphere.addVibrModel1
  409.     move.w    (sp)+,d0
  410.     movea.l    ZSphere.model,a1
  411.     bsr    ZSphere.addVibrModel2
  412.     rts
  413.  
  414. ZSphere.paintBouncing:
  415.     movea.l    ZSphere.model,a1
  416.     bsr    ZSphere.addBounceModel
  417.     rts
  418.  
  419. ; Seems to work ok, since there has been some patching on the overflow
  420. ; errors (caused by combination of finite accuracy and use of maximum range).
  421. ; INPUT:
  422. ; d0.w: X rotation (a)
  423. ; d1.w: Y rotation (b)
  424. ; d2.w: Z rotation (c)
  425. ZSphere.generateMatrix:
  426.     lea    ZSphere.tempMatrix,a0
  427. * 1> rotate 3 axis.
  428.     Do_SinModulo    d0
  429.     Do_SinModulo    d1
  430.     Do_SinModulo    d2
  431.     movea.w    d0,a3
  432.     movea.w    d1,a4
  433.     movea.w    d2,a5
  434.     lea    sine_tbl,a2
  435.  
  436. * X := + x*cos(b)*cos(c)
  437. *      - y*cos(b)*sin(c)
  438. *      + z*sin(b)
  439.     Get_SinCos    a2,d1,d3,d4
  440.     Get_SinCos    a2,d2,d5,d6
  441.     muls.w    d4,d6                * / cos(b)*sin(c)
  442.     add.l    d6,d6                * |
  443. ;    bvc.s    .skipxd6
  444. ;    subq.l    #1,d6
  445. ;.skipxd6:
  446.     swap    d6                * \
  447.     muls.w    d4,d5                * / -cos(b)*sin(c)
  448.     add.l    d5,d5                * |
  449. ;    bvc.s    .skipxd5
  450. ;    subq.l    #1,d5
  451. ;.skipxd5:
  452.     swap    d5                * |
  453.     neg.w    d5                * \
  454.     move.w    d6,(a0)+
  455.     move.w    d5,(a0)+
  456.     move.w    d3,(a0)+
  457.     
  458. * Y := + x*(sin(a)*sin(b)*cos(c)+cos(a)*sin(c))
  459. *      + y*(cos(a)*cos(c)-sin(a)*sin(b)*sin(c))
  460. *      - z*sin(a)*cos(b)
  461.     Get_SinCos    a2,a3,d0,d1
  462.     Get_Sin        a2,a4,d2
  463.     Get_SinCos    a2,a5,d4,d5
  464.     muls.w    d0,d2
  465.     add.l    d2,d2
  466. ;    bvc.s    .skipyd2
  467. ;    subq.l    #1,d2
  468. ;.skipyd2:
  469.     swap    d2
  470.     muls.w    d2,d5
  471.     add.l    d5,d5
  472. ;    bvc.s    .skipyd5
  473. ;    subq.l    #1,d5
  474. ;.skipyd5:
  475.     swap    d5
  476.     muls.w    d1,d4
  477.     add.l    d4,d4
  478. ;    bvc.s    .skipyd4
  479. ;    subq.l    #1,d4
  480. ;.skipyd4:
  481.     swap    d4
  482.     add.w    d4,d5
  483.     bvc.s    .skipyvd5
  484.     addq.w    #1,d5
  485.     neg.w    d5
  486. .skipyvd5:
  487.     move.w    d5,d3
  488.     ;Get_SinCos    a2,a3,d0,d1
  489.     Get_Sin        a2,a4,d2
  490.     Get_SinCos    a2,a5,d4,d5
  491.     muls.w    d1,d5
  492.     add.l    d5,d5
  493. ;    bvc.s    .skipy2d5
  494. ;    subq.l    #1,d5
  495. ;.skipy2d5:
  496.     swap    d5
  497.     muls.w    d0,d2
  498.     add.l    d2,d2
  499. ;    bvc.s    .skipy2d2
  500. ;    subq.l    #1,d2
  501. ;.skipy2d2:
  502.     swap    d2
  503.     muls.w    d2,d4
  504.     add.l    d4,d4
  505.     swap    d4
  506.     sub.w    d4,d5
  507.     bvc.s    .skipyv2d5
  508.     addq.w    #1,d5
  509.     neg.w    d5
  510. .skipyv2d5:
  511.     Get_Cos        a2,a4,d4
  512.     muls.w    d0,d4
  513.     add.l    d4,d4
  514. ;    bvc.s    .skipy2d4
  515. ;    subq.l    #1,d4
  516. ;.skipy2d4:
  517.     swap    d4
  518.     neg.w    d4
  519.     move.w    d3,(a0)+
  520.     move.w    d5,(a0)+
  521.     move.w    d4,(a0)+
  522.  
  523. * Z := + x*(sin(a)*sin(c)-cos(a)*sin(b)*cos(c))
  524. *      + y*(cos(a)*sin(b)*sin(c)+sin(a)*cos(c))
  525. *      + z*cos(a)*cos(b)
  526.     Get_SinCos    a2,a3,d0,d1
  527.     Get_Sin        a2,a4,d2
  528.     Get_SinCos    a2,a5,d4,d5
  529.     muls.w    d0,d4
  530.     add.l    d4,d4
  531. ;    bvc.s    .skipzd4
  532. ;    subq.l    #1,d4
  533. ;.skipzd4:
  534.     swap    d4
  535.     muls.w    d1,d2
  536.     add.l    d2,d2
  537. ;    bvc.s    .skipzd2
  538. ;    subq.l    #1,d2
  539. ;.skipzd2:
  540.     swap    d2
  541.     muls.w    d2,d5
  542.     add.l    d5,d5
  543.     swap    d5
  544.     sub.w    d5,d4
  545.     bvc.s    .skipzvd4
  546.     addq.w    #1,d4
  547.     neg.w    d4
  548. .skipzvd4:
  549.     move.w    d4,d3
  550.     ;Get_SinCos    a2,a3,d0,d1
  551.     Get_Sin        a2,a4,d2
  552.     Get_SinCos    a2,a5,d4,d5
  553.     muls.w    d1,d2
  554.     add.l    d2,d2
  555. ;    bvc.s    .skipz2d2
  556. ;    subq.l    #1,d2
  557. ;.skipz2d2:
  558.     swap    d2
  559.     muls.w    d2,d4
  560.     add.l    d4,d4
  561.     swap    d4
  562.     muls.w    d0,d5
  563.     add.l    d5,d5
  564. ;    bvc.s    .skipzd5
  565. ;    subq.l    #1,d5
  566. ;.skipzd5:
  567.     swap    d5
  568.     add.w    d4,d5
  569.     bvc.s    .skipzvd5
  570.     addq.w    #1,d5
  571.     neg.w    d5
  572. .skipzvd5:
  573.     Get_Cos        a2,a4,d4
  574.     muls.w    d1,d4
  575.     add.l    d4,d4
  576. ;    bvc.s    .skipz2d4
  577. ;    subq.l    #1,d4
  578. ;.skipz2d4:
  579.     swap    d4
  580.     move.w    d3,(a0)+
  581.     move.w    d5,(a0)+
  582.     move.w    d4,(a0)+
  583.  
  584. * Translation vector := (0,0,0)
  585.     moveq    #0,d0
  586.     move.l    d0,(a0)+
  587.     move.l    d0,(a0)+
  588.     move.l    d0,(a0)+
  589.  
  590.     rts
  591.  
  592. ; Give the object a unit-matrix and a translation of (0,0,0).
  593. ZSphere.loadUnityMatrix:
  594.     move.w    #$7fff,d0
  595.     moveq    #0,d1
  596.     lea    ZSphere.tempMatrix,a0
  597.     move.w    d0,(a0)+
  598.     move.w    d1,(a0)+
  599.     move.w    d1,(a0)+
  600.     move.w    d1,(a0)+
  601.     move.w    d0,(a0)+
  602.     move.w    d1,(a0)+
  603.     move.w    d1,(a0)+
  604.     move.w    d1,(a0)+
  605.     move.w    d0,(a0)+
  606.     move.l    d1,(a0)+
  607.     move.l    d1,(a0)+
  608.     move.l    d1,(a0)+
  609.     rts
  610.  
  611. ; Copy a matrix from, one location to the other.
  612. ; INPUT:
  613. ; a0: destination matrix
  614. ; a1: source matrix
  615. ZSphere.copyMatrix:
  616.     moveq    #15-1,d7
  617. .loop:    move.w    (a1)+,(a0)+
  618.     dbra    d7,.loop
  619.     rts
  620.  
  621. ; Translate the matrix translation vector.
  622. ; INPUT:
  623. ; d0.w: X translation
  624. ; d1.w: Y translation
  625. ; d2.w: Z translation
  626. ZSphere.translateMatrix:
  627.     lea    ZSphere.tempMatrix+9*2,a0
  628.     add.w    d0,(a0)
  629.     add.w    d1,4(a0)
  630.     add.w    d2,8(a0)
  631.     rts
  632.  
  633. ; Routine that multiplies the scale- and rotation-matrix AND also the
  634. ; translation vector. The matrix to be multiplied is the temporary matrix.
  635. ; This means this _must_ be inititialized.
  636. ; INPUT:
  637. ; a0: destination matrix
  638. ; a1: matrix to multiply with (source)
  639. ZSphere.multiplyMatrix:
  640. ; Multiply matrix.
  641.     movea.l    a0,a3
  642.     lea    ZSphere.tempMatrix,a0
  643.     moveq    #3-1,d7
  644.  
  645. .rowloop:
  646.     movem.w    (a1)+,d0-d2
  647.     moveq    #3-1,d6
  648.  
  649. .columnloop:
  650.     move.w    d0,d3
  651.     move.w    d1,d4
  652.     move.w    d2,d5
  653.     muls.w    (a0),d3
  654.     muls.w    3*2(a0),d4
  655.     muls.w    2*3*2(a0),d5
  656.     add.l    d3,d5
  657.     add.l    d4,d5
  658.     add.l    d5,d5
  659.     swap    d5
  660.     move.w    d5,(a3)+
  661.     addq    #2,a0
  662.     dbra    d6,.columnloop
  663.  
  664.     subq    #2*3,a0
  665.     dbra    d7,.rowloop
  666.  
  667. * Multiply (=rotate & scale) translation vector.
  668.     lea    -2*3*3(a1),a1
  669.     movem.l    9*2(a0),d0-d2
  670.     moveq    #3-1,d7
  671.  
  672. .vectorloop:
  673.     move.l    d0,d3
  674.     move.w    (a1)+,d4
  675.     ext.l    d4
  676.     muls.l    d4,d4:d3
  677.     add.l    d3,d3
  678.     addx.l    d4,d4
  679.     move.w    d4,d3
  680.     swap    d3
  681.     move.l    d1,d4
  682.     move.w    (a1)+,d5
  683.     ext.l    d5
  684.     muls.l    d5,d5:d4
  685.     add.l    d4,d4
  686.     addx.l    d5,d5
  687.     move.w    d5,d4
  688.     swap    d4
  689.     move.l    d2,d5
  690.     move.w    (a1)+,d6
  691.     ext.l    d6
  692.     muls.l    d6,d6:d5
  693.     add.l    d5,d5
  694.     addx.l    d6,d6
  695.     move.w    d6,d5
  696.     swap    d5
  697.     add.l    d3,d5
  698.     add.l    d4,d5
  699.     move.l    d5,(a3)+
  700.     dbra    d7,.vectorloop
  701.  
  702. ; Add new matrix's translation.
  703.     movem.l    -12(a3),d0-d2
  704.     add.l    (a1)+,d0
  705.     add.l    (a1)+,d1
  706.     add.l    (a1)+,d2
  707.     movem.l    d0-d2,-12(a3)
  708.     rts
  709.  
  710. ; Pushes a previously generated matrix on the stack.
  711. ZSphere.pushMatrix:
  712. ; First check for stack overflow.
  713.     move.w    ZSphere.matrixStackTop,d0
  714.     cmpi.w    #8,d0
  715.     bhs.s    .end
  716. ; The stack is not full..
  717.  
  718. ; If this is the first matrix on the stack, then simply copy it.
  719. .multiply_matrix:
  720.     tst.w    d0
  721.     bne.s    .not_first_entry
  722.     lea    ZSphere.matrixStack,a0
  723.     lea    ZSphere.tempMatrix,a1
  724.     bsr    ZSphere.copyMatrix
  725.     bra.s    .end_multiply_matrix
  726. ; Otherwise, multiply it with the previous entry.
  727. .not_first_entry:
  728.     lea    ZSphere.matrixStack,a0
  729.     mulu.w    #15*2,d0
  730.     adda.l    d0,a0                * a0 := address of current entry
  731.     lea    -15*2(a0),a1            * a1 := address of previous entry
  732.     bsr    ZSphere.multiplyMatrix
  733. .end_multiply_matrix:
  734.  
  735. ; Increase the stacktop by one.
  736.     addq.w    #1,ZSphere.matrixStackTop
  737. .end:    rts
  738.  
  739. ; Pops the top matrix off the stack.
  740. ZSphere.popMatrix:
  741.     tst.w    ZSphere.matrixStackTop
  742.     beq.s    .end
  743.     subq.w    #1,ZSphere.matrixStackTop
  744. .end:    rts
  745.  
  746. ; Transforms a vertex from 4d to 2d (perspective+width calcs included!).
  747. ; INPUT:
  748. ; a2: source 3d vertex (x,y,z,w)
  749. ; OUTPUT:
  750. ; d0.w: X
  751. ; d1.w: Y
  752. ; d2.w: WIDTH
  753. ; d3.w: Z (=z)
  754. ZSphere.transformVertex:
  755.  
  756. ; Get temp 2d vertex address.
  757.     lea    .temp(pc),a0
  758.  
  759. ; Get current matrix...
  760.     lea    ZSphere.matrixStack,a1
  761.     move.w    ZSphere.matrixStackTop,d1
  762.     ble    .end
  763.     subq.w    #1,d1
  764.     mulu.w    #15*2,d1
  765.     adda.l    d1,a1
  766. ; a1 = matrix
  767.     movem.l    9*2(a1),d6/a3/a6
  768.     movea.l    a0,a4
  769.  
  770.     movem.w    (a2)+,d0-d2
  771.  
  772. * X
  773.     move.w    d0,d3
  774.     move.w    d1,d4
  775.     move.w    d2,d5
  776.     muls.w    (a1)+,d3
  777.     muls.w    (a1)+,d4
  778.     muls.w    (a1)+,d5
  779.     add.l    d3,d5
  780.     add.l    d4,d5
  781.     add.l    d5,d5
  782.     add.l    d6,d5                * Translate coordinate.
  783.     swap    d5
  784.     move.w    d5,(a0)+            * Store coordinate.
  785. * Y
  786.     move.w    d0,d3
  787.     move.w    d1,d4
  788.     move.w    d2,d5
  789.     muls.w    (a1)+,d3
  790.     muls.w    (a1)+,d4
  791.     muls.w    (a1)+,d5
  792.     add.l    d3,d5
  793.     add.l    d4,d5
  794.     add.l    d5,d5
  795.     add.l    a3,d5                * Translate coordinate.
  796.     swap    d5
  797.     move.w    d5,(a0)+            * Store coordinate.
  798. * Z
  799.     move.w    d0,d3
  800.     move.w    d1,d4
  801.     move.w    d2,d5
  802.     muls.w    (a1)+,d3
  803.     muls.w    (a1)+,d4
  804.     muls.w    (a1)+,d5
  805.     add.l    d3,d5
  806.     add.l    d4,d5
  807.     add.l    d5,d5
  808.     add.l    a6,d5                * Translate coordinate.
  809.     swap    d5
  810.     move.w    d5,(a0)+            * Store coordinate.
  811. .end_transform:
  812.  
  813. .perspectivation:
  814.     movea.l    a4,a0
  815.     move.w    a5,d7
  816.     movem.w    (a0),d0/d1/d2
  817.     lsl.l    #8,d0
  818.     lsl.l    #8,d1
  819.     addi.w    #$100,d2
  820.     divs.w    d2,d0
  821.     divs.w    d2,d1
  822.     addi.w    #160/2,d0
  823.     addi.w    #100/2,d1
  824.     moveq    #0,d4
  825.     move.w    (a2),d4
  826.     lsl.l    #8,d4
  827.     divs.w    d2,d4
  828.     move.w    4(a0),d3            ; d3.w=Z
  829.     move.w    d4,d2                ; d2.w=WIDTH
  830. .end_perspectivation:
  831.  
  832. .end:    rts
  833.  
  834. .temp:    DS.W    3                ; X,Y,Z
  835.  
  836. ; Adds spheres to the scene.
  837. ; Uses a 3d particle model.
  838. ; "You're in the right position to suck my balls." 
  839. ; INPUT:
  840. ; a1: model
  841. ZSphere.addBounceModel:
  842.     move.w    $4bc.w,.time
  843.  
  844.     move.w    (a1)+,.num
  845.  
  846.     move.l    a1,-(sp)
  847. ; Push world rotation matrix.
  848.     move.w    .time(pc),d0
  849.     move.w    d0,d1
  850.     move.w    d0,d2
  851.     mulu.w    #5,d1
  852.     lsr.w    #2,d1
  853.     mulu.w    #7,d2
  854.     lsr.w    #2,d2
  855.     bsr    ZSphere.generateMatrix
  856.     move.w    $04BC.w,d0
  857.     sub.w    ZSphere.bounceStart+2,d0
  858.     move.w    d0,d1
  859.     mulu.w    #17,d0
  860.     andi.w    #$0FFF,d0
  861.     subi.w    #$0800,d0
  862.     mulu.w    #14,d1
  863.     Do_SinModulo    d1
  864.     Get_Sin    sine_tbl,d1,d1
  865.  
  866.     asr.w    #5,d1
  867.     bpl.s    .abs_done
  868.     neg.w    d1
  869. .abs_done:
  870.     muls.w    ZSphere.bounceDir,d1
  871.     add.w    ZSphere.yOffset,d1
  872.     muls.w    ZSphere.walkDir,d0
  873.  
  874.     tst.w    ZSphere.swapCoords
  875.     beq.s    .end_swap
  876.     exg    d0,d1
  877. .end_swap:
  878.  
  879.     move.w    #10000,d2
  880.     bsr    ZSphere.translateMatrix
  881.     bsr    ZSphere.pushMatrix
  882.     movea.l    (sp)+,a1
  883.  
  884. ; Transform all balls.
  885.     moveq    #0,d7
  886.     
  887. .loop:    move.l    a1,-(sp)
  888.     move.w    d7,-(sp)
  889.     move.w    .time(pc),d0
  890.     move.w    d0,d1
  891.     move.w    d0,d2
  892.     mulu.w    #3,d0
  893.     lsr.w    #2,d0
  894.     mulu.w    #5,d1
  895.     lsr.w    #1,d1
  896.     mulu.w    #7,d2
  897.     lsr.w    #3,d2
  898.     bsr    ZSphere.generateMatrix
  899.     clr.l    d0
  900.     clr.l    d1
  901.     clr.l    d2
  902.     bsr    ZSphere.translateMatrix
  903.     bsr    ZSphere.pushMatrix
  904.     lea    .temp(pc),a2
  905.     movea.l    2(sp),a1
  906.     move.w    (a1)+,(a2)
  907.     move.w    (a1)+,2(a2)
  908.     move.w    (a1)+,4(a2)
  909.     move.w    (a1)+,6(a2)
  910.     move.l    a1,2(sp)
  911.     bsr    ZSphere.transformVertex
  912.     cmpi.w    #ZSphere.MAX_RADIUS-1,d2
  913.     blo.s    .radius_okay
  914.     move.w    #ZSphere.MAX_RADIUS-1,d2
  915. .radius_okay:
  916.     addq.w    #1,d2
  917.     movea.l    ZSphere.baseAdr,a6
  918.     adda.l    #ZSphere.PALOFFSETTABLE,a6
  919.     move.l    (a6,d2.w*4),d4
  920.     move.l    2(sp),a1
  921.     move.w    (a1)+,d5
  922.     move.l    a1,2(sp)
  923.     movea.l    (ZSphere.ballColTable,d5.w*4),a6
  924.     lea    (a6,d4.l),a6
  925.  
  926.     neg.w    d3                ; z=-Z (due to z buffer direction!)
  927.     lsr.w    #4,d3                ; limit depthrange
  928.  
  929.     tst.w    (sp)
  930.     bne.s    .not_first
  931.     bsr    ZSphere.paint1stSphere
  932.     bra.s    .end_paint
  933. .not_first:
  934.     bsr    ZSphere.paintSphere
  935. .end_paint
  936.  
  937.     bsr    ZSphere.popMatrix
  938.     move.w    (sp)+,d7
  939.     movea.l    (sp)+,a1
  940.     addq.w    #1,d7
  941.     cmp.w    .num(pc),d7
  942.     blt    .loop
  943.  
  944.     bsr    ZSphere.popMatrix
  945.     rts
  946.  
  947. .temp:    DS.W    4                ; x,y,z,w
  948. .num:    DC.W    0
  949. .time:    DC.W    0
  950.  
  951.  
  952. ; Adds spheres to the scene.
  953. ; Uses a 3d particle model.
  954. ; "You're in the right position to suck my balls." 
  955. ; INPUT:
  956. ; a1: model
  957. ZSphere.addModel:
  958.  
  959.     move.w    $4bc.w,.time
  960.  
  961.     move.w    (a1)+,.num
  962.  
  963.     move.l    a1,-(sp)
  964. ; Push world rotation matrix.
  965.     move.w    .time(pc),d0
  966.     move.w    d0,d1
  967.     move.w    d0,d2
  968.     mulu.w    #5,d1
  969.     lsr.w    #2,d1
  970.     mulu.w    #7,d2
  971.     lsr.w    #2,d2
  972.     bsr    ZSphere.generateMatrix
  973.     move.w    .time(pc),d0
  974.     move.w    d0,d1
  975.     move.w    d0,d2
  976.     mulu.w    #7,d0
  977.     lsr.l    #1,d0
  978.     mulu.w    #11,d1
  979.     lsr.l    #1,d1
  980.     mulu.w    #13,d2
  981.     lsr.l    #2,d2
  982.     Do_SinModulo    d0
  983.     Do_SinModulo    d1
  984.     Do_SinModulo    d2
  985.     Get_Sin    sine_tbl,d0,d0
  986.     Get_Sin    sine_tbl,d1,d1
  987.     Get_Sin    sine_tbl,d2,d2
  988.     asr.w    #5,d0
  989.     asr.w    #5,d1
  990.     asr.w    #3,d2
  991.     addi.w    #10000,d2
  992.     bsr    ZSphere.translateMatrix
  993.     bsr    ZSphere.pushMatrix
  994.     movea.l    (sp)+,a1
  995.  
  996. ; Transform all balls.
  997.     moveq    #0,d7
  998.     
  999. .loop:    move.l    a1,-(sp)
  1000.     move.w    d7,-(sp)
  1001.     move.w    .time(pc),d0
  1002.     move.w    d0,d1
  1003.     move.w    d0,d2
  1004.     mulu.w    #3,d0
  1005.     lsr.w    #2,d0
  1006.     mulu.w    #5,d1
  1007.     lsr.w    #1,d1
  1008.     mulu.w    #7,d2
  1009.     lsr.w    #3,d2
  1010.     bsr    ZSphere.generateMatrix
  1011.     clr.l    d0
  1012.     clr.l    d1
  1013.     clr.l    d2
  1014.     bsr    ZSphere.translateMatrix
  1015.     bsr    ZSphere.pushMatrix
  1016.     lea    .temp(pc),a2
  1017.     movea.l    2(sp),a1
  1018.     move.w    (a1)+,(a2)
  1019.     move.w    (a1)+,2(a2)
  1020.     move.w    (a1)+,4(a2)
  1021.     move.w    (a1)+,6(a2)
  1022.     move.l    a1,2(sp)
  1023.     bsr    ZSphere.transformVertex
  1024.     cmpi.w    #ZSphere.MAX_RADIUS-1,d2
  1025.     blo.s    .radius_okay
  1026.     move.w    #ZSphere.MAX_RADIUS-1,d2
  1027. .radius_okay:
  1028.     addq.w    #1,d2
  1029.     movea.l    ZSphere.baseAdr,a6
  1030.     adda.l    #ZSphere.PALOFFSETTABLE,a6
  1031.     move.l    (a6,d2.w*4),d4
  1032.     move.l    2(sp),a1
  1033.     move.w    (a1)+,d5
  1034.     move.l    a1,2(sp)
  1035.     movea.l    (ZSphere.ballColTable,d5.w*4),a6
  1036.     lea    (a6,d4.l),a6
  1037.  
  1038.     neg.w    d3                ; z=-Z (due to z buffer direction!)
  1039.     lsr.w    #4,d3                ; limit depthrange
  1040.  
  1041.     tst.w    (sp)
  1042.     bne.s    .not_first
  1043.     bsr    ZSphere.paint1stSphere
  1044.     bra.s    .end_paint
  1045. .not_first:
  1046.     bsr    ZSphere.paintSphere
  1047. .end_paint
  1048.  
  1049.     bsr    ZSphere.popMatrix
  1050.     move.w    (sp)+,d7
  1051.     movea.l    (sp)+,a1
  1052.     addq.w    #1,d7
  1053.     cmp.w    .num(pc),d7
  1054.     blt    .loop
  1055.  
  1056.     bsr    ZSphere.popMatrix
  1057.     rts
  1058.  
  1059. .temp:    DS.W    4                ; x,y,z,w
  1060. .num:    DC.W    0
  1061. .time:    DC.W    0
  1062.  
  1063. ; Adds spheres to the scene.
  1064. ; Uses a 3d particle model.
  1065. ; "You're in the right position to suck my balls." 
  1066. ; INPUT:
  1067. ; d0.w=x offset
  1068. ; a1: model
  1069. ZSphere.addVibrModel1:
  1070.     move.w    d0,.x
  1071.  
  1072.     move.w    $04BC.w,.time
  1073.  
  1074.     move.w    (a1)+,.num
  1075.  
  1076.     move.l    a1,-(sp)
  1077. ; Push world rotation matrix.
  1078.     move.w    .time(pc),d0
  1079.     move.w    d0,d1
  1080.     move.w    d0,d2
  1081.     mulu.w    #5,d1
  1082.     lsr.w    #2,d1
  1083.     mulu.w    #7,d2
  1084.     lsr.w    #2,d2
  1085.     bsr    ZSphere.generateMatrix
  1086.     move.w    .time(pc),d0
  1087.     move.w    d0,d1
  1088.     move.w    d0,d2
  1089.     mulu.w    #47,d0
  1090.     mulu.w    #59,d1
  1091.     mulu.w    #71,d2
  1092.     Do_SinModulo    d0
  1093.     Do_SinModulo    d1
  1094.     Do_SinModulo    d2
  1095.     Get_Sin    sine_tbl,d0,d0
  1096.     Get_Sin    sine_tbl,d1,d1
  1097.     Get_Sin    sine_tbl,d2,d2
  1098.     asr.w    #8,d0
  1099.     asr.w    #8,d1
  1100.     asr.w    #8,d2
  1101.     addi.w    #10000,d2
  1102.     bsr    ZSphere.translateMatrix
  1103.     bsr    ZSphere.pushMatrix
  1104.     movea.l    (sp)+,a1
  1105.  
  1106. ; Transform all balls.
  1107.     moveq    #0,d7
  1108.     
  1109. .loop:    move.l    a1,-(sp)
  1110.     move.w    d7,-(sp)
  1111.     move.w    .time(pc),d0
  1112.     move.w    d0,d1
  1113.     move.w    d0,d2
  1114.     mulu.w    #3,d0
  1115.     lsr.w    #2,d0
  1116.     mulu.w    #5,d1
  1117.     lsr.w    #1,d1
  1118.     mulu.w    #7,d2
  1119.     lsr.w    #3,d2
  1120.     clr.w    d0
  1121.     clr.w    d1
  1122.     clr.w    d2
  1123.     bsr    ZSphere.generateMatrix
  1124.     move.w    .x(pc),d0
  1125.     clr.w    d1
  1126.     clr.w    d2
  1127.     bsr    ZSphere.translateMatrix
  1128.     bsr    ZSphere.pushMatrix
  1129.     lea    .temp(pc),a2
  1130.     movea.l    2(sp),a1
  1131.     move.w    (a1)+,(a2)
  1132.     move.w    (a1)+,2(a2)
  1133.     move.w    (a1)+,4(a2)
  1134.     move.w    (a1)+,6(a2)
  1135.     move.l    a1,2(sp)
  1136.     bsr    ZSphere.transformVertex
  1137.     cmpi.w    #ZSphere.MAX_RADIUS-1,d2
  1138.     blo.s    .radius_okay
  1139.     move.w    #ZSphere.MAX_RADIUS-1,d2
  1140. .radius_okay:
  1141.     addq.w    #1,d2
  1142.     movea.l    ZSphere.baseAdr,a6
  1143.     adda.l    #ZSphere.PALOFFSETTABLE,a6
  1144.     move.l    (a6,d2.w*4),d4
  1145.     move.l    2(sp),a1
  1146.     move.w    (a1)+,d5
  1147.     move.l    a1,2(sp)
  1148.     movea.l    (ZSphere.ballColTable,d5.w*4),a6
  1149.     lea    (a6,d4.l),a6
  1150.  
  1151.     neg.w    d3                ; z=-Z (due to z buffer direction!)
  1152.     lsr.w    #4,d3                ; limit depthrange
  1153.  
  1154. ;    tst.w    (sp)
  1155. ;    bne.s    .not_first
  1156. ;    bsr    ZSphere.paint1stSphere
  1157. ;    bra.s    .end_paint
  1158. ;.not_first:
  1159.     bsr    ZSphere.paintSphere
  1160. ;.end_paint
  1161.  
  1162.     bsr    ZSphere.popMatrix
  1163.     move.w    (sp)+,d7
  1164.     movea.l    (sp)+,a1
  1165.     addq.w    #1,d7
  1166.     cmp.w    .num(pc),d7
  1167.     blt    .loop
  1168.  
  1169.     bsr    ZSphere.popMatrix
  1170.     rts
  1171.  
  1172. .x:    DC.W    0
  1173. .temp:    DS.W    4                ; x,y,z,w
  1174. .num:    DC.W    0
  1175. .time:    DC.W    0
  1176.  
  1177. ; Adds spheres to the scene.
  1178. ; Uses a 3d particle model.
  1179. ; "You're in the right position to suck my balls." 
  1180. ; INPUT:
  1181. ; d0.w=x offset
  1182. ; a1: model
  1183. ZSphere.addVibrModel2:
  1184.     move.w    d0,.x
  1185.  
  1186.     move.w    $04BC.w,.time
  1187.  
  1188.     move.w    (a1)+,.num
  1189.  
  1190.     move.l    a1,-(sp)
  1191. ; Push world rotation matrix.
  1192.     move.w    .time(pc),d0
  1193.     move.w    d0,d1
  1194.     move.w    d0,d2
  1195.     mulu.w    #5,d1
  1196.     lsr.w    #2,d1
  1197.     mulu.w    #7,d2
  1198.     lsr.w    #2,d2
  1199.     bsr    ZSphere.generateMatrix
  1200.     move.w    .time(pc),d0
  1201.     move.w    d0,d1
  1202.     move.w    d0,d2
  1203.     mulu.w    #59,d0
  1204.     mulu.w    #67,d1
  1205.     mulu.w    #79,d2
  1206.     Do_SinModulo    d0
  1207.     Do_SinModulo    d1
  1208.     Do_SinModulo    d2
  1209.     Get_Sin    sine_tbl,d0,d0
  1210.     Get_Sin    sine_tbl,d1,d1
  1211.     Get_Sin    sine_tbl,d2,d2
  1212.     asr.w    #8,d0
  1213.     asr.w    #8,d1
  1214.     asr.w    #8,d2
  1215.     addi.w    #10000,d2
  1216.     bsr    ZSphere.translateMatrix
  1217.     bsr    ZSphere.pushMatrix
  1218.     movea.l    (sp)+,a1
  1219.  
  1220. ; Transform all balls.
  1221.     moveq    #0,d7
  1222.     
  1223. .loop:    move.l    a1,-(sp)
  1224.     move.w    d7,-(sp)
  1225.     move.w    .time(pc),d0
  1226.     move.w    d0,d1
  1227.     move.w    d0,d2
  1228.     mulu.w    #3,d0
  1229.     lsr.w    #2,d0
  1230.     mulu.w    #5,d1
  1231.     lsr.w    #1,d1
  1232.     mulu.w    #7,d2
  1233.     lsr.w    #3,d2
  1234.     move.w    #sintbllen/2,d0
  1235.     clr.w    d1
  1236.     clr.w    d2
  1237.     bsr    ZSphere.generateMatrix
  1238.     move.w    .x(pc),d0
  1239.     clr.w    d1
  1240.     clr.w    d2
  1241.     bsr    ZSphere.translateMatrix
  1242.     bsr    ZSphere.pushMatrix
  1243.     lea    .temp(pc),a2
  1244.     movea.l    2(sp),a1
  1245.     move.w    (a1)+,(a2)
  1246.     move.w    (a1)+,2(a2)
  1247.     move.w    (a1)+,4(a2)
  1248.     move.w    (a1)+,6(a2)
  1249.     move.l    a1,2(sp)
  1250.     bsr    ZSphere.transformVertex
  1251.     cmpi.w    #ZSphere.MAX_RADIUS-1,d2
  1252.     blo.s    .radius_okay
  1253.     move.w    #ZSphere.MAX_RADIUS-1,d2
  1254. .radius_okay:
  1255.     addq.w    #1,d2
  1256.     movea.l    ZSphere.baseAdr,a6
  1257.     adda.l    #ZSphere.PALOFFSETTABLE,a6
  1258.     move.l    (a6,d2.w*4),d4
  1259.     move.l    2(sp),a1
  1260.     move.w    (a1)+,d5
  1261.     move.l    a1,2(sp)
  1262.     movea.l    (ZSphere.ballColTable,d5.w*4),a6
  1263.     lea    (a6,d4.l),a6
  1264.  
  1265.     neg.w    d3                ; z=-Z (due to z buffer direction!)
  1266.     lsr.w    #4,d3                ; limit depthrange
  1267.  
  1268. ;    tst.w    (sp)
  1269. ;    bne.s    .not_first
  1270. ;    bsr    ZSphere.paint1stSphere
  1271. ;    bra.s    .end_paint
  1272. ;.not_first:
  1273.     bsr    ZSphere.paintSphere
  1274. ;.end_paint
  1275.  
  1276.     bsr    ZSphere.popMatrix
  1277.     move.w    (sp)+,d7
  1278.     movea.l    (sp)+,a1
  1279.     addq.w    #1,d7
  1280.     cmp.w    .num(pc),d7
  1281.     blt    .loop
  1282.  
  1283.     bsr    ZSphere.popMatrix
  1284.     rts
  1285.  
  1286. .x:    DC.W    0
  1287. .temp:    DS.W    4                ; x,y,z,w
  1288. .num:    DC.W    0
  1289. .time:    DC.W    0
  1290.  
  1291.  
  1292. ; INPUT:
  1293. ; d0.w: left x
  1294. ; d1.w: top y
  1295. ; d2.w: width
  1296. ; d3.w: heigth
  1297. ; OUTPUT:
  1298. ; d0.w: left x
  1299. ; d1.w: top y
  1300. ; d2.w: width
  1301. ; d3.w: height
  1302. ; d4.w: clipped off left x
  1303. ; d5.w: clipped off top y
  1304. ; d6.w: 0=offsceen, 1=onscreen
  1305. ZSphere.clip:
  1306.     clr.l    d4                ; d4.w = clipped off left x(=0)
  1307.     move.w    d0,d6
  1308.     add.w    d2,d6                ; d6.w = right x
  1309.     ble.s    .offscreen
  1310.     tst.w    d0
  1311.     bpl.s    .test_right_x
  1312. ; Clipped on left side.
  1313.     add.w    d0,d2                ; d2.w = width - clipped off left x
  1314.     move.w    d0,d4
  1315.     neg.w    d4                ; d4.w = clipped off left x
  1316.     clr.l    d0                ; d0.w = left x(=0)
  1317. .test_right_x:
  1318.     subi.w    #160,d6                ; d6.w = clipped off right x
  1319.     bls.s    .right_x_not_clipped
  1320.     cmpi.w    #160,d0
  1321.     bge.s    .offscreen
  1322. ; Clipped on right side.
  1323.     sub.w    d6,d2                ; d2.w = width - clipped off right x
  1324. .right_x_not_clipped:
  1325.  
  1326.     clr.l    d5                ; d5.w = clipped off top y(=0)
  1327.     move.w    d1,d6
  1328.     add.w    d3,d6                ; d6.w = bottom y
  1329.     ble.s    .offscreen
  1330.     tst.w    d1
  1331.     bpl.s    .test_bottom_y
  1332. ; Clipped on top side.
  1333.     add.w    d1,d3                ; d3.w = heigth - clipped off top y
  1334.     move.w    d1,d5
  1335.     neg.w    d5                ; d5.w = clipped off top y
  1336.     clr.l    d1                ; d1.w = top y(=0)
  1337. .test_bottom_y:
  1338.     subi.w    #100,d6                ; d6.w = clipped off bottom y
  1339.     bls.s    .bottom_y_not_clipped
  1340.     cmpi.w    #100,d1
  1341.     bge.s    .offscreen
  1342. ; Clipped on right side.
  1343.     sub.w    d6,d3                ; d3.w = height - clipped off top y
  1344. .bottom_y_not_clipped:
  1345.  
  1346. .onscreen:
  1347.     moveq    #1,d6
  1348.     rts
  1349. .offscreen:
  1350.     moveq    #0,d6
  1351.     rts
  1352.  
  1353. ; INPUT:
  1354. ; d0.w: center x
  1355. ; d1.w: center y
  1356. ; d2.w: radius
  1357. ; d3.w: center z
  1358. ; a6: color table
  1359. ZSphere.paintSphere:
  1360.  
  1361.     sub.w    d2,d0
  1362.     sub.w    d2,d1
  1363. ; d0.w: left x
  1364. ; d1.w: top y
  1365.  
  1366.     movem.w    d2/d3,-(sp)
  1367.     add.w    d2,d2
  1368.     move.w    d2,d3
  1369.  
  1370.     bsr    ZSphere.clip
  1371. ; d2.w = width
  1372. ; d3.w = height
  1373. ; d4.w = cliplx
  1374. ; d5.w = clipty
  1375.  
  1376.     movea.w    d2,a0
  1377.     move.w    d3,d7
  1378.     movem.w    (sp)+,d2/d3
  1379.  
  1380.     tst.w    d6
  1381.     beq    .end
  1382.  
  1383.     movea.l    ZSphere.baseAdr,a2
  1384.     movea.l    a2,a1
  1385.     movea.l    a2,a5
  1386.  
  1387.     move.w    #ZSphere.MAX_RADIUS,d6
  1388.     sub.w    d2,d6                ; d6.w = MAX_RADIUS - r
  1389.     add.w    d4,d6                ; d6.w = MAX_R - r + cliplx
  1390.     adda.l    #ZSphere.SQUARETABLE,a2
  1391.     movea.l    a2,a3
  1392.     lea    (a2,d6.w*2),a2            ; a2: x square lookup
  1393.     move.w    #ZSphere.MAX_RADIUS,d6
  1394.     sub.w    d2,d6                ; d6.w = MAX_RADIUS - r
  1395.     add.w    d5,d6                ; d6.w = MAX_R - r + clipty
  1396.     lea    (a3,d6.w*2),a3            ; a3: y square lookup
  1397.  
  1398.     adda.l    #ZSphere.SQRTTABLE,a1
  1399.     adda.l    #ZSphere.ZBUFFER,a5
  1400.  
  1401.     subq.w    #1,d7                ; d7.w = height-1
  1402.     move.w    a0,d5                ; d5.w = width
  1403.     subq.w    #1,d5                ; d5.w = width-1
  1404.  
  1405.     mulu.w    d2,d2
  1406. ; d2.w = r^2
  1407.  
  1408. ; Now paint the graphics.
  1409.     movea.l    ZSphere.scrAdrAdr,a0
  1410.     movea.l    (a0),a0
  1411.     ext.l    d0
  1412.     mulu.w    #160,d1
  1413.     add.l    d0,d1
  1414.     add.l    d1,d1
  1415.     adda.l    d1,a5
  1416.     adda.l    d1,a0
  1417.  
  1418.     clr.l    d0
  1419.     clr.l    d1
  1420.     clr.l    d4
  1421.  
  1422. ; z = sqrt(r^2-x^2-y^2)
  1423. .yloop:    movea.l    a2,a4
  1424.     move.w    d5,d6
  1425.     move.w    (a3)+,d0
  1426.  
  1427. .xloop:    move.w    (a4)+,d1
  1428.     add.w    d0,d1
  1429.     add.w    d2,d1
  1430.     bmi.s    .end_pixel
  1431.     move.w    (a1,d1.l*2),d1
  1432.     move.w    d1,d4
  1433.     add.w    d3,d1
  1434.     cmp.w    (a5),d1
  1435.     blt.s    .end_pixel
  1436.     move.w    d1,(a5)
  1437.     move.w    (a6,d4.l*2),(a0)
  1438. .end_pixel:
  1439.     addq    #2,a0
  1440.     addq    #2,a5
  1441.     dbra    d6,.xloop
  1442.  
  1443.     lea    159*2(a0),a0
  1444.     suba.w    d5,a0
  1445.     suba.w    d5,a0
  1446.     lea    159*2(a5),a5
  1447.     suba.w    d5,a5
  1448.     suba.w    d5,a5
  1449.     dbra    d7,.yloop
  1450. .end:    rts
  1451.  
  1452. ; INPUT:
  1453. ; d0.w: center x
  1454. ; d1.w: center y
  1455. ; d2.w: radius
  1456. ; d3.w: center z
  1457. ; a6: color table
  1458. ZSphere.paint1stSphere:
  1459.  
  1460.     sub.w    d2,d0
  1461.     sub.w    d2,d1
  1462. ; d0.w: left x
  1463. ; d1.w: top y
  1464.  
  1465.     movem.w    d2/d3,-(sp)
  1466.     add.w    d2,d2
  1467.     move.w    d2,d3
  1468.  
  1469.     bsr    ZSphere.clip
  1470. ; d2.w = width
  1471. ; d3.w = height
  1472. ; d4.w = cliplx
  1473. ; d5.w = clipty
  1474.  
  1475.     movea.w    d2,a0
  1476.     move.w    d3,d7
  1477.     movem.w    (sp)+,d2/d3
  1478.  
  1479.     tst.w    d6
  1480.     beq    .end
  1481.  
  1482.     movea.l    ZSphere.baseAdr,a2
  1483.     movea.l    a2,a1
  1484.     movea.l    a2,a5
  1485.  
  1486.     move.w    #ZSphere.MAX_RADIUS,d6
  1487.     sub.w    d2,d6                ; d6.w = MAX_RADIUS - r
  1488.     add.w    d4,d6                ; d6.w = MAX_R - r + cliplx
  1489.     adda.l    #ZSphere.SQUARETABLE,a2
  1490.     movea.l    a2,a3
  1491.     lea    (a2,d6.w*2),a2            ; a2: x square lookup
  1492.     move.w    #ZSphere.MAX_RADIUS,d6
  1493.     sub.w    d2,d6                ; d6.w = MAX_RADIUS - r
  1494.     add.w    d5,d6                ; d6.w = MAX_R - r + clipty
  1495.     lea    (a3,d6.w*2),a3            ; a3: y square lookup
  1496.  
  1497.     adda.l    #ZSphere.SQRTTABLE,a1
  1498.     adda.l    #ZSphere.ZBUFFER,a5
  1499.  
  1500.     subq.w    #1,d7                ; d7.w = height-1
  1501.     move.w    a0,d5                ; d5.w = width
  1502.     subq.w    #1,d5                ; d5.w = width-1
  1503.  
  1504.     mulu.w    d2,d2
  1505. ; d2.w = r^2
  1506.  
  1507. ; Now paint the graphics.
  1508.     movea.l    ZSphere.scrAdrAdr,a0
  1509.     movea.l    (a0),a0
  1510.     ext.l    d0
  1511.     mulu.w    #160,d1
  1512.     add.l    d0,d1
  1513.     add.l    d1,d1
  1514.     adda.l    d1,a5
  1515.     adda.l    d1,a0
  1516.  
  1517.     clr.l    d0
  1518.     clr.l    d1
  1519.     clr.l    d4
  1520.  
  1521. ; z = sqrt(r^2-x^2-y^2)
  1522. .yloop:    movea.l    a2,a4
  1523.     move.w    d5,d6
  1524.     move.w    (a3)+,d0
  1525.  
  1526. .xloop:    move.w    (a4)+,d1
  1527.     add.w    d0,d1
  1528.     add.w    d2,d1
  1529.     bmi.s    .end_pixel
  1530.     move.w    (a1,d1.l*2),d1
  1531.     move.w    (a6,d1.l*2),(a0)
  1532.     add.w    d3,d1
  1533.     move.w    d1,(a5)
  1534. .end_pixel:
  1535.     addq    #2,a0
  1536.     addq    #2,a5
  1537.     dbra    d6,.xloop
  1538.  
  1539.     lea    159*2(a0),a0
  1540.     suba.w    d5,a0
  1541.     suba.w    d5,a0
  1542.     lea    159*2(a5),a5
  1543.     suba.w    d5,a5
  1544.     suba.w    d5,a5
  1545.     dbra    d7,.yloop
  1546. .end:    rts
  1547.  
  1548. ; INPUT:
  1549. ; a0: screen (160*100 words)
  1550. ZSphere.clearScreen:
  1551.     movea.l    ZSphere.scrAdrAdr,a0
  1552.     movea.l    (a0),a0
  1553.     move.w    #160*100/2-1,d7
  1554.     clr.l    d0
  1555. .loop:    move.l    d0,(a0)+
  1556.     dbf    d7,.loop
  1557.     rts
  1558.  
  1559. ZSphere.feedbackScreen:
  1560.     movea.l    ZSphere.scrAdrAdr,a0
  1561.     movea.l    (a0),a0
  1562.     movea.l    ZSphere.oldScrAdrAdr,a1
  1563.     movea.l    (a1),a1
  1564.     lea    80*2(a0),a2
  1565.     lea    160*50*2(a0),a3
  1566.     lea    (160*50+80)*2(a0),a4
  1567.     moveq    #50-1,d7
  1568.  
  1569. .yloop:    moveq    #40-1,d6
  1570.  
  1571. .xloop:    move.w    (a1),d0
  1572.     addq    #4,a1
  1573.     swap    d0
  1574.     move.w    (a1),d0
  1575.     addq    #4,a1
  1576.     move.l    d0,(a0)+
  1577.     move.l    d0,(a2)+
  1578.     move.l    d0,(a3)+
  1579.     move.l    d0,(a4)+
  1580.     dbf    d6,.xloop
  1581.  
  1582.     adda.w    #80*2,a0
  1583.     adda.w    #160*2,a1
  1584.     adda.w    #80*2,a2
  1585.     adda.w    #80*2,a3
  1586.     adda.w    #80*2,a4
  1587.     dbf    d7,.yloop
  1588.     rts
  1589.  
  1590. ZSphere.copyVga60:
  1591.     move.w    #160,d0
  1592.     move.w    #100,d1
  1593.     movea.l    ZSphere.scrAdrAdr,a1
  1594.     movea.l    (a1),a1
  1595.     movea.l    scr,a0
  1596.     bra.l    DOUBLE_BUFFERV
  1597.  
  1598. ZSphere.copyRgb50:
  1599.     move.w    #160,d0
  1600.     move.w    #100,d1
  1601.     movea.l    ZSphere.scrAdrAdr,a1
  1602.     movea.l    (a1),a1
  1603.     movea.l    scr,a0
  1604.     bra.l    DOUBLE_BUFFERH
  1605.  
  1606. ;======= OBJECT DATA ========
  1607.  
  1608.     DATA
  1609.  
  1610. ; Largest ball first please due to z buffer optimisation =;)
  1611. ZSphere.waterModel:
  1612.     DC.W    3                ; 3 balls
  1613.     DC.W    +0000,+0000,+0000,600,0        ; x,y,z,r,c
  1614.     DC.W    -0400,+0400,+0000,500,1        ; x,y,z,r,c
  1615.     DC.W    +0400,+0400,+0000,500,1        ; x,y,z,r,c
  1616.  
  1617. ZSphere.methaneModel:
  1618.     DC.W    5                ; 5 balls
  1619.     DC.W    +0000,+0000,+0000,600,0        ; x,y,z,r,c
  1620.     DC.W    +0433,-0250,+0250,500,1        ; x,y,z,r,c
  1621.     DC.W    -0433,-0250,+0250,500,1        ; x,y,z,r,c
  1622.     DC.W    +0000,+0500,+0250,500,1        ; x,y,z,r,c
  1623.     DC.W    +0000,+0000,-0559,500,1        ; x,y,z,r,c
  1624.  
  1625. ZSphere.model:
  1626.     DC.L    ZSphere.waterModel
  1627.  
  1628. ZSphere.paintRout:
  1629.     DC.L    ZSphere.paintSingle
  1630.  
  1631. ZSphere.clearRout:
  1632.     DC.L    ZSphere.clearScreen
  1633.  
  1634. ;======= OBJECT RESERVES ========
  1635.  
  1636.     BSS
  1637.  
  1638. ZSphere.matrixStackTop:
  1639.     DS.W    1
  1640. ZSphere.tempMatrix:
  1641.     DS.W    15
  1642. ZSphere.matrixStack:                * page flipping transformation matrix
  1643.     DS.W    15*8
  1644.  
  1645. ZSphere.copyRout:
  1646.     DS.L    1
  1647. ZSphere.scrAdrAdr:                ; address of the address of the screenaddress (eh, yeah ;))
  1648.     DS.L    1
  1649. ZSphere.oldScrAdrAdr:
  1650.     DS.L    1
  1651. ZSphere.baseAdr:
  1652.     DS.L    1
  1653.  
  1654. ZSphere.bufAdr:
  1655.     DS.L    1                ; phys ptr
  1656. ZSphere.bufAdr2:
  1657.     DS.L    1                ; log ptr
  1658.  
  1659. ZSphere.ballColTable:
  1660.     DS.L    2                ; white, red table ptrs
  1661.  
  1662. ZSphere.yOffset:
  1663.     DS.W    1
  1664. ZSphere.bounceDir:
  1665.     DS.W    1
  1666. ZSphere.bounceStart:
  1667.     DS.L    1
  1668. ZSphere.walkDir:
  1669.     DS.W    1
  1670. ZSphere.swapCoords:
  1671.     DS.W    1
  1672. ZSphere.moveOff:
  1673.     DS.W    1
  1674.  
  1675. ;======= END OF DEMO-EFFECT OBJECT ========