RE-POST February: Lab 2
This post will be about an interesting mini-project and its implementation.
6502 Math and String
Criteria to be met
- Must
work in 6502
Emulator.
- Must
output to the character screen as well as the graphics screen.
- Must
accept user input from the keyboard.
- Must use
some arithmetic/math instructions.
Simple Game Chosen: Maze
- https://matrix.senecapolytechnic.ca/~chris.tyler/wiki/doku.php?id=spo600:6502_instructions
- https://matrix.senecapolytechnic.ca/~chris.tyler/wiki/doku.php?id=spo600:register
- http://www.6502.org/tutorials/6502opcodes.html
- https://www.masswerk.at/6502/6502_instruction_set.html
- https://matrix.senecapolytechnic.ca/~chris.tyler/wiki/doku.php?id=spo600:6502#registers
- https://matrix.senecapolytechnic.ca/~chris.tyler/wiki/doku.php?id=spo600:6502_addressing_modes
- https://matrix.senecapolytechnic.ca/~chris.tyler/wiki/doku.php?id=spo600:6502_jumps_branches_and_procedures
- https://matrix.senecapolytechnic.ca/~chris.tyler/wiki/doku.php?id=spo600:6502_math
define HEIGHT 8
define WIDTH 8
drawMaze:
lda #$21
sta POINT_MAZE_DRAWN_LOW
lda #$02
sta POINT_MAZE_DRAWN_HIGH
lda #$00
sta DRAW_MAZE
ldx #$00
ldy #$00
draw:
lda maze_data,x
sta (POINT_MAZE_DRAWN_LOW), y
inx
iny
cpy #WIDTH
bne draw
inc DRAW_MAZE
lda #HEIGHT
cmp DRAW_MAZE
beq done
lda POINT_MAZE_DRAWN_LOW
clc
adc #$20
sta POINT_MAZE_DRAWN_LOW
lda POINT_MAZE_DRAWN_HIGH
adc #$00
sta POINT_MAZE_DRAWN_HIGH
ldy #$00
beq draw
maze_data:
dcb 01,01,00,01,01,01,10,00
dcb 00,01,00,01,00,00,00,00
dcb 01,01,00,01,01,00,01,00
dcb 01,00,00,00,01,01,01,00
dcb 01,01,01,00,00,00,01,00
dcb 00,00,01,00,01,01,01,00
dcb 00,01,01,01,01,00,01,01
dcb 01,01,00,00,00,00,00,01
define CURRENT_ROW $20
define CURRENT_COL $21
define DRAW_MAZE $22
define POINT_MAZE_DRAWN_LOW $14
define POINT_MAZE_DRAWN_HIGH $15
define POINT_PLAYER_LOW $10
define POINT_PLAYER_HIGH $11
define POINT_TARGET_LOW $12
define POINT_TARGET_HIGH $13
define PATH $04
define PLAYER $0d
gameInstruction:
ldy #$00
pHelpLoop:
lda help,y
beq done
sta $f000,y
iny
bne pHelpLoop
gameInitialization:
lda #$01
sta CURRENT_ROW
sta CURRENT_COL
rts
gameLoop:
jsr updatePosition
jsr getInput
jsr checkCollision
ldx #$00
stx $ff
jmp gameLoop
updatePosition:
ldy CURRENT_ROW
lda table_low,y
sta POINT_PLAYER_LOW
lda table_high,y
sta POINT_PLAYER_HIGH
ldy CURRENT_COL
lda #PLAYER
sta (POINT_PLAYER_LOW),y
rts
getInput:
lda $ff
cmp #$80
bmi getInput
cmp #$84
bpl getInput
pha
lda #PATH
sta (POINT_PLAYER_LOW),y
pla
cmp #$80
bne checkRight
dec CURRENT_ROW
rts
checkRight:
cmp #$81
bne checkDown
inc CURRENT_COL
rts
checkDown:
cmp #$82
bne checkLeft
inc CURRENT_ROW
rts
checkLeft:
cmp #$83
bne done
dec CURRENT_COL
rts
done:
rts
help:
dcb "T","o",32,"p","l","a","y",44,32,"u","s","e",32
dcb "t","h","e",32,"a","r","r","o","w",32,"k","e","y","s"
dcb 00
table_high:
dcb $02,$02,$02,$02,$02,$02,$02,$02
dcb $03,$03,$03,$03,$03,$03,$03,$03
dcb $04,$04,$04,$04,$04,$04,$04,$04
dcb $05,$05,$05,$05,$05,$05,$05,$05
table_low:
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
define SCINIT $ff81
jsr gameInstruction
jsr drawMaze
jsr gameInitialization
jsr gameLoop
checkCollision:
ldy CURRENT_ROW
lda table_low,y
sta POINT_TARGET_LOW
lda table_high,y
sta POINT_TARGET_HIGH
ldy CURRENT_COL
lda (POINT_TARGET_LOW),y
cmp #$01
beq done
cmp #$04
beq done
cmp #$0a
beq gameComplete
lda #$00
sta (POINT_TARGET_LOW),y
lda $ff
cmp #$80
bne ifRight
inc CURRENT_ROW
rts
ifRight:
cmp #$81
bne ifDown
dec CURRENT_COL
rts
ifDown:
cmp #$82
bne ifLeft
dec CURRENT_ROW
rts
ifLeft:
cmp #$83
bne done
inc CURRENT_COL
rts
gameComplete:
jsr SCINIT
ldy #$00
pGameComplete:
lda complete,y
beq done
sta $f000,y
iny
bne pGameComplete
brk
complete:
dcb "C","o","n","g","r","a","t", "u", "l", "a", "t", "i", "o", "n", "!","!","!",32
dcb "T","h","e",32,"g","a","m","e",32,"i","s",32,
dcb "c","o","m","p","l","e","t","e","d","."
dcb 00
define CURRENT_ROW $20
define CURRENT_COL $21
define DRAW_MAZE $22
define POINT_MAZE_DRAWN_LOW $14
define POINT_MAZE_DRAWN_HIGH $15
define POINT_PLAYER_LOW $10
define POINT_PLAYER_HIGH $11
define POINT_TARGET_LOW $12
define POINT_TARGET_HIGH $13
define PATH $04
define PLAYER $0d
define HEIGHT 8
define WIDTH 8
define SCINIT $ff81
jsr gameInstruction
jsr drawMaze
jsr gameInitialization
jsr gameLoop
gameInstruction:
ldy #$00
pHelpLoop:
lda help,y
beq done
sta $f000,y
iny
bne pHelpLoop
gameInitialization:
lda #$01
sta CURRENT_ROW
sta CURRENT_COL
rts
gameLoop:
jsr updatePosition
jsr getInput
jsr checkCollision
ldx #$00
stx $ff
jmp gameLoop
updatePosition:
ldy CURRENT_ROW
lda table_low,y
sta POINT_PLAYER_LOW
lda table_high,y
sta POINT_PLAYER_HIGH
ldy CURRENT_COL
lda #PLAYER
sta (POINT_PLAYER_LOW),y
rts
getInput:
lda $ff
cmp #$80
bmi getInput
cmp #$84
bpl getInput
pha
lda #PATH
sta (POINT_PLAYER_LOW),y
pla
cmp #$80
bne checkRight
dec CURRENT_ROW
rts
checkRight:
cmp #$81
bne checkDown
inc CURRENT_COL
rts
checkDown:
cmp #$82
bne checkLeft
inc CURRENT_ROW
rts
checkLeft:
cmp #$83
bne done
dec CURRENT_COL
rts
done:
rts
checkCollision:
ldy CURRENT_ROW
lda table_low,y
sta POINT_TARGET_LOW
lda table_high,y
sta POINT_TARGET_HIGH
ldy CURRENT_COL
lda (POINT_TARGET_LOW),y
cmp #$01
beq done
cmp #$04
beq done
cmp #$0a
beq gameComplete
lda #$00
sta (POINT_TARGET_LOW),y
lda $ff
cmp #$80
bne ifRight
inc CURRENT_ROW
rts
ifRight:
cmp #$81
bne ifDown
dec CURRENT_COL
rts
ifDown:
cmp #$82
bne ifLeft
dec CURRENT_ROW
rts
ifLeft:
cmp #$83
bne done
inc CURRENT_COL
rts
gameComplete:
jsr SCINIT
ldy #$00
pGameComplete:
lda complete,y
beq done
sta $f000,y
iny
bne pGameComplete
brk
drawMaze:
lda #$21
sta POINT_MAZE_DRAWN_LOW
lda #$02
sta POINT_MAZE_DRAWN_HIGH
lda #$00
sta DRAW_MAZE
ldx #$00
ldy #$00
draw:
lda maze_data,x
sta (POINT_MAZE_DRAWN_LOW), y
inx
iny
cpy #WIDTH
bne draw
inc DRAW_MAZE
lda #HEIGHT
cmp DRAW_MAZE
beq done
lda POINT_MAZE_DRAWN_LOW
clc
adc #$20
sta POINT_MAZE_DRAWN_LOW
lda POINT_MAZE_DRAWN_HIGH
adc #$00
sta POINT_MAZE_DRAWN_HIGH
ldy #$00
beq draw
help:
dcb "T","o",32,"p","l","a","y",44,32,"u","s","e",32
dcb "t","h","e",32,"a","r","r","o","w",32,"k","e","y","s"
dcb 00
complete:
dcb "C","o","n","g","r","a","t", "u", "l", "a", "t", "i", "o", "n", "!","!","!",32
dcb "T","h","e",32,"g","a","m","e",32,"i","s",32,
dcb "c","o","m","p","l","e","t","e","d","."
dcb 00
maze_data:
dcb 01,01,00,01,01,01,10,00
dcb 00,01,00,01,00,00,00,00
dcb 01,01,00,01,01,00,01,00
dcb 01,00,00,00,01,01,01,00
dcb 01,01,01,00,00,00,01,00
dcb 00,00,01,00,01,01,01,00
dcb 00,01,01,01,01,00,01,01
dcb 01,01,00,00,00,00,00,01
table_high:
dcb $02,$02,$02,$02,$02,$02,$02,$02
dcb $03,$03,$03,$03,$03,$03,$03,$03
dcb $04,$04,$04,$04,$04,$04,$04,$04
dcb $05,$05,$05,$05,$05,$05,$05,$05
table_low:
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
dcb $00,$20,$40,$60,$80,$a0,$c0,$e0
Comments
Post a Comment