Yin and yang: Difference between revisions

m
→‎{{header|68000 Assembly}}: general clarification.
m (→‎{{header|68000 Assembly}}: removed unnecessary data blocks to reduce confusion)
m (→‎{{header|68000 Assembly}}: general clarification.)
Line 78:
=={{header|68000 Assembly}}==
{{works with|NEOGEO}}
The NEOGEO's hardware-supported sprite scaling helps a lot with this task. Each sprite has a shrink variable that is written to offset 0x8000 in video memory. A value of 0x0FFF is full-size, and the sprite gets smaller as the value decreases. (A sprite's tiles must be drawn in ROM at full size.)
This code uses the following macros:
<pre>
Line 92:
;the yin-yang is 8 sprites total, it is important that
;two different sprite objects do not overlap!
 
MOVE.W #$F800,D4 ;x position on screen
MOVE.W #$1000,D5 ;y position on screen
Line 114 ⟶ 115:
; D4 = Y POS
; D5 = X POS
; D7 = SHRINK FACTOR (SIZE PARAMETER)
; THESE VALUES ARE PASSED IN USING THE ABOVE REGISTERS
pushWord D0
ADD.W #$8000,D0 ;VRAM OFFSET FOR SPRITE 1
LEA YinYang_Data,A0 ;LOAD ADDRESS OF SPRITE METADATA
MOVE.B (A0)+,D2 ;SPRITE WIDTH - 8 SPRITES PER OBJECT
; (A NEOGEO SPRITE IS ALWAYS 1 TILE WIDE BUT CAN BE OF ARBITRARY HEIGHT)
MOVE.B (A0)+,D3 ;SPRITE HEIGHT
 
MOVE.B (A0)+,D3 ;SPRITE HEIGHT - 8 TILES PER SPRITE
AND.W #$00FF,D3 ;BYTE SANITIZE SPRITE HEIGHT
 
Line 127 ⟶ 131:
 
MOVE.W D0,$3C0000 ;SET SCB2DESTINATION ADDRESS OF SIZE PARAMETER
MOVE.W D7,$3C0002 ;SETWRITE SHRINKSIZE PARAMETER TO VRAM
;AUTO INCS TO $8201 WHICH IS WHERE Y POS MUST BE STORED.
Line 134 ⟶ 138:
MOVE.W D4,D1 ;GET Y POS
OR.W D3,D1 ;COMBINE WITH SPRITE HEIGHT,SINCE NEOGEO STORES THEM TOGETHER AS ONE UNIT.
MOVE.W D1,$3C0002 ;STORE IN SCB3VRAM
;AUTO INCS TO $8401 WHICH IS WHERE X POS MUST BE STORED.
MOVE.W D5,D1 ;GET X POS
MOVE.W D1,$3C0002 ;STORE IN SCB4VRAM
CMP.B #1,D2 ;IS THIS SPRITE EXACTLY ONE TILE WIDE?
CMP.B #1,D2
BEQ skipChainedOAM ;A 1-WIDE SPRITE NEEDS NO CHAINED SPRITES.
; IN THIS EXAMPLE THE YIN-YANGS ARE 8 TILES WIDE, THIS BRANCH IS NEVER TAKEN.
pushWord D2
SUBQ.B #2,D2 ;DBRAWE CORRECTIONNEED ANDTO SKIPLOOP ANCHOR(SPRITE_WIDTH-2) SPRITETIMES.
 
 
Line 152 ⟶ 157:
MOVE.W D0,$3C0000 ;SET VRAM DESTINATION.
MOVE.W D7,$3C0002 ;EACH STRIP HAS ITS OWN SHRINK VALUE.
MOVE.W #$0040,$3C0002 ;MARK THIS SPRITE AS CHAINED. CHAINED SPRITES MOVE AND SCALE AS ONE UNIT.
MOVE.W #$0000,$3C0002 ;DUMMY MOVE FOR PADDING.
DBRA D2,loop_generateChainedOAM
popWord D2
1,489

edits