home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games 1995 January / amigagames-1995-01.iso / archive / spiele / publicdomain / sk003.dms / sk003.adf / src / tetrisblit.s < prev    next >
Text File  |  2001-01-01  |  12KB  |  474 lines

  1. ;-----------------------------------------------------------------------------
  2. ; Tetris © Copyright 1990 Software Alchemy All Rights Reserved, V0.1 28-Dec-89
  3. ; Code generated by Transform © 1990 Software Alchemy All Rights Reserved
  4. ;-----------------------------------------------------------------------------
  5.     include    'tetris.i'
  6.  
  7. ;    Tetris renders to 5 bitplanes with one blit, the screen format is
  8. ;    "interleaved" to support this.  Andreas Hommel was the first person
  9. ;    to think of this idea (CMON, GAUNTLET).  S0ren Gronbech told me of
  10. ;    of rumors to that effect (he did SWORD OF SODAN, DATASTORM ect).
  11. ;    Interleaved bitplanes are a very common concept however, the hacker
  12. ;    intro to BackLash uses them for example, and thats 1987 technology.
  13.  
  14. ;
  15. ;    Generate Mulu Table for rest of blits to rely upon
  16. ;
  17. MakeMulu110
  18.     lea    Mulu110(pc),a0
  19.     moveq    #0,d0
  20. 1$    move.w    d0,(a0)+
  21.     add.w    #110*8,d0
  22.     cmp.w    #110*8*30,d0
  23.     bne.s    1$
  24.  
  25.     lea    Mulu44(pc),a0
  26.     moveq    #0,d0
  27. 2$    move.w    d0,(a0)+
  28.     add.w    #44,d0
  29.     cmp.w    #44*30,d0
  30.     bne.s    2$
  31.     rts
  32.  
  33. Mulu110            dcb.w    30,0
  34. Mulu44            dcb.w    30,0
  35.  
  36. ;
  37. ;    Draw a tetris tile to screen, with damage repair and teats.
  38. ;
  39. DrawBlock
  40.  
  41.     moveq    #0,d1
  42.     move.w    d1,d0
  43.     move.b    BlockPos(a4),d1            ; D1 = Byte X
  44.     move.b    BlockPos+2(a4),d0         ; D0 = Byte Y (0-30)
  45.  
  46. DrawBlockAt
  47.  
  48.     add.w    d0,d0                ; Y * 2
  49.  
  50.     lea    TetrisByteMap(pc),a2
  51.     add.w    Mulu44(pc,d0.w),a2
  52.     add.w    d1,a2                ; a2 = Current ByteMap Pos
  53.  
  54.     move.l    GameVideo2(pc),a0        ; A0 = Half-Screen
  55.     lea    Mulu110(pc),a1
  56.     add.w    (a1,d0.w),a0            ; + Y * 110*8  (add 1/2)
  57.  
  58.     add.l    a0,a0                ; A0 = Raw Screen sans X
  59.     add.w    d1,a0                ; Add X Pos
  60.     ror.w    #1,d1                ; D1 = Pixel Shift
  61.  
  62. ;
  63. ; Repair damaged backdrop if any prior to next render (if any)
  64. ;
  65.     lea    BlitWorkSpace(a4),a1        ; A1 = Source/Dest of Damage
  66.     move.l    BlitRepairAddress(a4),d0    ; D0 = Blit Repair Info
  67.     beq.s    BlitSave            ; (No Damage)
  68. BlitRepair
  69.     btst    #14-8,$02(a6)            ; 680x0 stuff, force read ACK
  70. 1$    btst    #14-8,$02(a6)            ; Wait for Blitter
  71.     bne.s    1$
  72.     move.l    d0,$54(a6)            ; D0 = Old Place to repair
  73.     move.l    a1,$48(a6)            ; A1 = Source, Damage Buffer
  74.     move.w    #44-6,$66(a6)            ; Dest Mod
  75.     move.w    #0,$60(a6)            ; Source Mod
  76.     move.l    #$03aa0000,$40(a6)        ; D = C
  77.     move.w    #64*5*34+3,$58(a6)        ; Do 3 words by 34 lines
  78.  
  79. ;
  80. ; Copy a hunk of object size for damage repair, d0 = source or dest
  81. ;
  82. BlitSave
  83.     move.l    a0,BlitRepairAddress(a4)    ; Will Undo to here next pass
  84.     btst    #14-8,$02(a6)            ; 680x0 stuff, force read ACK
  85. 1$    btst    #14-8,$02(a6)            ; Wait for Blitter
  86.     bne.s    1$
  87.     move.l    a0,$48(a6)            ; A0 = Source (C) Damage Save
  88.     move.l    a1,$54(a6)            ; DEST
  89.     move.w    #44-6,$60(a6)            ; SRC Modulo (DMA C)
  90.     move.w    #0,$66(a6)            ; Dest Modulo
  91.     move.l    #$03aa0000,$40(a6)        ; Minterm is D = C
  92.     move.w    #64*5*34+3,$58(a6)        ; Do 3 words by 34 lines
  93.  
  94. ;
  95. ; Get a Tetris Piece detailed TileMap in (a2)
  96. ;
  97. GetPiece
  98.     move.w    BlockID(a4),d2            ; D2 = Pointer to Tile # * 2
  99.     lsl.w    #3,d2                ; (2>>3) = 16
  100.     lea    TetrisDetails(pc),a1
  101.     lea    (a1,d2.w),a1            ; A1 = Detailed TileMap
  102.  
  103.     add.w    #2*220,a0            ; Room for Teat
  104.  
  105. DrawLoop
  106. ;
  107. ; Loop thru all pieces of TileMap and render them...
  108. ;
  109.     moveq    #4-1,d7                ; D7 = Vertical
  110. 1$    moveq    #4-1,d6                ; D6 = Horizontal
  111. 2$
  112.     moveq    #0,d0                ; (clean)
  113.     move.b    (a1)+,d0            ; D0 = Data
  114.     beq.s    3$                ; Don't draw where nothing
  115.     mulu    #2*5*8,d0
  116.     add.l    PiecesMem(pc),d0
  117.     bsr    ContinueDraw            ; Draw next piece...
  118. ;
  119. ; Render a teat here only if non-incident with tile or backdrop
  120. ;
  121.  
  122.     tst.b    -44(a2)                ; Allowable on bytemap?
  123.     bne.s    3$
  124.     tst.b    -4-1(a1)            ; Allowable on tile?
  125.     bne.s    3$
  126.     moveq    #0,d0
  127.     move.b    -1(a1),d0
  128.     or.b    #7,d0                ; Get to teat data
  129.     mulu    #2*5*8,d0
  130.     add.l    PiecesMem(pc),d0
  131.     sub.w    #8*220,a0            ; (backup for teat)
  132.     bsr    ContinueDraw            ; Add the teat
  133.     add.w    #8*220,a0
  134. 3$
  135.  
  136. ;
  137. ; Get to Next Horizontal raw-write and bytemap position
  138. ;
  139.     add.w    #$8000,d1            ; Pixel Shift >>
  140.     add.w    #1,a0                ; Next Byte Also >>
  141.     lea    1(a2),a2            ; Next HLine of ByteMap
  142.     dbf    d6,2$                ; End horizontal loop
  143. ;
  144. ; Get to next Vertical raw-write and bytemap position
  145. ;
  146.     add.w    #8*220-4,a0            ; Next VLine of RAW
  147.     lea    44-4(a2),a2            ; Next VLine of ByteMap
  148.     dbf    d7,1$                ; End vertical loop
  149.     rts
  150.  
  151.  
  152.  
  153. ;
  154. ;    Draw one line of tetris bytemap to screen with teats
  155. ;    Supply Y Line #
  156. ;
  157. DrawLine
  158.                         ; D0.w = Y on ByteMap
  159.     move.w    PlayerArea2+2(a4),d1        ; D1.w = X on ByteMap
  160.     lea    TetrisByteMap(pc),a2
  161.     add.w    PlayerArea(a4),a2        ; + Active Zone
  162.     lea    Mulu44(pc),a1
  163.     add.w    d0,d0                ; Y * 2 (index)
  164.     add.w    (a1,d0.w),a2            ; + Y
  165.                         ; a2 = Current ByteMap Pos
  166.  
  167.     add.w    #1,a2                ; Don't draw left wall
  168.     add.w    #1,d1                ; Don't draw left wall
  169.     add.w    PlayerArea2(a4),d0        ; Add Raw Vertical Offset
  170.     add.w    PlayerArea2(a4),d0
  171.  
  172.     move.l    GameVideo2(pc),a0        ; A0 = Half-Screen
  173.     lea    Mulu110(pc),a1
  174.     add.w    (a1,d0.w),a0            ; + Y * 110*8  (add 1/2)
  175.     add.l    a0,a0                ; A0 = Raw Screen sans X
  176.     add.w    d1,a0                ; Add X Pos
  177.     ror.w    #1,d1                ; D1 = Pixel Shift
  178.  
  179.     add.w    #2*220,a0            ; Room for Teat
  180.  
  181.     moveq    #RECT_X-1,d2            ; D2 = Horizontal
  182. 2$    moveq    #0,d0                ; (clean)
  183.     move.b    (a2)+,d0            ; D0 = Data
  184.                         ; (Do Draw where nothing)
  185.     mulu    #2*5*8,d0
  186.     add.l    PiecesMem(pc),d0
  187.     bsr    ContinueDraw            ; Draw next piece...
  188.  
  189.     tst.b    -1(a2)                ; Anything here?
  190.     beq.s    3$
  191.     tst.b    -44-1(a2)            ; Allowable on bytemap?
  192.     bne.s    3$
  193.     moveq    #0,d0
  194.     move.b    -1(a2),d0
  195.     or.b    #7,d0                ; Get to teat data
  196.     mulu    #2*5*8,d0
  197.     add.l    PiecesMem(pc),d0
  198.     sub.w    #8*220,a0            ; (backup for teat)
  199.     bsr    ContinueDraw            ; Add the teat
  200.     add.w    #8*220,a0
  201. 3$    add.w    #$8000,d1            ; In pixel blitter shift
  202.     add.w    #1,a0
  203.     dbf    d2,2$                ; End horizontal loop
  204.     rts
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. ;
  212. ;    Draw one element, part of a tile, to screen
  213. ;    Supply X,Y Byte Positions in D1,D0
  214. ;    Object to draw is in D2.w
  215. ;
  216. DrawOne
  217.                         ; D0.w = Y on ByteMap
  218.                         ; D1.w = X on ByteMap
  219.     lea    TetrisByteMap(pc),a2
  220.     add.w    d1,a2                ; + X
  221.     lea    Mulu44(pc),a1
  222.     add.w    d0,d0                ; Y * 2 (index)
  223.     add.w    (a1,d0.w),a2            ; + Y
  224.  
  225.                         ; a2 = Current ByteMap Pos
  226.     and.w    #$00ff,d2
  227.     move.b    d2,(a2)                ; Store Element
  228.  
  229.     move.l    GameVideo2(pc),a0        ; A0 = Half-Screen
  230.     lea    Mulu110(pc),a1
  231.     add.w    (a1,d0.w),a0            ; + Y * 110*8  (add 1/2)
  232.     add.l    a0,a0                ; A0 = Raw Screen sans X
  233.     add.w    d1,a0                ; Add X Pos
  234.     ror.w    #1,d1                ; D1 = Pixel Shift
  235.  
  236.     add.w    #2*220,a0            ; Room for Teat
  237.  
  238.     move.w    d2,d0
  239.     ext.l    d0                ; (clean)
  240.     mulu    #2*5*8,d0
  241.     add.l    PiecesMem(pc),d0
  242.     bsr    ContinueDraw            ; Draw next piece...
  243.  
  244.     tst.b    -44(a2)                ; Put Teat above?
  245.     bne.s    2$
  246.     move.w    d2,d0
  247.     beq.s    2$
  248.     sub.w    #8*220,a0            ; (backup for teat if !0)
  249.     or.b    #7,d0                ; Get to teat data
  250.     ext.l    d0                ; (clean)
  251.     mulu    #2*5*8,d0
  252.     add.l    PiecesMem(pc),d0
  253.     bra    ContinueDraw            ; Add the teat
  254. 2$    rts
  255.  
  256. ; Note that the Blitter always uses Post-Increment and Post-Decrement
  257. ; irregardless of if you are using it backwards or forwards.  Luckily
  258. ; however it does shift in reverse, and that is why I am using a backwards
  259. ; blit in this example:
  260.  
  261. DrawScroller
  262.     move.l    GameVideo(pc),a0
  263.     add.l    #232*44*5-2,a0
  264.     btst    #14-8,$02(a6)
  265. 1$    btst    #14-8,$02(a6)
  266.     bne.s    1$
  267.     move.l    #$ffffffff,$44(a6)
  268.     move.l    a0,$50(a6)
  269.     move.l    a0,$54(a6)
  270.     move.l    #0,$64(a6)
  271.     move.l    #$89f00002,$40(a6)        ; Backwards mode on
  272.     move.w    #64*5*80+22,$58(a6)
  273.     rts
  274.  
  275. DrawScrollBit
  276.     move.l    GameVideo2(pc),a0        ; A0 = Half-Screen
  277.     lea    Mulu110(pc),a1
  278.     add.w    d0,d0
  279.     add.w    (a1,d0.w),a0            ; + Y * 110*8  (add 1/2)
  280.     add.l    a0,a0                ; A0 = Raw Screen sans X
  281.     add.w    d1,a0                ; Add X Pos
  282.     ror.w    #1,d1                ; D1 = Pixel Shift
  283.     add.w    #2*220,a0            ; Room for Teat
  284.     move.w    d2,d0
  285.     ext.l    d0                ; (clean)
  286.     mulu    #2*5*8,d0
  287.     add.l    PiecesMem(pc),d0
  288.     bra    ContinueDraw
  289.  
  290. DrawScrollClear
  291.     move.l    GameVideo(pc),a0
  292.     add.l    #232*44*5-2,a0
  293.     btst    #14-8,$02(a6)            ; Erase Right Hand Side
  294. 2$    btst    #14-8,$02(a6)
  295.     bne.s    2$
  296.     move.l    a0,$54(a6)
  297.     move.w    #44-2,$66(a6)
  298.     move.l    #$01000002,$40(a6)        ; (backwards also)
  299.     move.w    #64*5*80+1,$58(a6)
  300.     rts
  301.  
  302.  
  303. ;
  304. ; Draw a block anywhere (Renders to all 5 planes with one blit)
  305. ;
  306. ContinueDraw
  307.                         ; A0 = Raw Dest
  308.                         ; D0 = Raw Source
  309.                         ; D1 = 16 bit Pixel Shift
  310.  
  311.     btst    #14-8,$02(a6)            ; 680x0 stuff, force read ACK
  312. 1$    btst    #14-8,$02(a6)            ; Wait for Blitter
  313.     bne.s    1$
  314.     move.l    a0,$54(a6)            ; DEST
  315.     move.l    a0,$48(a6)            ; DEST READ (DMA CHANNEL C)
  316.     move.l    d0,$4c(a6)            ; source grafix
  317.     and.w    #$f000,d1            ; (clean)
  318.     move.w    d1,$42(a6)            ; SOURCE Shift (DMA B)
  319.     or.w    #$07ca,d1            ; Minterm = Cookie, A is OFF
  320.     move.w    d1,$40(a6)            ; MASK Shifts also (DMA A)
  321.  
  322.                 ; (these can be moved for optimization)
  323.     move.l    #$ffff0000,$44(a6)        ; A MASK (Occurs before A*B)
  324.     move.w    #$ff00,$74(a6)            ; Source A (acts as mask on B)
  325.     move.w    #-2,$64(a6)            ; Src Modulo undoes over-blit
  326.     move.w    #-2,$62(a6)
  327.     move.w    #44-2-2,$60(a6)            ; Dest Mod gets next bitplane
  328.     move.w    #44-2-2,$66(a6)
  329.  
  330.     move.w    #64*5*8+2,$58(a6)        ; Trigger 5 PLANE BLIT.
  331.     rts
  332.  
  333.  
  334.  
  335.  
  336. Erase
  337.     move.l    GameVideo2(pc),a0        ; A0 = Half-Screen
  338.     lea    Mulu110(pc),a1
  339.     add.w    d0,d0                ; Y * 2
  340.     add.w    (a1,d0.w),a0            ; + Y * 110*8  (add 1/2)
  341.  
  342.     add.l    a0,a0                ; A0 = Raw Screen sans X
  343.     add.w    d1,a0                ; Add X Pos
  344.  
  345.     btst    #14-8,$02(a6)
  346. 1$    btst    #14-8,$02(a6)
  347.     bne.s    1$
  348.     move.l    a0,$54(a6)
  349.     move.w    #44-6,$66(a6)
  350.     move.l    #$01000000,$40(a6)
  351.     move.w    #64*5*34+3,$58(a6)
  352.     rts
  353.  
  354.  
  355. ;
  356. ;    Raisers needs a faster redraw, and one that doesn't collide with tile
  357. ;    being moved by player.
  358. ;
  359. RaisersDraw
  360.     sub.l    #8*220,BlitRepairAddress(a4)    ; hack, move up repair also
  361.  
  362.     move.w    PlayerArea2(a4),d0
  363.     move.w    PlayerArea2+2(a4),d1
  364.     addq.w    #1,d0                ; Y++
  365.     move.l    GameVideo2(pc),a0        ; A0 = Half-Screen
  366.     lea    Mulu110(pc),a1
  367.     add.w    d0,d0
  368.     add.w    (a1,d0.w),a0            ; + Y * 110*8  (add 1/2)
  369.     add.l    a0,a0                ; A0 = Raw Screen sans X
  370.     add.w    d1,a0                ; Add X Pos
  371.     move.l    a0,a1
  372.     add.w    #16*220,a0
  373.     add.w    #8*220,a1
  374.  
  375.     btst    #14-8,$02(a6)            ; 680x0 stuff, force read ACK
  376. 1$    btst    #14-8,$02(a6)            ; Wait for Blitter
  377.     bne.s    1$
  378.     move.l    a0,$50(a6)
  379.     move.l    a1,$54(a6)
  380.     move.l    #$ffffffff,$44(a6)        ; A MASK (Occurs before A*B)
  381.     move.w    #44-RECT_X-2,$64(a6)
  382.     move.w    #44-RECT_X-2,$66(a6)
  383.     move.l    #$09f00000,$40(a6)
  384.     move.w    #(RECT_Y*8+2-8-8-8)*5*64+RECT_X/2+1,$58(a6)
  385.     rts
  386.  
  387. ;
  388. ;    Each tetris object is made up of small pieces.  Tetris
  389. ;    has all the pieces in one color internally.  The pieces
  390. ;    must be "unpacked" into 8 colors
  391. ;
  392. ;    There are 8 slots for pieces and
  393. ;    there are 4 rotations per piece and 8 colors per rotation
  394. ;    8*8*4 makes exactly 256 possible pieces (index 1).
  395. ;
  396. ;    Pieces are stored in a non-interleaved bitplane format 3 planes deep
  397. ;    and there are 8*4 pieces total
  398. ;
  399. ;    Pieces end up in interleaved bitplane format 5 planes deep
  400. ;
  401. ;    Pieces are one byte at source
  402. ;    Pieces are 8 tall
  403. ;
  404.  
  405. DataSize equ 5*2*8                ; Depth*Width*Heigth
  406. BankEls  equ 8*4                ; (pieces * rotations)
  407.  
  408. UnpackPieces
  409.     moveq    #7-1,d2                ; D2 = Merge Generated Colors
  410. 1$    bsr    UnpackBank            ; Do next color...
  411.     dbf    d2,1$
  412.     rts
  413.  
  414.  
  415. UnpackBank
  416.     move.l    PiecesMem(pc),a2        ; A2 = Base of Dest
  417.     move.l    d2,d3                ; Color #?
  418.     mulu    #BankEls*DataSize,d3        ; Get Appropriate Color Bank
  419.     add.w    d3,a2                ; A2 = Color Bank of pieces
  420.  
  421.     moveq    #0,d5                ; D5 = Counter (and Index)
  422. 0$
  423.     lea    PiecesSource(pc),a0
  424.     move.l    d5,d0
  425.     lsl.w    #3,d0                ; Graphic #
  426.     add.w    d0,a0
  427.     moveq    #8-1,d4                ; D4 = Do One Object
  428. 1$    move.b    (a0)+,(a2)+            ; Copy Black and White Info
  429.     move.b    #0,(a2)+
  430.     move.b    256-1(a0),(a2)+            ; (next plane)
  431.     move.b    #0,(a2)+
  432.     moveq    #0,d0
  433.     move.b    512-1(a0),d0            ; D0 = Color Info
  434.     lsl.w    #8,d0                ; (force up)
  435.     bsr    UnpackPiece
  436.     lea    6(a2),a2            ; Skip to next set of planes
  437.     dbf    d4,1$
  438.     add.w    #1,d5
  439.     cmp.w    #BankEls,d5
  440.     bne.s    0$
  441.     rts
  442.  
  443.  
  444. UnpackPiece
  445.     clr.w    (a2)                ; pre clean
  446.     clr.w    2(a2)
  447.     clr.w    4(a2)
  448.     cmp.b    #0,d2                ; moronic stupidity
  449.     beq.s    zero
  450.     cmp.b    #1,d2
  451.     beq.s    one2
  452.     cmp.b    #2,d2
  453.     beq.s    two
  454.     cmp.b    #3,d2
  455.     beq.s    three
  456.     cmp.b    #4,d2
  457.     beq.s    four
  458.     cmp.b    #5,d2
  459.     beq.s    five
  460. six    move.w    d0,(a2)
  461. five    move.w    d0,2(a2)
  462. three    move.w    d0,4(a2)
  463.     rts
  464. zero    move.w    d0,(a2)
  465.     rts
  466. two    move.w    d0,(a2)
  467. one2    move.w    d0,2(a2)
  468.     rts
  469. four    move.w    d0,(a2)
  470.     move.w    d0,4(a2)
  471.     rts
  472.  
  473. ; end of tetrisblit.s
  474.