diff --git a/ass1/bonus-snake.asm b/ass1/bonus-snake.asm index b236843..374d49d 100644 --- a/ass1/bonus-snake.asm +++ b/ass1/bonus-snake.asm @@ -6,10 +6,15 @@ . . keyboard settings: . Address: 0x00C000 +. +. frequency: 4000 SNAKE START 0 -FIRST JSUB RENDER +FIRST CLEAR A +LOOP JSUB RENDER + + JSUB WAIT .if (food was eaten) temp = snake[LEN - 1], generate new food: @@ -18,47 +23,62 @@ FIRST JSUB RENDER .if (eaten) LEN++, snake[LEN - 1] = temp - LDA @KEY_IN - COMP #0x41 .A - JEQ LEFT + CLEAR A + LDCH @KEY_IN + +L10 COMP #0x41 .A + JEQ L3 COMP #0x57 .W - JEQ UP + JEQ L4 COMP #0x44 .D - JEQ RIGHT + JEQ L5 COMP #0x53 .S - JEQ DOWN + JEQ L6 -L3 RMO A, X .make horizontal move - LDA @SNAKEX - ADDR X, A + LDCH DIREC + J L10 + +L3 STCH DIREC + LDA @SNAKEX .move left + SUB #1 STA @SNAKEX - J L5 + J L7 -L4 RMO A, X .make vertical move - LDA @SNAKEY - ADDR X, A +L4 STCH DIREC + LDA @SNAKEY .move up + SUB #1 + STA @SNAKEY + J L7 + +L5 STCH DIREC + LDA @SNAKEX .move right + ADD #1 + STA @SNAKEX + J L7 + +L6 STCH DIREC + LDA @SNAKEY .move down + ADD #1 STA @SNAKEY -L5 .check bounds +L7 .check bounds .for (pos : snakex/y) assert x/y >= 0 && x/y <= 15 - J FIRST + JSUB RENDER + J LOOP 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 +.waits some time before reading input so it doesnt feel laggy +.no arguements, no return +.changes A, X +WAIT LDA #0 + LDX #0xA0 +L8 ADD #1 + COMPR A, X + JEQ L9 + J L8 +L9 RSUB .draws the snake .no arguements, no return @@ -138,7 +158,7 @@ POP LDA ST_PTR LDA @ST_PTR RSUB -LEN WORD 0 .snake length +LEN WORD 1 .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