implemented hexstrings, implemented MOVE, PUTCOLOR, GETCHAR, GETCOLOR, modified PUTCHAR, several fixes.
This commit is contained in:
2
main.cpp
2
main.cpp
@@ -43,6 +43,8 @@ int main(int argc, char** argv) {
|
|||||||
vdp_init();
|
vdp_init();
|
||||||
vm_register_out_port(10, vdp_data_out);
|
vm_register_out_port(10, vdp_data_out);
|
||||||
vm_register_out_port(11, vdp_cmd_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_out_port(20, input_data_in);
|
||||||
vm_register_in_port(21, input_data_out);
|
vm_register_in_port(21, input_data_out);
|
||||||
|
|
||||||
|
|||||||
85
parser.cpp
85
parser.cpp
@@ -29,7 +29,7 @@ struct t_external_function {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct t_string {
|
struct t_string {
|
||||||
char string[256];
|
unsigned char string[256];
|
||||||
word references[256];
|
word references[256];
|
||||||
int num_references = 1;
|
int num_references = 1;
|
||||||
};
|
};
|
||||||
@@ -208,12 +208,35 @@ static void generate_anonymous_labelname(char* dest) {
|
|||||||
/****************************************************************************************/
|
/****************************************************************************************/
|
||||||
/* STRING MANAGEMENT */
|
/* 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) {
|
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++) {
|
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();
|
strings[num_strings++].references[0] = get_current_address();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -224,9 +247,9 @@ static void append_strings() {
|
|||||||
emmit(num_strings);
|
emmit(num_strings);
|
||||||
for (int i = 0; i < num_strings; i++) {
|
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()); }
|
for (int j = 0; j < strings[i].num_references; j++) { patch(strings[i].references[j], get_current_address()); }
|
||||||
char len = strlen(strings[i].string);
|
//char len = strings[i].string[0];
|
||||||
emmit(len);
|
//emmit(len);
|
||||||
for (int j = 0; j < len; j++) { emmit(strings[i].string[j]); }
|
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_strlen();
|
||||||
static void parse_keypressed();
|
static void parse_keypressed();
|
||||||
static void parse_anykey();
|
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; }
|
#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();
|
tkn_next();
|
||||||
return;
|
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) {
|
if (tkn_get_token() == TOKEN_IDENTIFIER) {
|
||||||
int ivar = get_variable_index(tkn_get_string());
|
int ivar = get_variable_index(tkn_get_string());
|
||||||
if (!is_variable_array()) { parser_finished = true; error_raise("Expected string constant or variable"); return; }
|
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_STRLEN) { tkn_next(); parse_strlen(); return; }
|
||||||
if (tkn_get_token() == TOKEN_KEYPRESSED) { tkn_next(); parse_keypressed(); 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_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");
|
parser_finished = true; error_raise("Syntax error");
|
||||||
return;
|
return;
|
||||||
@@ -690,6 +725,13 @@ static void parse_locate() {
|
|||||||
emmit_w(get_label_address("_sys_vdp_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() {
|
static void parse_print() {
|
||||||
parse_concatenation();
|
parse_concatenation();
|
||||||
emmit(OP_JSR);
|
emmit(OP_JSR);
|
||||||
@@ -700,11 +742,32 @@ static void parse_putchar() {
|
|||||||
parse_expression();
|
parse_expression();
|
||||||
parse_expression();
|
parse_expression();
|
||||||
parse_expression();
|
parse_expression();
|
||||||
parse_expression();
|
|
||||||
emmit(OP_JSR);
|
emmit(OP_JSR);
|
||||||
emmit_w(get_label_address("_sys_vdp_putchar"));
|
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() {
|
static void parse_setchar() {
|
||||||
parse_expression();
|
parse_expression();
|
||||||
parse_concatenation();
|
parse_concatenation();
|
||||||
@@ -824,10 +887,18 @@ static void parse_statements() {
|
|||||||
tkn_next(); parse_putsprite(); break;
|
tkn_next(); parse_putsprite(); break;
|
||||||
case TOKEN_LOCATE:
|
case TOKEN_LOCATE:
|
||||||
tkn_next(); parse_locate(); break;
|
tkn_next(); parse_locate(); break;
|
||||||
|
case TOKEN_MOVE:
|
||||||
|
tkn_next(); parse_move(); break;
|
||||||
case TOKEN_PRINT:
|
case TOKEN_PRINT:
|
||||||
tkn_next(); parse_print(); break;
|
tkn_next(); parse_print(); break;
|
||||||
case TOKEN_PUTCHAR:
|
case TOKEN_PUTCHAR:
|
||||||
tkn_next(); parse_putchar(); break;
|
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:
|
case TOKEN_SETCHAR:
|
||||||
tkn_next(); parse_setchar(); break;
|
tkn_next(); parse_setchar(); break;
|
||||||
//case TOKEN_KEYPRESSED: <--- Parsed in parse_expr_atom
|
//case TOKEN_KEYPRESSED: <--- Parsed in parse_expr_atom
|
||||||
|
|||||||
24
sound.cpp
24
sound.cpp
@@ -34,26 +34,26 @@ private:
|
|||||||
char note = 0;
|
char note = 0;
|
||||||
char param = -1;
|
char param = -1;
|
||||||
switch (song[pos++]) {
|
switch (song[pos++]) {
|
||||||
case 'b': note += 2;
|
case 'B': note += 2;
|
||||||
case 'a': note += 2;
|
case 'A': note += 2;
|
||||||
case 'g': note += 2;
|
case 'G': note += 2;
|
||||||
case 'f': note += 1;
|
case 'F': note += 1;
|
||||||
case 'e': note += 2;
|
case 'E': note += 2;
|
||||||
case 'd': note += 2;
|
case 'D': note += 2;
|
||||||
case 'c':
|
case 'C':
|
||||||
param = song[pos];
|
param = song[pos];
|
||||||
if (param == '#' || param == '+') { note++; param = song[++pos]; } else if (param == '-') { note--; 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 (param >= 48 && param <= 57) { param -= 48; pos++; } else { param = -1; }
|
||||||
if (song[pos] == '.') { multip = 1.5f; pos++; }
|
if (song[pos] == '.') { multip = 1.5f; pos++; }
|
||||||
program_pipeline(note, param, multip);
|
program_pipeline(note, param, multip);
|
||||||
return true;
|
return true;
|
||||||
case 'r':
|
case 'R':
|
||||||
param = song[pos];
|
param = song[pos];
|
||||||
if (param >= 48 && param <= 57) { param -= 48; pos++; } else { param = -1; }
|
if (param >= 48 && param <= 57) { param -= 48; pos++; } else { param = -1; }
|
||||||
if (song[pos] == '.') { multip = 1.5f; pos++; }
|
if (song[pos] == '.') { multip = 1.5f; pos++; }
|
||||||
program_pipeline(100, param, multip);
|
program_pipeline(100, param, multip);
|
||||||
return true;
|
return true;
|
||||||
case 'o':
|
case 'O':
|
||||||
param = song[pos];
|
param = song[pos];
|
||||||
if (param >= 48 && param <= 57) { octave = (param - 48) % 8; pos++; }
|
if (param >= 48 && param <= 57) { octave = (param - 48) % 8; pos++; }
|
||||||
break;
|
break;
|
||||||
@@ -63,17 +63,17 @@ private:
|
|||||||
case '<':
|
case '<':
|
||||||
octave = (octave - 1) % 8;
|
octave = (octave - 1) % 8;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'L':
|
||||||
param = song[pos];
|
param = song[pos];
|
||||||
if (param >= 48 && param <= 57) { default_length = lengths[param - 48]; 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++; }
|
||||||
else if (param == '-') { default_length /= 2; pos++; }
|
else if (param == '-') { default_length /= 2; pos++; }
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'V':
|
||||||
param = song[pos];
|
param = song[pos];
|
||||||
if (param >= 48 && param <= 57) { volume = (param - 48) << 4; pos++; }
|
if (param >= 48 && param <= 57) { volume = (param - 48) << 4; pos++; }
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 'T':
|
||||||
param = song[pos];
|
param = song[pos];
|
||||||
if (param >= 48 && param <= 57) { tempo = tempos[param - 48] * 10; pos++; }
|
if (param >= 48 && param <= 57) { tempo = tempos[param - 48] * 10; pos++; }
|
||||||
break;
|
break;
|
||||||
|
|||||||
263
test.bas
263
test.bas
@@ -1,24 +1,25 @@
|
|||||||
SETMUSIC 0 "l5cccfrf>l6c." PLAYMUSIC
|
SETMUSIC 0 "L5CCCFRF>L6C." PLAYMUSIC
|
||||||
START:
|
START:
|
||||||
BORDER INK_BLACK
|
BORDER INK_GRAY
|
||||||
COLOR INK_WHITE + PAPER_BLACK
|
COLOR INK_RED + PAPER_BLACK
|
||||||
CLS
|
CLS
|
||||||
LOCATE 4 2 PRINT CHR &h87, CHR &h85, CHR &h87, CHR &h85, CHR &h87, CHR &h85, CHR &h87, CHR &h81
|
LOCATE 0 1 PRINT !8A87858A87858A8783888F8D8A858E81
|
||||||
LOCATE 4 3 PRINT CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h85, CHR &h84
|
LOCATE 0 2 PRINT !8A878B8A878B8A87818A8D8F8A8F8D80
|
||||||
LOCATE 4 4 PRINT CHR &h87, CHR &h81, CHR &h8D, CHR &h85, CHR &h85, CHR &h85, CHR &h8D, CHR &h85
|
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
|
W = 0
|
||||||
MENU_BLINK:
|
MENU_BLINK:
|
||||||
LOCATE 3 8 PRINT "PRESS CTRL"
|
LOCATE 0 9 PRINT "PRESS A TO START"
|
||||||
LOCATE 4 9 PRINT "TO PLAY"
|
|
||||||
UPDATESCR
|
UPDATESCR
|
||||||
INC W
|
INC W
|
||||||
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
|
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
|
||||||
IF W < 25 THEN
|
IF W < 25 THEN GOTO MENU_BLINK END
|
||||||
GOTO MENU_BLINK
|
|
||||||
END
|
|
||||||
MENU_BLINK2:
|
MENU_BLINK2:
|
||||||
LOCATE 3 8 PRINT " "
|
LOCATE 0 9 PRINT " "
|
||||||
LOCATE 4 9 PRINT " "
|
|
||||||
UPDATESCR
|
UPDATESCR
|
||||||
INC W
|
INC W
|
||||||
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
|
IF KEYPRESSED BTN_A THEN GOTO INIT_GAME END
|
||||||
@@ -26,184 +27,70 @@ MENU_BLINK2:
|
|||||||
W = 0
|
W = 0
|
||||||
GOTO MENU_BLINK
|
GOTO MENU_BLINK
|
||||||
INIT_GAME:
|
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
|
CLS
|
||||||
GOSUB DRAW_NET
|
X = 64 ' X DE LA PALA
|
||||||
GOSUB DRAW_SCORE
|
BX = 64 BY = 48 ' X I Y DE LA BOLA
|
||||||
GOSUB DRAW_P1
|
DX = 1 DY = 1 ' VELOCITAT EN X I Y DE LA BOLA
|
||||||
GOSUB DRAW_P2
|
' 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:
|
MAIN_GAME:
|
||||||
IF (P1_SCORE = 10) OR (P2_SCORE = 10) THEN GOTO END_GAME END
|
' MOVIMENT DE LA PALA
|
||||||
GOSUB DRAW_BALL
|
IF KEYPRESSED BTN_LEFT THEN GOSUB MOVE_LEFT END
|
||||||
TIME = 32
|
IF KEYPRESSED BTN_RIGHT THEN GOSUB MOVE_RIGHT END
|
||||||
PRE_GAME:
|
|
||||||
GOSUB PROCESS_PLAYER1
|
' MOVIMENT DE LA BOLA
|
||||||
DEC TIME
|
BX = BX + DX
|
||||||
UPDATESCR
|
IF BX >= 131 THEN BX = 131 DX = -DX END
|
||||||
IF TIME > 0 THEN GOTO PRE_GAME END
|
IF BX <= 5 THEN BX = 5 DX = -DX END
|
||||||
GAME:
|
BY = BY + DY
|
||||||
GOSUB PROCESS_PLAYER1
|
IF BY >= 99 THEN BY = 99 DY = -DY END
|
||||||
GOSUB PROCESS_PLAYER2
|
IF BY <= 5 THEN BY = 5 DY = -DY END
|
||||||
GOSUB MOVE_BALL
|
TX = (BX-5)/8
|
||||||
IF (BALL_X > 8) AND (BALL_X < 14) THEN GOSUB BOUNCE_P1 END
|
TY = (BY-5)/8
|
||||||
IF (BALL_X < 128) AND (BALL_X > 122) THEN GOSUB BOUNCE_P2 END
|
CHAR = GETCHAR TX TY
|
||||||
IF (BALL_X > 135) THEN
|
IF NOT(CHAR = 32) THEN
|
||||||
INC P1_SCORE
|
PUTCHAR TX TY 32
|
||||||
BALL_X = 67
|
IF TX MOD 2 = 0 THEN
|
||||||
BALL_Y = 48
|
PUTCHAR TX+1 TY 32
|
||||||
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
|
ELSE
|
||||||
IF KEYPRESSED BTN_DOWN THEN
|
PUTCHAR TX-1 TY 32
|
||||||
INC P1_Y INC P1_Y
|
|
||||||
IF P1_Y > 88 THEN P1_Y = 88 END
|
|
||||||
GOSUB DRAW_P1
|
|
||||||
END
|
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
|
END
|
||||||
RETURN
|
|
||||||
PROCESS_PLAYER2:
|
|
||||||
IF BALL_Y < P2_Y+8 THEN DEC P2_Y END
|
' PINTEM SPRITES
|
||||||
IF BALL_Y > P2_Y+8 THEN INC P2_Y END
|
PUTSPRITE 0 BX BY
|
||||||
GOSUB DRAW_P2
|
PUTSPRITE 1 X 96
|
||||||
RETURN
|
PUTSPRITE 2 X+8 96
|
||||||
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
|
|
||||||
UPDATESCR
|
UPDATESCR
|
||||||
SETMUSIC 0 "l5o5ccr<a#argrfrrr<f" PLAYMUSIC
|
GOTO MAIN_GAME
|
||||||
WAIT 4
|
LOOP: GOTO LOOP
|
||||||
PUTSPRITE 0 0 0
|
MOVE_LEFT: IF X > 8 THEN X = X - 4 END RETURN
|
||||||
PUTSPRITE 1 0 0
|
MOVE_RIGHT: IF X < 120 THEN X = X + 4 END RETURN
|
||||||
PUTSPRITE 2 0 0
|
|
||||||
PUTSPRITE 3 0 0
|
|
||||||
PUTSPRITE 4 0 0
|
|
||||||
GOTO START
|
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
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ static bool streq(const char* a, const char* b) {
|
|||||||
static const char* ptr;
|
static const char* ptr;
|
||||||
static t_tokentype current_token = TOKEN_ERROR;
|
static t_tokentype current_token = TOKEN_ERROR;
|
||||||
static char identifier[255];
|
static char identifier[255];
|
||||||
|
static unsigned char array[255];
|
||||||
static int value;
|
static int value;
|
||||||
static int line = 0;
|
static int line = 0;
|
||||||
static int row = 0;
|
static int row = 0;
|
||||||
@@ -54,9 +55,13 @@ t_token_op tkn_tokens[] = {
|
|||||||
{ "setsprite", TOKEN_SETSPRITE },
|
{ "setsprite", TOKEN_SETSPRITE },
|
||||||
{ "putsprite", TOKEN_PUTSPRITE },
|
{ "putsprite", TOKEN_PUTSPRITE },
|
||||||
{ "locate", TOKEN_LOCATE },
|
{ "locate", TOKEN_LOCATE },
|
||||||
|
{ "move", TOKEN_MOVE },
|
||||||
{ "print", TOKEN_PRINT },
|
{ "print", TOKEN_PRINT },
|
||||||
{ "putchar", TOKEN_PUTCHAR },
|
|
||||||
{ "setchar", TOKEN_SETCHAR },
|
{ "setchar", TOKEN_SETCHAR },
|
||||||
|
{ "putchar", TOKEN_PUTCHAR },
|
||||||
|
{ "getchar", TOKEN_GETCHAR },
|
||||||
|
{ "putcolor", TOKEN_PUTCOLOR },
|
||||||
|
{ "getcolor", TOKEN_GETCOLOR },
|
||||||
{ "keypressed", TOKEN_KEYPRESSED },
|
{ "keypressed", TOKEN_KEYPRESSED },
|
||||||
{ "anykey", TOKEN_ANYKEY },
|
{ "anykey", TOKEN_ANYKEY },
|
||||||
{ "updatescr", TOKEN_UPDATESCR },
|
{ "updatescr", TOKEN_UPDATESCR },
|
||||||
@@ -86,6 +91,17 @@ static void tkn_do_next() {
|
|||||||
if (CCHR == 0) { current_token = TOKEN_ENDFILE; return; }
|
if (CCHR == 0) { current_token = TOKEN_ENDFILE; return; }
|
||||||
// if 13, we are at the end of the line
|
// if 13, we are at the end of the line
|
||||||
if (CCHR == 10) { NEXT; current_token = TOKEN_ENDLINE; return; }
|
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 34, grab the string
|
||||||
if (CCHR == 34) {
|
if (CCHR == 34) {
|
||||||
NEXT;
|
NEXT;
|
||||||
@@ -161,13 +177,14 @@ void tkn_init(const char* buffer) {
|
|||||||
ptr = buffer;
|
ptr = buffer;
|
||||||
current_token = TOKEN_ERROR;
|
current_token = TOKEN_ERROR;
|
||||||
value = line = row = current_tokenline = current_tokenrow = 0;
|
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); }
|
void tkn_next() { do { tkn_do_next(); } while (current_token == TOKEN_REM || current_token == TOKEN_ENDLINE); }
|
||||||
|
|
||||||
t_tokentype tkn_get_token() { return current_token; }
|
t_tokentype tkn_get_token() { return current_token; }
|
||||||
char* tkn_get_string() { return identifier; }
|
char* tkn_get_string() { return identifier; }
|
||||||
|
unsigned char* tkn_get_array() { return array; }
|
||||||
int tkn_get_value() { return value; }
|
int tkn_get_value() { return value; }
|
||||||
int tkn_get_line() { return current_tokenline; }
|
int tkn_get_line() { return current_tokenline; }
|
||||||
int tkn_get_row() { return current_tokenrow; }
|
int tkn_get_row() { return current_tokenrow; }
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ enum t_tokentype {
|
|||||||
TOKEN_ERROR,
|
TOKEN_ERROR,
|
||||||
TOKEN_NUMBER,
|
TOKEN_NUMBER,
|
||||||
TOKEN_STRING,
|
TOKEN_STRING,
|
||||||
|
TOKEN_HEXSTRING,
|
||||||
|
|
||||||
TOKEN_IDENTIFIER,
|
TOKEN_IDENTIFIER,
|
||||||
TOKEN_LABEL,
|
TOKEN_LABEL,
|
||||||
@@ -59,9 +60,13 @@ enum t_tokentype {
|
|||||||
TOKEN_SETSPRITE,
|
TOKEN_SETSPRITE,
|
||||||
TOKEN_PUTSPRITE,
|
TOKEN_PUTSPRITE,
|
||||||
TOKEN_LOCATE,
|
TOKEN_LOCATE,
|
||||||
|
TOKEN_MOVE,
|
||||||
TOKEN_PRINT,
|
TOKEN_PRINT,
|
||||||
TOKEN_PUTCHAR,
|
|
||||||
TOKEN_SETCHAR,
|
TOKEN_SETCHAR,
|
||||||
|
TOKEN_PUTCHAR,
|
||||||
|
TOKEN_GETCHAR,
|
||||||
|
TOKEN_PUTCOLOR,
|
||||||
|
TOKEN_GETCOLOR,
|
||||||
TOKEN_KEYPRESSED,
|
TOKEN_KEYPRESSED,
|
||||||
TOKEN_ANYKEY,
|
TOKEN_ANYKEY,
|
||||||
TOKEN_UPDATESCR,
|
TOKEN_UPDATESCR,
|
||||||
@@ -80,6 +85,7 @@ void tkn_init(const char* buffer);
|
|||||||
void tkn_next();
|
void tkn_next();
|
||||||
t_tokentype tkn_get_token();
|
t_tokentype tkn_get_token();
|
||||||
char* tkn_get_string();
|
char* tkn_get_string();
|
||||||
|
unsigned char* tkn_get_array();
|
||||||
int tkn_get_value();
|
int tkn_get_value();
|
||||||
int tkn_get_line();
|
int tkn_get_line();
|
||||||
int tkn_get_row();
|
int tkn_get_row();
|
||||||
|
|||||||
20
vdp.cpp
20
vdp.cpp
@@ -15,6 +15,10 @@
|
|||||||
#define VDP_CMD_COLOR 7
|
#define VDP_CMD_COLOR 7
|
||||||
#define VDP_CMD_BORDER 8
|
#define VDP_CMD_BORDER 8
|
||||||
#define VDP_CMD_CLRSCR 9
|
#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 {
|
struct t_sprite {
|
||||||
Uint8 x = 0;
|
Uint8 x = 0;
|
||||||
@@ -166,6 +170,8 @@ void vdp_cmd_out(const unsigned char& value) {
|
|||||||
switch (value) {
|
switch (value) {
|
||||||
case VDP_CMD_LOCATE:
|
case VDP_CMD_LOCATE:
|
||||||
cursor_x = data_stack[--data_stack_pos]; cursor_y = data_stack[--data_stack_pos]; break;
|
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:
|
case VDP_CMD_PRINT:
|
||||||
for (int i = data_stack_pos-1; i >= 0; i--) {
|
for (int i = data_stack_pos-1; i >= 0; i--) {
|
||||||
screen_map[cursor_x + (cursor_y << 4)] = data_stack[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_x = data_stack[data_stack_pos - 1];
|
||||||
cursor_y = data_stack[data_stack_pos - 2];
|
cursor_y = data_stack[data_stack_pos - 2];
|
||||||
screen_map[cursor_x + (cursor_y << 4)] = data_stack[data_stack_pos-3];
|
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;
|
break;
|
||||||
case VDP_CMD_SETCHAR:
|
case VDP_CMD_SETCHAR:
|
||||||
n = data_stack[data_stack_pos - 1];
|
n = data_stack[data_stack_pos - 1];
|
||||||
@@ -218,7 +234,7 @@ void vdp_cmd_out(const unsigned char& value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned char vdp_in() {
|
unsigned char vdp_in() {
|
||||||
return 0;
|
return data_stack[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*int main(int argc, char* argv[]) {
|
/*int main(int argc, char* argv[]) {
|
||||||
|
|||||||
88
vm.cpp
88
vm.cpp
@@ -13,84 +13,6 @@
|
|||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
typedef unsigned short word;
|
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 void(*t_out_port)(const byte&);
|
||||||
typedef byte(*t_in_port)();
|
typedef byte(*t_in_port)();
|
||||||
static t_out_port out_ports[256];
|
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_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_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_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_ADD: GRAB(ds); PUSH(ds, b + a); vm_cycles++; break;
|
||||||
case OP_SUB: GRAB(ds); PUSH(ds, a - b); vm_cycles++; break;
|
case OP_SUB: GRAB(ds); PUSH(ds, b - a); vm_cycles++; break;
|
||||||
case OP_MUL: GRAB(ds); PUSH(ds, a * b); 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_DIV: GRAB(ds); PUSH(ds, b / a); vm_cycles++; break;
|
||||||
case OP_MOD: 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_AND: GRAB(ds); PUSH(ds, b & a); vm_cycles++; break;
|
||||||
case OP_OR: GRAB(ds); PUSH(ds, a | b); 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_NOT: a = POP(ds); PUSH(ds, !a); vm_cycles++; break;
|
||||||
case OP_NEG: 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;
|
case OP_INC: a = POP(ds); PUSH(ds, a + 1); vm_cycles++; break;
|
||||||
|
|||||||
Reference in New Issue
Block a user