mirror of
https://github.com/bradgrantham/apple2a.git
synced 2024-11-27 03:49:31 +00:00
Add NEW; report line number of error.
This commit is contained in:
parent
e3f29f7dc5
commit
109a0af072
61
main.c
61
main.c
@ -25,6 +25,7 @@ uint8_t title_length = 9;
|
|||||||
#define T_LIST 0x82
|
#define T_LIST 0x82
|
||||||
#define T_POKE 0x83
|
#define T_POKE 0x83
|
||||||
#define T_RUN 0x84
|
#define T_RUN 0x84
|
||||||
|
#define T_NEW 0x85
|
||||||
|
|
||||||
// Line number used for "no line number".
|
// Line number used for "no line number".
|
||||||
#define INVALID_LINE_NUMBER 0xFFFF
|
#define INVALID_LINE_NUMBER 0xFFFF
|
||||||
@ -36,6 +37,7 @@ static uint8_t *TOKEN[] = {
|
|||||||
"LIST",
|
"LIST",
|
||||||
"POKE",
|
"POKE",
|
||||||
"RUN",
|
"RUN",
|
||||||
|
"NEW",
|
||||||
};
|
};
|
||||||
static int16_t TOKEN_COUNT = sizeof(TOKEN)/sizeof(TOKEN[0]);
|
static int16_t TOKEN_COUNT = sizeof(TOKEN)/sizeof(TOKEN[0]);
|
||||||
|
|
||||||
@ -111,6 +113,14 @@ static uint8_t *get_end_of_program(uint8_t *line) {
|
|||||||
return line + 2;
|
return line + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the stored program.
|
||||||
|
*/
|
||||||
|
static void new_statement() {
|
||||||
|
g_program[0] = '\0';
|
||||||
|
g_program[1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List the stored program.
|
* List the stored program.
|
||||||
*/
|
*/
|
||||||
@ -184,6 +194,16 @@ static uint16_t parse_uint16(uint8_t **s_ptr) {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate code to put the value into AX.
|
||||||
|
*/
|
||||||
|
static void compile_load_ax(uint16_t value) {
|
||||||
|
g_compiled[g_compiled_length++] = I_LDX;
|
||||||
|
g_compiled[g_compiled_length++] = value >> 8;
|
||||||
|
g_compiled[g_compiled_length++] = I_LDA;
|
||||||
|
g_compiled[g_compiled_length++] = value & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse an expression, generating code to compute it, leaving the
|
* Parse an expression, generating code to compute it, leaving the
|
||||||
* result in AX.
|
* result in AX.
|
||||||
@ -203,10 +223,7 @@ static uint8_t *compile_expression(uint8_t *s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
value = parse_uint16(&s);
|
value = parse_uint16(&s);
|
||||||
g_compiled[g_compiled_length++] = I_LDX;
|
compile_load_ax(value);
|
||||||
g_compiled[g_compiled_length++] = value >> 8;
|
|
||||||
g_compiled[g_compiled_length++] = I_LDA;
|
|
||||||
g_compiled[g_compiled_length++] = value & 0xFF;
|
|
||||||
have_value_in_ax = 1;
|
have_value_in_ax = 1;
|
||||||
} else if (*s == '+') {
|
} else if (*s == '+') {
|
||||||
plus_count += 1;
|
plus_count += 1;
|
||||||
@ -301,7 +318,7 @@ static void set_up_compile(void) {
|
|||||||
/**
|
/**
|
||||||
* Compile the tokenized line of BASIC, adding it to the g_compiled binary.
|
* Compile the tokenized line of BASIC, adding it to the g_compiled binary.
|
||||||
*/
|
*/
|
||||||
static void compile_buffer(uint8_t *buffer) {
|
static void compile_buffer(uint8_t *buffer, uint16_t line_number) {
|
||||||
uint8_t *s = buffer;
|
uint8_t *s = buffer;
|
||||||
uint8_t done;
|
uint8_t done;
|
||||||
|
|
||||||
@ -366,8 +383,13 @@ static void compile_buffer(uint8_t *buffer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
if (line_number != INVALID_LINE_NUMBER) {
|
||||||
|
compile_load_ax(line_number);
|
||||||
|
add_call(syntax_error_in_line);
|
||||||
|
} else {
|
||||||
add_call(syntax_error);
|
add_call(syntax_error);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} while (!done);
|
} while (!done);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,12 +427,14 @@ static void compile_stored_program(void) {
|
|||||||
uint8_t *line = g_program;
|
uint8_t *line = g_program;
|
||||||
uint8_t *next_line;
|
uint8_t *next_line;
|
||||||
|
|
||||||
|
set_up_compile();
|
||||||
while ((next_line = get_next_line(line)) != 0) {
|
while ((next_line = get_next_line(line)) != 0) {
|
||||||
uint16_t line_number = get_line_number(line);
|
uint16_t line_number = get_line_number(line);
|
||||||
compile_buffer(line + 4);
|
compile_buffer(line + 4, line_number);
|
||||||
|
|
||||||
line = next_line;
|
line = next_line;
|
||||||
}
|
}
|
||||||
|
complete_compile_and_execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -427,15 +451,18 @@ static void process_input_buffer() {
|
|||||||
if (line_number == INVALID_LINE_NUMBER) {
|
if (line_number == INVALID_LINE_NUMBER) {
|
||||||
// Immediate mode.
|
// Immediate mode.
|
||||||
|
|
||||||
set_up_compile();
|
|
||||||
// See if it's the "RUN" command, which we don't compile.
|
|
||||||
if (g_input_buffer[0] == T_RUN) {
|
if (g_input_buffer[0] == T_RUN) {
|
||||||
|
// We don't compile "RUN".
|
||||||
compile_stored_program();
|
compile_stored_program();
|
||||||
|
} else if (g_input_buffer[0] == T_NEW) {
|
||||||
|
// We don't compile "NEW".
|
||||||
|
new_statement();
|
||||||
} else {
|
} else {
|
||||||
// Compile the immediate mode line.
|
// Compile the immediate mode line.
|
||||||
compile_buffer(g_input_buffer);
|
set_up_compile();
|
||||||
}
|
compile_buffer(g_input_buffer, INVALID_LINE_NUMBER);
|
||||||
complete_compile_and_execute();
|
complete_compile_and_execute();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Stored mode. Add line to program.
|
// Stored mode. Add line to program.
|
||||||
|
|
||||||
@ -502,18 +529,8 @@ int16_t main(void)
|
|||||||
{
|
{
|
||||||
int16_t blink;
|
int16_t blink;
|
||||||
|
|
||||||
/*
|
// Clear stored program.
|
||||||
int16_t i, j, k;
|
new_statement();
|
||||||
|
|
||||||
i = 2;
|
|
||||||
j = 3;
|
|
||||||
k = 4;
|
|
||||||
i = i*j;
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Blank program.
|
|
||||||
g_program[0] = '\0';
|
|
||||||
g_program[1] = '\0';
|
|
||||||
|
|
||||||
// Initialize UI.
|
// Initialize UI.
|
||||||
home();
|
home();
|
||||||
|
10
runtime.c
10
runtime.c
@ -184,3 +184,13 @@ void syntax_error(void) {
|
|||||||
print("\n?SYNTAX ERROR");
|
print("\n?SYNTAX ERROR");
|
||||||
// No linefeed, assume prompt will do it.
|
// No linefeed, assume prompt will do it.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a syntax error message for stored program.
|
||||||
|
*/
|
||||||
|
void syntax_error_in_line(uint16_t line_number) {
|
||||||
|
print("\n?SYNTAX ERROR IN ");
|
||||||
|
print_int(line_number);
|
||||||
|
|
||||||
|
// No linefeed, assume prompt will do it.
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user