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

  1. ; Tribal tridi stuffings.
  2. ; Filled shrunken headz.
  3. ;
  4. ; originally intended as tribal stuff but now more industrial, how lame..
  5. ; A screen for delta, using ufly.
  6.  
  7. ;======= OBJECT EQUATES ========
  8.  
  9. ; Change these to your likings..
  10. Tribal.WHEELSTEPS:    =    24            ; must be even!
  11. Tribal.WHEELDEPTH:    =    60
  12. Tribal.WHEELRIN:    =    300
  13. Tribal.WHEELROUT:    =    400            ; > RIN
  14. Tribal.WHEELRT:        =    60            ; >=0
  15.  
  16. ; Do not change these!
  17. Tribal.WHEELPOINTS:    =    Tribal.WHEELSTEPS*6
  18. Tribal.WHEELPOLYS:    =    Tribal.WHEELSTEPS*5
  19.  
  20. ; Change these to your likings..
  21. Tribal.SWHEELSTEPS:    =    12            ; must be even!
  22. Tribal.SWHEELDEPTH:    =    60
  23. Tribal.SWHEELRIN:    =    150
  24. Tribal.SWHEELROUT:    =    250            ; > RIN
  25. Tribal.SWHEELRT:    =    60            ; >=0
  26.  
  27. Tribal.AXIS_SEGMENTS:    =    2
  28. Tribal.AXIS_SEGLEN:    =    2000/Tribal.AXIS_SEGMENTS
  29.  
  30. Tribal.ANCHORROUT:    =    Tribal.SWHEELRIN
  31. Tribal.ANCHORRIN:    =    40
  32.  
  33. Tribal.AXIS_POINTS:    =    24+Tribal.AXIS_SEGMENTS*4
  34. Tribal.AXIS_POLYS:    =    1+4*4+Tribal.AXIS_SEGMENTS*4
  35.  
  36.             RSRESET
  37. Tribal.wheel:        RS.W    4096
  38. Tribal.smallWheel:    RS.W    2048
  39. Tribal.axis:        RS.W    2048
  40. Tribal.BLOCK_SIZE:    RS.B    0
  41.  
  42. ;======= OBJECT TABLE ========
  43.  
  44. ; Must be first in object!!
  45. Tribal.table:
  46.     DC.L    Tribal.mainLoop
  47.     DC.L    Tribal.init
  48.     DC.L    Tribal.setRes
  49.     DC.L    Tribal.trigger2Circles
  50.     DC.L    Tribal.introBigWheel
  51.     DC.L    Tribal.introSmallWheel
  52.     DC.L    Tribal.switchWheelRot
  53.     DC.L    Tribal.setTopWheels
  54.     DC.L    Tribal.setFrontFocus
  55.     DC.L    Tribal.setMidFocus
  56.     DC.L    Tribal.triggerHalfCircle
  57.     DC.L    Tribal.triggerShiftLeft
  58.     DC.L    Tribal.setZoomAccel
  59.     DC.L    0
  60.  
  61.     IFND    DEMO_SYSTEM
  62.     INCLUDE    SFLY_DSP.S
  63.     TEXT
  64.     ENDC
  65.  
  66. ;======= RESOLUTION SETTING ROUTINE ========
  67.  
  68. Tribal.setRes:
  69.     IFEQ    testmode
  70.     move.w    monitormode,d0
  71.     cmpi.w    #vga60,d0
  72.     beq.s    .vga60
  73.     cmpi.w    #vga100,d0
  74.     beq.s    .vga100
  75.     cmpi.w    #rgb50,d0
  76.     beq.s    .rgb50
  77. ; Unknown monitormode..
  78.     rts
  79. .vga60:    bra.l    vga60_16bit_320_200
  80. .vga100:bra.l    vga100_16bit_320_200
  81. .rgb50:    bra.l    rgb50_16bit_320_200
  82.     ENDC
  83.     rts
  84.  
  85. ;======= INIT SUBROUTINE ========
  86.  
  87. ; OUTPUT:
  88. ; d0.l: =0 all clear, <0 error
  89. Tribal.init:
  90.     move.l    #Tribal.BLOCK_SIZE,d0
  91.     bsr.l    Mem.register
  92.  
  93.     lea    sine_tbl,a1
  94.     bsr.l    Matrix.init
  95.  
  96. ; Generate nice turbulence chrome texture..
  97.     lea    Tribal.texture,a0
  98.     move.l    #"Word",(a0)+
  99.     move.l    #"PerP",(a0)+
  100.     move.l    #"ixel",(a0)+
  101.     move.l    #$00400040,(a0)+
  102.     lea    FlareGen.chromePal,a1
  103.     moveq    #6,d0
  104.     moveq    #3,d1
  105.     move.l    #$00010001,d2
  106.     bsr.l    Texture.createWords2
  107.  
  108.     bsr    Tribal.calcGreyPal
  109.  
  110. .success:
  111.     moveq    #0,d0
  112.     rts
  113. .error:    moveq    #-1,d0
  114.     rts
  115.  
  116. ;======= REALTIME INIT SUBROUTINE ========
  117.  
  118. Tribal.realtimeInit:
  119.     move.l    #rts,vbl_gfx
  120.  
  121.     bsr.l    Mem.getBlock
  122.     move.l    d0,Tribal.baseAdr
  123.  
  124.     bsr.l    HumanFly.init
  125.  
  126.     lea    Viewport.settingsTable,a0
  127.     move.w    #320,Viewport.XSCREEN(a0)
  128.     move.w    #200,Viewport.YSCREEN(a0)
  129.     move.w    #0,Viewport.XSTART(a0)
  130.     move.w    #0,Viewport.YSTART(a0)
  131.     move.w    #320,Viewport.XEND(a0)
  132.     move.w    #200,Viewport.YEND(a0)
  133.     move.w    #160,Viewport.XCENTER(a0)
  134.     move.w    #100,Viewport.YCENTER(a0)
  135.     move.w    #256+32,Viewport.ASPECT(a0)
  136.     move.w    #$100,Viewport.FOCAL(a0)
  137.     bsr.l    Viewport.update
  138.  
  139.     lea    Tribal.textureTable,a0
  140.     lea    Tribal.pal,a1
  141.     bsr.l    Polygon.init
  142.  
  143.     bsr.l    ObjectRegistry.clear
  144.  
  145.     lea    Tribal.delta,a0
  146.     move.l    #Tribal.deltaEnd-Tribal.delta,d0
  147.     bsr.l    ObjectRegistry.set
  148.     tst.w    d0
  149.     bmi    .error
  150.  
  151.     move.w    #Tribal.WHEELSTEPS,Tribal.wheelSteps
  152.     move.w    #Tribal.WHEELDEPTH,Tribal.wheelDepth
  153.     move.w    #Tribal.WHEELRIN,Tribal.wheelRIn
  154.     move.w    #Tribal.WHEELROUT,Tribal.wheelROut
  155.     move.w    #Tribal.WHEELRT,Tribal.wheelRT
  156.  
  157.     movea.l    Tribal.baseAdr,a0
  158.     adda.l    #Tribal.wheel,a0
  159.     bsr    Tribal.genWheel
  160. ; d0.l=obj size
  161.     movea.l    Tribal.baseAdr,a0
  162.     adda.l    #Tribal.wheel,a0
  163.     bsr.l    ObjectRegistry.set
  164.     tst.w    d0
  165.     bmi    .error
  166.  
  167.     move.w    #Tribal.SWHEELSTEPS,Tribal.wheelSteps
  168.     move.w    #Tribal.SWHEELDEPTH,Tribal.wheelDepth
  169.     move.w    #Tribal.SWHEELRIN,Tribal.wheelRIn
  170.     move.w    #Tribal.SWHEELROUT,Tribal.wheelROut
  171.     move.w    #Tribal.SWHEELRT,Tribal.wheelRT
  172.  
  173.     movea.l    Tribal.baseAdr,a0
  174.     adda.l    #Tribal.smallWheel,a0
  175.     bsr    Tribal.genWheel
  176. ; d0.l=obj size
  177.     movea.l    Tribal.baseAdr,a0
  178.     adda.l    #Tribal.smallWheel,a0
  179.     bsr.l    ObjectRegistry.set
  180.     tst.w    d0
  181.     bmi    .error
  182.  
  183.     movea.l    Tribal.baseAdr,a0
  184.     adda.l    #Tribal.axis,a0
  185.     bsr    Tribal.genAxis
  186. ; d0.l=obj size
  187.     movea.l    Tribal.baseAdr,a0
  188.     adda.l    #Tribal.axis,a0
  189.     bsr.l    ObjectRegistry.set
  190.     tst.w    d0
  191.     bmi.s    .error
  192.  
  193.     move.w    #-2000,Tribal.bigWheelX
  194.     move.w    #+2000,Tribal.smallWheelX
  195.     clr.l    Tribal.worldRotTime
  196.     clr.w    Tribal.worldRotOn
  197.     clr.w    Tribal.bigWheelMoveOn
  198.     clr.w    Tribal.wheelRotOn
  199.     clr.w    Tribal.topWheelsOn
  200.     clr.w    Tribal.axisMoveOn
  201.     clr.w    Tribal.axisOn
  202.     clr.w    Tribal.rotAccelOn
  203.     clr.w    Tribal.worldX
  204.     clr.w    Tribal.worldZ
  205.     move.l    #Tribal.paint,Tribal.paintRout
  206.     move.l    #Tribal.dummy,Tribal.worldRout
  207.     move.w    #32,Tribal.wRotSpeed
  208.  
  209. .success:
  210.     moveq    #0,d0
  211.     rts
  212. .error:    moveq    #-1,d0
  213.     rts
  214.  
  215. ;======= SCREENINIT SUBROUTINE ========
  216.  
  217. Tribal.initScreen:
  218.     lea    Viewport.settingsTable,a0
  219.     movem.w    Viewport.XSTART(a0),d0/d6
  220.     movem.w    Viewport.YSTART(a0),d1/d7
  221.     move.l    #$00000000,d4
  222.     bsr.l    Viewport.paintRectangle
  223.     rts
  224.  
  225. ;======= MAINLOOP SUBROUTINE ========
  226.  
  227. Tribal.mainLoop:
  228.     move.w    $0468.w,.old468
  229.  
  230.     movea.l    scr,a0
  231.     bsr.l    Primitive.setScreenbuffer
  232.  
  233.     move.l    frmcnt,d0
  234.     sub.l    lastframecount,d0
  235.     bne.s    .end_realtime_init
  236.     move.l    d0,-(sp)
  237.     bsr    Tribal.realtimeInit
  238.     tst.l    d0
  239.     bmi    .end
  240.     move.l    (sp)+,d0
  241. .end_realtime_init:
  242.     cmpi.l    #3,d0
  243.     bhs.s    .end_screeninit
  244.     bsr    Tribal.initScreen
  245. .end_screeninit:
  246.  
  247. ; big wheel movement
  248.     tst.w    Tribal.bigWheelMoveOn
  249.     beq.s    .bigwheel_done
  250.     move.l    $04BA.w,d0
  251.     sub.l    Tribal.bigWheelStart,d0
  252.     lsl.l    #3,d0
  253.     subi.w    #2000,d0
  254.     cmpi.w    #-430,d0
  255.     blt.s    .big_ok
  256.     move.w    #-430,d0
  257.     clr.w    Tribal.bigWheelMoveOn
  258. .big_ok:move.w    d0,Tribal.bigWheelX
  259. .bigwheel_done:
  260.  
  261. ; small wheel movement
  262.     tst.w    Tribal.smallWheelMoveOn
  263.     beq.s    .smallwheel_done
  264.     move.l    $04BA.w,d0
  265.     sub.l    Tribal.smallWheelStart,d0
  266.     lsl.l    #3,d0
  267.     neg.l    d0
  268.     addi.w    #2000,d0
  269.     cmpi.w    #+280,d0
  270.     bgt.s    .s_ok
  271.     move.w    #+280,d0
  272.     clr.w    Tribal.smallWheelMoveOn
  273. .s_ok:    move.w    d0,Tribal.smallWheelX
  274. .smallwheel_done:
  275.  
  276. ; wheel axial rotation
  277.     clr.l    d0
  278.     tst.w    Tribal.wheelRotOn
  279.     beq.s    .wheelrot_done
  280.     move.l    $04BA.w,d0
  281.     sub.l    Tribal.wheelRotStart,d0
  282.     tst.w    Tribal.rotAccelOn
  283.     beq.s    .wheelrot_done
  284.     sub.w    Tribal.oldWRotTime,d0
  285.     move.w    d0,d1
  286.     move.w    d0,Tribal.wRotSpeed
  287.     mulu.w    d0,d0
  288.     lsr.l    #8,d0
  289.     lsr.l    #2,d0
  290.     add.w    Tribal.oldWRotTime,d0
  291.     add.w    d1,d0
  292.     move.w    d0,Tribal.wheelRotTime
  293.     bra.s    .end_wrot
  294. .wheelrot_done:
  295.     mulu.w    Tribal.wRotSpeed,d0
  296.     lsr.l    #5,d0
  297.     move.w    d0,Tribal.wheelRotTime
  298. .end_wrot:
  299.  
  300. ; axis z position
  301.     tst.w    Tribal.axisMoveOn
  302.     beq.s    .end_axis
  303.     move.l    $04BA.w,d0
  304.     sub.l    Tribal.axisStart,d0
  305.     lsl.l    #3,d0
  306.     neg.w    d0
  307.     addi.w    #4000,d0
  308.     bpl.s    .oki_axis
  309.     clr.w    d0
  310.     clr.w    Tribal.axisMoveOn
  311. .oki_axis:
  312.     move.w    d0,Tribal.axisZ
  313. .end_axis:
  314.  
  315.     movea.l    Tribal.worldRout,a0
  316.     jsr    (a0)
  317.  
  318.     movea.l    Tribal.paintRout,a0
  319.     jsr    (a0)
  320.  
  321.     IFEQ    testmode
  322.     lea    scr,a0
  323.     move.l    (a0)+,d0
  324.     move.l    (a0)+,d1
  325.     move.l    (a0),-4(a0)
  326.     move.l    d0,(a0)
  327.     move.l    d1,-8(a0)
  328.     move.l    d0,d1
  329.     lsr.w    #8,d0
  330.     move.l    d0,$ffff8200.w
  331.     move.b    d1,$ffff820d.w
  332.     ENDC
  333.  
  334.     move.w    .old468(pc),d0
  335. .wait:    cmp.w    $0468.w,d0
  336.     beq.s    .wait
  337.  
  338.     move.l    frmcnt,d0
  339.     sub.l    lastframecount,d0
  340.     bne.s    .res_done
  341.     bsr    Tribal.setRes
  342. .res_done:
  343.  
  344. .end:    rts
  345.  
  346. .old468:DC.W    0
  347.  
  348. ;======= OBJECT SUBROUTINES ========
  349.  
  350. Tribal.introBigWheel:
  351.     move.w    #1,Tribal.bigWheelMoveOn
  352.     move.l    $04BA.w,Tribal.bigWheelStart
  353.     rts
  354.  
  355. Tribal.introSmallWheel:
  356.     move.w    #1,Tribal.smallWheelMoveOn
  357.     move.l    $04BA.w,Tribal.smallWheelStart
  358.     rts
  359.  
  360. Tribal.switchWheelRot:
  361.     not.w    Tribal.wheelRotOn
  362.     move.l    $04BA.w,Tribal.wheelRotStart
  363.     rts
  364.  
  365. Tribal.setTopWheels:
  366.     move.w    #1,Tribal.topWheelsOn
  367.     bra.s    Tribal.setAxis
  368.  
  369. Tribal.setFrontFocus:
  370.     move.l    #Tribal.paint,Tribal.paintRout
  371.     rts
  372.  
  373. Tribal.setMidFocus:
  374.     move.l    #Tribal.paintMid,Tribal.paintRout
  375.     rts
  376.  
  377. Tribal.trigger2Circles:
  378.     move.l    #Tribal.turnTwice,Tribal.worldRout
  379.     move.l    $04BA.w,Tribal.worldRotStart
  380.     rts
  381.  
  382. Tribal.triggerHalfCircle:
  383.     move.l    #Tribal.turnHalf,Tribal.worldRout
  384.     move.l    $04BA.w,Tribal.worldRotStart
  385.     rts
  386.  
  387. Tribal.setAxis:
  388.     move.l    $04BA.w,Tribal.axisStart
  389.     move.w    #1,Tribal.axisOn
  390.     move.w    #1,Tribal.axisMoveOn
  391.     rts
  392.  
  393. Tribal.triggerShiftLeft:
  394.     move.l    #Tribal.shiftLeft,Tribal.worldRout
  395.     move.l    $04BA.w,Tribal.worldRotStart
  396.     rts
  397.  
  398. Tribal.setZoomAccel:
  399.     move.l    #Tribal.zoomIn,Tribal.worldRout
  400.     move.l    $04BA.w,Tribal.worldRotStart
  401.     move.w    Tribal.wheelRotTime,Tribal.oldWRotTime
  402.     move.w    #32,Tribal.wRotSpeed
  403.     move.w    #1,Tribal.rotAccelOn
  404.     rts
  405.  
  406. Tribal.zoomIn:
  407.     move.l    $04BA.w,d0
  408.     sub.l    Tribal.worldRotStart,d0
  409.     add.l    d0,d0
  410.     cmpi.w    #1950,d0
  411.     blt.s    .ok
  412.     move.w    #1950,d0
  413.     move.l    #Tribal.dummy,Tribal.worldRout
  414.     clr.w    Tribal.rotAccelOn
  415.     move.w    Tribal.wheelRotTime,Tribal.oldWRotTime
  416. .ok:    neg.w    d0
  417.     move.w    d0,Tribal.worldZ
  418.     rts
  419.  
  420. Tribal.turnTwice:
  421. ; rot wereld!
  422.     move.l    $04BA.w,d0
  423.     sub.l    Tribal.worldRotStart,d0
  424.     add.l    d0,d0
  425.     cmpi.w    #sintbllen*2,d0
  426.     blt.s    .ok
  427.     move.w    #sintbllen*2,d0
  428.     move.l    #Tribal.dummy,Tribal.worldRout
  429. .ok:    move.l    d0,Tribal.worldRotTime
  430.     rts
  431.  
  432. Tribal.turnHalf:
  433. ; rot wereld!
  434.     move.l    $04BA.w,d0
  435.     sub.l    Tribal.worldRotStart,d0
  436.     add.l    d0,d0
  437.     cmpi.w    #sintbllen/2,d0
  438.     blt.s    .ok
  439.     move.w    #sintbllen/2,d0
  440.     move.l    #Tribal.dummy,Tribal.worldRout
  441. .ok:    move.l    d0,Tribal.worldRotTime
  442.     rts
  443.  
  444. Tribal.shiftLeft:
  445.     move.l    $04BA.w,d0
  446.     sub.l    Tribal.worldRotStart,d0
  447.     lsl.l    #2,d0
  448.     cmpi.w    #Tribal.SWHEELROUT*3+Tribal.SWHEELRT*2,d0
  449.     blt.s    .ok
  450.     move.w    #Tribal.SWHEELROUT*3+Tribal.SWHEELRT*2,d0
  451.     move.l    #Tribal.dummy,Tribal.worldRout
  452. .ok:    move.w    d0,Tribal.worldX
  453.     rts
  454.  
  455. Tribal.calcGreyPal:
  456.     lea    Tribal.pal,a0
  457.     clr.w    d0
  458.     move.w    #%0000100000100001,d1
  459.     move.w    #%0000000000100000,d2
  460.  
  461. .loop:    move.w    d0,(a0)+
  462.     move.w    d0,(a0)+
  463.     add.w    d2,d0
  464.     move.w    d0,(a0)+
  465.     move.w    d0,(a0)+
  466.     add.w    d1,d0
  467.     bcc.s    .loop
  468.     rts
  469.  
  470. ; Generates a cogwheel. Very industrial, yes, yes.
  471. ;
  472. ; Parametrisation (2d, we extrude very easily later on):
  473. ;
  474. ; phi controls rotation. 0<=phi<2pi, phi=step*(2pi/steps), 0<=step<steps
  475. ;
  476. ; in(phi) = R_in*[cos(phi), sin(phi)]
  477. ; --
  478. ; out(phi) = R_out*[cos(phi), sin(phi)]
  479. ; ---
  480. ; t(phi) = out(phi) + n(phi) (tooth)
  481. ; -        ---        -
  482. ;
  483. ;          { R_n*[cos(phi+a), sin(phi+a)], step even
  484. ; n(phi) = { or...
  485. ; -        { R_n*[cos(phi-a), sin(phi-a)], step odd
  486. ;
  487. ; a = 2pi/(2*steps)=pi/steps
  488. ;
  489. ; INPUT:
  490. ; a0: dst object
  491. ; OUTPUT:
  492. ; d0.l=size of obj
  493. Tribal.genWheel:
  494.     movea.l    a0,a6
  495.  
  496.     move.w    Tribal.wheelSteps,d0
  497.     move.w    d0,d1
  498.     mulu.w    #6,d0
  499.     mulu.w    #5,d1
  500.     move.w    d0,Tribal.wheelPoints
  501.     move.w    d1,Tribal.wheelPolys
  502.  
  503.     move.w    Tribal.wheelPoints,d0
  504.     add.w    d0,d0
  505.     move.w    d0,(a0)+
  506.     move.w    Tribal.wheelPoints,(a0)+
  507.     move.w    Tribal.wheelPoints,d0
  508.     mulu.w    #Vertex.SIZE,d0
  509.     lea    (a0,d0.l),a2
  510.     lea    sine_tbl,a1
  511.     move.w    Tribal.wheelSteps,d7
  512.     subq.w    #1,d7
  513.  
  514. .pointloop:
  515. ; calc 6 points inner, outer, tooth and both in front and back versions..
  516.     move.w    d7,d0
  517.     mulu.w    #sintbllen,d0
  518.     divu.w    Tribal.wheelSteps,d0
  519.     Get_SinCos    a1,d0,d0,d1
  520.     move.w    d0,d2
  521.     move.w    d1,d3
  522.     muls.w    Tribal.wheelRIn,d2
  523.     muls.w    Tribal.wheelRIn,d3
  524.     add.l    d2,d2
  525.     add.l    d3,d3
  526.     swap    d2
  527.     swap    d3
  528. ; Store in, front..
  529.     move.w    d2,(a0)+
  530.     move.w    d3,(a0)+
  531.     move.w    Tribal.wheelDepth,(a0)+
  532. ; Store in, back..
  533.     move.w    d2,(a0)+
  534.     move.w    d3,(a0)+
  535.     move.w    Tribal.wheelDepth,d3
  536.     neg.w    d3
  537.     move.w    d3,(a0)+
  538.  
  539. ; Store normal in, f.
  540.     move.w    d0,d2
  541.     move.w    d1,d3
  542.     muls.w    #-209,d2
  543.     muls.w    #-209,d3
  544.     swap    d2
  545.     swap    d3
  546.     move.w    d2,(a2)+
  547.     move.w    d3,(a2)+
  548.     move.w    #+73,(a2)+
  549. ; Store normal in, b.
  550.     move.w    d2,(a2)+
  551.     move.w    d3,(a2)+
  552.     move.w    #-73,(a2)+
  553.  
  554.     move.w    d0,d2
  555.     move.w    d1,d3
  556.     muls.w    Tribal.wheelROut,d2
  557.     muls.w    Tribal.wheelROut,d3
  558.     add.l    d2,d2
  559.     add.l    d3,d3
  560.     swap    d2
  561.     swap    d3
  562. ; Store out, front..
  563.     move.w    d2,(a0)+
  564.     move.w    d3,(a0)+
  565.     move.w    Tribal.wheelDepth,(a0)+
  566. ; Store out, back..
  567.     move.w    d2,(a0)+
  568.     move.w    d3,(a0)+
  569.     move.w    Tribal.wheelDepth,d4
  570.     neg.w    d4
  571.     move.w    d4,(a0)+
  572.  
  573. ; Store normal out, f.
  574.     move.w    d7,d4
  575.     mulu.w    #sintbllen,d4
  576.     divu.w    Tribal.wheelSteps,d4
  577.     move.w    #sintbllen/16,d6
  578.     btst    #0,d7                ; step even?
  579.     beq.s    .r_calced
  580.     neg.w    d6
  581. .r_calced:
  582. ;    add.w    d6,d4                ; Rotate +-45 deg.
  583.     Get_SinCos    a1,d4,d4,d5
  584.     muls.w    #209,d4
  585.     muls.w    #209,d5
  586.     swap    d4
  587.     swap    d5
  588.     move.w    d4,(a2)+
  589.     move.w    d5,(a2)+
  590.     move.w    #+73,(a2)+
  591. ; Store normal out, b.
  592.     move.w    d4,(a2)+
  593.     move.w    d5,(a2)+
  594.     move.w    #-73,(a2)+
  595.  
  596. ; Store normal tooth, f.
  597.     move.w    d7,d4
  598.     mulu.w    #sintbllen,d4
  599.     divu.w    Tribal.wheelSteps,d4
  600.     move.w    #sintbllen/16,d6
  601.     btst    #0,d7                ; step even?
  602.     beq.s    .r1_calced
  603.     neg.w    d6
  604. .r1_calced:
  605. ;    add.w    d6,d4                ; Rotate +-45 deg.
  606.     Get_SinCos    a1,d4,d4,d5
  607.     muls.w    #209,d4
  608.     muls.w    #209,d5
  609.     swap    d4
  610.     swap    d5
  611.     move.w    d4,(a2)+
  612.     move.w    d5,(a2)+
  613.     move.w    #+73,(a2)+
  614. ; Store normal tooth, b.
  615.     move.w    d4,(a2)+
  616.     move.w    d5,(a2)+
  617.     move.w    #-73,(a2)+
  618.  
  619. ; Calc n vector.
  620. ;      -
  621.     move.l    #sintbllen/2,d4
  622.     divu.w    Tribal.wheelSteps,d4
  623.     btst    #0,d7                ; step even?
  624.     beq.s    .a_calced
  625.     neg.w    d4
  626. .a_calced:
  627.     move.w    d7,d0
  628.     mulu.w    #sintbllen,d0
  629.     divu.w    Tribal.wheelSteps,d0
  630.     add.w    d4,d0
  631.     Get_SinCos    a1,d0,d0,d1
  632.     muls.w    Tribal.wheelRT,d0
  633.     muls.w    Tribal.wheelRT,d1
  634.     add.l    d0,d0
  635.     add.l    d1,d1
  636.     swap    d0
  637.     swap    d1
  638. ; d0.w=R_n*sin(phi+/-a), d1.w=R_n*cos(phi+/-a)
  639.     add.w    d2,d0
  640.     add.w    d3,d1
  641. ; d0.w=R_out*sin(phi)+R_n*sin(phi+/-a), d1.w=R_out*cos(phi)+R_n*cos(phi+/-a)
  642. ; Store tooth, front..
  643.     move.w    d0,(a0)+
  644.     move.w    d1,(a0)+
  645.     move.w    Tribal.wheelDepth,(a0)+
  646. ; Store tooth, back..
  647.     move.w    d0,(a0)+
  648.     move.w    d1,(a0)+
  649.     move.w    Tribal.wheelDepth,d3
  650.     neg.w    d3
  651.     move.w    d3,(a0)+
  652.  
  653. ; Next step..
  654.     dbf    d7,.pointloop
  655.  
  656.     movea.l    a2,a0
  657.  
  658.     clr.w    (a0)+                ; texels
  659.  
  660. ; polys..
  661.     move.w    Tribal.wheelPolys,(a0)+
  662.     move.w    Tribal.wheelSteps,d7
  663.     subq.w    #1,d7
  664.  
  665. .polyloop:
  666. ; face 1.. (in)
  667.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED,(a0)+
  668.  
  669.     move.w    d7,d0
  670.     mulu.w    #6,d0                ; d0.w=1st,front,i
  671.     clr.l    d1
  672.     move.w    d7,d1
  673.     addq.w    #1,d1
  674.     divu.w    Tribal.wheelSteps,d1
  675.     swap    d1
  676.     mulu.w    #6,d1                ; d1.w=2nd,front,i
  677.     move.w    d0,d2
  678.     addq.w    #1,d2                ; d2.w=1st,back,i
  679.     move.w    d1,d3
  680.     addq.w    #1,d3                ; d3.w=2nd,back,i
  681.     move.w    d0,(a0)+
  682.     move.w    d1,(a0)+
  683.     move.w    d3,(a0)+
  684.     move.w    d2,(a0)+
  685.     
  686.     move.w    Tribal.wheelPoints,a2
  687.     move.w    Tribal.wheelPoints,a3
  688.     move.w    Tribal.wheelPoints,a4
  689.     move.w    Tribal.wheelPoints,a5
  690.     adda.l    d0,a2
  691.     adda.l    d1,a3
  692.     adda.l    d2,a4
  693.     adda.l    d3,a5
  694.     move.w    a2,(a0)+
  695.     move.w    a3,(a0)+
  696.     move.w    a5,(a0)+
  697.     move.w    a4,(a0)+
  698.  
  699.     btst    #0,d7
  700.     bne    .low
  701.  
  702. ; High poly (tooth included).
  703. .high:
  704. ; face 2.. (top of tooth)
  705.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  706.  
  707.     addq.w    #4,d0                ; d0.w=1st,front,tooth
  708.     addq.w    #4,d1                ; d1.w=2nd,front,tooth
  709.     addq.w    #4,d2                ; d2.w=1st,back,tooth
  710.     addq.w    #4,d3                ; d3.w=2nd,back,tooth
  711.     move.w    d2,(a0)+
  712.     move.w    d3,(a0)+
  713.     move.w    d1,(a0)+
  714.     move.w    d0,(a0)+
  715.     addq    #4,a2
  716.     addq    #4,a3
  717.     addq    #4,a4
  718.     addq    #4,a5
  719.     move.w    a4,(a0)+
  720.     move.w    a5,(a0)+
  721.     move.w    a3,(a0)+
  722.     move.w    a2,(a0)+
  723.  
  724. ; face 3.. (front)
  725.     move.w    #Polygon.HEX|Polygon.ENVMAPPED|0,(a0)+
  726.  
  727. ; d0.w=1st,front,tooth
  728. ; d1.w=2nd,front,tooth
  729.     move.w    d0,(a0)+
  730.     move.w    d1,(a0)+
  731.     subq.w    #2,d1                ; d1.w=2nd,f,o
  732.     move.w    d1,(a0)+
  733.     subq.w    #2,d1                ; d1.w=2nd,f,i
  734.     move.w    d1,(a0)+
  735.     subq.w    #4,d0                ; d0.w=1st,f,i
  736.     move.w    d0,(a0)+
  737.     addq.w    #2,d0                ; d0.w=1st,f,o
  738.     move.w    d0,(a0)+
  739.  
  740.     move.w    a2,(a0)+
  741.     move.w    a3,(a0)+
  742.     subq    #2,a3
  743.     move.w    a3,(a0)+
  744.     subq    #2,a3
  745.     move.w    a3,(a0)+
  746.     subq    #4,a2
  747.     move.w    a2,(a0)+
  748.     addq    #2,a2
  749.     move.w    a2,(a0)+
  750.  
  751. ; face 4.. (back)
  752.     lea    -6*4(a0),a1
  753.     move.w    #Polygon.HEX|Polygon.ENVMAPPED|0,(a0)+
  754.  
  755.     adda.w    #6*2,a0
  756.     moveq    #6-1,d6
  757. .front_to_back_loop:
  758.     move.w    6*2(a1),d1
  759.     move.w    (a1)+,d0
  760.     addq.w    #1,d0
  761.     addq.w    #1,d1
  762.     move.w    d0,-(a0)
  763.     move.w    d1,6*2(a0)
  764.     dbf    d6,.front_to_back_loop
  765.  
  766.     adda.w    #6*4,a0
  767.     bra    .next_poly_step
  768.  
  769. ; Low poly (no tooth included)
  770. .low:
  771. ; face 2.. (top of out)
  772.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  773.  
  774.     addq.w    #2,d0                ; d0.w=1st,front,out
  775.     addq.w    #2,d1                ; d1.w=2nd,front,out
  776.     addq.w    #2,d2                ; d2.w=1st,back,out
  777.     addq.w    #2,d3                ; d3.w=2nd,back,out
  778.     move.w    d2,(a0)+
  779.     move.w    d3,(a0)+
  780.     move.w    d1,(a0)+
  781.     move.w    d0,(a0)+
  782.     addq    #2,a2                ; d0.w=1st,front,out
  783.     addq    #2,a3                ; d1.w=2nd,front,out
  784.     addq    #2,a4                ; d2.w=1st,back,out
  785.     addq    #2,a5                ; d3.w=2nd,back,out
  786.     move.w    a4,(a0)+
  787.     move.w    a5,(a0)+
  788.     move.w    a3,(a0)+
  789.     move.w    a2,(a0)+
  790.  
  791. ; face 3 (front)
  792.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  793.  
  794.     move.w    d0,(a0)+
  795.     move.w    d1,(a0)+
  796.     subq.w    #2,d0                ; d0.w=1st,front,in
  797.     subq.w    #2,d1                ; d1.w=2nd,front,in
  798.     move.w    d1,(a0)+
  799.     move.w    d0,(a0)+
  800.     move.w    a2,(a0)+
  801.     move.w    a3,(a0)+
  802.     subq    #2,a2                ; d0.w=1st,front,in
  803.     subq    #2,a3                ; d1.w=2nd,front,in
  804.     move.w    a3,(a0)+
  805.     move.w    a2,(a0)+
  806.  
  807. ; face 4 (back)
  808.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  809.  
  810.     addq.w    #1,d0                ; d0.w=1st,back,in
  811.     addq.w    #1,d1                ; d1.w=2nd,back,in
  812.     move.w    d0,(a0)+
  813.     move.w    d1,(a0)+
  814.     addq.w    #2,d0                ; d0.w=1st,back,out
  815.     addq.w    #2,d1                ; d1.w=2nd,back,out
  816.     move.w    d1,(a0)+
  817.     move.w    d0,(a0)+
  818.     addq    #1,a2                ; d0.w=1st,back,in
  819.     addq    #1,a3                ; d1.w=2nd,back,in
  820.     move.w    a2,(a0)+
  821.     move.w    a3,(a0)+
  822.     addq    #2,a2                ; d0.w=1st,back,out
  823.     addq    #2,a3                ; d1.w=2nd,back,out
  824.     move.w    a3,(a0)+
  825.     move.w    a2,(a0)+
  826.  
  827. .next_poly_step:
  828.  
  829. ; face 5 (tooth->out)
  830.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  831.     move.w    d7,d0
  832.     mulu.w    #6,d0                ; d0.w=1st,front,i
  833.     move.w    d0,a2
  834.     adda.w    Tribal.wheelPoints,a2
  835.  
  836.     btst    #0,d7
  837.     bne.s    .poly_order
  838.  
  839.     addq.w    #2,d0                ; d0.w=1,f,o
  840.     move.w    d0,(a0)+
  841.     addq.w    #1,d0                ; d0.w=1,b,o
  842.     move.w    d0,(a0)+
  843.     addq.w    #2,d0                ; d0.w=1,b,t
  844.     move.w    d0,(a0)+
  845.     subq.w    #1,d0                ; d0.w=1,f,t
  846.     move.w    d0,(a0)+
  847.     addq    #2,a2                ; d0.w=1,f,o
  848.     move.w    a2,(a0)+
  849.     addq    #1,a2                ; d0.w=1,b,o
  850.     move.w    a2,(a0)+
  851.     addq    #2,a2                ; d0.w=1,b,t
  852.     move.w    a2,(a0)+
  853.     subq    #1,a2                ; d0.w=1,f,t
  854.     move.w    a2,(a0)+
  855.     bra.s    .nextplease
  856.  
  857. .poly_order:
  858.     addq.w    #3,d0                ; d0.w=1,b,o
  859.     move.w    d0,(a0)+
  860.     subq.w    #1,d0                ; d0.w=1,f,o
  861.     move.w    d0,(a0)+
  862.     addq.w    #2,d0                ; d0.w=1,f,t
  863.     move.w    d0,(a0)+
  864.     addq.w    #1,d0                ; d0.w=1,b,t
  865.     move.w    d0,(a0)+
  866.     addq    #3,a2                ; d0.w=1,b,o
  867.     move.w    a2,(a0)+
  868.     subq    #1,a2                ; d0.w=1,f,o
  869.     move.w    a2,(a0)+
  870.     addq    #2,a2                ; d0.w=1,f,t
  871.     move.w    a2,(a0)+
  872.     addq    #1,a2                ; d0.w=1,b,t
  873.     move.w    a2,(a0)+
  874.  
  875. .nextplease:
  876.     dbf    d7,.polyloop
  877.  
  878. ; calc size..
  879.     move.l    a0,d0
  880.     sub.l    a6,d0
  881.     rts
  882.  
  883. ; Generates a cogwheel axis.
  884. ; INPUT:
  885. ; a0: dst object
  886. ; OUTPUT:
  887. ; d0.l=size of obj
  888. Tribal.genAxis:
  889.     movea.l    a0,a6
  890.     lea    Tribal.anchor,a1
  891.     move.w    #Tribal.AXIS_POINTS*2,(a0)+
  892.     move.w    #Tribal.AXIS_POINTS,(a0)+
  893.  
  894. ; Copy 'anchor' vertices.
  895.     move.w    #24*3-1,d7
  896.     addq    #4,a1
  897. .copy_v_loop:
  898.     move.w    (a1)+,(a0)+
  899.     dbf    d7,.copy_v_loop
  900.  
  901. ; Generate segment vertices.
  902.     moveq    #Tribal.AXIS_SEGMENTS-1,d7
  903.     move.w    #+Tribal.ANCHORRIN,d0
  904.  
  905. .segpoint_loop:
  906.     addi.w    #Tribal.AXIS_SEGLEN,d0
  907.     move.w    #-Tribal.ANCHORRIN,(a0)+
  908.     move.w    #-Tribal.ANCHORRIN,(a0)+
  909.     move.w    d0,(a0)+
  910.     move.w    #+Tribal.ANCHORRIN,(a0)+
  911.     move.w    #-Tribal.ANCHORRIN,(a0)+
  912.     move.w    d0,(a0)+
  913.     move.w    #+Tribal.ANCHORRIN,(a0)+
  914.     move.w    #+Tribal.ANCHORRIN,(a0)+
  915.     move.w    d0,(a0)+
  916.     move.w    #-Tribal.ANCHORRIN,(a0)+
  917.     move.w    #+Tribal.ANCHORRIN,(a0)+
  918.     move.w    d0,(a0)+
  919.     dbf    d7,.segpoint_loop
  920.  
  921. ; Copy 'anchor' normals.
  922.     move.w    #24*3-1,d7
  923. .copy_n_loop:
  924.     move.w    (a1)+,(a0)+
  925.     dbf    d7,.copy_n_loop
  926.  
  927. ; Generate segment normals.
  928.     moveq    #Tribal.AXIS_SEGMENTS-1,d7
  929.  
  930. .segnorm_loop:
  931.     move.w    #-90,(a0)+
  932.     move.w    #-90,(a0)+
  933.     clr.w    (a0)+
  934.     move.w    #+90,(a0)+
  935.     move.w    #-90,(a0)+
  936.     clr.w    (a0)+
  937.     move.w    #+90,(a0)+
  938.     move.w    #+90,(a0)+
  939.     clr.w    (a0)+
  940.     move.w    #-90,(a0)+
  941.     move.w    #+90,(a0)+
  942.     clr.w    (a0)+
  943.     dbf    d7,.segnorm_loop
  944.  
  945.     clr.w    (a0)+                ; texels
  946.  
  947. ; polys..
  948.     addq    #2,a1                ; Skip anchor texel shit.
  949.  
  950.     move.w    #Tribal.AXIS_POLYS,(a0)+
  951.  
  952. ; Copy 'anchor' polys.
  953.     move.w    (a1)+,d7
  954.     subq.w    #1,d7
  955. .copy_poly_loop:
  956. ; Assume each poly is 9 words size!!
  957.     REPT    9
  958.     move.w    (a1)+,(a0)+    
  959.     ENDR
  960.     dbf    d7,.copy_poly_loop
  961.  
  962. ; Generate segment polys.
  963.  
  964. ; First segment, a special one..
  965.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  966.     move.w    #5,(a0)+
  967.     move.w    #24+1,(a0)+
  968.     move.w    #24+0,(a0)+
  969.     move.w    #1,(a0)+
  970.     move.w    #Tribal.AXIS_POINTS+5,(a0)+
  971.     move.w    #Tribal.AXIS_POINTS+24+1,(a0)+
  972.     move.w    #Tribal.AXIS_POINTS+24+0,(a0)+
  973.     move.w    #Tribal.AXIS_POINTS+1,(a0)+
  974.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  975.     move.w    #7,(a0)+
  976.     move.w    #24+2,(a0)+
  977.     move.w    #24+1,(a0)+
  978.     move.w    #5,(a0)+
  979.     move.w    #Tribal.AXIS_POINTS+7,(a0)+
  980.     move.w    #Tribal.AXIS_POINTS+24+2,(a0)+
  981.     move.w    #Tribal.AXIS_POINTS+24+1,(a0)+
  982.     move.w    #Tribal.AXIS_POINTS+5,(a0)+
  983.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  984.     move.w    #3,(a0)+
  985.     move.w    #24+3,(a0)+
  986.     move.w    #24+2,(a0)+
  987.     move.w    #7,(a0)+
  988.     move.w    #Tribal.AXIS_POINTS+3,(a0)+
  989.     move.w    #Tribal.AXIS_POINTS+24+3,(a0)+
  990.     move.w    #Tribal.AXIS_POINTS+24+2,(a0)+
  991.     move.w    #Tribal.AXIS_POINTS+7,(a0)+
  992.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  993.     move.w    #1,(a0)+
  994.     move.w    #24+0,(a0)+
  995.     move.w    #24+3,(a0)+
  996.     move.w    #3,(a0)+
  997.     move.w    #Tribal.AXIS_POINTS+1,(a0)+
  998.     move.w    #Tribal.AXIS_POINTS+24+0,(a0)+
  999.     move.w    #Tribal.AXIS_POINTS+24+3,(a0)+
  1000.     move.w    #Tribal.AXIS_POINTS+3,(a0)+
  1001.  
  1002.     moveq    #0,d7
  1003.  
  1004. .segpoly_loop:
  1005.     move.w    d7,d0
  1006.     move.w    d7,d1
  1007.     lsl.w    #2,d0
  1008.     addq.w    #1,d1
  1009.     lsl.w    #2,d1
  1010.     addi.w    #24,d0
  1011.     addi.w    #24,d1
  1012.     move.w    d0,d2
  1013.     move.w    d1,d3
  1014.     addi.w    #Tribal.AXIS_POINTS,d2
  1015.     addi.w    #Tribal.AXIS_POINTS,d3
  1016.     REPT    3
  1017.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  1018.     move.w    d1,(a0)+
  1019.     move.w    d0,(a0)+
  1020.     addq.w    #1,d0
  1021.     addq.w    #1,d1
  1022.     move.w    d0,(a0)+
  1023.     move.w    d1,(a0)+
  1024.     move.w    d2,(a0)+
  1025.     move.w    d3,(a0)+
  1026.     addq.w    #1,d2
  1027.     addq.w    #1,d3
  1028.     move.w    d2,(a0)+
  1029.     move.w    d3,(a0)+
  1030.     ENDR
  1031.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  1032.     move.w    d1,(a0)+
  1033.     move.w    d0,(a0)+
  1034.     subq.w    #3,d0
  1035.     subq.w    #3,d1
  1036.     move.w    d0,(a0)+
  1037.     move.w    d1,(a0)+
  1038.     move.w    d3,(a0)+
  1039.     move.w    d2,(a0)+
  1040.     subq.w    #3,d2
  1041.     subq.w    #3,d3
  1042.     move.w    d2,(a0)+
  1043.     move.w    d3,(a0)+
  1044.  
  1045.     addq.w    #1,d7
  1046.     cmpi.w    #Tribal.AXIS_SEGMENTS-1,d7
  1047.     blt    .segpoly_loop
  1048.  
  1049. ; calc size..
  1050.     move.l    a0,d0
  1051.     sub.l    a6,d0
  1052.     rts
  1053.  
  1054.     IFNE    0
  1055.  
  1056. ; Generates a side cogwheel. Very industrial, yes, yes.
  1057. ;
  1058. ; Parametrisation (2d, we extrude very easily later on):
  1059. ;
  1060. ; phi controls rotation. 0<=phi<2pi, phi=step*(2pi/steps), 0<=step<steps
  1061. ;
  1062. ; in(phi) = R_in*[cos(phi), sin(phi), d]
  1063. ; --
  1064. ; out(phi) = R_out*[cos(phi), sin(phi), d]
  1065. ; --
  1066. ; t(phi) = n(phi) + (0,0,d)
  1067. ; --       -
  1068. ;
  1069. ;          { in(phi), if in
  1070. ; n(phi) = { --
  1071. ; -        { out(phi), if out
  1072. ;            --
  1073. ;
  1074. ; INPUT:
  1075. ; a0: dst object
  1076. ; OUTPUT:
  1077. ; d0.l=size of obj
  1078. Tribal.genSideWheel:
  1079.     movea.l    a0,a6
  1080.  
  1081.     move.w    #Tribal.WHEELPOINTS,(a0)+
  1082.     clr.w    (a0)+
  1083.     lea    sine_tbl,a1
  1084.     moveq    #Tribal.WHEELSTEPS-1,d7
  1085.  
  1086. .pointloop:
  1087. ; calc 6 points inner, outer, tooth and both in front and back versions..
  1088.     move.w    d7,d0
  1089.     mulu.w    #sintbllen/Tribal.WHEELSTEPS,d0
  1090.     Get_SinCos    a1,d0,d0,d1
  1091.     move.w    d0,d2
  1092.     move.w    d1,d3
  1093.     move.w    d0,d4
  1094.     move.w    d1,d5
  1095.     muls.w    #Tribal.WHEELRIN*2,d2
  1096.     muls.w    #Tribal.WHEELRIN*2,d3
  1097.     muls.w    #Tribal.WHEELROUT*2,d4
  1098.     muls.w    #Tribal.WHEELROUT*2,d5
  1099.     swap    d2
  1100.     swap    d3
  1101.     swap    d4
  1102.     swap    d5
  1103.  
  1104. ; (i,f),(i,b),(o,f),(o,b),(t,f),(t,b)
  1105. ; ->
  1106. ; (i,b),(o,b),(i,f),(o,f),(t,i),(t,o)
  1107.  
  1108. ; Store in, back..
  1109.     move.w    d2,(a0)+
  1110.     move.w    d3,(a0)+
  1111.     move.w    #-Tribal.WHEELDEPTH,(a0)+
  1112. ; Store out, back..
  1113.     move.w    d4,(a0)+
  1114.     move.w    d5,(a0)+
  1115.     move.w    #-Tribal.WHEELDEPTH,(a0)+
  1116. ; Store in, front..
  1117.     move.w    d2,(a0)+
  1118.     move.w    d3,(a0)+
  1119.     move.w    #+Tribal.WHEELDEPTH,(a0)+
  1120. ; Store out, front..
  1121.     move.w    d4,(a0)+
  1122.     move.w    d5,(a0)+
  1123.     move.w    #+Tribal.WHEELDEPTH,(a0)+
  1124. ; Store tooth, in..
  1125.     move.w    d2,(a0)+
  1126.     move.w    d3,(a0)+
  1127.     move.w    #+Tribal.WHEELDEPTH+Tribal.WHEELRT,(a0)+
  1128. ; Store tooth, out..
  1129.     move.w    d4,(a0)+
  1130.     move.w    d5,(a0)+
  1131.     move.w    #+Tribal.WHEELDEPTH+Tribal.WHEELRT,(a0)+
  1132.  
  1133. ; Next step..
  1134.     dbf    d7,.pointloop
  1135.  
  1136.     clr.w    (a0)+                ; texels
  1137.  
  1138. ; polys..
  1139.     move.w    #Tribal.WHEELPOLYS,(a0)+
  1140.     moveq    #Tribal.WHEELSTEPS-1,d7
  1141.  
  1142. .polyloop:
  1143. ; face 1.. (in)
  1144.     move.w    #Polygon.QUAD|Polygon.FLATSHADED,d0
  1145.     move.w    d7,d1
  1146.     andi.w    #1,d1
  1147.     add.w    d1,d1
  1148.     or.w    d1,d0
  1149.     move.w    d0,(a0)+
  1150.  
  1151.     move.w    d7,d0
  1152.     mulu.w    #6,d0                ; d0.w=1st,front,i
  1153.     clr.l    d1
  1154.     move.w    d7,d1
  1155.     addq.w    #1,d1
  1156.     divu.w    #Tribal.WHEELSTEPS,d1
  1157.     swap    d1
  1158.     mulu.w    #6,d1                ; d1.w=2nd,front,i
  1159.     move.w    d0,d2
  1160.     addq.w    #1,d2                ; d2.w=1st,back,i
  1161.     move.w    d1,d3
  1162.     addq.w    #1,d3                ; d3.w=2nd,back,i
  1163.     move.w    d0,(a0)+
  1164.     move.w    d1,(a0)+
  1165.     move.w    d3,(a0)+
  1166.     move.w    d2,(a0)+
  1167.  
  1168.     btst    #0,d7
  1169.     bne    .low
  1170.  
  1171. ; High poly (tooth included).
  1172. .high:
  1173. ; face 2.. (top of tooth)
  1174.     move.w    #Polygon.QUAD|Polygon.FLATSHADED|0,(a0)+
  1175.  
  1176.     addq.w    #4,d0                ; d0.w=1st,front,tooth
  1177.     addq.w    #4,d1                ; d1.w=2nd,front,tooth
  1178.     addq.w    #4,d2                ; d2.w=1st,back,tooth
  1179.     addq.w    #4,d3                ; d3.w=2nd,back,tooth
  1180.     move.w    d2,(a0)+
  1181.     move.w    d3,(a0)+
  1182.     move.w    d1,(a0)+
  1183.     move.w    d0,(a0)+
  1184.  
  1185. ; face 3.. (front)
  1186.     move.w    #Polygon.HEX|Polygon.FLATSHADED|2,(a0)+
  1187.  
  1188. ; d0.w=1st,front,tooth
  1189. ; d1.w=2nd,front,tooth
  1190.     move.w    d0,(a0)+
  1191.     move.w    d1,(a0)+
  1192.     subq.w    #2,d1                ; d1.w=2nd,f,o
  1193.     move.w    d1,(a0)+
  1194.     subq.w    #2,d1                ; d1.w=2nd,f,i
  1195.     move.w    d1,(a0)+
  1196.     subq.w    #4,d0                ; d0.w=1st,f,i
  1197.     move.w    d0,(a0)+
  1198.     addq.w    #2,d0                ; d0.w=1st,f,o
  1199.     move.w    d0,(a0)+
  1200.  
  1201. ; face 4.. (back)
  1202.     lea    -6*2(a0),a1
  1203.     move.w    #Polygon.HEX|Polygon.FLATSHADED|2,(a0)+
  1204.  
  1205.     adda.w    #6*2,a0
  1206.     moveq    #6-1,d6
  1207. .front_to_back_loop:
  1208.     move.w    (a1)+,d0
  1209.     addq.w    #1,d0
  1210.     move.w    d0,-(a0)
  1211.     dbf    d6,.front_to_back_loop
  1212.  
  1213.     adda.w    #6*2,a0
  1214.     bra    .next_poly_step
  1215.  
  1216. ; Low poly (no tooth included)
  1217. .low:
  1218. ; face 2.. (top of out)
  1219.     move.w    #Polygon.QUAD|Polygon.FLATSHADED|0,(a0)+
  1220.  
  1221.     addq.w    #2,d0                ; d0.w=1st,front,out
  1222.     addq.w    #2,d1                ; d1.w=2nd,front,out
  1223.     addq.w    #2,d2                ; d2.w=1st,back,out
  1224.     addq.w    #2,d3                ; d3.w=2nd,back,out
  1225.     move.w    d2,(a0)+
  1226.     move.w    d3,(a0)+
  1227.     move.w    d1,(a0)+
  1228.     move.w    d0,(a0)+
  1229.  
  1230. ; face 3 (front)
  1231.     move.w    #Polygon.QUAD|Polygon.FLATSHADED|2,(a0)+
  1232.  
  1233.     move.w    d0,(a0)+
  1234.     move.w    d1,(a0)+
  1235.     subq.w    #2,d0                ; d0.w=1st,front,in
  1236.     subq.w    #2,d1                ; d1.w=2nd,front,in
  1237.     move.w    d1,(a0)+
  1238.     move.w    d0,(a0)+
  1239.  
  1240. ; face 4 (back)
  1241.     move.w    #Polygon.QUAD|Polygon.FLATSHADED|2,(a0)+
  1242.  
  1243.     addq.w    #1,d0                ; d0.w=1st,back,in
  1244.     addq.w    #1,d1                ; d1.w=2nd,back,in
  1245.     move.w    d0,(a0)+
  1246.     move.w    d1,(a0)+
  1247.     addq.w    #2,d0                ; d0.w=1st,back,out
  1248.     addq.w    #2,d1                ; d1.w=2nd,back,out
  1249.     move.w    d1,(a0)+
  1250.     move.w    d0,(a0)+
  1251.  
  1252. .next_poly_step:
  1253.  
  1254. ; face 5 (tooth->out)
  1255.     move.w    #Polygon.QUAD|Polygon.FLATSHADED|1,(a0)+
  1256.     move.w    d7,d0
  1257.     mulu.w    #6,d0                ; d0.w=1st,front,i
  1258.  
  1259.     btst    #0,d7
  1260.     bne.s    .poly_order
  1261.  
  1262.     addq.w    #2,d0                ; d0.w=1,f,o
  1263.     move.w    d0,(a0)+
  1264.     addq.w    #1,d0                ; d0.w=1,b,o
  1265.     move.w    d0,(a0)+
  1266.     addq.w    #2,d0                ; d0.w=1,b,t
  1267.     move.w    d0,(a0)+
  1268.     subq.w    #1,d0                ; d0.w=1,f,t
  1269.     move.w    d0,(a0)+
  1270.     bra.s    .nextplease
  1271.  
  1272. .poly_order:
  1273.     addq.w    #3,d0                ; d0.w=1,b,o
  1274.     move.w    d0,(a0)+
  1275.     subq.w    #1,d0                ; d0.w=1,f,o
  1276.     move.w    d0,(a0)+
  1277.     addq.w    #2,d0                ; d0.w=1,f,t
  1278.     move.w    d0,(a0)+
  1279.     addq.w    #1,d0                ; d0.w=1,b,t
  1280.     move.w    d0,(a0)+
  1281.  
  1282. .nextplease:
  1283.     dbf    d7,.polyloop
  1284.  
  1285. ; calc size..
  1286.     move.l    a0,d0
  1287.     sub.l    a6,d0
  1288.     rts
  1289.  
  1290.     ENDC
  1291.  
  1292. ; todo: 2 painters can be brought back to 1 by using variable z!
  1293.  
  1294. Tribal.paintMid:
  1295.     bsr.l    PrimitiveMesh.new
  1296.  
  1297.     clr.w    d0
  1298.     move.l    Tribal.worldRotTime,d1
  1299.     clr.w    d2
  1300.     bsr.l    Matrix.generate
  1301.     move.w    Tribal.worldX,d0
  1302.     clr.w    d1
  1303.     move.w    #+4000,d2
  1304.     add.w    Tribal.worldZ,d2
  1305.     bsr.l    Matrix.translate
  1306.     bsr.l    Matrix.push
  1307.  
  1308. ; wheel big.
  1309.     clr.w    d0
  1310.     clr.w    d1
  1311.     move.w    Tribal.wheelRotTime,d2
  1312.     mulu.w    #4,d2
  1313.     addi.w    #sintbllen/Tribal.WHEELSTEPS,d2
  1314.     bsr.l    Matrix.generate
  1315.     move.w    Tribal.bigWheelX,d0
  1316.     move.w    #0,d1
  1317.     move.w    #-2000,d2
  1318.     bsr.l    Matrix.translate
  1319.     bsr.l    Matrix.push
  1320.  
  1321.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1322.     moveq    #1,d1
  1323.     bsr.l    TransformObject.transform
  1324.  
  1325.     bsr.l    Matrix.pop
  1326.  
  1327. ; wheel small
  1328.     clr.w    d0
  1329.     clr.w    d1
  1330.     clr.l    d2
  1331.     move.w    Tribal.wheelRotTime,d2
  1332.     andi.w    #$3FFF,d2
  1333.     mulu.w    #2,d2
  1334. ; *2 (24:12)
  1335.     mulu.w    #4,d2
  1336.     neg.w    d2
  1337.     bsr.l    Matrix.generate
  1338.     move.w    Tribal.smallWheelX,d0
  1339.     move.w    #0,d1
  1340.     move.w    #-2000,d2
  1341.     bsr.l    Matrix.translate
  1342.     bsr.l    Matrix.push
  1343.  
  1344.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1345.     moveq    #2,d1
  1346.     bsr.l    TransformObject.transform
  1347.  
  1348.     bsr.l    Matrix.pop
  1349.  
  1350. ; Bring axis into scene if required
  1351.     tst.w    Tribal.axisOn
  1352.     beq    .end_axis
  1353.  
  1354. ; small cogwheel axis!
  1355.     clr.w    d0
  1356.     clr.w    d1
  1357.     clr.l    d2
  1358.     move.w    Tribal.wheelRotTime,d2
  1359.     andi.w    #$3FFF,d2
  1360.     mulu.w    #2,d2
  1361. ; *2 (24:12)
  1362.     mulu.w    #4,d2
  1363.     neg.w    d2
  1364.     bsr.l    Matrix.generate
  1365.     move.w    Tribal.smallWheelX,d0
  1366.     move.w    #0,d1
  1367.     move.w    #-2000,d2
  1368.     add.w    Tribal.axisZ,d2
  1369.     bsr.l    Matrix.translate
  1370.     bsr.l    Matrix.push
  1371.  
  1372.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1373.     moveq    #3,d1
  1374.     bsr.l    TransformObject.transform
  1375.  
  1376.     bsr.l    Matrix.pop
  1377.  
  1378. ; small cogwheel axis! mirrored
  1379.     move.w    #sintbllen/2,d0
  1380.     clr.w    d1
  1381.     clr.l    d2
  1382.     move.w    Tribal.wheelRotTime,d2
  1383.     andi.w    #$3FFF,d2
  1384.     mulu.w    #2,d2
  1385. ; *2 (24:16)
  1386.     mulu.w    #4,d2
  1387.     bsr.l    Matrix.generate
  1388.     move.w    Tribal.smallWheelX,d0
  1389.     move.w    #0,d1
  1390.     move.w    #+2000,d2
  1391.     add.w    Tribal.axisZ,d2
  1392.     bsr.l    Matrix.translate
  1393.     bsr.l    Matrix.push
  1394.  
  1395.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1396.     moveq    #3,d1
  1397.     bsr.l    TransformObject.transform
  1398.  
  1399.     bsr.l    Matrix.pop
  1400. .end_axis:
  1401.  
  1402. ; Bring top wheels into the scene (if required).
  1403.     tst.w    Tribal.topWheelsOn
  1404.     beq    .end_top_wheels
  1405.  
  1406. ; top wheel 1
  1407.     clr.w    d0
  1408.     clr.w    d1
  1409.     clr.l    d2
  1410.     move.w    Tribal.wheelRotTime,d2
  1411.     andi.w    #$3FFF,d2
  1412.     mulu.w    #2,d2
  1413. ; *2 (24:16)
  1414.     mulu.w    #4,d2
  1415.     neg.w    d2
  1416.     bsr.l    Matrix.generate
  1417.     move.w    Tribal.smallWheelX,d0
  1418.     move.w    #0,d1
  1419.     move.w    #2000,d2
  1420.     bsr.l    Matrix.translate
  1421.     bsr.l    Matrix.push
  1422.  
  1423.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1424.     moveq    #2,d1
  1425.     bsr.l    TransformObject.transform
  1426.  
  1427.     bsr.l    Matrix.pop
  1428.  
  1429. ; top wheel 2
  1430.     clr.w    d0
  1431.     clr.w    d1
  1432.     clr.l    d2
  1433.     move.w    Tribal.wheelRotTime,d2
  1434.     mulu.w    #2,d2
  1435. ; *2 (24:12)
  1436.     mulu.w    #4,d2
  1437.     bsr.l    Matrix.generate
  1438.     move.w    Tribal.smallWheelX,d0
  1439.     addi.w    #Tribal.SWHEELROUT*2+Tribal.SWHEELRT,d0
  1440.     move.w    #0,d1
  1441.     move.w    #2000,d2
  1442.     bsr.l    Matrix.translate
  1443.     bsr.l    Matrix.push
  1444.  
  1445.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1446.     moveq    #2,d1
  1447.     bsr.l    TransformObject.transform
  1448.  
  1449.     bsr.l    Matrix.pop
  1450.  
  1451. ; delta symbol inside top wheel 2
  1452.     clr.w    d0
  1453.     clr.w    d1
  1454.     clr.l    d2
  1455.     move.w    Tribal.wheelRotTime,d2
  1456.     andi.w    #$3FFF,d2
  1457.     mulu.w    #2,d2
  1458. ; *2 (24:12)
  1459.     mulu.w    #4,d2
  1460.     bsr.l    Matrix.generate
  1461.     move.w    Tribal.smallWheelX,d0
  1462.     addi.w    #Tribal.SWHEELROUT*2+Tribal.SWHEELRT,d0
  1463.     move.w    #0,d1
  1464.     move.w    #2000,d2
  1465.     bsr.l    Matrix.translate
  1466.     bsr.l    Matrix.push
  1467.  
  1468.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1469.     moveq    #0,d1
  1470.     bsr.l    TransformObject.transform
  1471.  
  1472.     bsr.l    Matrix.pop
  1473. .end_top_wheels:
  1474.  
  1475.     bsr.l    Matrix.pop
  1476.  
  1477.     bsr.l    PrimitiveMesh.sortZ
  1478.  
  1479.     bsr.l    PrimitiveMesh.complete
  1480.  
  1481.     IFNE    1
  1482.     lea    Viewport.settingsTable,a0
  1483.     movem.w    Viewport.XSTART(a0),d0/d6
  1484.     movem.w    Viewport.YSTART(a0),d1/d7
  1485.     moveq    #$00000000,d4
  1486.     bsr.l    Viewport.paintRectangle
  1487.     ELSE
  1488.     movea.l    Tribal.rectAddressTable,a0
  1489.     move.w    (a0)+,d7
  1490.     beq.s    .end_restore
  1491.     subq.w    #1,d7
  1492. .restore_loop:
  1493.     move.w    d7,-(sp)
  1494.     movem.w    (a0)+,d1/d7
  1495.     movem.w    (a0)+,d0/d6
  1496.     move.l    a0,-(sp)
  1497.     move.l    #$00000000,d4
  1498.     bsr.l    Viewport.paintRectangle
  1499.     movea.l    (sp)+,a0
  1500.     move.w    (sp)+,d7
  1501.     dbra    d7,.restore_loop
  1502. .end_restore:
  1503.     ENDC
  1504.  
  1505.     movea.l    Tribal.rectAddressTable,a0
  1506.     bsr.l    PrimitiveMesh.paint
  1507.  
  1508.     lea    Tribal.rectAddressTable,a0
  1509.      move.l    (a0)+,d0
  1510.     move.l    (a0)+,d1
  1511.     move.l    (a0),-(a0)
  1512.     move.l    d0,4(a0)
  1513.     move.l    d1,-(a0)
  1514.  
  1515.     moveq    #0,d0
  1516.     rts
  1517.  
  1518. .error:    moveq    #-1,d0
  1519.     rts
  1520.  
  1521. Tribal.paint:
  1522.     bsr.l    PrimitiveMesh.new
  1523.  
  1524.     clr.w    d0
  1525.     move.l    Tribal.worldRotTime,d1
  1526.     clr.w    d2
  1527.     bsr.l    Matrix.generate
  1528.     move.w    Tribal.worldX,d0
  1529.     clr.w    d1
  1530.     move.w    #+2000,d2
  1531.     add.w    Tribal.worldZ,d2
  1532.     bsr.l    Matrix.translate
  1533.     bsr.l    Matrix.push
  1534.  
  1535. ; wheel big.
  1536.     clr.w    d0
  1537.     clr.w    d1
  1538.     move.w    Tribal.wheelRotTime,d2
  1539.     mulu.w    #4,d2
  1540.     addi.w    #sintbllen/Tribal.WHEELSTEPS,d2
  1541.     bsr.l    Matrix.generate
  1542.     move.w    Tribal.bigWheelX,d0
  1543.     move.w    #0,d1
  1544.     move.w    #0,d2
  1545.     bsr.l    Matrix.translate
  1546.     bsr.l    Matrix.push
  1547.  
  1548.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1549.     moveq    #1,d1
  1550.     bsr.l    TransformObject.transform
  1551.  
  1552.     bsr.l    Matrix.pop
  1553.  
  1554. ; wheel small
  1555.     clr.w    d0
  1556.     clr.w    d1
  1557.     clr.l    d2
  1558.     move.w    Tribal.wheelRotTime,d2
  1559.     andi.w    #$3FFF,d2
  1560.     mulu.w    #2,d2
  1561. ; *2 (24:12)
  1562.     mulu.w    #4,d2
  1563.     neg.w    d2
  1564.     bsr.l    Matrix.generate
  1565.     move.w    Tribal.smallWheelX,d0
  1566.     move.w    #0,d1
  1567.     move.w    #0,d2
  1568.     bsr.l    Matrix.translate
  1569.     bsr.l    Matrix.push
  1570.  
  1571.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1572.     moveq    #2,d1
  1573.     bsr.l    TransformObject.transform
  1574.  
  1575.     bsr.l    Matrix.pop
  1576.  
  1577. ; Bring axis into scene if required
  1578.     tst.w    Tribal.axisOn
  1579.     beq    .end_axis
  1580.  
  1581. ; small cogwheel axis!
  1582.     clr.w    d0
  1583.     clr.w    d1
  1584.     clr.l    d2
  1585.     move.w    Tribal.wheelRotTime,d2
  1586.     andi.w    #$3FFF,d2
  1587.     mulu.w    #2,d2
  1588. ; *2 (24:12)
  1589.     mulu.w    #4,d2
  1590.     neg.w    d2
  1591.     bsr.l    Matrix.generate
  1592.     move.w    Tribal.smallWheelX,d0
  1593.     move.w    #0,d1
  1594.     move.w    #0,d2
  1595.     add.w    Tribal.axisZ,d2
  1596.     bsr.l    Matrix.translate
  1597.     bsr.l    Matrix.push
  1598.  
  1599.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1600.     moveq    #3,d1
  1601.     bsr.l    TransformObject.transform
  1602.  
  1603.     bsr.l    Matrix.pop
  1604.  
  1605. ; small cogwheel axis! mirrored
  1606.     move.w    #sintbllen/2,d0
  1607.     clr.w    d1
  1608.     clr.l    d2
  1609.     move.w    Tribal.wheelRotTime,d2
  1610.     andi.w    #$3FFF,d2
  1611.     mulu.w    #2,d2
  1612. ; *2 (24:12)
  1613.     mulu.w    #4,d2
  1614.     bsr.l    Matrix.generate
  1615.     move.w    Tribal.smallWheelX,d0
  1616.     move.w    #0,d1
  1617.     move.w    #+4000,d2
  1618.     add.w    Tribal.axisZ,d2
  1619.     bsr.l    Matrix.translate
  1620.     bsr.l    Matrix.push
  1621.  
  1622.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1623.     moveq    #3,d1
  1624.     bsr.l    TransformObject.transform
  1625.  
  1626.     bsr.l    Matrix.pop
  1627. .end_axis:
  1628.  
  1629. ; Bring top wheels into the scene (if required).
  1630.     tst.w    Tribal.topWheelsOn
  1631.     beq    .end_top_wheels
  1632.  
  1633. ; top wheel 1
  1634.     clr.w    d0
  1635.     clr.w    d1
  1636.     clr.l    d2
  1637.     move.w    Tribal.wheelRotTime,d2
  1638.     andi.w    #$3FFF,d2
  1639.     mulu.w    #2,d2
  1640. ; *2 (24:12)
  1641.     mulu.w    #4,d2
  1642.     neg.w    d2
  1643.     bsr.l    Matrix.generate
  1644.     move.w    Tribal.smallWheelX,d0
  1645.     move.w    #0,d1
  1646.     move.w    #4000,d2
  1647.     bsr.l    Matrix.translate
  1648.     bsr.l    Matrix.push
  1649.  
  1650.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1651.     moveq    #2,d1
  1652.     bsr.l    TransformObject.transform
  1653.  
  1654.     bsr.l    Matrix.pop
  1655.  
  1656. ; top wheel 2
  1657.     clr.w    d0
  1658.     clr.w    d1
  1659.     clr.l    d2
  1660.     move.w    Tribal.wheelRotTime,d2
  1661.     andi.w    #$3FFF,d2
  1662.     mulu.w    #2,d2
  1663. ; *2 (24:12)
  1664.     mulu.w    #4,d2
  1665.     bsr.l    Matrix.generate
  1666.     move.w    Tribal.smallWheelX,d0
  1667.     addi.w    #Tribal.SWHEELROUT*2+Tribal.SWHEELRT,d0
  1668.     move.w    #0,d1
  1669.     move.w    #4000,d2
  1670.     bsr.l    Matrix.translate
  1671.     bsr.l    Matrix.push
  1672.  
  1673.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1674.     moveq    #2,d1
  1675.     bsr.l    TransformObject.transform
  1676.  
  1677.     bsr.l    Matrix.pop
  1678.  
  1679. ; delta symbol inside top wheel 2
  1680.     clr.w    d0
  1681.     clr.w    d1
  1682.     clr.l    d2
  1683.     move.w    Tribal.wheelRotTime,d2
  1684.     andi.w    #$3FFF,d2
  1685.     mulu.w    #2,d2
  1686. ; *2 (24:12)
  1687.     mulu.w    #4,d2
  1688.     bsr.l    Matrix.generate
  1689.     move.w    Tribal.smallWheelX,d0
  1690.     addi.w    #Tribal.SWHEELROUT*2+Tribal.SWHEELRT,d0
  1691.     move.w    #0,d1
  1692.     move.w    #4000,d2
  1693.     bsr.l    Matrix.translate
  1694.     bsr.l    Matrix.push
  1695.  
  1696.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1697.     moveq    #0,d1
  1698.     bsr.l    TransformObject.transform
  1699.  
  1700.     bsr.l    Matrix.pop
  1701. .end_top_wheels:
  1702.  
  1703.     bsr.l    Matrix.pop
  1704.  
  1705.     bsr.l    PrimitiveMesh.sortZ
  1706.  
  1707.     bsr.l    PrimitiveMesh.complete
  1708.  
  1709.     IFNE    1
  1710.     lea    Viewport.settingsTable,a0
  1711.     movem.w    Viewport.XSTART(a0),d0/d6
  1712.     movem.w    Viewport.YSTART(a0),d1/d7
  1713.     moveq    #$00000000,d4
  1714.     bsr.l    Viewport.paintRectangle
  1715.     ELSE
  1716.     movea.l    Tribal.rectAddressTable,a0
  1717.     move.w    (a0)+,d7
  1718.     beq.s    .end_restore
  1719.     subq.w    #1,d7
  1720. .restore_loop:
  1721.     move.w    d7,-(sp)
  1722.     movem.w    (a0)+,d1/d7
  1723.     movem.w    (a0)+,d0/d6
  1724.     move.l    a0,-(sp)
  1725.     move.l    #$00000000,d4
  1726.     bsr.l    Viewport.paintRectangle
  1727.     movea.l    (sp)+,a0
  1728.     move.w    (sp)+,d7
  1729.     dbra    d7,.restore_loop
  1730. .end_restore:
  1731.     ENDC
  1732.  
  1733.     movea.l    Tribal.rectAddressTable,a0
  1734.     bsr.l    PrimitiveMesh.paint
  1735.  
  1736.     lea    Tribal.rectAddressTable,a0
  1737.      move.l    (a0)+,d0
  1738.     move.l    (a0)+,d1
  1739.     move.l    (a0),-(a0)
  1740.     move.l    d0,4(a0)
  1741.     move.l    d1,-(a0)
  1742.  
  1743.     moveq    #0,d0
  1744.     rts
  1745.  
  1746. .error:    moveq    #-1,d0
  1747.     rts
  1748.  
  1749. Tribal.dummy:
  1750.     rts
  1751.  
  1752. ;======= OBJECT DATA ========
  1753.  
  1754.     DATA
  1755.  
  1756. Tribal.anchor:
  1757.     DC.W    24*2
  1758.     DC.W    24
  1759.     DC.W    -Tribal.ANCHORRIN,-Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1760.     DC.W    -Tribal.ANCHORRIN,-Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1761.     DC.W    -Tribal.ANCHORRIN,+Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1762.     DC.W    -Tribal.ANCHORRIN,+Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1763.     DC.W    +Tribal.ANCHORRIN,-Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1764.     DC.W    +Tribal.ANCHORRIN,-Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1765.     DC.W    +Tribal.ANCHORRIN,+Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1766.     DC.W    +Tribal.ANCHORRIN,+Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1767. ;
  1768.     DC.W    -Tribal.ANCHORRIN,-Tribal.ANCHORROUT,-Tribal.ANCHORRIN
  1769.     DC.W    +Tribal.ANCHORRIN,-Tribal.ANCHORROUT,-Tribal.ANCHORRIN
  1770.     DC.W    -Tribal.ANCHORRIN,-Tribal.ANCHORROUT,+Tribal.ANCHORRIN
  1771.     DC.W    +Tribal.ANCHORRIN,-Tribal.ANCHORROUT,+Tribal.ANCHORRIN
  1772.     DC.W    -Tribal.ANCHORRIN,+Tribal.ANCHORROUT,-Tribal.ANCHORRIN
  1773.     DC.W    +Tribal.ANCHORRIN,+Tribal.ANCHORROUT,-Tribal.ANCHORRIN
  1774.     DC.W    -Tribal.ANCHORRIN,+Tribal.ANCHORROUT,+Tribal.ANCHORRIN
  1775.     DC.W    +Tribal.ANCHORRIN,+Tribal.ANCHORROUT,+Tribal.ANCHORRIN
  1776.     DC.W    -Tribal.ANCHORROUT,-Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1777.     DC.W    -Tribal.ANCHORROUT,+Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1778.     DC.W    -Tribal.ANCHORROUT,-Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1779.     DC.W    -Tribal.ANCHORROUT,+Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1780.     DC.W    +Tribal.ANCHORROUT,-Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1781.     DC.W    +Tribal.ANCHORROUT,+Tribal.ANCHORRIN,-Tribal.ANCHORRIN
  1782.     DC.W    +Tribal.ANCHORROUT,-Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1783.     DC.W    +Tribal.ANCHORROUT,+Tribal.ANCHORRIN,+Tribal.ANCHORRIN
  1784.  
  1785.     DC.W    -73,-73,-73
  1786.     DC.W    -73,-73,+73
  1787.     DC.W    -73,+73,-73
  1788.     DC.W    -73,+73,+73
  1789.     DC.W    +73,-73,-73
  1790.     DC.W    +73,-73,+73
  1791.     DC.W    +73,+73,-73
  1792.     DC.W    +73,+73,+73
  1793. ;
  1794.     IFNE    1
  1795.     DC.W    -73,+73,-73
  1796.     DC.W    +73,+73,-73
  1797.     DC.W    -73,+73,+73
  1798.     DC.W    +73,+73,+73
  1799.     DC.W    -73,-73,-73
  1800.     DC.W    +73,-73,-73
  1801.     DC.W    -73,-73,+73
  1802.     DC.W    +73,-73,+73
  1803.     DC.W    +73,-73,-73
  1804.     DC.W    +73,+73,-73
  1805.     DC.W    +73,-73,+73
  1806.     DC.W    +73,+73,+73
  1807.     DC.W    -73,-73,-73
  1808.     DC.W    -73,+73,-73
  1809.     DC.W    -73,-73,+73
  1810.     DC.W    -73,+73,+73
  1811.     ELSE
  1812.     DC.W    -73,-73,-73
  1813.     DC.W    +73,-73,-73
  1814.     DC.W    -73,-73,+73
  1815.     DC.W    +73,-73,+73
  1816.     DC.W    -73,+73,-73
  1817.     DC.W    +73,+73,-73
  1818.     DC.W    -73,+73,+73
  1819.     DC.W    -73,-73,-73
  1820.     DC.W    -73,+73,-73
  1821.     DC.W    -73,-73,+73
  1822.     DC.W    -73,+73,+73
  1823.     DC.W    +73,+73,+73
  1824.     DC.W    +73,-73,-73
  1825.     DC.W    +73,+73,-73
  1826.     DC.W    +73,-73,+73
  1827.     DC.W    +73,+73,+73
  1828.     ENDC
  1829.  
  1830.     DC.W    0
  1831.  
  1832.     DC.W    4*4+1
  1833.  
  1834.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+02,06,04,00,+26,30,28,24    ; 'cover'
  1835.  
  1836. ;    DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+08,10,11,09
  1837.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+00,08,10,01,+24,32,34,25
  1838.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+01,10,11,05,+25,34,35,29
  1839.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+05,11,09,04,+29,35,33,28
  1840.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+04,09,08,00,+28,33,32,24
  1841.  
  1842. ;    DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+12,14,15,13
  1843.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+03,14,12,02,+27,38,36,26
  1844.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+07,15,14,03,+31,39,38,27
  1845.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+06,13,15,07,+30,37,39,31
  1846.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+02,12,13,06,+26,36,37,30
  1847.  
  1848. ;    DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+16,18,19,17
  1849.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+01,18,16,00,+25,42,40,24
  1850.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+03,19,18,01,+27,43,42,25
  1851.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+02,17,19,03,+26,41,43,27
  1852.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+00,16,17,02,+24,40,41,26
  1853.  
  1854. ;    DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+20,22,23,21
  1855.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+04,20,22,05,+28,44,46,29
  1856.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+05,22,23,07,+29,46,47,31
  1857.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+07,23,21,06,+31,47,45,30
  1858.     DC.W    Polygon.QUAD|Polygon.ENVMAPPED|0,+06,21,20,04,+30,45,44,28
  1859. Tribal.anchorEnd:
  1860.  
  1861. Tribal.delta:
  1862.     DC.W    6
  1863.     DC.W    0
  1864.     DC.W    +000,+150,+000            ; 0
  1865.     DC.W    +130,-075,+000            ; 1
  1866.     DC.W    -130,-075,+000            ; 2
  1867.     DC.W    +000,+100,+000            ; 3
  1868.     DC.W    +087,-040,+000            ; 4
  1869.     DC.W    -087,-040,+000            ; 5
  1870.     DC.W    0
  1871.     DC.W    6
  1872.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,0,1,4,3,00,00,127,127
  1873.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,1,2,5,4,00,00,127,127
  1874.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,2,0,3,5,00,00,127,127
  1875.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,3,4,1,0,127,127,00,00
  1876.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,4,5,2,1,127,127,00,00
  1877.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,5,3,0,2,127,127,00,00
  1878. Tribal.deltaEnd:
  1879.  
  1880. Tribal.textureTable:
  1881.     DC.L    Tribal.texture
  1882. ;    DC.L    FlareGen.goldBuffer
  1883.     DC.L    0
  1884.  
  1885. Tribal.rectAddressTable:
  1886.     DC.L    Tribal.rectTable
  1887.     DC.L    Tribal.rectTable2
  1888.     DC.L    Tribal.rectTable3
  1889.  
  1890. ;======= OBJECT RESERVES ========
  1891.  
  1892.     BSS
  1893.  
  1894. Tribal.rectTable:
  1895.     DS.W    1+4*32
  1896. Tribal.rectTable2:
  1897.     DS.W    1+4*32
  1898. Tribal.rectTable3:
  1899.     DS.W    1+4*32
  1900.  
  1901. Tribal.pal:
  1902.     DS.W    128
  1903.  
  1904. Tribal.wheelSteps
  1905.     DS.W    1
  1906. Tribal.wheelDepth
  1907.     DS.W    1
  1908. Tribal.wheelRIn
  1909.     DS.W    1
  1910. Tribal.wheelROut
  1911.     DS.W    1
  1912. Tribal.wheelRT:
  1913.     DS.W    1
  1914. Tribal.wheelPoints:
  1915.     DS.W    1
  1916. Tribal.wheelPolys:
  1917.     DS.W    1
  1918. Tribal.worldRotOn:
  1919.     DS.W    1
  1920. Tribal.worldRotStart:
  1921.     DS.L    1
  1922. Tribal.worldRotTime:
  1923.     DS.L    1
  1924. Tribal.smallWheelMoveOn:
  1925.     DS.W    1
  1926. Tribal.smallWheelStart:
  1927.     DS.L    1
  1928. Tribal.bigWheelMoveOn:
  1929.     DS.W    1
  1930. Tribal.bigWheelStart:
  1931.     DS.L    1
  1932. Tribal.wheelRotOn:
  1933.     DS.W    1
  1934. Tribal.wheelRotStart:
  1935.     DS.L    1
  1936. Tribal.wheelRotTime:
  1937.     DS.W    1
  1938. Tribal.topWheelsOn:
  1939.     DS.W    1
  1940. Tribal.worldX:
  1941.     DS.W    1
  1942. Tribal.worldZ:
  1943.     DS.W    1
  1944. Tribal.axisOn:
  1945.     DS.W    1
  1946. Tribal.axisZ:
  1947.     DS.W    1
  1948. Tribal.axisStart:
  1949.     DS.L    1
  1950. Tribal.axisMoveOn:
  1951.     DS.W    1
  1952. Tribal.rotAccelOn:
  1953.     DS.W    1
  1954. Tribal.oldWRotTime:
  1955.     DS.W    1
  1956.  
  1957. Tribal.texture:
  1958.     DS.W    10+64*64
  1959.  
  1960. Tribal.baseAdr:
  1961.     DS.L    1
  1962.  
  1963. Tribal.bigWheelX:
  1964.     DS.W    1
  1965. Tribal.smallWheelX:
  1966.     DS.W    1
  1967.  
  1968. Tribal.paintRout:
  1969.     DS.L    1
  1970. Tribal.worldRout:
  1971.     DS.L    1
  1972. Tribal.wRotSpeed:
  1973.     DS.W    1
  1974.  
  1975. ;======= END OF DEMO-EFFECT OBJECT ========