Correcting error in string output and avoiding segment faults in vm
This commit is contained in:
parent
4963fcfebc
commit
d3bed26e0a
|
@ -37,9 +37,11 @@ Added Low memory detection to stage2 FORTH and now exits gracefully
|
||||||
Minor refactor of stage3 FORTH by reepa
|
Minor refactor of stage3 FORTH by reepa
|
||||||
Stage3 FORTH WHILE's compile-time stack effect is now consistent with gforth
|
Stage3 FORTH WHILE's compile-time stack effect is now consistent with gforth
|
||||||
Changed behavior of stage2 FORTH's CREATE to better match the way it usually works.
|
Changed behavior of stage2 FORTH's CREATE to better match the way it usually works.
|
||||||
|
Stage0 vm now will show an error message if the size of the rom exceeds the available memory
|
||||||
|
|
||||||
** Fixed
|
** Fixed
|
||||||
Updated checksums to reflect changes in stage2 FORTH
|
Updated checksums to reflect changes in stage2 FORTH
|
||||||
|
Fixed dis behavior in regards to hex values in strings
|
||||||
|
|
||||||
** Removed
|
** Removed
|
||||||
the HERE and DP! are gone from ' now in stage3 FORTH
|
the HERE and DP! are gone from ' now in stage3 FORTH
|
||||||
|
|
|
@ -87,14 +87,25 @@ Broken:
|
||||||
|
|
||||||
void print_non_NULL(uint8_t c)
|
void print_non_NULL(uint8_t c)
|
||||||
{
|
{
|
||||||
if(0 != c)
|
switch(c)
|
||||||
{
|
{
|
||||||
fprintf(stdout, "%c", c);
|
case 0: return;
|
||||||
|
case 32 ... 126:
|
||||||
|
{
|
||||||
|
fprintf(stdout, "%c", c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: fprintf(stdout, "0x%X ", c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void string_values(struct Instruction *c)
|
void string_values(struct Instruction *c, bool first)
|
||||||
{
|
{
|
||||||
|
if(first)
|
||||||
|
{
|
||||||
|
fprintf(stdout, "\"");
|
||||||
|
}
|
||||||
|
|
||||||
print_non_NULL(c->raw0);
|
print_non_NULL(c->raw0);
|
||||||
print_non_NULL(c->raw1);
|
print_non_NULL(c->raw1);
|
||||||
print_non_NULL(c->raw2);
|
print_non_NULL(c->raw2);
|
||||||
|
@ -103,12 +114,12 @@ void string_values(struct Instruction *c)
|
||||||
if(0 != c->raw3)
|
if(0 != c->raw3)
|
||||||
{
|
{
|
||||||
read_instruction(c);
|
read_instruction(c);
|
||||||
string_values(c);
|
string_values(c, false);
|
||||||
address = address + 4;
|
address = address + 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stdout, "\t #STRING\n");
|
fprintf(stdout, "\"\t #STRING\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +242,7 @@ void decode_Integer_4OP(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 4OP */
|
default: /* Unknown 4OP */
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,7 +566,7 @@ void decode_Integer_3OP(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 3OP*/
|
default: /* Unknown 3OP*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -733,7 +744,7 @@ void decode_Integer_2OP(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 2OP*/
|
default: /* Unknown 2OP*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -801,7 +812,7 @@ void decode_1OP(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 1OP*/
|
default: /* Unknown 1OP*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -843,7 +854,7 @@ void decode_0OP(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 1OP*/
|
default: /* Unknown 1OP*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1035,7 +1046,7 @@ void decode_Integer_2OPI(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 2OPI*/
|
default: /* Unknown 2OPI*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1280,7 +1291,7 @@ void decode_1OPI(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 1OPI*/
|
default: /* Unknown 1OPI*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1314,7 +1325,7 @@ void decode_0OPI(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown 1OPI*/
|
default: /* Unknown 1OPI*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1375,7 +1386,7 @@ void decode_HALCODE(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Unknown HALCODE*/
|
default: /* Unknown HALCODE*/
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1439,7 +1450,7 @@ void eval_instruction(struct Instruction* c)
|
||||||
}
|
}
|
||||||
default: /* Not supported by this disassembler */
|
default: /* Not supported by this disassembler */
|
||||||
{
|
{
|
||||||
string_values(c);
|
string_values(c, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
7
vm.c
7
vm.c
|
@ -29,6 +29,13 @@ void load_program(struct lilith* vm, char* rom_name)
|
||||||
size_t end = ftell(program);
|
size_t end = ftell(program);
|
||||||
rewind(program);
|
rewind(program);
|
||||||
|
|
||||||
|
/* Deal with the special case of the ROM is bigger than available memory */
|
||||||
|
if(end > vm->amount_of_Ram)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Program %s is %d bytes large but only %d bytes of memory have been allocated!\n", rom_name, (int)end, (int)vm->amount_of_Ram);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Load the entire tape into memory */
|
/* Load the entire tape into memory */
|
||||||
fread(vm->memory, 1, end, program);
|
fread(vm->memory, 1, end, program);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue