diff --git a/debug.cpp b/debug.cpp index 30489b3..686005f 100644 --- a/debug.cpp +++ b/debug.cpp @@ -285,14 +285,10 @@ void debug_print_asm(byte offset) { word pointer = *pc + offset;// if (pointer >= 10) pointer -= 10; debug_draw_space(39, 39, 40, 20, "ASM:"); debug_set_ink(255, 255, 255); - char cadena[255]; 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); } else debug_set_ink(255, 255, 255); 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; } } diff --git a/error.cpp b/error.cpp index f3d61bd..e1ccfae 100644 --- a/error.cpp +++ b/error.cpp @@ -9,12 +9,14 @@ static bool raised = false; void error_raise(const char* msg) { if (!raised) { 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; } -void error_print() { - printf("%s", errormsg); +void error_print(unsigned char* mem) { + char* msg = errormsg; + while (*msg != 0) *mem++ = *msg++; + //printf("%s", errormsg); } diff --git a/error.h b/error.h index 727c622..2c95b4b 100644 --- a/error.h +++ b/error.h @@ -2,4 +2,4 @@ void error_raise(const char* msg); bool error_raised(); -void error_print(); +void error_print(unsigned char* mem); diff --git a/paco.xcodeproj/project.pbxproj b/paco.xcodeproj/project.pbxproj index 1143afb..bdc05ae 100644 --- a/paco.xcodeproj/project.pbxproj +++ b/paco.xcodeproj/project.pbxproj @@ -156,7 +156,7 @@ 02CF35B11C7649C300180C9F /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = "Raimon Zamora"; TargetAttributes = { 02CF35B81C7649C300180C9F = { @@ -229,8 +229,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -272,8 +274,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; diff --git a/parser.cpp b/parser.cpp index 0577f29..6184125 100644 --- a/parser.cpp +++ b/parser.cpp @@ -346,9 +346,10 @@ static void parse_expr_mul() { tkn_next(); parse_expr_atom(); switch (operat) { - case TOKEN_ASTERISC: emmit(OP_MUL); break; - case TOKEN_SLASH: emmit(OP_DIV); break; - case TOKEN_MOD: emmit(OP_MOD); break; + case TOKEN_ASTERISC: emmit(OP_MUL); break; + case TOKEN_SLASH: emmit(OP_DIV); break; + case TOKEN_MOD: emmit(OP_MOD); break; + default: /* Impossible */ break; } } } @@ -359,9 +360,10 @@ static void parse_expr_sum() { tkn_next(); parse_expr_mul(); switch (operat) { - case TOKEN_PLUS: emmit(OP_ADD); break; - case TOKEN_MINUS: emmit(OP_SUB); break; - } + case TOKEN_PLUS: emmit(OP_ADD); break; + case TOKEN_MINUS: emmit(OP_SUB); break; + default: /* Impossible */ break; + } } } static void parse_expr_bool() { @@ -371,9 +373,10 @@ static void parse_expr_bool() { tkn_next(); parse_expr_sum(); switch (operat) { - case TOKEN_AND: emmit(OP_AND); break; - case TOKEN_OR: emmit(OP_OR); break; - } + case TOKEN_AND: emmit(OP_AND); break; + case TOKEN_OR: emmit(OP_OR); break; + default: /* Impossible */ break; + } } } static void parse_expression() { @@ -383,12 +386,13 @@ static void parse_expression() { tkn_next(); parse_expr_bool(); switch (operat) { - case TOKEN_EQ: emmit(OP_EQ); break; - case TOKEN_LT: emmit(OP_LT); break; - case TOKEN_GT: emmit(OP_GT); break; - case TOKEN_LEQ: emmit(OP_LEQ); break; - case TOKEN_GEQ: emmit(OP_GEQ); break; - } + case TOKEN_EQ: emmit(OP_EQ); break; + case TOKEN_LT: emmit(OP_LT); break; + case TOKEN_GT: emmit(OP_GT); break; + case TOKEN_LEQ: emmit(OP_LEQ); break; + case TOKEN_GEQ: emmit(OP_GEQ); break; + default: /* Impossible */ break; + } } } @@ -409,7 +413,7 @@ static void parse_dim() { strcpy(varname, tkn_get_string()); tkn_next(); EXPECT(TOKEN_LPAR, "Expected 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(); } @@ -893,9 +897,15 @@ void parser_parse(const char* buffer, byte* mem) { parse_statements(); append_strings(); - FILE *f = fopen("test.bin", "wb"); - fwrite(mem, codepos, 1, f); - fclose(f); + if (error_raised()) { + codepos = 0xA000; + emmit(OP_JMP); + emmit_w(0xA000); + } + + //FILE *f = fopen("test.bin", "wb"); + //fwrite(mem, codepos, 1, f); + //fclose(f); //return code; } diff --git a/sound.cpp b/sound.cpp index 93d9909..f199037 100644 --- a/sound.cpp +++ b/sound.cpp @@ -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 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: Uint8 volume{ 64 }; Uint8 octave{ 4 }; @@ -110,7 +110,7 @@ public: return last_noise; } void set_song(const char* melody) { - int len = SDL_strlen(melody); + size_t len = SDL_strlen(melody); SDL_memcpy(song, melody, len); song[len] = 0; pos = 0; volume = 64; octave = 4; tempo = 44100; default_length = 0.25f; @@ -128,9 +128,6 @@ public: 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) { Uint8 datum = 0; for (int i = 0; i < len; i++) { diff --git a/tokenizer.cpp b/tokenizer.cpp index cef4393..4b9b5ef 100644 --- a/tokenizer.cpp +++ b/tokenizer.cpp @@ -19,7 +19,7 @@ static int current_tokenline = 0; static int current_tokenrow = 0; struct t_token_op { - char* str; + const char* str; t_tokentype tokentype; }; diff --git a/vdp.cpp b/vdp.cpp index 8e117f6..cff0863 100644 --- a/vdp.cpp +++ b/vdp.cpp @@ -3,6 +3,7 @@ //#include "stb_image.h" #include #include "font.h" +#include "error.h" #define VDP_CMD_LOCATE 0 #define VDP_CMD_PRINT 1 @@ -27,8 +28,6 @@ static SDL_Renderer* sdlRenderer = NULL; static SDL_Texture* sdlTexture = NULL; static SDL_Rect src, dst; static bool fullscreen = false; -static const Uint8* keys = nullptr; -static Uint8 just_pressed = SDL_SCANCODE_UNKNOWN; static t_sprite sprites[32]; @@ -63,6 +62,8 @@ static Uint8 palette[16][4] = { { 0, 0, 0, 255 }, }; +void vdp_flip(); + void vdp_init() { SDL_Init(SDL_INIT_EVERYTHING); 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); 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; - src.x = src.y = 0; - dst.x = dst.y = 12; - src.w = dst.w = 128; - src.h = dst.h = 96; + if (error_raised()) { + error_print(screen_map); + border = 0; + vdp_flip(); + } } void vdp_quit() { diff --git a/vm.cpp b/vm.cpp index dc18f23..c47b609 100644 --- a/vm.cpp +++ b/vm.cpp @@ -141,7 +141,8 @@ static void load_program(const char* filename) { free(program); if (error_raised()) { - error_print(); + vm_pc = 0xA000; + //error_print(&mem[0xA000]); } else { 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_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_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;