150 lines
3.5 KiB
NASM
150 lines
3.5 KiB
NASM
. graphical screen settings:
|
|
. Address: 0x00A000
|
|
. Columns: 16
|
|
. Rows: 16
|
|
. Pixel size: 24
|
|
.
|
|
. keyboard settings:
|
|
. Address: 0x00C000
|
|
|
|
SNAKE START 0
|
|
|
|
FIRST JSUB RENDER
|
|
|
|
.if (food was eaten) temp = snake[LEN - 1], generate new food:
|
|
|
|
.propagate position through the snake
|
|
.for (i = LEN - 2, i >= 0 ) snakex/y[i + 1] = snakex/y[i]
|
|
|
|
.if (eaten) LEN++, snake[LEN - 1] = temp
|
|
|
|
LDA @KEY_IN
|
|
COMP #0x41 .A
|
|
JEQ LEFT
|
|
COMP #0x57 .W
|
|
JEQ UP
|
|
COMP #0x44 .D
|
|
JEQ RIGHT
|
|
COMP #0x53 .S
|
|
JEQ DOWN
|
|
|
|
L3 RMO A, X .make horizontal move
|
|
LDA @SNAKEX
|
|
ADDR X, A
|
|
STA @SNAKEX
|
|
J L5
|
|
|
|
L4 RMO A, X .make vertical move
|
|
LDA @SNAKEY
|
|
ADDR X, A
|
|
STA @SNAKEY
|
|
|
|
L5 .check bounds
|
|
.for (pos : snakex/y) assert x/y >= 0 && x/y <= 15
|
|
|
|
J FIRST
|
|
|
|
HALT J HALT
|
|
|
|
.store direction
|
|
LEFT LDA #-1
|
|
STA DIREC
|
|
J L3
|
|
UP LDA #-0x10
|
|
STA DIREC
|
|
J L4
|
|
RIGHT LDA #1
|
|
STA DIREC
|
|
J L3
|
|
DOWN LDA #0x10
|
|
STA DIREC
|
|
J L4
|
|
|
|
.draws the snake
|
|
.no arguements, no return
|
|
.changes A
|
|
RENDER RMO L, A
|
|
JSUB PUSH .prolouge
|
|
RMO X, A
|
|
JSUB PUSH
|
|
RMO T, A
|
|
JSUB PUSH
|
|
|
|
CLEAR X .draw head
|
|
JSUB OFFSET
|
|
ADD SCREEN
|
|
STA ADR
|
|
CLEAR A
|
|
LDCH #240
|
|
STCH @ADR
|
|
|
|
L1 RMO X, A .draw others
|
|
ADD #1
|
|
RMO A, X
|
|
|
|
COMP LEN
|
|
JEQ L2
|
|
|
|
JSUB OFFSET
|
|
ADD SCREEN
|
|
STA ADR
|
|
CLEAR A
|
|
LDCH #255
|
|
STA @ADR
|
|
|
|
J L1
|
|
|
|
L2 JSUB POP .epilouge
|
|
RMO A, T
|
|
JSUB POP
|
|
RMO A, X
|
|
JSUB POP
|
|
RMO A, L
|
|
RSUB
|
|
|
|
.calculates the offset of the snake cell at index X for rendering
|
|
.offset = 16 * snakey[index] + snakex[index]
|
|
.arguements: X - index
|
|
.return: A - offset
|
|
.changes A, T
|
|
OFFSET RMO X, A
|
|
MUL #3
|
|
ADD SNAKEY
|
|
STA ADR
|
|
LDA @ADR
|
|
MUL #16
|
|
RMO A, T
|
|
|
|
RMO X, A
|
|
MUL #3
|
|
ADD SNAKEX
|
|
STA ADR
|
|
LDA @ADR
|
|
ADDR T, A
|
|
RSUB
|
|
|
|
.pushes A to stack
|
|
.changes A
|
|
PUSH STA @ST_PTR
|
|
LDA ST_PTR
|
|
ADD #3
|
|
STA ST_PTR
|
|
RSUB
|
|
|
|
.pops top of stack into A
|
|
POP LDA ST_PTR
|
|
SUB #3
|
|
STA ST_PTR
|
|
LDA @ST_PTR
|
|
RSUB
|
|
|
|
LEN WORD 0 .snake length
|
|
SCREEN WORD X'00A000' .screen pointer
|
|
KEY_IN WORD X'00C000' .input pointer
|
|
ST_PTR WORD X'000200' .stack pointer, 2kB of space
|
|
SNAKEX WORD X'000A00' .pointer to an array of snake x coords, first input is head, SNAKEX + LEN is tail, 3 byte elements, upper left corner is 0, 0
|
|
SNAKEY WORD X'000C00' .pointer to an array of snake y coords, offset 0x200 from SNAKEX
|
|
ADR WORD 0 .actual address of the x / y coord since sic/xe doesnt support indirect and indexed addressing
|
|
DIREC WORD 0 .movement direction, gets added to snake's head
|
|
|
|
END FIRST
|