diff --git a/main.cpp b/main.cpp index 9071887..66bdaae 100644 --- a/main.cpp +++ b/main.cpp @@ -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); diff --git a/parser.cpp b/parser.cpp index 6184125..1c89840 100644 --- a/parser.cpp +++ b/parser.cpp @@ -29,9 +29,9 @@ struct t_external_function { }; struct t_string { - char string[256]; - word references[256]; - int num_references = 1; + unsigned char string[256]; + word references[256]; + int num_references = 1; }; struct t_constant { @@ -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 diff --git a/rom.bin b/rom.bin index c1147cc..a49f765 100644 Binary files a/rom.bin and b/rom.bin differ diff --git a/rom.lbl b/rom.lbl index ecfd8b8..85dfd0f 100644 Binary files a/rom.lbl and b/rom.lbl differ diff --git a/sound.cpp b/sound.cpp index f199037..a1044d8 100644 --- a/sound.cpp +++ b/sound.cpp @@ -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; diff --git a/test.bas b/test.bas index 8179356..ab40f1a 100644 --- a/test.bas +++ b/test.bas @@ -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 - ELSE - IF KEYPRESSED BTN_DOWN THEN - INC P1_Y INC P1_Y - IF P1_Y > 88 THEN P1_Y = 88 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 + 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 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 diff --git a/tokenizer.cpp b/tokenizer.cpp index 4b9b5ef..6958247 100644 --- a/tokenizer.cpp +++ b/tokenizer.cpp @@ -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; } diff --git a/tokenizer.h b/tokenizer.h index f5bbef3..c20ae3a 100644 --- a/tokenizer.h +++ b/tokenizer.h @@ -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(); diff --git a/vdp.cpp b/vdp.cpp index cff0863..1c6a626 100644 --- a/vdp.cpp +++ b/vdp.cpp @@ -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[]) { diff --git a/vm.cpp b/vm.cpp index c47b609..dafb43e 100644 --- a/vm.cpp +++ b/vm.cpp @@ -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;