home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / phxass / examples / vectorballs.asm < prev   
Assembly Source File  |  1977-12-31  |  10KB  |  407 lines

  1. **
  2. **    V E C T O R B A L L S
  3. **
  4. **     by Frank Wille 1994
  5. **
  6. **     Assembler: PhxAss V4.xx
  7. **     Linker:      PhxLnk V4.xx
  8. **
  9.  
  10.  
  11. ** Imported Functions **
  12.  
  13.     xref    demoStartup
  14. ;        (IN: - / OUT: a4=SmallDataBase,a6=CUSTOM)
  15.  
  16.     xref    demoCleanup
  17. ;        (IN: - / OUT: d0=0)
  18.  
  19.     xref    demoStdView
  20. ;        (IN: d0=Width,d1=Height,d2=HStrt,d3=VStrt,d4=Depth,a0=CList,
  21. ;         a1=DisplayMem / OUT: a0=newCList)
  22.  
  23.     xref    demoColors
  24. ;        (IN: a0=CList,a1=ColorTab,d0=nColors / OUT: a0=CList)
  25.  
  26.  
  27.  
  28.  
  29. ** Includes **
  30.  
  31.     incdir    "include"
  32.     include "hardware/custom_all.i"
  33.     include "hardware/dmabits.i"
  34.     include "hardware/intbits.i"
  35.  
  36.  
  37.  
  38. ** Defines **
  39.  
  40. WIDTH        = 336            ; Bitmap dimensions
  41. HEIGHT        = 128
  42. DEPTH        = 4
  43. BPR        = WIDTH>>3        ; Bytes per row
  44. DISPHEIGHT    = 176            ; last line of display (bitmap pos.)
  45. HSTART        = $79            ; Display start position (beam pos.)
  46. VSTART        = $4c
  47. MIRRSTART    = 90            ; first line for reflecting surface
  48. VBWIDTH     = 16            ; Vector Ball dimensions
  49. VBHEIGHT    = 16
  50. SINTABVALS    = 256            ; number of entries in sine table
  51. ORGX        = 240            ; bitmap position of spatial origin
  52. ORGY        = 80
  53. ORGZ        = 200
  54. NUMOBS        = 52            ; number of vector balls
  55.  
  56. ; DblBuf structure
  57.         rsreset
  58. dblbuf_CList    rs.l    1        ; copper list and its
  59. dblbuf_Bitmap    rs.l    1        ;  bitmap pointer
  60. dblbuf_SIZE    rs
  61.  
  62. ; BobCoords structure
  63.         rsreset
  64. bobc_next    rs.l 1            ; MinNode header
  65. bobc_prev    rs.l 1
  66. bobc_x        rs.w 1            ; object's 3D coords
  67. bobc_y        rs.w 1
  68. bobc_z        rs.w 1
  69. bobc_reserved    rs.w 1            ; longword align
  70. bobc_SIZE    rs
  71.  
  72.  
  73.  
  74. ** Macros **
  75.  
  76.     macro    WAITBLIT
  77. 1\@$:    btst    #6,DMACONR(a6)        ; wait until blitter ready
  78.     bne.s    1\@$
  79.     endm
  80.  
  81. LASTLIN set    0
  82.     macro    COPWAIT         ; COPWAIT <line>
  83.     ifge    \1-256            ; wait for line >= 256?
  84.     iflt    LASTLIN-256
  85.     move.l    #$ffe1fffe,(a0)+
  86.     endc
  87.     endc
  88.     move.l    #(\1&$ff)<<24|$0ffffe,(a0)+
  89. LASTLIN set    \1
  90.     endm
  91.  
  92.     macro    COPEND
  93.     move.l    #$fffffffe,(a0)
  94. LASTLIN set    0
  95.     endm
  96.  
  97.  
  98.  
  99. ** Code **
  100.  
  101.     near    a4,-2            ; __MERGED Small Data (a4)
  102.  
  103.     code
  104.  
  105.  
  106.     bsr    demoStartup        ; -> a4=SmallData Base, a6=CUSTOM
  107.     bsr    make_ytable        ; pre-calculate line offsets
  108.     bsr    initCopperLists
  109.     move.w    #$8200|DMAF_RASTER|DMAF_COPPER|DMAF_BLITTER|DMAF_DISK,DMACON(a6)
  110. loop:
  111.     bsr    drawVBalls        ; call main routine
  112. 1$:    move.w    INTREQR(a6),d0        ; wait for copper interrupt, which
  113.     and.w    #INTF_COPER,d0        ;  occurs always at end of display
  114.     beq.s    1$
  115.     move.w    toggle(a4),d0        ; swap copper lists and bitmaps
  116.     lea    DblBufInfo(a4),a0
  117.     move.l    dblbuf_CList(a0,d0.w),COP1LC(a6)
  118.     eor.w    #dblbuf_SIZE,d0     ; toggle
  119.     move.w    d0,toggle(a4)
  120.     move.l    dblbuf_Bitmap(a0,d0.w),workBitmap(a4)
  121.     btst    #6,$bfe001        ; loop until left mouse button pressed
  122.     bne.s    loop
  123.     bra    demoCleanup        ; cleanup and quit to CLI or WB
  124.  
  125.  
  126. drawVBalls:
  127.     moveq    #1,d0
  128.     ror.l    #8,d0            ; $01000000 (use D only, D=0)
  129.     WAITBLIT
  130.     move.w    d0,BLTDMOD(a6)        ; use blitter to clear bitmap
  131.     move.l    d0,BLTCON0(a6)
  132.     move.l    workBitmap(a4),BLTDPT(a6)
  133.     move.w    #((DEPTH*HEIGHT)<<6)|(WIDTH>>4),BLTSIZE(a6)
  134.  
  135.     lea    boblist(a4),a3        ; init empty Bob list header -> a3
  136.     move.l    a3,(a3)
  137.     addq.l    #4,(a3)
  138.     move.l    a3,8(a3)
  139.     lea    bobnodes(a4),a2     ; a2 = first Bob node
  140.     lea    SinCosTab(pc),a0    ; a0/a1 = Sine/Cosine table
  141.     lea    SINTABVALS/2(a0),a1
  142.     movem.w alpha(a4),d0/d1     ; d0 = alpha, d1 = beta
  143.     move.w    (a0,d0.w),d5        ; d5 = MSW: sin(alpha) | LSW: cos(alpha)
  144.     swap    d5
  145.     move.w    (a1,d0.w),d5
  146.     move.w    (a0,d1.w),d6        ; d6 = MSW: sin(beta) | LSW: cos(beta)
  147.     swap    d6
  148.     move.w    (a1,d1.w),d6
  149.  
  150.     moveq    #NUMOBS-1,d7        ; *** Coordinate Calculation Loop ***
  151.     lea    vballcoords(pc),a5    ; a5 = spatial positions of all VBalls
  152. rotbobs_loop:
  153.     movem.w (a5)+,d0-d1        ; d0=x, d1=y, z=0
  154.     move.w    d1,d2
  155.     muls    d5,d1            ; * rotate about x-axis *
  156.     swap    d5
  157.     add.l    d1,d1
  158.     clr.w    d1
  159.     swap    d1            ; y' = y*cos(alpha) [- z*sin(alpha)]
  160.     muls    d5,d2
  161.     swap    d5
  162.     add.l    d2,d2
  163.     swap    d2            ; z' = y*sin(alpha) [+ z*cos(alpha)]
  164.     move.w    d0,d3
  165.     move.w    d1,d4
  166.     muls    d6,d0            ; * rotate about y-axis *
  167.     swap    d6
  168.     muls    d6,d4
  169.     add.l    d4,d0
  170.     add.l    d0,d0
  171.     clr.w    d0
  172.     swap    d0            ; x' = x*cos(beta) + z*sin(beta)
  173.     muls    d6,d3
  174.     swap    d6
  175.     muls    d6,d2
  176.     sub.l    d3,d2
  177.     add.l    d2,d2
  178.     swap    d2            ; z' = -x*sin(beta) + z*cos(beta)
  179.     add.w    #ORGX,d0
  180.     add.w    #ORGY,d1
  181.     add.w    #ORGZ,d2
  182.     move.w    d2,d4            ; projection
  183.     add.w    #$100,d4
  184.     beq.s    1$
  185.     lsl.l    #8,d0
  186.     divs    d4,d0
  187.     lsl.l    #8,d1
  188.     divs    d4,d1
  189. 1$:    movem.w d0-d2,bobc_x(a2)    ; write transformed coords. into node
  190.     move.l    (a3),a1
  191.     bra.s    3$
  192. 2$:    cmp.w    bobc_z(a1),d2        ; insert into list, sorted by z-coord.
  193.     bge.s    4$
  194.     move.l    d0,a1
  195. 3$:    move.l    bobc_next(a1),d0
  196.     bne.s    2$
  197. 4$:    move.l    a1,(a2)         ; insert node a2 before node a1
  198.     addq.l    #4,a1
  199.     move.l    (a1),a0
  200.     move.l    a0,4(a2)
  201.     move.l    a2,(a0)
  202.     move.l    a2,(a1)
  203.     lea    bobc_SIZE(a2),a2    ; create next Bob node
  204.     dbf    d7,rotbobs_loop
  205.  
  206.     moveq    #NUMOBS-1,d7        ; Bob counter
  207.     move.w    #(DEPTH*VBHEIGHT)<<6|(VBWIDTH+16)>>4,d6  ; d6 = BLTSIZE
  208.     moveq    #15,d5            ; d5 = shift mask
  209.     move.l    #%111111001010,d4    ; d4 Use ABCD  Minterm: ABC|ABc|aBC|abC
  210.     lea    vballimg,a0                ; a0 = image pointer
  211.     lea    (VBWIDTH>>3)*VBHEIGHT*DEPTH(a0),a1  ; a1 = mask pointer
  212.     move.l    (a3),d2         ; d2 = first Bob node
  213.     lea    yoffsets(a4),a3     ; a3 = offset table for y-coords
  214.     move.l    workBitmap(a4),a5    ; a5 = bitmap pointer
  215.     moveq    #-1,d0
  216.     clr.w    d0            ; BLTAFWM/BLTALWM = $ffff0000
  217.     move.l    #(-2<<16)|((WIDTH-VBWIDTH-16)>>3),d1  ; Bob / Bitmap modulos
  218.     WAITBLIT
  219.     move.l    d0,BLTAFWM(a6)
  220.     move.l    d1,BLTAMOD(a6)        ; A and D modulo
  221.     swap    d1
  222.     move.l    d1,BLTCMOD(a6)        ; C and B modulo
  223. blit_loop:
  224.     move.l    d2,a2
  225.     move.l    bobc_next(a2),d2    ; next Bob node
  226.     movem.w bobc_x(a2),d0-d1    ; d0 = x, d1 = y
  227.     add.w    d1,d1
  228.     move.w    (a3,d1.w),d1        ; fetch line-offset
  229.     lea    (a5,d1.w),a2
  230.     move.w    d0,d1
  231.     lsr.w    #4,d0            ; + 2*(x/16)
  232.     add.w    d0,d0
  233.     add.w    d0,a2            ; -> a2 destination pointer
  234.     and.w    d5,d1            ; x & 15
  235.     ror.w    #4,d1            ; A/B shift (moved to bit 15-12)
  236.     move.l    d4,d0
  237.     or.w    d1,d0
  238.     swap    d0
  239.     move.w    d1,d0            ; d0 = BLTCON0 | BLTCON1
  240.     WAITBLIT
  241.     move.l    a0,BLTBPT(a6)        ; B = Image
  242.     move.l    a1,BLTAPT(a6)        ; A = Mask
  243.     move.l    a2,BLTCPT(a6)        ; C,D = Destination
  244.     move.l    a2,BLTDPT(a6)
  245.     move.l    d0,BLTCON0(a6)
  246.     move.w    d6,BLTSIZE(a6)        ; blit it!
  247.     dbf    d7,blit_loop
  248.  
  249.     move.w    #(SINTABVALS-1)<<1,d2    ; change rotation angles
  250.     movem.w alpha(a4),d0-d1     ; d0 = alpha, d1 = beta
  251.     addq.w    #2,d0
  252.     and.w    d2,d0
  253.     addq.w    #4,d1
  254.     and.w    d2,d1
  255.     movem.w d0-d1,alpha(a4)
  256.     rts
  257.  
  258.  
  259. initCopperLists:
  260.     move.w    #$0020,BEAMCON0(a6)    ; enable PAL-display (to get more time)
  261.     lea    clist1,a0
  262.     lea    dispmem1,a1
  263.     move.l    a1,workBitmap(a4)    ; work with Bitmap #1 first
  264.     movem.l a0-a1,DblBufInfo+dblbuf_CList(a4)  ; save CList and Bitmap poin-
  265.     bsr.s    initCList$               ;  ters for double buffering
  266.     lea    clist2,a0
  267.     lea    dispmem2,a1
  268.     move.l    a0,COP1LC(a6)        ; use copper list #2 first
  269.     tst.w    COPJMP1(a6)
  270.     movem.l a0-a1,DblBufInfo+dblbuf_SIZE+dblbuf_CList(a4)
  271. initCList$:
  272.     move.l    #INTREQ<<16|INTF_COPER,(a0)+ ; reset copper interrupt flag
  273.     move.w    #WIDTH,d0
  274.     move.w    #DISPHEIGHT,d1
  275.     move.w    #HSTART,d2
  276.     moveq    #VSTART,d3
  277.     moveq    #%1000|DEPTH,d4     ; Interleaved bitplanes!
  278.     bsr    demoStdView
  279.     lea    NrmColors(pc),a1
  280.     moveq    #16,d0
  281.     bsr    demoColors        ; init all 16 colors at top of frame
  282.     COPWAIT VSTART+MIRRSTART
  283.     move.l    #COLOR00<<16|$313,(a0)+ ; purple mirror surface
  284.     COPWAIT VSTART+MIRRSTART+29
  285.     lea    MirrColors(pc),a1
  286.     moveq    #14,d0
  287.     bsr    demoColors        ; reflected colors
  288.     COPWAIT VSTART+MIRRSTART+30
  289.     move.l    #(BPL1MOD<<16)|(((-2*DEPTH-1)*BPR)&$ffff),(a0)+ ; mirror effect
  290.     move.l    #(BPL2MOD<<16)|(((-2*DEPTH-1)*BPR)&$ffff),(a0)+
  291.     COPWAIT VSTART+DISPHEIGHT
  292.     move.l    #INTREQ<<16|$8000|INTF_COPER,(a0)+ ; invoke copper interrupt
  293.     COPEND                       ;  at end of display
  294.     rts
  295.  
  296.  
  297. make_ytable:                ; calculate an offset for any
  298.     lea    yoffsets(a4),a0     ;  y-coordinate
  299.     moveq    #0,d0
  300.     move.w    #HEIGHT-1,d1
  301. 1$:    move.w    d0,(a0)+
  302.     add.w    #BPR*DEPTH,d0
  303.     dbf    d1,1$
  304.     rts
  305.  
  306.  
  307. NrmColors:                ; normal Demo colors
  308.     dc.w    $000,$aad,$ddf,$88c,$66a,$459,$337,$226
  309.     dc.w    $114,$b8a,$a78,$857,$745,$534,$c22,$114
  310.  
  311. MirrColors:                ; Mirror colors
  312.     dc.w    $313,$988,$988,$869,$758,$646,$435,$324
  313.     dc.w    $114,$756,$645,$534,$423,$423
  314.  
  315.  
  316. vballcoords:                ; object coordinates
  317.     dc.w    -$b0,-$20,-$a0,-$20,-$90,-$10,-$b0,-$10         ;'P'(8)
  318.     dc.w    -$a0,0,-$b0,0,-$b0,$10,-$b0,$20
  319.     dc.w    -$70,-$20,-$70,-$10,-$70,0,-$70,$10,-$70,$20        ;'H'(11)
  320.     dc.w    -$60,0,-$50,-$20,-$50,-$10,-$50,0,-$50,$10,-$50,$20
  321.     dc.w    -$30,-$20,-$30,-$10,-$20,0,-$30,$10,-$30,$20        ;'X'(9)
  322.     dc.w    -$10,-$20,-$10,-$10,-$10,$10,-$10,$20
  323.     dc.w    $20,-$20,$10,-$10,$10,0,$10,$10,$10,$20         ;'A'(10)
  324.     dc.w    $20,0,$30,-$10,$30,0,$30,$10,$30,$20
  325.     dc.w    $70,-$20,$60,-$20,$50,-$10,$60,0            ;'S'(7)
  326.     dc.w    $70,$10,$60,$20,$50,$20
  327.     dc.w    $b0,-$20,$a0,-$20,$90,-$10,$a0,0            ;'S'(7)
  328.     dc.w    $b0,$10,$a0,$20,$90,$20
  329.  
  330.  
  331. SinCosTab:                ; Sine and Cosine table
  332. twopi    equ.d    6.2831853072
  333. ang    set.d    0
  334.     rept    SINTABVALS+SINTABVALS/4
  335. sinval    int    sin(ang)*32767
  336.     dc.w    sinval
  337. ang    set.d    ang+twopi/SINTABVALS
  338.     endr
  339.  
  340.  
  341.  
  342.  
  343.     section "__MERGED",bss
  344.  
  345. boblist:                ; (uninitialized) MinList for
  346.     ds.l    3            ;  depth-sorted Bob Nodes
  347. bobnodes:
  348.     ds.b    NUMOBS*bobc_SIZE    ; all Bob Nodes containing 3d coords
  349. alpha:
  350.     ds.w    1            ; rotation about x-axis
  351. beta:
  352.     ds.w    1            ; rotation about y-axis
  353. yoffsets:
  354.     ds.w    HEIGHT            ; Offset table for any y-coordinate
  355.  
  356. DblBufInfo:
  357.     ds.l    2*dblbuf_SIZE        ; copper list and bitmap pointers
  358. workBitmap:
  359.     ds.l    1            ; current Bitmap for drawing objects
  360. toggle:
  361.     ds.w    1            ; toggle switch for double buffering
  362.  
  363.  
  364.  
  365.  
  366.     section "VBallImage",data,chip
  367.  
  368. vballimg:                ; Ball image, interleaved
  369.     incbin    "VBallImage.ilvd"    ; size: 16x16x4 (mask appended)
  370.  
  371.  
  372.  
  373.  
  374.     section "CopperLists",bss,chip
  375.  
  376. clist1:
  377.     ds.l    2*DEPTH     ; BPLxPT
  378.     ds.l    7        ; BPLxMOD,DIWSTRT/STOP,DDFSTRT/STOP,BPLCON0
  379.     ds.l    1<<DEPTH    ; COLORxx
  380.     ds.l    28        ; mirror colors, mirror effect, etc. - some
  381.                 ;  extra longwords included :-)
  382.  
  383. clist2:
  384.     ds.l    2*DEPTH
  385.     ds.l    7
  386.     ds.l    1<<DEPTH
  387.     ds.l    28
  388.  
  389.  
  390.  
  391.  
  392.     section "DisplayMem_1",bss,chip
  393.  
  394. dispmem1:
  395.     ds.b    BPR*HEIGHT*DEPTH
  396.  
  397.  
  398.  
  399.  
  400.     section "DisplayMem_2",bss,chip
  401.  
  402. dispmem2:
  403.     ds.b    BPR*HEIGHT*DEPTH
  404.  
  405.  
  406.     end
  407.