A C64 example in assembly that moves a sprite up/down/left/right
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;************************************************* | |
;* Create and move a simple sprite x,y * | |
;************************************************* | |
processor 6502 | |
org $1000 | |
;helpful labels | |
CLEAR = $E544 | |
GETIN = $FFE4 | |
SCNKEY = $FF9F | |
ENTER = $C202 | |
MOVE = $C203 | |
;sprite 0 setup | |
SPRITE0 = $7F8 | |
COLOR0 = $D027 | |
SP0X = $D000 | |
SP0Y = $D001 | |
MSBX = $D010 | |
SP0VAL = $0340 | |
ENABLE = $D015 | |
YEXPAND = $D017 | |
XEXPAND = $D01D | |
JSR CLEAR | |
LDA #13 | |
STA ENTER | |
LDA #$0D ;using block 13 for sprite0 | |
STA SPRITE0 | |
LDA #01 ;enable sprite0 | |
STA ENABLE | |
LDA #02 ;use red for sprite0 | |
STA COLOR0 | |
LDX #0 | |
LDA #0 | |
;reset the spriteval data | |
CLEANUP STA SP0VAL,X | |
INX | |
CPX #63 | |
BNE CLEANUP | |
;build the sprite | |
LDX #0 | |
BUILD LDA DATA,X | |
STA SP0VAL,X | |
INX | |
CPX #63 | |
BNE BUILD | |
;position | |
LDA #0 ;stick with x0-255 | |
STA MSBX | |
;starting sprite location | |
LDX #100 | |
LDY #70 | |
STX SP0X | |
STY SP0Y | |
SCAN JSR SCNKEY ;get key | |
JSR GETIN ;put key in A | |
START CMP #87 ;W - up | |
BEQ UP | |
CMP #83 ;S - down | |
BEQ DOWN | |
CMP #65 ;A - left | |
BEQ LEFT | |
CMP #68 ;D - right | |
BEQ RIGHT | |
CMP ENTER ;end if enter clicked | |
BEQ END | |
JMP SCAN | |
UP LDY SP0Y | |
DEY | |
STY SP0Y | |
JMP SCAN | |
DOWN LDY SP0Y | |
INY | |
STY SP0Y | |
JMP SCAN | |
LEFT LDX SP0X | |
DEX | |
STX SP0X | |
CPX #255 | |
BNE SCAN | |
LDA #0 | |
STA MSBX | |
JMP SCAN | |
RIGHT LDX SP0X | |
INX | |
STX SP0X | |
CPX #255 | |
BNE SCAN | |
LDA #1 | |
STA MSBX | |
JMP SCAN | |
;clean up at the end | |
END JSR CLEAR | |
LDA #0 | |
STA ENABLE | |
RTS | |
;define the sprite | |
DATA .BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.BYTE 255,255,255 | |
.END | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi i found this examble really helpful thanks very much. I have added a version which works in CBM just a few tweaks to work in that otherwise its unchanged. :)
;*************************************************
;* Create and move a simple sprite x,y *
;*************************************************
*=$c000
;helpful labels
CLEAR = $E544
GETIN = $FFE4
SCNKEY = $FF9F
ENTER = $C202
MOVE = $C203
;sprite 0 setup
SPRITE0 = $7F8
COLOR0 = $D027
SP0X = $D000
SP0Y = $D001
MSBX = $D010
SP0VAL = $0340
ENABLE = $D015
YEXPAND = $D017
XEXPAND = $D01D
CLEANUP STA SP0VAL,X
INX
CPX #63
BNE CLEANUP
BUILD LDA DATA,X
STA SP0VAL,X
INX
CPX #63
BNE BUILD
SCAN JSR SCNKEY ;get key
JSR GETIN ;put key in A
START CMP #87 ;W - up
BEQ UP
UP LDY SP0Y
DEY
STY SP0Y
JMP SCAN
DOWN LDY SP0Y
INY
STY SP0Y
JMP SCAN
LEFT LDX SP0X
DEX
STX SP0X
CPX #255
BNE SCAN
LDA #0
STA MSBX
JMP SCAN
RIGHT LDX SP0X
INX
STX SP0X
CPX #255
BNE SCAN
LDA #1
STA MSBX
JMP SCAN
END JSR CLEAR
LDA #0
STA ENABLE
RTS
DATA BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255
BYTE 255,255,255