This commit is contained in:
2017-02-06 12:14:05 +01:00
parent 209c869eeb
commit 19a2260644
9 changed files with 60 additions and 43 deletions

View File

@@ -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;
} }
} }

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -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 = "-";

View File

@@ -349,6 +349,7 @@ static void parse_expr_mul() {
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;
} }
} }
} }
@@ -361,6 +362,7 @@ static void parse_expr_sum() {
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;
} }
} }
} }
@@ -373,6 +375,7 @@ static void parse_expr_bool() {
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;
} }
} }
} }
@@ -388,6 +391,7 @@ static void parse_expression() {
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;
} }

View File

@@ -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++) {

View File

@@ -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;
}; };

17
vdp.cpp
View File

@@ -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;
for (int i = 0; i < 16 * 12; i++) screen_color[i] = color;
src.x = src.y = 0; src.x = src.y = 0;
dst.x = dst.y = 12; dst.x = dst.y = 12;
src.w = dst.w = 128; src.w = dst.w = 128;
src.h = dst.h = 96; 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;
if (error_raised()) {
error_print(screen_map);
border = 0;
vdp_flip();
}
} }
void vdp_quit() { void vdp_quit() {

5
vm.cpp
View File

@@ -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;