mirror of
https://codeberg.org/hkzlab/TK2048.git
synced 2025-12-26 02:32:15 +11:00
Replace enums with simple defs, replace kb routine with asm
calypsi uses "int" as the type for enums, also replace the basic keyboard routine for key reading with an assembly written one
This commit is contained in:
parent
dfd26b4b8c
commit
5d739383aa
9 changed files with 103 additions and 73 deletions
|
|
@ -336,14 +336,14 @@ void draw_picture(uint8_t w, uint8_t h, uint8_t x, uint8_t y, const uint8_t *dat
|
|||
}
|
||||
}
|
||||
|
||||
void ddraw_direction_arrows(arrow_direction dir) {
|
||||
void ddraw_direction_arrows(uint8_t dir) {
|
||||
uint8_t pic_buffer[ARROWS_HEIGHT];
|
||||
|
||||
int8_t start, step, end, flip;
|
||||
uint8_t ext, x, y;
|
||||
|
||||
switch(dir) {
|
||||
case ARROW_UP:
|
||||
case GRAPH_ARROW_UP:
|
||||
x = 2;
|
||||
y = TOP_OFFSET + 1;
|
||||
ext = 1;
|
||||
|
|
@ -352,7 +352,7 @@ void ddraw_direction_arrows(arrow_direction dir) {
|
|||
end = ARROWS_HEIGHT;
|
||||
flip = 0;
|
||||
break;
|
||||
case ARROW_DOWN:
|
||||
case GRAPH_ARROW_DOWN:
|
||||
x = 2;
|
||||
y = TOP_OFFSET + (GRID_SIDE * GRID_CELL_SIDE);
|
||||
ext = 1;
|
||||
|
|
@ -361,7 +361,7 @@ void ddraw_direction_arrows(arrow_direction dir) {
|
|||
end = 0;
|
||||
flip = 0;
|
||||
break;
|
||||
case ARROW_LEFT:
|
||||
case GRAPH_ARROW_LEFT:
|
||||
x = 1;
|
||||
y = TOP_OFFSET + 7;
|
||||
ext = 0;
|
||||
|
|
@ -370,7 +370,7 @@ void ddraw_direction_arrows(arrow_direction dir) {
|
|||
end = (ARROWS_HEIGHT * 2);
|
||||
flip = 0;
|
||||
break;
|
||||
case ARROW_RIGHT:
|
||||
case GRAPH_ARROW_RIGHT:
|
||||
x = 1 + (GRID_SIDE * (GRID_CELL_SIDE/7));
|
||||
y = TOP_OFFSET + 7;
|
||||
ext = 0;
|
||||
|
|
|
|||
|
|
@ -13,12 +13,10 @@
|
|||
#define BRD_SKIP_LEFT(a) (a & 0x40)
|
||||
#define BRD_SKIP_RIGHT(a) (a & 0x80)
|
||||
|
||||
typedef enum {
|
||||
ARROW_UP,
|
||||
ARROW_DOWN,
|
||||
ARROW_LEFT,
|
||||
ARROW_RIGHT
|
||||
} arrow_direction;
|
||||
#define GRAPH_ARROW_UP 0
|
||||
#define GRAPH_ARROW_DOWN 1
|
||||
#define GRAPH_ARROW_LEFT 2
|
||||
#define GRAPH_ARROW_RIGHT 3
|
||||
|
||||
void ddraw_field_borders_on_buffer(uint8_t brd);
|
||||
void draw_game_background(uint16_t hi_score);
|
||||
|
|
@ -28,7 +26,7 @@ void ddraw_single_tile(uint8_t offset);
|
|||
void swap_display_buffers(void);
|
||||
void clear_display_buffers(void);
|
||||
void clear_box(uint8_t w, uint8_t h, uint8_t off_x, uint8_t off_y, uint8_t *disp_buf);
|
||||
void ddraw_direction_arrows(arrow_direction dir);
|
||||
void ddraw_direction_arrows(uint8_t dir);
|
||||
void ddraw_endgame_box(int8_t done, uint16_t score, uint16_t hi_score);
|
||||
|
||||
#endif /* _GAME_GRAPHICS_HEADER_ */
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ uint8_t add_random_tile(void) {
|
|||
return 0; // Return 0 if we were not able to place the tile, else we return (offset + 1) to indicate where the tile was placed
|
||||
}
|
||||
|
||||
int8_t step_game(step_direction dir) {
|
||||
int8_t step_game(uint8_t dir) {
|
||||
int8_t done = 0;
|
||||
uint8_t start_offset;
|
||||
int8_t column_step;
|
||||
|
|
@ -75,22 +75,22 @@ int8_t step_game(step_direction dir) {
|
|||
*/
|
||||
|
||||
switch(dir) {
|
||||
case STEP_UP:
|
||||
case GAME_STEP_UP:
|
||||
start_offset = GRID_SIDE - 1;
|
||||
column_step = GRID_SIDE;
|
||||
row_step = -1;
|
||||
break;
|
||||
case STEP_DOWN:
|
||||
case GAME_STEP_DOWN:
|
||||
start_offset = (GRID_SIDE * GRID_SIDE) - 1;
|
||||
column_step = -GRID_SIDE;
|
||||
row_step = -1;
|
||||
break;
|
||||
case STEP_LEFT:
|
||||
case GAME_STEP_LEFT:
|
||||
start_offset = 0;
|
||||
column_step = 1;
|
||||
row_step = GRID_SIDE;
|
||||
break;
|
||||
case STEP_RIGHT:
|
||||
case GAME_STEP_RIGHT:
|
||||
start_offset = GRID_SIDE - 1;
|
||||
column_step = -1;
|
||||
row_step = GRID_SIDE;
|
||||
|
|
|
|||
|
|
@ -5,16 +5,14 @@
|
|||
|
||||
#define GRID_SIDE 5
|
||||
|
||||
typedef enum {
|
||||
STEP_UP,
|
||||
STEP_DOWN,
|
||||
STEP_LEFT,
|
||||
STEP_RIGHT
|
||||
} step_direction;
|
||||
#define GAME_STEP_UP 0
|
||||
#define GAME_STEP_DOWN 1
|
||||
#define GAME_STEP_LEFT 2
|
||||
#define GAME_STEP_RIGHT 3
|
||||
|
||||
uint8_t reset_game(void);
|
||||
uint8_t *get_front_grid(void);
|
||||
int8_t step_game(step_direction dir);
|
||||
int8_t step_game(uint8_t dir);
|
||||
uint16_t calculate_score(void);
|
||||
uint8_t add_random_tile(void);
|
||||
|
||||
|
|
|
|||
35
src/input.c
35
src/input.c
|
|
@ -3,38 +3,11 @@
|
|||
#include "utility.h"
|
||||
#include "mem_registers.h"
|
||||
|
||||
key __internal_read_kb(void);
|
||||
uint8_t __internal_read_kb(void);
|
||||
|
||||
inline key __internal_read_kb(void) {
|
||||
PEEK(IO_KB_CTRL_HI);
|
||||
|
||||
if(PEEK(IO_DATAIN) & 0x01) {
|
||||
POKE(IO_DATAOUT, 0x04);
|
||||
if (PEEK(IO_DATAIN) & 0x04) {
|
||||
return K_CTRL_R;
|
||||
}
|
||||
}
|
||||
|
||||
PEEK(IO_KB_CTRL_LOW);
|
||||
|
||||
POKE(IO_DATAOUT, 0x40);
|
||||
if (PEEK(IO_DATAIN) & 0x01) return K_UP;
|
||||
|
||||
POKE(IO_DATAOUT, 0x20);
|
||||
if (PEEK(IO_DATAIN) & 0x01) return K_DOWN;
|
||||
|
||||
POKE(IO_DATAOUT, 0x10);
|
||||
if (PEEK(IO_DATAIN) & 0x01) return K_RIGHT;
|
||||
|
||||
POKE(IO_DATAOUT, 0x08);
|
||||
if (PEEK(IO_DATAIN) & 0x01) return K_LEFT;
|
||||
|
||||
return K_NONE;
|
||||
}
|
||||
|
||||
key read_kb(void) {
|
||||
static key last_press = K_NONE;
|
||||
key cur_press = __internal_read_kb();
|
||||
uint8_t read_kb(void) {
|
||||
static uint8_t last_press = K_NONE;
|
||||
uint8_t cur_press = __internal_read_kb();
|
||||
|
||||
if (cur_press != last_press) {
|
||||
last_press = cur_press;
|
||||
|
|
|
|||
16
src/input.h
16
src/input.h
|
|
@ -3,16 +3,14 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef enum {
|
||||
K_NONE = 0,
|
||||
K_UP,
|
||||
K_DOWN,
|
||||
K_LEFT,
|
||||
K_RIGHT,
|
||||
K_CTRL_R,
|
||||
} key;
|
||||
#define K_NONE 0
|
||||
#define K_UP 1
|
||||
#define K_DOWN 2
|
||||
#define K_LEFT 3
|
||||
#define K_RIGHT 4
|
||||
#define K_CTRL_R 5
|
||||
|
||||
key read_kb(void);
|
||||
uint8_t read_kb(void);
|
||||
|
||||
uint8_t read_any_key(void);
|
||||
|
||||
|
|
|
|||
63
src/input_asm.s
Normal file
63
src/input_asm.s
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
.rtmodel version,"1"
|
||||
.rtmodel core,"6502"
|
||||
|
||||
.extern _Vfp
|
||||
.extern _Vsp
|
||||
.extern _Zp
|
||||
|
||||
K_NONE: .equ 0
|
||||
K_UP .equ 1
|
||||
K_DOWN .equ 2
|
||||
K_LEFT .equ 3
|
||||
K_RIGHT .equ 4
|
||||
K_CTRL_R .equ 5
|
||||
|
||||
__internal_read_kb:
|
||||
IO_DATAOUT$:.equ 0xC000
|
||||
IO_DATAIN$: .equ 0xC010
|
||||
IO_KB_CTRL_LOW$: .equ 0xC05E
|
||||
IO_KB_CTRL_HI$: .equ 0xC05F
|
||||
|
||||
lda IO_KB_CTRL_HI$
|
||||
lda IO_DATAIN$
|
||||
ror a
|
||||
bcc NoCtrl$
|
||||
lda #0x04
|
||||
sta IO_DATAOUT$
|
||||
lda IO_DATAIN$
|
||||
ror a
|
||||
ror a
|
||||
ror a
|
||||
lda #K_CTRL_R
|
||||
bcs Return$
|
||||
|
||||
NoCtrl$:
|
||||
lda IO_KB_CTRL_LOW$
|
||||
ldy #3
|
||||
NextKey$: lda _rkb_key_inp,y
|
||||
sta IO_DATAOUT$
|
||||
lda IO_DATAIN$
|
||||
ror a
|
||||
lda _rkb_key_ret,y
|
||||
bcs Return$
|
||||
dey
|
||||
bpl NextKey$
|
||||
|
||||
lda #K_NONE
|
||||
Return$:
|
||||
rts
|
||||
|
||||
_rkb_key_ret:
|
||||
.byte K_LEFT
|
||||
.byte K_RIGHT
|
||||
.byte K_DOWN
|
||||
.byte K_UP
|
||||
|
||||
_rkb_key_inp:
|
||||
.byte 0x08
|
||||
.byte 0x10
|
||||
.byte 0x20
|
||||
.byte 0x40
|
||||
|
||||
;;; Declaration of public symbols
|
||||
.public __internal_read_kb
|
||||
16
src/main.c
16
src/main.c
|
|
@ -86,23 +86,23 @@ __task int main(void) {
|
|||
switch(read_kb()) {
|
||||
case K_UP:
|
||||
BELL1();
|
||||
done = step_game(STEP_UP);
|
||||
ddraw_direction_arrows(ARROW_UP);
|
||||
done = step_game(GAME_STEP_UP);
|
||||
ddraw_direction_arrows(GRAPH_ARROW_UP);
|
||||
break;
|
||||
case K_DOWN:
|
||||
BELL1();
|
||||
done = step_game(STEP_DOWN);
|
||||
ddraw_direction_arrows(ARROW_DOWN);
|
||||
done = step_game(GAME_STEP_DOWN);
|
||||
ddraw_direction_arrows(GRAPH_ARROW_DOWN);
|
||||
break;
|
||||
case K_LEFT:
|
||||
BELL1();
|
||||
done = step_game(STEP_LEFT);
|
||||
ddraw_direction_arrows(ARROW_LEFT);
|
||||
done = step_game(GAME_STEP_LEFT);
|
||||
ddraw_direction_arrows(GRAPH_ARROW_LEFT);
|
||||
break;
|
||||
case K_RIGHT:
|
||||
BELL1();
|
||||
done = step_game(STEP_RIGHT);
|
||||
ddraw_direction_arrows(ARROW_RIGHT);
|
||||
done = step_game(GAME_STEP_RIGHT);
|
||||
ddraw_direction_arrows(GRAPH_ARROW_RIGHT);
|
||||
break;
|
||||
case K_CTRL_R:
|
||||
BELL1();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue