implemented hexstrings, implemented MOVE, PUTCOLOR, GETCHAR, GETCOLOR, modified PUTCHAR, several fixes.

This commit is contained in:
2017-02-09 19:03:20 +01:00
parent be539b1591
commit 3f1f9451ca
10 changed files with 219 additions and 298 deletions

View File

@@ -43,6 +43,8 @@ int main(int argc, char** argv) {
vdp_init();
vm_register_out_port(10, vdp_data_out);
vm_register_out_port(11, vdp_cmd_out);
vm_register_in_port(12, vdp_in);
vm_register_out_port(20, input_data_in);
vm_register_in_port(21, input_data_out);

View File

@@ -29,7 +29,7 @@ struct t_external_function {
};
struct t_string {
char string[256];
unsigned char string[256];
word references[256];
int num_references = 1;
};
@@ -208,12 +208,35 @@ static void generate_anonymous_labelname(char* dest) {
/****************************************************************************************/
/* STRING MANAGEMENT */
/****************************************************************************************/
static const bool same_string(const unsigned char* a, const unsigned char*b) {
for (int i = 0; i <= a[0]; i++) if (a[i] != b[i]) return false;
return true;
}
static void copy_string(unsigned char* dest, const unsigned char* src) {
memcpy(dest, src, src[0] + 1);
//for (int i = 0; i <= src[0]; i++) dest[i] = src[i];
}
static void to_basic_string(unsigned char* dest, const char* src) {
int len = strlen(src);
*dest = len; dest++;
memcpy(dest, src, len);
}
static int register_array(const unsigned char* string) {
for (int i = 0; i < num_strings; i++) {
if (same_string(strings[i].string, string)) { strings[i].references[strings[i].num_references++] = get_current_address(); return 0; }
}
copy_string(strings[num_strings].string, string);
strings[num_strings++].references[0] = get_current_address();
return 0;
}
static int register_string(const char* string) {
unsigned char new_str[255]; to_basic_string(new_str, string);
for (int i = 0; i < num_strings; i++) {
if (strcmp(strings[i].string, string) == 0) { strings[i].references[strings[i].num_references++] = get_current_address(); return 0; }
if (same_string(strings[i].string, new_str)) { strings[i].references[strings[i].num_references++] = get_current_address(); return 0; }
}
strcpy(strings[num_strings].string, string);
copy_string(strings[num_strings].string, new_str);
strings[num_strings++].references[0] = get_current_address();
return 0;
}
@@ -224,9 +247,9 @@ static void append_strings() {
emmit(num_strings);
for (int i = 0; i < num_strings; i++) {
for (int j = 0; j < strings[i].num_references; j++) { patch(strings[i].references[j], get_current_address()); }
char len = strlen(strings[i].string);
emmit(len);
for (int j = 0; j < len; j++) { emmit(strings[i].string[j]); }
//char len = strings[i].string[0];
//emmit(len);
for (int j = 0; j <= strings[i].string[0]; j++) { emmit(strings[i].string[j]); }
}
}
@@ -244,6 +267,8 @@ static void parse_chr();
static void parse_strlen();
static void parse_keypressed();
static void parse_anykey();
static void parse_getchar();
static void parse_getcolor();
#define EXPECT(X, Y) if (tkn_get_token() != X) { parser_finished = true; error_raise(Y); return; }
@@ -256,6 +281,14 @@ static void parse_concat_atom() {
tkn_next();
return;
}
if (tkn_get_token() == TOKEN_HEXSTRING) {
emmit(OP_SETX);
emmit_w(register_array(tkn_get_array()));
emmit(OP_JSR);
emmit_w(get_label_address("_sys_string_load"));
tkn_next();
return;
}
if (tkn_get_token() == TOKEN_IDENTIFIER) {
int ivar = get_variable_index(tkn_get_string());
if (!is_variable_array()) { parser_finished = true; error_raise("Expected string constant or variable"); return; }
@@ -334,6 +367,8 @@ static void parse_expr_atom() {
if (tkn_get_token() == TOKEN_STRLEN) { tkn_next(); parse_strlen(); return; }
if (tkn_get_token() == TOKEN_KEYPRESSED) { tkn_next(); parse_keypressed(); return; }
if (tkn_get_token() == TOKEN_ANYKEY) { tkn_next(); parse_anykey(); return; }
if (tkn_get_token() == TOKEN_GETCHAR) { tkn_next(); parse_getchar(); return; }
if (tkn_get_token() == TOKEN_GETCOLOR) { tkn_next(); parse_getcolor(); return; }
parser_finished = true; error_raise("Syntax error");
return;
@@ -690,6 +725,13 @@ static void parse_locate() {
emmit_w(get_label_address("_sys_vdp_locate"));
}
static void parse_move() {
parse_expression();
parse_expression();
emmit(OP_JSR);
emmit_w(get_label_address("_sys_vdp_move"));
}
static void parse_print() {
parse_concatenation();
emmit(OP_JSR);
@@ -700,11 +742,32 @@ static void parse_putchar() {
parse_expression();
parse_expression();
parse_expression();
parse_expression();
emmit(OP_JSR);
emmit_w(get_label_address("_sys_vdp_putchar"));
}
static void parse_putcolor() {
parse_expression();
parse_expression();
parse_expression();
emmit(OP_JSR);
emmit_w(get_label_address("_sys_vdp_putcolor"));
}
static void parse_getchar() {
parse_expression();
parse_expression();
emmit(OP_JSR);
emmit_w(get_label_address("_sys_vdp_getchar"));
}
static void parse_getcolor() {
parse_expression();
parse_expression();
emmit(OP_JSR);
emmit_w(get_label_address("_sys_vdp_getcolor"));
}
static void parse_setchar() {
parse_expression();
parse_concatenation();
@@ -824,10 +887,18 @@ static void parse_statements() {
tkn_next(); parse_putsprite(); break;
case TOKEN_LOCATE:
tkn_next(); parse_locate(); break;
case TOKEN_MOVE:
tkn_next(); parse_move(); break;
case TOKEN_PRINT:
tkn_next(); parse_print(); break;
case TOKEN_PUTCHAR:
tkn_next(); parse_putchar(); break;
case TOKEN_PUTCOLOR:
tkn_next(); parse_putcolor(); break;
//case TOKEN_GETCHAR: <--- Parsed in parse_expr_atom
// tkn_next(); parse_getchar(); break;
//case TOKEN_GETCOLOR: <--- Parsed in parse_expr_atom
// tkn_next(); parse_getcolor(); break;
case TOKEN_SETCHAR:
tkn_next(); parse_setchar(); break;
//case TOKEN_KEYPRESSED: <--- Parsed in parse_expr_atom

BIN
rom.bin

Binary file not shown.

BIN
rom.lbl

Binary file not shown.

View File

@@ -34,26 +34,26 @@ private:
char note = 0;
char param = -1;
switch (song[pos++]) {
case 'b': note += 2;
case 'a': note += 2;
case 'g': note += 2;
case 'f': note += 1;
case 'e': note += 2;
case 'd': note += 2;
case 'c':
case 'B': note += 2;
case 'A': note += 2;
case 'G': note += 2;
case 'F': note += 1;
case 'E': note += 2;
case 'D': note += 2;
case 'C':
param = song[pos];
if (param == '#' || param == '+') { note++; param = song[++pos]; } else if (param == '-') { note--; param = song[++pos]; }
if (param >= 48 && param <= 57) { param -= 48; pos++; } else { param = -1; }
if (song[pos] == '.') { multip = 1.5f; pos++; }
program_pipeline(note, param, multip);
return true;
case 'r':
case 'R':
param = song[pos];
if (param >= 48 && param <= 57) { param -= 48; pos++; } else { param = -1; }
if (song[pos] == '.') { multip = 1.5f; pos++; }
program_pipeline(100, param, multip);
return true;
case 'o':
case 'O':
param = song[pos];
if (param >= 48 && param <= 57) { octave = (param - 48) % 8; pos++; }
break;
@@ -63,17 +63,17 @@ private:
case '<':
octave = (octave - 1) % 8;
break;
case 'l':
case 'L':
param = song[pos];
if (param >= 48 && param <= 57) { default_length = lengths[param - 48]; pos++; }
else if (param == '+') { default_length *= 2; pos++; }
else if (param == '-') { default_length /= 2; pos++; }
break;
case 'v':
case 'V':
param = song[pos];
if (param >= 48 && param <= 57) { volume = (param - 48) << 4; pos++; }
break;
case 't':
case 'T':
param = song[pos];
if (param >= 48 && param <= 57) { tempo = tempos[param - 48] * 10; pos++; }
break;

263
test.bas
View File

@@ -1,24 +1,25 @@
SETMUSIC 0 "l5cccfrf>l6c." PLAYMUSIC
SETMUSIC 0 "L5CCCFRF>L6C." PLAYMUSIC
START:
BORDER INK_BLACK
COLOR INK_WHITE + PAPER_BLACK
BORDER INK_GRAY
COLOR INK_RED + PAPER_BLACK
CLS
LOCATE 4 2 PRINT CHR &h87, CHR &h85, CHR &h87, CHR &h85, CHR &h87, CHR &h85, CHR &h87, CHR &h81
LOCATE 4 3 PRINT CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h84
LOCATE 4 4 PRINT CHR &h87, CHR &h81, CHR &h8D, CHR &h85, CHR &h85, CHR &h85, CHR &h8D, CHR &h85
LOCATE 0 1 PRINT !8A87858A87858A8783888F8D8A858E81
LOCATE 0 2 PRINT !8A878B8A878B8A87818A8D8F8A8F8D80
LOCATE 0 3 PRINT !8A8D8E8A858A8A8F8F8A858F8A858B85
COLOR INK_YELLOW + PAPER_BLACK
LOCATE 3 4 PRINT !8E8F8D8A858A858F8F8F
LOCATE 3 5 PRINT !8F808F8A858A85808F80
LOCATE 3 6 PRINT !8B8F87828F8F81808F80
COLOR INK_WHITE + PAPER_BLACK
W = 0
MENU_BLINK:
LOCATE 3 8 PRINT "PRESS CTRL"
LOCATE 4 9 PRINT "TO PLAY"
LOCATE 0 9 PRINT "PRESS A TO START"
UPDATESCR
INC W
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
IF W < 25 THEN
GOTO MENU_BLINK
END
IF W < 25 THEN GOTO MENU_BLINK END
MENU_BLINK2:
LOCATE 3 8 PRINT " "
LOCATE 4 9 PRINT " "
LOCATE 0 9 PRINT " "
UPDATESCR
INC W
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
@@ -26,184 +27,70 @@ MENU_BLINK2:
W = 0
GOTO MENU_BLINK
INIT_GAME:
P1_Y = 48
P1_SCORE = 0
P2_Y = 48
P2_SCORE = 0
BALL_X = 67
BALL_Y = 48
BALL_DX = 1
BALL_DY = 1
SETSPRITE 0 &HE7 INK_WHITE
SETSPRITE 1 &h95 INK_WHITE
SETSPRITE 2 &h95 INK_WHITE
SETSPRITE 3 &h95 INK_WHITE
SETSPRITE 4 &h95 INK_WHITE
CLS
GOSUB DRAW_NET
GOSUB DRAW_SCORE
GOSUB DRAW_P1
GOSUB DRAW_P2
X = 64 ' X DE LA PALA
BX = 64 BY = 48 ' X I Y DE LA BOLA
DX = 1 DY = 1 ' VELOCITAT EN X I Y DE LA BOLA
' DEFINIM ELS CARACTERS PER ALS BLOCS I LA BOLA
SETCHAR 16 !007F7F7F7F7F7F7F
SETCHAR 17 !00FFFFFFFFFFFFFF
' PINTEM ELS BLOCS
COLOR INK_RED + PAPER_BLACK LOCATE 0 1 PRINT !10111011101110111011101110111011
COLOR INK_YELLOW + PAPER_BLACK LOCATE 0 2 PRINT !10111011101110111011101110111011
COLOR INK_GREEN + PAPER_BLACK LOCATE 0 3 PRINT !10111011101110111011101110111011
COLOR INK_BLUE + PAPER_BLACK LOCATE 0 4 PRINT !10111011101110111011101110111011
' DEFINIM ELS SPRITES
SETSPRITE 0 &h90 INK_WHITE
SETSPRITE 1 &H83 INK_CYAN
SETSPRITE 2 &H83 INK_CYAN
MAIN_GAME:
IF (P1_SCORE = 10) OR (P2_SCORE = 10) THEN GOTO END_GAME END
GOSUB DRAW_BALL
TIME = 32
PRE_GAME:
GOSUB PROCESS_PLAYER1
DEC TIME
UPDATESCR
IF TIME > 0 THEN GOTO PRE_GAME END
GAME:
GOSUB PROCESS_PLAYER1
GOSUB PROCESS_PLAYER2
GOSUB MOVE_BALL
IF (BALL_X > 8) AND (BALL_X < 14) THEN GOSUB BOUNCE_P1 END
IF (BALL_X < 128) AND (BALL_X > 122) THEN GOSUB BOUNCE_P2 END
IF (BALL_X > 135) THEN
INC P1_SCORE
BALL_X = 67
BALL_Y = 48
BALL_DX = -1
GOSUB FLASH_BORDER
GOSUB DRAW_SCORE
GOSUB POINT
GOTO MAIN_GAME
END
IF (BALL_X < 2) THEN
INC P2_SCORE
BALL_X = 67
BALL_Y = 48
BALL_DX = 1
GOSUB FLASH_BORDER
GOSUB DRAW_SCORE
GOSUB POINT
GOTO MAIN_GAME
END
IF (BALL_Y > 96) OR (BALL_Y < 8) THEN BALL_DY = -BALL_DY END
UPDATESCR
GOTO GAME
FLASH_BORDER:
BORDER INK_WHITE
UPDATESCR
BORDER INK_BLACK
RETURN
DRAW_NET:
PUTCHAR 7 0 &HD1 INK_WHITE + PAPER_BLACK
PUTCHAR 7 2 &HD1 INK_WHITE + PAPER_BLACK
PUTCHAR 7 4 &HD1 INK_WHITE + PAPER_BLACK
PUTCHAR 7 6 &HD1 INK_WHITE + PAPER_BLACK
PUTCHAR 7 8 &HD1 INK_WHITE + PAPER_BLACK
PUTCHAR 7 10 &HD1 INK_WHITE + PAPER_BLACK
RETURN
DRAW_SCORE:
LOCATE 6 1 PRINT STR P1_SCORE
LOCATE 9 1 PRINT STR P2_SCORE
RETURN
DRAW_P1:
PUTSPRITE 1 8 P1_Y
PUTSPRITE 2 8 P1_Y+8
RETURN
DRAW_P2:
PUTSPRITE 3 128 P2_Y
PUTSPRITE 4 128 P2_Y+8
RETURN
DRAW_BALL:
PUTSPRITE 0 BALL_X BALL_Y
RETURN
PROCESS_PLAYER1:
IF KEYPRESSED BTN_UP THEN
DEC P1_Y DEC P1_Y
IF P1_Y < 8 THEN P1_Y = 8 END
GOSUB DRAW_P1
' MOVIMENT DE LA PALA
IF KEYPRESSED BTN_LEFT THEN GOSUB MOVE_LEFT END
IF KEYPRESSED BTN_RIGHT THEN GOSUB MOVE_RIGHT END
' MOVIMENT DE LA BOLA
BX = BX + DX
IF BX >= 131 THEN BX = 131 DX = -DX END
IF BX <= 5 THEN BX = 5 DX = -DX END
BY = BY + DY
IF BY >= 99 THEN BY = 99 DY = -DY END
IF BY <= 5 THEN BY = 5 DY = -DY END
TX = (BX-5)/8
TY = (BY-5)/8
CHAR = GETCHAR TX TY
IF NOT(CHAR = 32) THEN
PUTCHAR TX TY 32
IF TX MOD 2 = 0 THEN
PUTCHAR TX+1 TY 32
ELSE
IF KEYPRESSED BTN_DOWN THEN
INC P1_Y INC P1_Y
IF P1_Y > 88 THEN P1_Y = 88 END
GOSUB DRAW_P1
PUTCHAR TX-1 TY 32
END
DY = -DY
IF (GETCOLOR TX TY) = INK_GREEN + PAPER_BLACK THEN DY = 2 DX = 2 END
'IF GETCOLOR TX TY = INK_YELLOW + PAPER_BLACK THEN DY = 3 DX = 3 END
END
RETURN
PROCESS_PLAYER2:
IF BALL_Y < P2_Y+8 THEN DEC P2_Y END
IF BALL_Y > P2_Y+8 THEN INC P2_Y END
GOSUB DRAW_P2
RETURN
MOVE_BALL:
BALL_X = BALL_X + BALL_DX
BALL_Y = BALL_Y + BALL_DY
GOSUB DRAW_BALL
RETURN
BOUNCE_P1:
IF (P1_Y <= BALL_Y+7) AND (P1_Y > BALL_Y+1) THEN
BALL_DY = -2
BALL_DX = 1
GOTO PING
END
IF (P1_Y <= BALL_Y+1) AND (P1_Y+5 > BALL_Y) THEN
BALL_DY = -1
IF BALL_DX = -1 THEN BALL_DX = 1 ELSE BALL_DX = 2 END
GOTO PING
END
IF (P1_Y+5 <= BALL_Y) AND (P1_Y+11 > BALL_Y) THEN
BALL_DY = 0
BALL_DX = 2
GOTO PING
END
IF (P1_Y+11 <= BALL_Y) AND (P1_Y+17 > BALL_Y) THEN
BALL_DY = 1
IF BALL_DX = -1 THEN BALL_DX = 1 ELSE BALL_DX = 2 END
GOTO PING
END
IF (P1_Y+17 <= BALL_Y) AND (P1_Y+23 > BALL_Y) THEN
BALL_DY = 2
BALL_DX = 1
GOTO PING
END
RETURN
BOUNCE_P2:
IF (P2_Y <= BALL_Y+7) AND (P2_Y > BALL_Y+1) THEN
BALL_DY = -2
BALL_DX = -1
GOTO PING
END
IF (P2_Y <= BALL_Y+1) AND (P2_Y+5 > BALL_Y) THEN
BALL_DY = -1
IF BALL_DX = 1 THEN BALL_DX = -1 ELSE BALL_DX = -2 END
GOTO PING
END
IF (P2_Y+5 <= BALL_Y) AND (P2_Y+11 > BALL_Y) THEN
BALL_DY = 0
BALL_DX = -2
GOTO PING
END
IF (P2_Y+11 <= BALL_Y) AND (P2_Y+17 > BALL_Y) THEN
BALL_DY = 1
IF BALL_DX = 1 THEN BALL_DX = -1 ELSE BALL_DX = -2 END
GOTO PING
END
IF (P2_Y+17 <= BALL_Y) AND (P2_Y+23 > BALL_Y) THEN
BALL_DY = 2
BALL_DX = -1
GOTO PING
END
RETURN
PING:
SETMUSIC 0 "l1o7c" PLAYMUSIC
RETURN
POINT:
SETMUSIC 0 "l2o2bec" PLAYMUSIC
RETURN
END_GAME:
LOCATE 3 5 PRINT "GAME OVER"
LOCATE 1 7
IF P1_SCORE = 10 THEN PRINT "PLAYER 1 WINS!" END
IF P2_SCORE = 10 THEN PRINT "PLAYER 2 WINS!" END
' PINTEM SPRITES
PUTSPRITE 0 BX BY
PUTSPRITE 1 X 96
PUTSPRITE 2 X+8 96
UPDATESCR
SETMUSIC 0 "l5o5ccr<a#argrfrrr<f" PLAYMUSIC
WAIT 4
PUTSPRITE 0 0 0
PUTSPRITE 1 0 0
PUTSPRITE 2 0 0
PUTSPRITE 3 0 0
PUTSPRITE 4 0 0
GOTO START
GOTO MAIN_GAME
LOOP: GOTO LOOP
MOVE_LEFT: IF X > 8 THEN X = X - 4 END RETURN
MOVE_RIGHT: IF X < 120 THEN X = X + 4 END RETURN
JUMP_LINE: MOVE -2 1 RETURN
DRAW_0: PRINT !8785 GOSUB JUMP_LINE PRINT !8585 GOSUB JUMP_LINE PRINT !8381 RETURN
DRAW_1: PRINT !8085 GOSUB JUMP_LINE PRINT !8085 GOSUB JUMP_LINE PRINT !8081 RETURN
DRAW_2: PRINT !8385 GOSUB JUMP_LINE PRINT !8781 GOSUB JUMP_LINE PRINT !8381 RETURN
DRAW_3: PRINT !8385 GOSUB JUMP_LINE PRINT !8385 GOSUB JUMP_LINE PRINT !8381 RETURN
DRAW_4: PRINT !8585 GOSUB JUMP_LINE PRINT !8385 GOSUB JUMP_LINE PRINT !8081 RETURN
DRAW_5: PRINT !8781 GOSUB JUMP_LINE PRINT !8385 GOSUB JUMP_LINE PRINT !8381 RETURN
DRAW_6: PRINT !8781 GOSUB JUMP_LINE PRINT !8785 GOSUB JUMP_LINE PRINT !8381 RETURN
DRAW_7: PRINT !8385 GOSUB JUMP_LINE PRINT !8085 GOSUB JUMP_LINE PRINT !8081 RETURN
DRAW_8: PRINT !8785 GOSUB JUMP_LINE PRINT !8785 GOSUB JUMP_LINE PRINT !8381 RETURN
DRAW_9: PRINT !8785 GOSUB JUMP_LINE PRINT !8385 GOSUB JUMP_LINE PRINT !8081 RETURN

View File

@@ -12,6 +12,7 @@ static bool streq(const char* a, const char* b) {
static const char* ptr;
static t_tokentype current_token = TOKEN_ERROR;
static char identifier[255];
static unsigned char array[255];
static int value;
static int line = 0;
static int row = 0;
@@ -54,9 +55,13 @@ t_token_op tkn_tokens[] = {
{ "setsprite", TOKEN_SETSPRITE },
{ "putsprite", TOKEN_PUTSPRITE },
{ "locate", TOKEN_LOCATE },
{ "move", TOKEN_MOVE },
{ "print", TOKEN_PRINT },
{ "putchar", TOKEN_PUTCHAR },
{ "setchar", TOKEN_SETCHAR },
{ "putchar", TOKEN_PUTCHAR },
{ "getchar", TOKEN_GETCHAR },
{ "putcolor", TOKEN_PUTCOLOR },
{ "getcolor", TOKEN_GETCOLOR },
{ "keypressed", TOKEN_KEYPRESSED },
{ "anykey", TOKEN_ANYKEY },
{ "updatescr", TOKEN_UPDATESCR },
@@ -86,6 +91,17 @@ static void tkn_do_next() {
if (CCHR == 0) { current_token = TOKEN_ENDFILE; return; }
// if 13, we are at the end of the line
if (CCHR == 10) { NEXT; current_token = TOKEN_ENDLINE; return; }
// If '!' grab the hexstring
if (CCHR == '!') {
NEXT; int i = 0;
while ((CCHR >= 48 && CCHR <= 57) || (CCHR >= 'A' && CCHR <= 'F') || (CCHR >= 'a' && CCHR <= 'f')) {
array[++i] = hex_digit(CCHR) << 4; NEXT;
if (!((CCHR >= 48 && CCHR <= 57) || (CCHR >= 'A' && CCHR <= 'F') || (CCHR >= 'a' && CCHR <= 'f'))) { current_token = TOKEN_ERROR; error_raise("Invalid hexstring."); return; }
array[i] += hex_digit(CCHR); NEXT;
}
array[0] = i;
current_token = TOKEN_HEXSTRING; return;
}
// if 34, grab the string
if (CCHR == 34) {
NEXT;
@@ -161,13 +177,14 @@ void tkn_init(const char* buffer) {
ptr = buffer;
current_token = TOKEN_ERROR;
value = line = row = current_tokenline = current_tokenrow = 0;
identifier[0] = 0;
identifier[0] = 0; array[0] = 0;
}
void tkn_next() { do { tkn_do_next(); } while (current_token == TOKEN_REM || current_token == TOKEN_ENDLINE); }
t_tokentype tkn_get_token() { return current_token; }
char* tkn_get_string() { return identifier; }
unsigned char* tkn_get_array() { return array; }
int tkn_get_value() { return value; }
int tkn_get_line() { return current_tokenline; }
int tkn_get_row() { return current_tokenrow; }

View File

@@ -7,6 +7,7 @@ enum t_tokentype {
TOKEN_ERROR,
TOKEN_NUMBER,
TOKEN_STRING,
TOKEN_HEXSTRING,
TOKEN_IDENTIFIER,
TOKEN_LABEL,
@@ -59,9 +60,13 @@ enum t_tokentype {
TOKEN_SETSPRITE,
TOKEN_PUTSPRITE,
TOKEN_LOCATE,
TOKEN_MOVE,
TOKEN_PRINT,
TOKEN_PUTCHAR,
TOKEN_SETCHAR,
TOKEN_PUTCHAR,
TOKEN_GETCHAR,
TOKEN_PUTCOLOR,
TOKEN_GETCOLOR,
TOKEN_KEYPRESSED,
TOKEN_ANYKEY,
TOKEN_UPDATESCR,
@@ -80,6 +85,7 @@ void tkn_init(const char* buffer);
void tkn_next();
t_tokentype tkn_get_token();
char* tkn_get_string();
unsigned char* tkn_get_array();
int tkn_get_value();
int tkn_get_line();
int tkn_get_row();

20
vdp.cpp
View File

@@ -15,6 +15,10 @@
#define VDP_CMD_COLOR 7
#define VDP_CMD_BORDER 8
#define VDP_CMD_CLRSCR 9
#define VDP_CMD_MOVE 10
#define VDP_CMD_GETCHAR 11
#define VDP_CMD_GETCOLOR 12
#define VDP_CMD_PUTCOLOR 13
struct t_sprite {
Uint8 x = 0;
@@ -166,6 +170,8 @@ void vdp_cmd_out(const unsigned char& value) {
switch (value) {
case VDP_CMD_LOCATE:
cursor_x = data_stack[--data_stack_pos]; cursor_y = data_stack[--data_stack_pos]; break;
case VDP_CMD_MOVE:
cursor_x += data_stack[--data_stack_pos]; cursor_y += data_stack[--data_stack_pos]; break;
case VDP_CMD_PRINT:
for (int i = data_stack_pos-1; i >= 0; i--) {
screen_map[cursor_x + (cursor_y << 4)] = data_stack[i];
@@ -177,7 +183,17 @@ void vdp_cmd_out(const unsigned char& value) {
cursor_x = data_stack[data_stack_pos - 1];
cursor_y = data_stack[data_stack_pos - 2];
screen_map[cursor_x + (cursor_y << 4)] = data_stack[data_stack_pos-3];
screen_color[cursor_x + (cursor_y << 4)] = data_stack[data_stack_pos - 4];
break;
case VDP_CMD_PUTCOLOR:
cursor_x = data_stack[data_stack_pos - 1];
cursor_y = data_stack[data_stack_pos - 2];
screen_color[cursor_x + (cursor_y << 4)] = data_stack[data_stack_pos - 3];
break;
case VDP_CMD_GETCHAR:
data_stack[0] = screen_map[data_stack[1] + (data_stack[0] << 4)];
break;
case VDP_CMD_GETCOLOR:
data_stack[0] = screen_color[data_stack[1] + (data_stack[0] << 4)];
break;
case VDP_CMD_SETCHAR:
n = data_stack[data_stack_pos - 1];
@@ -218,7 +234,7 @@ void vdp_cmd_out(const unsigned char& value) {
}
unsigned char vdp_in() {
return 0;
return data_stack[0];
}
/*int main(int argc, char* argv[]) {

88
vm.cpp
View File

@@ -13,84 +13,6 @@
typedef unsigned char byte;
typedef unsigned short word;
/*enum OPS {
OP_NOP = 0,
OP_PUSH,
OP_POP,
OP_DUP,
OP_SWAP,
OP_LOAD,
OP_LOADI,
OP_STORE,
OP_STOREI,
OP_LOADXY,
OP_STOREXY,
OP_SETX,
OP_SETY,
OP_SETZ,
OP_GETY,
OP_GETZ,
OP_INCX,
OP_DECX,
OP_INCY,
OP_DECY,
OP_INCZ,
OP_DECZ,
OP_JMP,
OP_JNT,
OP_JTR,
OP_JSR,
OP_RET,
OP_CALL,
OP_RJ,
OP_RB,
OP_RJZ,
OP_RJN,
OP_RBZ,
OP_RBN,
OP_RJYZ,
OP_RJYN,
OP_RBYZ,
OP_RBYN,
OP_RJZZ,
OP_RJZN,
OP_RBZZ,
OP_RBZN,
OP_ADD,
OP_SUB,
OP_MUL,
OP_DIV,
OP_MOD,
OP_AND,
OP_OR,
OP_NOT,
OP_NEG,
OP_INC,
OP_DEC,
OP_CONCAT,
OP_EQ,
OP_NEQ,
OP_LT,
OP_GT,
OP_LEQ,
OP_GEQ,
OP_IN,
OP_OUT,
OP_SLEEP,
};*/
/*typedef void(*t_extcall)(t_stack&);
t_extcall external_calls[MAX_EXTERNAL_CALLS];
int numcallbacks = 0;*/
typedef void(*t_out_port)(const byte&);
typedef byte(*t_in_port)();
static t_out_port out_ports[256];
@@ -215,13 +137,13 @@ const unsigned short vm_step() {
case OP_RJZN: if (rZ != 0) vm_pc += vm_program[vm_pc]; else vm_pc++; vm_cycles++; break;
case OP_RBZZ: if (rZ == 0) vm_pc -= vm_program[vm_pc] + 1; else vm_pc++; vm_cycles++; break;
case OP_RBZN: if (rZ != 0) vm_pc -= vm_program[vm_pc] + 1; else vm_pc++; vm_cycles++; break;
case OP_ADD: GRAB(ds); PUSH(ds, a + b); vm_cycles++; break;
case OP_SUB: GRAB(ds); PUSH(ds, a - b); vm_cycles++; break;
case OP_MUL: GRAB(ds); PUSH(ds, a * b); vm_cycles++; break;
case OP_ADD: GRAB(ds); PUSH(ds, b + a); vm_cycles++; break;
case OP_SUB: GRAB(ds); PUSH(ds, b - a); vm_cycles++; break;
case OP_MUL: GRAB(ds); PUSH(ds, b * a); vm_cycles++; break;
case OP_DIV: GRAB(ds); PUSH(ds, b / a); vm_cycles++; break;
case OP_MOD: GRAB(ds); PUSH(ds, b % a); vm_cycles++; break;
case OP_AND: GRAB(ds); PUSH(ds, a & b); vm_cycles++; break;
case OP_OR: GRAB(ds); PUSH(ds, a | b); vm_cycles++; break;
case OP_AND: GRAB(ds); PUSH(ds, b & a); vm_cycles++; break;
case OP_OR: GRAB(ds); PUSH(ds, b | a); vm_cycles++; break;
case OP_NOT: a = POP(ds); PUSH(ds, !a); vm_cycles++; break;
case OP_NEG: a = POP(ds); PUSH(ds, -a); vm_cycles++; break;
case OP_INC: a = POP(ds); PUSH(ds, a + 1); vm_cycles++; break;