Fixes
This commit is contained in:
@@ -285,14 +285,10 @@ void debug_print_asm(byte offset) {
|
|||||||
word pointer = *pc + offset;// if (pointer >= 10) pointer -= 10;
|
word pointer = *pc + offset;// if (pointer >= 10) pointer -= 10;
|
||||||
debug_draw_space(39, 39, 40, 20, "ASM:");
|
debug_draw_space(39, 39, 40, 20, "ASM:");
|
||||||
debug_set_ink(255, 255, 255);
|
debug_set_ink(255, 255, 255);
|
||||||
char cadena[255];
|
|
||||||
for (int i = 0; i < 20; i++) {
|
for (int i = 0; i < 20; i++) {
|
||||||
if (*pc == pointer) { debug_set_ink(0, 0, 0); debug_fill_rect(39, 39 + i, 40, 1); debug_set_ink(255, 255, 0); }
|
if (*pc == pointer) { debug_set_ink(0, 0, 0); debug_fill_rect(39, 39 + i, 40, 1); debug_set_ink(255, 255, 0); }
|
||||||
else debug_set_ink(255, 255, 255);
|
else debug_set_ink(255, 255, 255);
|
||||||
debug_print(39, 39+i, get_asm_line(pointer));
|
debug_print(39, 39+i, get_asm_line(pointer));
|
||||||
//sprintf(cadena, "%.4X %.2X %.2X %.2X %.2X %.2X %.2X %.2X %.2X", offset, debug_mem[offset], debug_mem[offset + 1], debug_mem[offset + 2], debug_mem[offset + 3], debug_mem[offset + 4], debug_mem[offset + 5], debug_mem[offset + 6], debug_mem[offset + 7]);
|
|
||||||
//debug_print(1, 39 + i, cadena); debug_print_ex(30, 39 + i, &debug_mem[offset], 8);
|
|
||||||
//offset += 8;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,14 @@ static bool raised = false;
|
|||||||
void error_raise(const char* msg) {
|
void error_raise(const char* msg) {
|
||||||
if (!raised) {
|
if (!raised) {
|
||||||
raised = true;
|
raised = true;
|
||||||
sprintf(errormsg, "ERROR: %s at %d:%d.", msg, tkn_get_line() + 1, tkn_get_row() + 1);
|
sprintf(errormsg, "ERROR AT SOURCE:%s at %d:%d.", msg, tkn_get_line() + 1, tkn_get_row() + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool error_raised() { return raised; }
|
bool error_raised() { return raised; }
|
||||||
|
|
||||||
void error_print() {
|
void error_print(unsigned char* mem) {
|
||||||
printf("%s", errormsg);
|
char* msg = errormsg;
|
||||||
|
while (*msg != 0) *mem++ = *msg++;
|
||||||
|
//printf("%s", errormsg);
|
||||||
}
|
}
|
||||||
|
|||||||
2
error.h
2
error.h
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
void error_raise(const char* msg);
|
void error_raise(const char* msg);
|
||||||
bool error_raised();
|
bool error_raised();
|
||||||
void error_print();
|
void error_print(unsigned char* mem);
|
||||||
|
|||||||
@@ -156,7 +156,7 @@
|
|||||||
02CF35B11C7649C300180C9F /* Project object */ = {
|
02CF35B11C7649C300180C9F /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 0720;
|
LastUpgradeCheck = 0820;
|
||||||
ORGANIZATIONNAME = "Raimon Zamora";
|
ORGANIZATIONNAME = "Raimon Zamora";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
02CF35B81C7649C300180C9F = {
|
02CF35B81C7649C300180C9F = {
|
||||||
@@ -229,8 +229,10 @@
|
|||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CODE_SIGN_IDENTITY = "-";
|
CODE_SIGN_IDENTITY = "-";
|
||||||
@@ -272,8 +274,10 @@
|
|||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CODE_SIGN_IDENTITY = "-";
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
|||||||
48
parser.cpp
48
parser.cpp
@@ -346,9 +346,10 @@ static void parse_expr_mul() {
|
|||||||
tkn_next();
|
tkn_next();
|
||||||
parse_expr_atom();
|
parse_expr_atom();
|
||||||
switch (operat) {
|
switch (operat) {
|
||||||
case TOKEN_ASTERISC: emmit(OP_MUL); break;
|
case TOKEN_ASTERISC: emmit(OP_MUL); break;
|
||||||
case TOKEN_SLASH: emmit(OP_DIV); break;
|
case TOKEN_SLASH: emmit(OP_DIV); break;
|
||||||
case TOKEN_MOD: emmit(OP_MOD); break;
|
case TOKEN_MOD: emmit(OP_MOD); break;
|
||||||
|
default: /* Impossible */ break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -359,9 +360,10 @@ static void parse_expr_sum() {
|
|||||||
tkn_next();
|
tkn_next();
|
||||||
parse_expr_mul();
|
parse_expr_mul();
|
||||||
switch (operat) {
|
switch (operat) {
|
||||||
case TOKEN_PLUS: emmit(OP_ADD); break;
|
case TOKEN_PLUS: emmit(OP_ADD); break;
|
||||||
case TOKEN_MINUS: emmit(OP_SUB); break;
|
case TOKEN_MINUS: emmit(OP_SUB); break;
|
||||||
}
|
default: /* Impossible */ break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void parse_expr_bool() {
|
static void parse_expr_bool() {
|
||||||
@@ -371,9 +373,10 @@ static void parse_expr_bool() {
|
|||||||
tkn_next();
|
tkn_next();
|
||||||
parse_expr_sum();
|
parse_expr_sum();
|
||||||
switch (operat) {
|
switch (operat) {
|
||||||
case TOKEN_AND: emmit(OP_AND); break;
|
case TOKEN_AND: emmit(OP_AND); break;
|
||||||
case TOKEN_OR: emmit(OP_OR); break;
|
case TOKEN_OR: emmit(OP_OR); break;
|
||||||
}
|
default: /* Impossible */ break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void parse_expression() {
|
static void parse_expression() {
|
||||||
@@ -383,12 +386,13 @@ static void parse_expression() {
|
|||||||
tkn_next();
|
tkn_next();
|
||||||
parse_expr_bool();
|
parse_expr_bool();
|
||||||
switch (operat) {
|
switch (operat) {
|
||||||
case TOKEN_EQ: emmit(OP_EQ); break;
|
case TOKEN_EQ: emmit(OP_EQ); break;
|
||||||
case TOKEN_LT: emmit(OP_LT); break;
|
case TOKEN_LT: emmit(OP_LT); break;
|
||||||
case TOKEN_GT: emmit(OP_GT); break;
|
case TOKEN_GT: emmit(OP_GT); break;
|
||||||
case TOKEN_LEQ: emmit(OP_LEQ); break;
|
case TOKEN_LEQ: emmit(OP_LEQ); break;
|
||||||
case TOKEN_GEQ: emmit(OP_GEQ); break;
|
case TOKEN_GEQ: emmit(OP_GEQ); break;
|
||||||
}
|
default: /* Impossible */ break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,7 +413,7 @@ static void parse_dim() {
|
|||||||
strcpy(varname, tkn_get_string());
|
strcpy(varname, tkn_get_string());
|
||||||
tkn_next(); EXPECT(TOKEN_LPAR, "Expected array size");
|
tkn_next(); EXPECT(TOKEN_LPAR, "Expected array size");
|
||||||
tkn_next(); EXPECT(TOKEN_NUMBER, "Expected integer constant as array size");
|
tkn_next(); EXPECT(TOKEN_NUMBER, "Expected integer constant as array size");
|
||||||
int ivar = get_variable_index(varname, tkn_get_value());
|
get_variable_index(varname, tkn_get_value()); // register variable with size, no need to keep ival
|
||||||
tkn_next(); EXPECT(TOKEN_RPAR, "Expected ')'");
|
tkn_next(); EXPECT(TOKEN_RPAR, "Expected ')'");
|
||||||
tkn_next();
|
tkn_next();
|
||||||
}
|
}
|
||||||
@@ -893,9 +897,15 @@ void parser_parse(const char* buffer, byte* mem) {
|
|||||||
parse_statements();
|
parse_statements();
|
||||||
append_strings();
|
append_strings();
|
||||||
|
|
||||||
FILE *f = fopen("test.bin", "wb");
|
if (error_raised()) {
|
||||||
fwrite(mem, codepos, 1, f);
|
codepos = 0xA000;
|
||||||
fclose(f);
|
emmit(OP_JMP);
|
||||||
|
emmit_w(0xA000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//FILE *f = fopen("test.bin", "wb");
|
||||||
|
//fwrite(mem, codepos, 1, f);
|
||||||
|
//fclose(f);
|
||||||
|
|
||||||
//return code;
|
//return code;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ static const float lengths[10] = { 0.0f, 0.00390625f, 0.0078125f, 0.015625f, 0.0
|
|||||||
static const Uint16 tempos[10] = { 13230, 8820, 6615, 5292, 4410, 3780, 3308, 2940, 2646, 2406 };
|
static const Uint16 tempos[10] = { 13230, 8820, 6615, 5292, 4410, 3780, 3308, 2940, 2646, 2406 };
|
||||||
static const float periods[108] = { 1348.49207, 1272.80688, 1201.37, 1133.94214, 1070.29871, 1010.22772, 953.527893, 900.010376, 849.496887, 801.818176, 756.815613, 714.338745, 674.246033, 636.403564, 600.684875, 566.971069, 535.149475, 505.11377, 476.763947, 450.005249, 424.748352, 400.909088, 378.407806, 357.169373, 337.123016, 318.201782, 300.342438, 283.485535, 267.574738, 252.556885, 238.381973, 225.002625, 212.374176, 200.454544, 189.203888, 178.584702, 168.561508, 159.100876, 150.171234, 141.742767, 133.787354, 126.278458, 119.190987, 112.501305, 106.187096, 100.227272, 94.6019516, 89.2923508, 84.2807541, 79.5504379, 75.0856171, 70.8713837, 66.8936768, 63.139225, 59.5954933, 56.2506561, 53.0935478, 50.113636, 47.3009758, 44.6461754, 42.140377, 39.775219, 37.5428085, 35.4356918, 33.4468384, 31.5696125, 29.7977467, 28.1253281, 26.5467739, 25.056818, 23.650486, 22.3230877, 21.0701885, 19.8876095, 18.7714043, 17.7178459, 16.7234192, 15.7848072, 14.8988733, 14.0626631, 13.273387, 12.528409, 11.8252439, 11.1615429, 10.5350943, 9.94380569, 9.38570118, 8.85892296, 8.36171055, 7.89240265, 7.44943666, 7.03133202, 6.636693, 6.2642045, 5.91262197, 5.58077145, 5.26754713, 4.97190285, 4.69285059, 4.42946148, 4.18085527, 3.94620132, 3.72471833, 3.51566601, 3.3183465, 3.13210225, 2.95631051, 2.7903862 };
|
static const float periods[108] = { 1348.49207, 1272.80688, 1201.37, 1133.94214, 1070.29871, 1010.22772, 953.527893, 900.010376, 849.496887, 801.818176, 756.815613, 714.338745, 674.246033, 636.403564, 600.684875, 566.971069, 535.149475, 505.11377, 476.763947, 450.005249, 424.748352, 400.909088, 378.407806, 357.169373, 337.123016, 318.201782, 300.342438, 283.485535, 267.574738, 252.556885, 238.381973, 225.002625, 212.374176, 200.454544, 189.203888, 178.584702, 168.561508, 159.100876, 150.171234, 141.742767, 133.787354, 126.278458, 119.190987, 112.501305, 106.187096, 100.227272, 94.6019516, 89.2923508, 84.2807541, 79.5504379, 75.0856171, 70.8713837, 66.8936768, 63.139225, 59.5954933, 56.2506561, 53.0935478, 50.113636, 47.3009758, 44.6461754, 42.140377, 39.775219, 37.5428085, 35.4356918, 33.4468384, 31.5696125, 29.7977467, 28.1253281, 26.5467739, 25.056818, 23.650486, 22.3230877, 21.0701885, 19.8876095, 18.7714043, 17.7178459, 16.7234192, 15.7848072, 14.8988733, 14.0626631, 13.273387, 12.528409, 11.8252439, 11.1615429, 10.5350943, 9.94380569, 9.38570118, 8.85892296, 8.36171055, 7.89240265, 7.44943666, 7.03133202, 6.636693, 6.2642045, 5.91262197, 5.58077145, 5.26754713, 4.97190285, 4.69285059, 4.42946148, 4.18085527, 3.94620132, 3.72471833, 3.51566601, 3.3183465, 3.13210225, 2.95631051, 2.7903862 };
|
||||||
|
|
||||||
static class c_channel {
|
class c_channel {
|
||||||
private:
|
private:
|
||||||
Uint8 volume{ 64 };
|
Uint8 volume{ 64 };
|
||||||
Uint8 octave{ 4 };
|
Uint8 octave{ 4 };
|
||||||
@@ -110,7 +110,7 @@ public:
|
|||||||
return last_noise;
|
return last_noise;
|
||||||
}
|
}
|
||||||
void set_song(const char* melody) {
|
void set_song(const char* melody) {
|
||||||
int len = SDL_strlen(melody);
|
size_t len = SDL_strlen(melody);
|
||||||
SDL_memcpy(song, melody, len);
|
SDL_memcpy(song, melody, len);
|
||||||
song[len] = 0;
|
song[len] = 0;
|
||||||
pos = 0; volume = 64; octave = 4; tempo = 44100; default_length = 0.25f;
|
pos = 0; volume = 64; octave = 4; tempo = 44100; default_length = 0.25f;
|
||||||
@@ -128,9 +128,6 @@ public:
|
|||||||
|
|
||||||
static c_channel channels[4];
|
static c_channel channels[4];
|
||||||
|
|
||||||
static int sign(int number) { return number > 0 ? 1 : -1; }
|
|
||||||
static bool samesign(int a, int b) { return (a > 0 && b > 0) || (a < 0 && b < 0); }
|
|
||||||
|
|
||||||
static void audio_callback(void* userdata, Uint8* stream, int len) {
|
static void audio_callback(void* userdata, Uint8* stream, int len) {
|
||||||
Uint8 datum = 0;
|
Uint8 datum = 0;
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ static int current_tokenline = 0;
|
|||||||
static int current_tokenrow = 0;
|
static int current_tokenrow = 0;
|
||||||
|
|
||||||
struct t_token_op {
|
struct t_token_op {
|
||||||
char* str;
|
const char* str;
|
||||||
t_tokentype tokentype;
|
t_tokentype tokentype;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
21
vdp.cpp
21
vdp.cpp
@@ -3,6 +3,7 @@
|
|||||||
//#include "stb_image.h"
|
//#include "stb_image.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
#define VDP_CMD_LOCATE 0
|
#define VDP_CMD_LOCATE 0
|
||||||
#define VDP_CMD_PRINT 1
|
#define VDP_CMD_PRINT 1
|
||||||
@@ -27,8 +28,6 @@ static SDL_Renderer* sdlRenderer = NULL;
|
|||||||
static SDL_Texture* sdlTexture = NULL;
|
static SDL_Texture* sdlTexture = NULL;
|
||||||
static SDL_Rect src, dst;
|
static SDL_Rect src, dst;
|
||||||
static bool fullscreen = false;
|
static bool fullscreen = false;
|
||||||
static const Uint8* keys = nullptr;
|
|
||||||
static Uint8 just_pressed = SDL_SCANCODE_UNKNOWN;
|
|
||||||
|
|
||||||
static t_sprite sprites[32];
|
static t_sprite sprites[32];
|
||||||
|
|
||||||
@@ -63,6 +62,8 @@ static Uint8 palette[16][4] = {
|
|||||||
{ 0, 0, 0, 255 },
|
{ 0, 0, 0, 255 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void vdp_flip();
|
||||||
|
|
||||||
void vdp_init() {
|
void vdp_init() {
|
||||||
SDL_Init(SDL_INIT_EVERYTHING);
|
SDL_Init(SDL_INIT_EVERYTHING);
|
||||||
sdlWindow = SDL_CreateWindow("PaCo", 160, SDL_WINDOWPOS_UNDEFINED, 608, 480, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_SHOWN);
|
sdlWindow = SDL_CreateWindow("PaCo", 160, SDL_WINDOWPOS_UNDEFINED, 608, 480, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_SHOWN);
|
||||||
@@ -72,13 +73,19 @@ void vdp_init() {
|
|||||||
sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, 128, 128);
|
sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, 128, 128);
|
||||||
SDL_ShowCursor(fullscreen ? 0 : 1);
|
SDL_ShowCursor(fullscreen ? 0 : 1);
|
||||||
|
|
||||||
for (int i = 0; i < 16 * 12; i++) screen_map[i] = 32;
|
src.x = src.y = 0;
|
||||||
|
dst.x = dst.y = 12;
|
||||||
|
src.w = dst.w = 128;
|
||||||
|
src.h = dst.h = 96;
|
||||||
|
|
||||||
|
for (int i = 0; i < 16 * 12; i++) screen_map[i] = 32;
|
||||||
for (int i = 0; i < 16 * 12; i++) screen_color[i] = color;
|
for (int i = 0; i < 16 * 12; i++) screen_color[i] = color;
|
||||||
|
|
||||||
src.x = src.y = 0;
|
if (error_raised()) {
|
||||||
dst.x = dst.y = 12;
|
error_print(screen_map);
|
||||||
src.w = dst.w = 128;
|
border = 0;
|
||||||
src.h = dst.h = 96;
|
vdp_flip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vdp_quit() {
|
void vdp_quit() {
|
||||||
|
|||||||
5
vm.cpp
5
vm.cpp
@@ -141,7 +141,8 @@ static void load_program(const char* filename) {
|
|||||||
free(program);
|
free(program);
|
||||||
|
|
||||||
if (error_raised()) {
|
if (error_raised()) {
|
||||||
error_print();
|
vm_pc = 0xA000;
|
||||||
|
//error_print(&mem[0xA000]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printf("Compilation complete!\nProgram size: %d bytes\nMemory usage: %d bytes\n", parser_get_codesize(), parser_get_memory_usage());
|
printf("Compilation complete!\nProgram size: %d bytes\nMemory usage: %d bytes\n", parser_get_codesize(), parser_get_memory_usage());
|
||||||
@@ -174,7 +175,7 @@ const unsigned short vm_step() {
|
|||||||
|
|
||||||
case OP_NOP: vm_cycles++; break;
|
case OP_NOP: vm_cycles++; break;
|
||||||
case OP_PUSH: PUSH(ds, vm_program[vm_pc++]); vm_cycles++; break;
|
case OP_PUSH: PUSH(ds, vm_program[vm_pc++]); vm_cycles++; break;
|
||||||
case OP_POP: POP(ds); vm_cycles++; break;
|
case OP_POP: ds[0]--; vm_cycles++; break;
|
||||||
case OP_DUP: a = PEEK(ds); PUSH(ds, a); vm_cycles++; break;
|
case OP_DUP: a = PEEK(ds); PUSH(ds, a); vm_cycles++; break;
|
||||||
case OP_SWAP: a = POP(ds); b = POP(ds); PUSH(ds, a); PUSH(ds, b); vm_cycles++; break;
|
case OP_SWAP: a = POP(ds); b = POP(ds); PUSH(ds, a); PUSH(ds, b); vm_cycles++; break;
|
||||||
case OP_LOAD: PUSH(ds, mem[WORD()]); vm_cycles++; break;
|
case OP_LOAD: PUSH(ds, mem[WORD()]); vm_cycles++; break;
|
||||||
|
|||||||
Reference in New Issue
Block a user