home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / OUT.ZIP / SOURCE.ZIP / FAST.SO < prev    next >
Text File  |  2004-01-18  |  20KB  |  1,016 lines

  1. ; A testscreen for getting ufly upto speed.
  2. ; Probably the ultimate 3d screen in speed on falcon.
  3. ; start:    : 37fps (std, rgb50)
  4. ; ??-05-2003: 40fps (std, rgb50)
  5. ;             better pixelclearing innerloop
  6. ; 05-06-2003: 44fps (std, rgb50)
  7. ;             new (pessimised) polygon rout, instead of old tri-splitter.
  8. ; 09-06-2003: 45fps (std, rgb50)
  9. ;             killed divisions in poly rout
  10. ; 10-06-2003: background picture restore also optimised
  11. ; 16-06-2003: new complex object, all n-poly.. (170 polys = 360 tris)
  12. ;             with backgnd 34fps (ct2 vga100), try on std!
  13. ; 18-06-2003: tests on std falcon prove it's too slow with such complex
  14. ;             objects... use simple objects.
  15. ;             maybe xperience (26poly) objects, or spikecubes (24poly)
  16. ;             objects, or who knows, maybe also more complex..
  17. ;             i have an idea how to join two spikecubes giving 44 polys.
  18. ; 22-06-2003: nice results with 100 poly (200 tri) object (with back!)
  19. ;             25fps std falc, 50fps on ct2
  20.  
  21.     IFND    DEMO_SYSTEM
  22. testmode:    =    0
  23.     move.l    #Fast.table,fxAdr
  24.     INCLUDE    TESTER.S
  25.     TEXT
  26.     ENDC    
  27.  
  28. ;======= OBJECT EQUATES ====================================================
  29.  
  30. Fast.TRIBUF:=        1                ; triple or double buffer?
  31.  
  32. ; 3d part
  33. Fast.SILHOUETTE:=    1
  34. Fast.BACKGND:=        1
  35.  
  36. ; 2d part (buildings)
  37. Fast.NUMBUILDINGS:=    5                ; don't change!
  38.  
  39. ;======= OBJECT TABLE ======================================================
  40.  
  41. ; Must be first in object!!
  42. Fast.table:
  43.     DC.L    Fast.mainLoop
  44.     DC.L    Fast.init
  45.     DC.L    Fast.initRT
  46.     DC.L    Fast.deinitRT
  47.     DC.L    Fast.setFurthest
  48.     DC.L    Fast.setFar
  49.     DC.L    Fast.setFlash
  50.     DC.L    Fast.setIntro
  51.     DC.L    Fast.setMain
  52.     DC.L    Fast.resetBuildings
  53.     DC.L    Fast.setMoveBuilding1
  54.     DC.L    Fast.setMoveBuilding2
  55.     DC.L    Fast.setMoveBuilding3
  56.     DC.L    Fast.setMoveBuilding4
  57.     DC.L    Fast.setMoveBuilding5
  58.     DC.L    Fast.switchObject
  59.     DC.L    Fast.bumpObject
  60.     DC.L    0
  61.  
  62.     IFND    DEMO_SYSTEM
  63.     INCLUDE    SFLY_DSP.S                ; Include the CPU-DSP engine.
  64.     TEXT
  65.     ENDC
  66.  
  67. ;======= INIT SUBROUTINE ===================================================
  68.  
  69. ; OUTPUT:
  70. ; d0.l: =0: All clear, <0: Error! Not initialized!
  71. Fast.init:
  72.     lea    sine_tbl,a1
  73.     bsr.l    Matrix.init
  74.  
  75. .success:
  76.     moveq    #0,d0
  77.     rts
  78. .error:    moveq    #-1,d0
  79.     rts
  80.  
  81. ;======= REALTIME INIT SUBROUTINE ==========================================
  82.  
  83. Fast.initRT:
  84.     bsr.l    HumanFly.init
  85.  
  86.     lea    Viewport.settingsTable,a0
  87.     move.w    #320,Viewport.XSCREEN(a0)
  88.     move.w    #200,Viewport.YSCREEN(a0)
  89.     move.w    #0,Viewport.XSTART(a0)
  90.     move.w    #0,Viewport.YSTART(a0)
  91.     move.w    #320,Viewport.XEND(a0)
  92.     move.w    #200,Viewport.YEND(a0)
  93.     move.w    #160,Viewport.XCENTER(a0)
  94.     move.w    #100,Viewport.YCENTER(a0)
  95.     move.w    #256+32,Viewport.ASPECT(a0)
  96.     move.w    #$100,Viewport.FOCAL(a0)
  97.     bsr.l    Viewport.update
  98.  
  99.     lea    Fast.textureTable,a0
  100.     bsr.l    Polygon.init
  101.  
  102.     move.w    #-1,Fast.times4
  103.     move.l    #Fast.binObj,Fast.obj
  104.     move.l    #Fast.binObjEnd-Fast.binObj,Fast.objSize
  105.     bsr    Fast.setObject
  106.  
  107.     bsr    Fast.setFar
  108.     bsr    Fast.setIntro
  109.  
  110.     move.w    monitormode,d0
  111.     cmpi.w    #vga60,d0
  112.     beq.s    .vga60
  113.     cmpi.w    #vga100,d0
  114.     beq.s    .vga100
  115.     cmpi.w    #rgb50,d0
  116.     beq.s    .rgb50
  117. ; Unknown monitormode..
  118. .end:    rts
  119. .vga60:    move.l    #vga60_16bit_320_200,resRout
  120.     move.l    resRout,Fast.res
  121.     rts
  122. .vga100:move.l    #vga100_16bit_320_200,resRout
  123.     move.l    resRout,Fast.res
  124.     rts
  125. .rgb50:    move.l    #rgb50_16bit_320_200,resRout
  126.     move.l    resRout,Fast.res
  127.     rts
  128.  
  129. Fast.deinitRT:
  130.     rts
  131.  
  132. ;======= SCREENINIT SUBROUTINE =============================================
  133.  
  134. Fast.initScreen:
  135.     movea.l    scr,a0
  136.     tst.w    Fast.intro
  137.     bne.s    .end
  138.     lea    Fast.background+20,a1
  139.     bra.l    COPY_PIC32020016
  140. .end:    bra.l    CLEAR_320200TSCR
  141.     rts
  142.  
  143. ;======= MAINLOOP SUBROUTINE ===============================================
  144.  
  145. Fast.mainLoop:
  146.     move.w    $0468.w,.old468
  147.  
  148.     movea.l    scr,a0
  149.     bsr.l    Primitive.setScreenbuffer
  150.  
  151.     move.l    frmcnt,d0
  152.     sub.l    lastframecount,d0
  153.     IFNE    Fast.TRIBUF
  154.     cmpi.l    #3,d0
  155.     ELSE
  156.     cmpi.l    #2,d0
  157.     ENDC
  158.     bhs.s    .end_screeninit
  159.     bsr    Fast.initScreen
  160. .end_screeninit:
  161.  
  162.     IFNE    0
  163. ; Turn write-alloc and datacache lameness off (better for random access).
  164.     movec    cacr,d0
  165.     move.l    d0,-(sp)
  166.     bclr    #13,d0                ; Disable write-alloc.
  167.     bclr    #8,d0                 ; Disable datacache.
  168.     bset    #11,d0                ; Clear datacache.
  169.     bset    #0,d0                ; Enable instruction-burst.
  170.     movec    d0,cacr
  171.     ENDC
  172.  
  173. ; Calc the current z (when bumping)
  174.     tst.w    Fast.bumping
  175.     beq.s    .end_calc_z
  176.     move.w    $04BC.w,d0
  177.     sub.w    Fast.bumpStart,d0
  178.     lsl.w    #5,d0
  179.     cmpi.w    #$2000,d0
  180.     blt.s    .ok
  181.     move.w    #$2000,d0
  182.     clr.w    Fast.bumping
  183. .ok:    addi.w    #6200,d0
  184.     move.w    d0,Fast.z
  185. .end_calc_z:
  186.  
  187. ; Run the active painting routine..
  188.     movea.l    Fast.paintRout,a0
  189.     jsr    (a0)
  190.  
  191. ; Update flash flags
  192.     move.w    Fast.flash,Fast.wipeTable
  193.  
  194.     IFNE    0
  195. ; Restore cache to original state.
  196.     move.l    (sp)+,d0
  197.     movec    d0,cacr
  198.     ENDC
  199.  
  200.     lea    Fast.timeTable,a0
  201.     IFNE    Fast.TRIBUF
  202.     move.w    (a0),d0
  203.     move.w    4(a0),(a0)
  204.     move.w    2(a0),4(a0)
  205.     move.w    d0,2(a0)
  206.     ELSE
  207.     move.w    (a0),d0
  208.     move.w    2(a0),(a0)
  209.     move.w    d0,2(a0)
  210.     ENDC
  211.  
  212.     lea    Fast.wipeTable,a0
  213.     IFNE    Fast.TRIBUF
  214.     move.w    (a0),d0
  215.     move.w    4(a0),(a0)
  216.     move.w    2(a0),4(a0)
  217.     move.w    d0,2(a0)
  218.     ELSE
  219.     move.w    (a0),d0
  220.     move.w    2(a0),(a0)
  221.     move.w    d0,2(a0)
  222.     ENDC
  223.  
  224.     lea    scr,a0
  225.     IFNE    Fast.TRIBUF
  226.     move.l    (a0)+,d0
  227.     move.l    (a0)+,d1
  228.     move.l    (a0),-4(a0)
  229.     move.l    d0,(a0)
  230.     move.l    d1,-8(a0)
  231.     ELSE
  232.     move.l    (a0)+,d0
  233.     move.l    (a0),-(a0)
  234.     move.l    d0,4(a0)
  235.     ENDC
  236.     movea.l    resRout,a0
  237.     clr.l    resRout
  238.     lea    Fast.black,a1
  239.     movea.l    d0,a2
  240.     
  241.     tst.w    Fast.flash
  242.     beq.s    .oki
  243.     bsr    .set_8bit
  244.     move.l    #Fast.set16BppMode,resRout
  245. .oki:    bsr.l    Screen.requestUpdate
  246.  
  247.     clr.w    Fast.flash
  248.  
  249.     IFNE    Fast.TRIBUF
  250.  
  251.     move.w    .old468(pc),d0
  252.     moveq    #1,d3
  253.  
  254.     cmpi.w    #rgb50,monitormode
  255.     beq.s    .wait
  256. ;    cmpi.w    #vga100,monitormode
  257. ;    bne.s    .wait
  258.  
  259.     moveq    #2,d3
  260. .wait:    move.w    $0468.w,d2
  261.     sub.w    d0,d2
  262.     cmp.w    d3,d2
  263.     blt.s    .wait
  264.  
  265.     ELSE
  266.  
  267.     move.w    $0468.w,d0
  268. .wait:    cmp.w    $0468.w,d0
  269.     beq.s    .wait
  270.  
  271.     ENDC
  272.  
  273.     rts
  274.  
  275. .old468:DC.W    0
  276.  
  277. .set_8bit:
  278.     lea    empty,a2
  279.     lea    Fast.white,a1
  280.     move.l    #Fast.set8BplMode,a0
  281.     rts
  282.  
  283. Fast.res:
  284.     DC.L    0
  285.  
  286. Fast.white:
  287.     REPT    256
  288.     DC.L    $FFFFFFFF
  289.     ENDR
  290. Fast.black:
  291.     REPT    256
  292.     DC.L    0
  293.     ENDR
  294.  
  295. ;======= OBJECT SUBROUTINES ================================================
  296.  
  297. Fast.set8BplMode:
  298.     move.w    d7,-(sp)
  299.     move.w    $FFFF8266.w,d7
  300.     andi.w    #%1111111011111111,d7        ; tc mode off!
  301.     ori.w    #%0000000000010000,d7        ; 8bpl mode on
  302.     move.w    d7,$FFFF8266.w
  303.     move.w    (sp)+,d7
  304.     rts
  305.  
  306. Fast.set16BppMode:
  307.     move.w    d7,-(sp)
  308.     move.w    $FFFF8266.w,d7
  309.     andi.w    #%1111111111101111,d7        ; 8bpl mode off!
  310.     ori.w    #%0000000100000000,d7        ; tc mode on
  311.     move.w    d7,$FFFF8266.w
  312.     move.w    (sp)+,d7
  313.     rts
  314.  
  315. ;- intro part: moving buildings --------------------------------------------
  316.  
  317. Fast.setIntro:
  318.     bsr    Fast.resetBuildings
  319.     st    Fast.intro
  320.     move.l    #Fast.introduceBuildings,Fast.paintRout
  321.     move.l    frmcnt,lastframecount
  322.     rts
  323.  
  324. Fast.setMoveBuilding1:
  325.     move.l    $04BA.w,Fast.introStart
  326.     bsr    Fast.freeze
  327.     move.w    #0,Fast.movingBuilding
  328.     rts
  329.  
  330. Fast.setMoveBuilding2:
  331.     move.l    $04BA.w,Fast.introStart
  332.     moveq    #1,d0
  333.     bsr    Fast.freeze
  334.     rts
  335.  
  336. Fast.setMoveBuilding3:
  337.     move.l    $04BA.w,Fast.introStart
  338.     moveq    #2,d0
  339.     bsr    Fast.freeze
  340.     rts
  341.  
  342. Fast.setMoveBuilding4:
  343.     move.l    $04BA.w,Fast.introStart
  344.     moveq    #3,d0
  345.     bsr    Fast.freeze
  346.     rts
  347.  
  348. Fast.setMoveBuilding5:
  349.     move.l    $04BA.w,Fast.introStart
  350.     moveq    #4,d0
  351.     bsr    Fast.freeze
  352.     rts
  353.  
  354. Fast.resetBuildings:
  355.     lea    Fast.spriteInfo,a0
  356.     clr.l    d0
  357.     REPT    3*2
  358.     move.l    d0,(a0)+
  359.     ENDR
  360.  
  361.     moveq    #Fast.NUMBUILDINGS-1,d7
  362.     lea    Fast.buildingPosTable,a0
  363.     lea    Fast.buildingStartTable,a1
  364. .loop:    move.l    (a1)+,(a0)+
  365.     dbf    d7,.loop
  366.     move.w    #-1,Fast.movingBuilding
  367.     rts
  368.  
  369. Fast.introStart:
  370.     DC.L    0
  371.  
  372. ; freezes current screen to backbuffer... or well, parts of it at least.
  373. ; INPUT:
  374. ; d0.w: new sprite num
  375. Fast.freeze:
  376.     move.w    d0,-(sp)
  377.  
  378. ; first fill old spriteinfo to get old rectangle to store..
  379.     move.w    Fast.movingBuilding,d0
  380.     bpl.s    .ok
  381. ; if no building yet, set some dummy rectangle...
  382.     clr.w    d1
  383.     clr.w    d2
  384.     clr.w    d3
  385.     clr.w    d4
  386.     bra.s    .set
  387. .ok:    move.l    (Fast.buildingTable,d0.w*4),a0        ; a0: rle sprite
  388.     movem.w    (a0),d5-d6                ; d5.w=w, d6.w=h
  389.     lsr.w    d5                    ; d5.w=w/2
  390.     lsr.w    d6                    ; d6.w=h/2
  391.     movem.w    (Fast.buildingPosTable,d0.w*4),d1-d2    ; d1.w=xm, d2.w=ym
  392.     move.w    d1,d3                    ; d3.w=xm
  393.     move.w    d2,d4                    ; d4.w=ym
  394.     sub.w    d5,d1                    ; d1.w=xm-w/2=x0
  395.     sub.w    d6,d2                    ; d2.w=ym-h/2=y0
  396.     add.w    d5,d3                    ; d3.w=xm+w/2=x1
  397.     add.w    d6,d4                    ; d4.w=ym+h/2=y1
  398. .set:    movem.w    d1-d4,Fast.spriteInfo
  399.  
  400. ; store new building number..
  401.     move.w    (sp)+,d0
  402.     move.w    d0,Fast.movingBuilding
  403.  
  404. ; now blit that old crap to store.
  405.     movem.w    Fast.spriteInfo,d0-d1/d6-d7        ; x0,y0,x1,y1
  406.     lea    Fast.backBuffer,a0            ; a0: dst
  407.     movea.l    scr,a1                    ; a1: src
  408.     bsr    Fast.blit
  409.     rts
  410.  
  411. Fast.restoreBuilding:
  412.     movem.w    Fast.spriteInfo,d0-d1/d6-d7        ; x0,y0,x1,y1
  413.     lea    Fast.backBuffer,a1            ; a1: dst
  414.     movea.l    scr,a0                    ; a0: src
  415.     bsr    Fast.blit
  416.     rts
  417.  
  418. ; todo: optimise!
  419. ; INPUT:
  420. ; d0.w: left x
  421. ; d1.w: upper y
  422. ; d6.w: right x
  423. ; d7.w: lower y
  424. ; a0: dst
  425. ; a1: src
  426. Fast.blit:
  427.     lea    Viewport.settingsTable,a2
  428.     move.w    d6,d2
  429.  
  430.     cmp.w    Viewport.XSTART(a2),d0
  431.     bpl.s    .testx0
  432.     move.w    Viewport.XSTART(a2),d0
  433. .testx0:
  434.     cmp.w    Viewport.XEND(a2),d0
  435.     blt.s    .endtestx0
  436.     move.w    Viewport.XEND(a2),d0
  437.     subq.w    #1,d0
  438. .endtestx0:
  439.  
  440.     cmp.w    Viewport.YSTART(a2),d1
  441.     bpl.s    .testy0
  442.     move.w    Viewport.YSTART(a2),d1
  443. .testy0:
  444.     cmp.w    Viewport.YEND(a2),d1
  445.     blt.s    .endtesty0
  446.     move.w    Viewport.YEND(a2),d1
  447.     subq.w    #1,d1
  448. .endtesty0:
  449.  
  450.     cmp.w    Viewport.XSTART(a2),d6
  451.     bpl.s    .testx1
  452.     move.w    Viewport.XSTART(a2),d6
  453. .testx1:
  454.     cmp.w    Viewport.XEND(a2),d6
  455.     blt.s    .endtestx1
  456.     move.w    Viewport.XEND(a2),d6
  457.     move.w    d6,d2
  458.     subq.w    #1,d6
  459. .endtestx1:
  460.  
  461.     cmp.w    Viewport.YSTART(a2),d7
  462.     bpl.s    .testy1
  463.     move.w    Viewport.YSTART(a2),d7
  464. .testy1:
  465.     cmp.w    Viewport.YEND(a2),d7
  466.     blt.s    .endtesty1
  467.     move.w    Viewport.YEND(a2),d7
  468.     subq.w    #1,d7
  469. .endtesty1:
  470.  
  471.     move.w    d7,d3
  472. ;    andi.w    #$FFFE,d2            ; longeven startaddy! todo: make correct.
  473.     adda.w    d2,a0
  474.     adda.w    d2,a0
  475.     adda.w    d2,a1
  476.     adda.w    d2,a1
  477.     move.w    Viewport.XSCREEN(a2),d5
  478.     add.w    d5,d5
  479.     movea.w    d5,a4
  480.     mulu.w    d5,d3
  481.     adda.l    d3,a0
  482.     adda.l    d3,a1
  483. ; w=r-l+1, ceil(w/2)=(w+1)/2=(r-l+2)/2
  484.     sub.w    d0,d6                ; d6.w=r-l
  485.     addq.w    #2,d6                ; d6.w=r-l+2
  486.     lsr.w    d6                ; d6.w=(r-l+2)/2=ceil(w/2)
  487.     move.w    d6,d5
  488.     add.w    d6,d5
  489.     add.w    d5,d5
  490.     suba.w    d5,a4
  491.     sub.w    d1,d7
  492.     subq.w    #1,d6
  493.     bmi.s    .end
  494.     move.w    d6,d5
  495.  
  496. .yloop:
  497.  
  498. .xloop:    move.l    -(a1),-(a0)
  499.     dbf    d6,.xloop
  500.  
  501.     move.w    d5,d6
  502.     suba.l    a4,a0
  503.     suba.l    a4,a1
  504.     dbf    d7,.yloop
  505. .end:    rts
  506.  
  507.  
  508. ; paint sprites
  509. Fast.introduceBuildings:
  510.     bsr    Fast.restoreBuilding    
  511.  
  512. ; Interpolate positions..
  513.     move.w    Fast.movingBuilding,d1
  514.     bmi    .end
  515.  
  516.     move.l    $04BA.w,d0
  517.     sub.l    Fast.introStart,d0
  518.     add.l    d0,d0
  519.     cmpi.l    #$100,d0
  520.     blt.s    .ok
  521.     move.w    #$0100,d0
  522. .ok:    move.w    #$0100,d5
  523.     sub.w    d0,d5
  524. ; d0.w=t [0..$100], d5.w=$100-t
  525.     lea    (Fast.buildingPosTable,d1.w*4),a0
  526.     lea    (Fast.buildingStartTable,d1.w*4),a2
  527.     lea    (Fast.buildingDestTable,d1.w*4),a1
  528.     move.w    (a1)+,d1
  529.     move.w    (a1)+,d2
  530.     move.w    (a2)+,d3
  531.     move.w    (a2)+,d4
  532.     muls.w    d0,d1
  533.     muls.w    d0,d2
  534.     muls.w    d5,d3
  535.     muls.w    d5,d4
  536.     add.l    d3,d1
  537.     add.l    d4,d2
  538.     asr.l    #8,d1
  539.     asr.l    #8,d2
  540.     move.w    d1,(a0)+
  541.     move.w    d2,(a0)+
  542. .end_traject:
  543.  
  544. ; paint only one!
  545.     move.w    Fast.movingBuilding,d2
  546.     movem.w    (Fast.buildingPosTable,d2.w*4),d0-d1    ; d0.w=x, d1.w=y
  547.     movea.l    (Fast.buildingTable,d2.w*4),a1        ; a1: sprite
  548. ; todo: save to spriteinfo..
  549.  
  550.     movem.w    (a1),d5-d6                ; d5.w=w, d6.w=h
  551.     lsr.w    d5                    ; d5.w=w/2
  552.     lsr.w    d6                    ; d6.w=h/2
  553.     movem.w    (Fast.buildingPosTable,d2.w*4),d0-d1    ; d0.w=xm, d1.w=ym
  554.     move.w    d0,d3                    ; d3.w=xm
  555.     move.w    d1,d4                    ; d4.w=ym
  556.     sub.w    d5,d0                    ; d0.w=xm-w/2=x0
  557.     sub.w    d6,d1                    ; d1.w=ym-h/2=y0
  558.     add.w    d5,d3                    ; d3.w=xm+w/2=x1
  559.     add.w    d6,d4                    ; d4.w=ym+h/2=y1
  560.     movem.w    d0-d1/d3-d4,Fast.spriteInfo
  561.  
  562.     movem.w    (Fast.buildingPosTable,d2.w*4),d0-d1    ; d0.w=x, d1.w=y
  563.     bsr    Sprite.clipAndPaint
  564.  
  565. ; swap 'em...
  566.     lea    Fast.spriteInfo,a0
  567.     IFNE    Fast.TRIBUF
  568.     movem.l    (a0),d0-d5
  569.     movem.l    d0-d1,8(a0)
  570.     movem.l    d2-d3,16(a0)
  571.     movem.l    d4-d5,(a0)
  572.     ELSE
  573.     movem.l    (a0),d0-d3
  574.     movem.l    d0-d1,8(a0)
  575.     movem.l    d2-d3,(a0)
  576.     ENDC
  577.  
  578. .end:    rts
  579.  
  580. ;- main part: 3d -----------------------------------------------------------
  581.  
  582. Fast.setFar:
  583.     move.w    #6200,Fast.z
  584.     clr.w    Fast.bumping
  585.     rts
  586.  
  587. Fast.setFurthest:
  588.     move.w    #10000,Fast.z
  589.     clr.w    Fast.bumping
  590.     rts
  591.  
  592. Fast.setFlash:
  593.     st    Fast.flash
  594.     rts
  595.  
  596. Fast.setMain:
  597.     clr.w    Fast.intro
  598.     move.l    #Fast.paintMain,Fast.paintRout
  599.     move.l    frmcnt,lastframecount
  600.     bsr    Fast.setFlash
  601.     rts
  602.  
  603. Fast.switchObject:
  604.     not.w    Fast.times4
  605.     cmp.l    #Fast.earxObj,Fast.obj
  606.     beq.s    .ok
  607.     move.l    #Fast.earxObj,Fast.obj
  608.     move.l    #Fast.earxObjEnd-Fast.earxObj,Fast.objSize
  609.     bra.s    Fast.setObject
  610. .ok:    move.l    #Fast.binObj,Fast.obj
  611.     move.l    #Fast.binObjEnd-Fast.binObj,Fast.objSize
  612.     ;bra.s    Fast.setObject
  613.  
  614. Fast.setObject:
  615.     bsr.l    ObjectRegistry.clear
  616.     movea.l    Fast.obj,a0
  617.     move.l    Fast.objSize,d0
  618.     bsr.l    ObjectRegistry.set
  619.     rts
  620.  
  621. Fast.bumpObject:
  622.     move.w    $04BC.w,Fast.bumpStart
  623.     st    Fast.bumping
  624.     rts
  625.  
  626. Fast.bumping:
  627.     DC.W    0
  628. Fast.bumpStart:
  629.     DC.W    0
  630.  
  631.  
  632. ; paint the foreground 3d object..
  633. Fast.paintMain:
  634.     move.w    $04BC.w,d0
  635.     move.w    d0,Fast.timeTable
  636.     moveq    #0,d1
  637.     bsr    Fast.paint
  638.     rts
  639.  
  640. ; INPUT:
  641. ; d0.w=time
  642. ; d1.w=object handle
  643. Fast.paint:
  644.     movem.w    d0-d1,-(sp)
  645.  
  646.     IFNE    Fast.SILHOUETTE
  647.     movea.l    Fast.shadowAdrAdr,a0        ; a0: log table adrs
  648.     movea.l    (a0),a0                ; a0: current log table
  649.     bsr.l    PrimitiveMesh.newShadowed
  650.     ELSE
  651.     bsr.l    PrimitiveMesh.new
  652.     ENDC
  653.  
  654.     movem.w    (sp),d0-d1
  655.  
  656.     move.w    d0,d1
  657.     move.w    d0,d2
  658.     mulu.w    #3,d1
  659.     lsr.l    d1
  660.     mulu.w    #5,d2
  661.     lsr.l    d2
  662.     bsr.l    Matrix.generate
  663.     move.w    #0,d0
  664.     move.w    #0,d1
  665.     move.w    Fast.z,d2
  666.     bsr.l    Matrix.translate
  667.     bsr.l    Matrix.push
  668.  
  669.     movem.w    (sp),d0-d1
  670.  
  671.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  672.     bsr.l    TransformObject.transform
  673.  
  674.     bsr.l    Matrix.pop
  675.  
  676. ; Perform only on a 1 arm object...
  677.     tst.w    Fast.times4
  678.     beq    .end_times4
  679.  
  680.     movem.w    (sp),d0-d1
  681.  
  682.     move.w    d0,d1
  683.     move.w    d0,d2
  684.     mulu.w    #3,d1
  685.     lsr.l    d1
  686.     mulu.w    #5,d2
  687.     lsr.l    d2
  688.     addi.w    #sintbllen/4,d2
  689.     bsr.l    Matrix.generate
  690.     move.w    #0,d0
  691.     move.w    #0,d1
  692.     move.w    Fast.z,d2
  693.     bsr.l    Matrix.translate
  694.     bsr.l    Matrix.push
  695.  
  696.     movem.w    (sp),d0-d1
  697.  
  698.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  699.     bsr.l    TransformObject.transform
  700.  
  701.     bsr.l    Matrix.pop
  702.  
  703.     movem.w    (sp),d0-d1
  704.  
  705.     move.w    d0,d1
  706.     move.w    d0,d2
  707.     mulu.w    #3,d1
  708.     lsr.l    d1
  709.     mulu.w    #5,d2
  710.     lsr.l    d2
  711.     addi.w    #sintbllen/2,d2
  712.     bsr.l    Matrix.generate
  713.     move.w    #0,d0
  714.     move.w    #0,d1
  715.     move.w    Fast.z,d2
  716.     bsr.l    Matrix.translate
  717.     bsr.l    Matrix.push
  718.  
  719.     movem.w    (sp),d0-d1
  720.  
  721.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  722.     bsr.l    TransformObject.transform
  723.  
  724.     bsr.l    Matrix.pop
  725.  
  726.     movem.w    (sp),d0-d1
  727.  
  728.     move.w    d0,d1
  729.     move.w    d0,d2
  730.     mulu.w    #3,d1
  731.     lsr.l    d1
  732.     mulu.w    #5,d2
  733.     lsr.l    d2
  734.     subi.w    #sintbllen/4,d2
  735.     bsr.l    Matrix.generate
  736.     move.w    #0,d0
  737.     move.w    #0,d1
  738.     move.w    Fast.z,d2
  739.     bsr.l    Matrix.translate
  740.     bsr.l    Matrix.push
  741.  
  742.     movem.w    (sp),d0-d1
  743.  
  744.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  745.     bsr.l    TransformObject.transform
  746.  
  747.     bsr.l    Matrix.pop
  748. .end_times4:
  749.  
  750.     movem.w    (sp)+,d0-d1
  751.     tst.w    d1
  752.     bne.s    .skip
  753.     bsr.l    PrimitiveMesh.sortZ
  754. .skip:
  755.     bsr.l    PrimitiveMesh.complete
  756.  
  757. ; parallel shit
  758.  
  759.     IFEQ    Fast.SILHOUETTE
  760.     movea.l    Fast.rectAddressTable,a0
  761.     move.w    (a0)+,d7
  762.     beq.s    .end_restore
  763.     subq.w    #1,d7
  764. .restore_loop:
  765.     move.w    d7,-(sp)
  766.     movem.w    (a0)+,d1/d7
  767.     movem.w    (a0)+,d0/d6
  768.     move.l    a0,-(sp)
  769.     IFNE    Fast.BACKGND
  770.     lea    Fast.background+20,a1
  771.     bsr.l    Viewport.copyRectangle
  772.     ELSE
  773.     moveq    #$00000000,d4
  774.     bsr.l    Viewport.paintRectangle
  775.     ENDC
  776.     movea.l    (sp)+,a0
  777.     move.w    (sp)+,d7
  778.     dbra    d7,.restore_loop
  779. .end_restore:
  780.     ELSE
  781.  
  782.     movea.l    Fast.shadowAdrAdr+4,a1        ; a1: phys table adrs
  783.     movea.l    (a1),a1                ; a1: current phys table
  784.     clr.l    d0
  785.  
  786.     IFEQ    Fast.BACKGND
  787.  
  788.     bsr.l    Polygon.clearShadows
  789.  
  790.     ELSE
  791.  
  792. ;    tst.w    Fast.flash
  793. ;    beq.s    .pic
  794. ;.white:    moveq    #-1,d0
  795. ;    movea.l    scr,a0
  796. ;    bsr.l    WIPE_320200TSCR
  797. ;    bra.s    .end_restore
  798. ;.pic:    tst.w    Fast.wipeTable
  799. ;    beq.s    .restore_shadows
  800. ;.paint_pic:
  801. ;    lea    Fast.background+20,a1
  802. ;    movea.l    scr,a0
  803. ;    bsr.l    COPY_PIC32020016    
  804. ;    bra.s    .end_restore
  805. .restore_shadows:
  806.     lea    Fast.background+20,a0
  807.     bsr.l    Polygon.restoreShadows
  808. .end_restore:
  809.  
  810.     ENDC
  811.  
  812.     ENDC
  813.  
  814. ; end of parallel shit
  815.  
  816.     movea.l    Fast.rectAddressTable,a0
  817.     bsr.l    PrimitiveMesh.paint
  818.  
  819.     lea    Fast.rectAddressTable,a0
  820.     IFNE    Fast.TRIBUF
  821.      move.l    (a0)+,d0
  822.     move.l    (a0)+,d1
  823.     move.l    (a0),-(a0)
  824.     move.l    d0,4(a0)
  825.     move.l    d1,-(a0)
  826.     ELSE
  827.      move.l    (a0)+,d0
  828.     move.l    (a0),-(a0)
  829.     move.l    d0,4(a0)
  830.     ENDC
  831.  
  832. ;= shadow swapping =
  833.  
  834.     movea.l    Fast.shadowAdrAdr,a0
  835.     IFNE    Fast.TRIBUF
  836.      move.l    (a0)+,d0
  837.     move.l    (a0)+,d1
  838.     move.l    (a0),-(a0)
  839.     move.l    d0,4(a0)
  840.     move.l    d1,-(a0)
  841.     ELSE
  842.      move.l    (a0)+,d0
  843.     move.l    (a0),-(a0)
  844.     move.l    d0,4(a0)
  845.     ENDC
  846.  
  847.     movea.l    Fast.shadowAdrAdr+4,a0
  848.     IFNE    Fast.TRIBUF
  849.      move.l    (a0)+,d0
  850.     move.l    (a0)+,d1
  851.     move.l    (a0),-(a0)
  852.     move.l    d0,4(a0)
  853.     move.l    d1,-(a0)
  854.     ELSE
  855.      move.l    (a0)+,d0
  856.     move.l    (a0),-(a0)
  857.     move.l    d0,4(a0)
  858.     ENDC
  859.  
  860.     move.w    .swapcount(pc),d0
  861.     addq.w    #1,d0
  862.     IFNE    Fast.TRIBUF
  863.     cmpi.w    #3,d0
  864.     ELSE
  865.     cmpi.w    #2,d0
  866.     ENDC
  867.     blt.s    .end_swapcount
  868.  
  869. ; Clear count and swap phys/log shadow tables..
  870.     clr.w    d0
  871.     lea    Fast.shadowAdrAdr,a0
  872.     move.l    (a0)+,d1
  873.     move.l    (a0),-(a0)
  874.     move.l    d1,4(a0)
  875.  
  876. .end_swapcount:
  877.     move.w    d0,.swapcount
  878.  
  879. ;= end shadow swapping =
  880.  
  881.     rts
  882.  
  883. .swapcount:
  884.     DC.W    0
  885.  
  886. ;======= OBJECT DATA =======================================================
  887.  
  888.     DATA
  889.  
  890. Fast.texture:
  891.     INCBIN    ENV64.APX
  892.  
  893. Fast.textureTable:
  894.     DC.L    Fast.texture
  895.     DC.L    Fast.texture
  896.     DC.L    0
  897.  
  898. Fast.rectAddressTable:
  899.     DC.L    Fast.rectTable
  900.     DC.L    Fast.rectTable2
  901.     DC.L    Fast.rectTable3
  902.  
  903. Fast.earxObj:
  904.     INCLUDE    SPIKETR6.S
  905. Fast.earxObjEnd:
  906.  
  907. Fast.binObj:
  908.     INCLUDE    EXTRUDED.S
  909. Fast.binObjEnd:
  910.  
  911. Fast.z:    DC.W    3000
  912.  
  913. Fast.shadowAdrAdr:
  914.     DC.L    Fast.shadowAdr
  915.     DC.L    Fast.shadowAdr2
  916.  
  917. Fast.shadowAdr:
  918.     DC.L    Fast.shadowTable
  919.     DC.L    Fast.shadowTable2
  920.     DC.L    Fast.shadowTable3
  921.  
  922. Fast.shadowAdr2:
  923.     DC.L    Fast.shadowTable4
  924.     DC.L    Fast.shadowTable5
  925.     DC.L    Fast.shadowTable6
  926.  
  927. Fast.background:
  928.     INCBIN    BACKCREM.APX
  929.  
  930. Fast.buildingTable:
  931.     DC.L    Fast.building1
  932.     DC.L    Fast.building2
  933.     DC.L    Fast.building3
  934.     DC.L    Fast.building4
  935.     DC.L    Fast.building5
  936.  
  937. Fast.building1:
  938.     INCBIN    FLAT1.RLE
  939. Fast.building2:
  940.     INCBIN    FLAT2.RLE
  941. Fast.building3:
  942.     INCBIN    FLAT3.RLE
  943. Fast.building4:
  944.     INCBIN    FLAT4.RLE
  945. Fast.building5:
  946.     INCBIN    FLAT5.RLE
  947.  
  948. Fast.paintRout:
  949.     DC.L    Fast.introduceBuildings
  950.  
  951. Fast.intro:
  952.     DC.W    1
  953.  
  954. Fast.buildingPosTable:
  955.     DS.L    Fast.NUMBUILDINGS
  956. Fast.buildingDestTable:
  957.     DC.W    95,46
  958.     DC.W    80,146
  959.     DC.W    238,163
  960.     DC.W    258,97
  961.     DC.W    232,37
  962. Fast.buildingStartTable:
  963.     DC.W    95-256,46
  964.     DC.W    80,146+256
  965.     DC.W    238,163+256
  966.     DC.W    258+256,97
  967.     DC.W    232,37-256
  968.  
  969. Fast.movingBuilding:
  970.     DC.W    -1
  971.  
  972. ;======= OBJECT RESERVES ===================================================
  973.  
  974.     BSS
  975.  
  976. Fast.timeTable:
  977.     DS.W    3
  978. Fast.wipeTable:
  979.     DS.W    3
  980. Fast.flash:
  981.     DS.W    1
  982.  
  983. Fast.rectTable:
  984.     DS.W    1+4*32
  985. Fast.rectTable2:
  986.     DS.W    1+4*32
  987. Fast.rectTable3:
  988.     DS.W    1+4*32
  989.  
  990. Fast.shadowTable:
  991.     DS.W    1+4*2*200
  992. Fast.shadowTable2:
  993.     DS.W    1+4*2*200
  994. Fast.shadowTable3:
  995.     DS.W    1+4*2*200
  996.  
  997. Fast.shadowTable4:
  998.     DS.W    1+4*2*200
  999. Fast.shadowTable5:
  1000.     DS.W    1+4*2*200
  1001. Fast.shadowTable6:
  1002.     DS.W    1+4*2*200
  1003.  
  1004. Fast.backBuffer:
  1005.     DS.W    320*200            ; again... alot of mem wasted!
  1006.  
  1007. Fast.spriteInfo:
  1008.     DS.W    4*3            ; 3 screens..
  1009.  
  1010. Fast.obj:
  1011.     DS.L    1
  1012. Fast.objSize:
  1013.     DS.L    1
  1014. Fast.times4:
  1015.     DS.W    1
  1016.