home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v1.2
/
amidev_cd_12.iso
/
reference_library
/
hardware
/
hard_examples
/
sprite_move.asm
< prev
Wrap
Assembly Source File
|
1992-08-20
|
3KB
|
56 lines
;
; sprite_move.asm
;
; In this example of moving a sprite, the spaceship is bounced around
; on the screen, changing direction whenever it reaches an edge.
;
; The sprite position data, containing VSTART and HSTART, lives in
; memory at $25000. VSTOP is located at $25002. You write to these
; locations to move the sprite. Once during each frame, VSTART is
; incremented (or decremented) by 1 and HSTART by 2. Then a new VSTOP
; is calculated, which will be the new VSTART + 6.
;
MOVE.B #151,d0 ;Initialize horizontal count
MOVE.B #194,d1 ;Initialize vertical count
MOVE.B #64,d2 ;Initialize horizontal position
MOVE.B #44,d3 ;Initialize vertical position
MOVE.B #1,d4 ;Initialize horizontal increment value
MOVE.B #1,d5 ;Initialize vertical increment value
;
;Here we wait for the start of the screen updating.
;This ensures a glitch-free display.
;
LEA CUSTOM,a0 ;Set custom chip base pointer
VLOOP:
MOVE.B VHPOSR(a0),d6 ;Read Vertical beam position.
;Only insert the following line if you are using a PAL machine.
; CMP.B #$20,d6 ;Compare with end of PAL screen.
BNE.S VLOOP ;Loop if not end of screen.
;Alternatively you can use the following code:
;VLOOP:
; MOVE.W INTREQR(a0),d6 ;Read interrupt request word
; AND.W #$0020,d6 ;Mask off all but vertical blank bit
; BEQ VLOOP ;Loop until bit is a 1
; MOVE.W #$0020,INTREQ(a0) ;Vertical bit is on, so reset it
;
;Please note that this will only work if you have turned OFF the Vertical
;blanking interrupt enable (not recommended for long periods).
ADD.B d4,d2 ;Increment horizontal value
SUBQ.B #1,d0 ;Decrement horizontal counter
BNE L1
MOVE.B #151,d0 ;Count exhausted, reset to 151
EOR.B #$FE,d4 ;Negate the increment value
L1: MOVE.B d2,$25001 ;Write new HSTART value to sprite
ADD.B d5,d3 ;Increment vertical value
SUBQ.B #1,d1 ;Decrement vertical counter
BNE L2
MOVE.B #194,d1 ;Count exhausted, reset to 194
EOR.B #$FE,d5 ;Negate the increment value
L2: MOVE.B d3,$25000 ;Write new VSTART value to sprite
MOVE.B d3,d6 ;Must now calculate new VSTOP
ADD.B #6,d6 ;VSTOP always VSTART+6 for spaceship
MOVE.B d6,$25002 ;Write new VSTOP to sprite
BRA VLOOP ;Loop forever