From a349cf5c0cd32e353c2de6e9ca60386671aa25f7 Mon Sep 17 00:00:00 2001 From: JailDoctor Date: Mon, 21 Feb 2022 16:38:26 +0100 Subject: [PATCH 1/3] v0.6.0 [FEAT] New mode(3) with 32x24 characters --- ascii.cpp | 32 +++-- main.cpp | 359 +----------------------------------------------------- 2 files changed, 23 insertions(+), 368 deletions(-) diff --git a/ascii.cpp b/ascii.cpp index 324073f..32e6aab 100644 --- a/ascii.cpp +++ b/ascii.cpp @@ -21,6 +21,10 @@ uint8_t *char_screen = NULL; uint8_t *color_screen = NULL; uint8_t screen_width = 40; uint8_t screen_height = 30; +int v_screen_w = 640; +int v_screen_h = 480; +uint8_t hborder = 40; +uint8_t vborder = 40; uint8_t current_color = 0x1e; uint8_t current_border = 0; uint8_t current_mode = 1; @@ -65,6 +69,8 @@ const char* get_filename() { void reinit() { if (mini_bak != NULL) SDL_DestroyTexture(mini_bak); counter=0; + hborder = vborder = 40; + v_screen_w = 640; v_screen_h = 480; switch (current_mode) { case 0: screen_width = 80; @@ -102,17 +108,21 @@ void reinit() { //SDL_RenderSetLogicalSize(mini_ren, 160, 120); mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 160, 120); break; - case 3: // SUPERSECRET MODE FOR THE EDITOR!!! - screen_width = 80; - screen_height = 30; - current_color = 0x1f; - current_border = 9; + case 3: + hborder = 104; + vborder = 88; + v_screen_w = 512; + v_screen_h = 384; + screen_width = 32; + screen_height = 24; + current_color = 0x07; + current_border = 0; cursor_x = 0; cursor_y = 0; char_screen = &mem[0]; - color_screen = &mem[0x1200]; + color_screen = &mem[1200]; //SDL_RenderSetLogicalSize(mini_ren, 640, 480); - mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 240); + mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 256, 192); break; } } @@ -233,9 +243,9 @@ int main(int argc,char*argv[]) { keys = SDL_GetKeyboardState(NULL); int mx, my; mouse_buttons = SDL_GetMouseState(&mx, &my); - if (mx>=40 && my>=40 && mx<680 && my<520) { - mouse_x = (mx-40) / (640/screen_width); - mouse_y = (my-40) / (480/screen_height); + if (mx>=hborder && my>=vborder && mx<(v_screen_w+hborder) && my<(v_screen_h+vborder)) { + mouse_x = (mx-hborder) / (v_screen_w/screen_width); + mouse_y = (my-vborder) / (v_screen_h/screen_height); } if (lua_is_playing()) { @@ -303,7 +313,7 @@ int main(int argc,char*argv[]) { SDL_SetRenderDrawColor(mini_ren, (palette[current_border] >> 16)&0xff, (palette[current_border] >> 8)&0xff, palette[current_border]&0xff, 0); //SDL_SetRenderDrawColor(mini_ren, 255, 0, 0, 0); SDL_RenderClear(mini_ren); - SDL_Rect rect = {40, 40, 640, 480}; + SDL_Rect rect = {hborder, vborder, v_screen_w, v_screen_h}; SDL_RenderCopy(mini_ren, mini_bak, NULL, &rect); //SDL_RenderCopy(mini_ren, mini_bak, NULL, NULL); SDL_RenderPresent(mini_ren); diff --git a/main.cpp b/main.cpp index cf3d973..a3a0008 100644 --- a/main.cpp +++ b/main.cpp @@ -3,41 +3,15 @@ #include #include -std::list code; - -int current_editor = 0; - void init_terminal(); void do_terminal(); -void init_code_editor(); -void do_code_editor(); -void save_code(); - void loop() { - if (btnp(KEY_TAB)) { - current_editor = (++current_editor)%2; - switch(current_editor) { - case 0: - init_terminal(); - break; - case 1: - init_code_editor(); - break; - } - } - switch(current_editor) { - case 0: - do_terminal(); - break; - case 1: - do_code_editor(); - break; - } + do_terminal(); } void execute_run() { - if (current_editor == 1) save_code(); + //if (current_editor == 1) save_code(); } uint8_t get_char(uint8_t key) { @@ -97,332 +71,3 @@ void do_terminal() { } } } - -void save_code() { - const char* file = get_filename(); - FILE *f = fopen(file, "w"); - for (std::list::iterator it = code.begin(); it != code.end(); it++) { - fprintf(f, "%s\n", (*it).c_str()); - } - fclose(f); -} - -void load_code() { - const char* file = get_filename(); - FILE *f = fopen(file, "rb"); - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); /* same as rewind(f); */ - char *buffer = (char*)malloc(fsize + 1); - fread(buffer, 1, fsize, f); - fclose(f); - buffer[fsize] = 0; - - int start = 0; - for (int pos=0;pos::iterator ls[28]; -static int col = 0; -static int line = 0; -bool cursor_inverted = false; -int blink_wait = 30; - -#define PARSER_NOTHING 0 -#define PARSER_NUMBER 1 -#define PARSER_IDENTIFIER 2 -#define PARSER_STRING 3 -#define PARSER_COMMENT 4 -#define PARSER_FUNCTION 5 - -uint16_t parser_offset = 0; -uint8_t parser_pos = 0; -uint8_t parser_start=0; -void parser_setup(uint16_t address) { - parser_offset = address; - parser_pos = 0; - parser_start = 0; -} -const uint8_t parser_get_char(uint8_t offset=0) { - if ((parser_pos+offset) >= 80) return 0; - return peek(parser_offset+parser_pos+offset); -} -char alpha[80] = ""; -uint8_t alpha_pos = 0; -void parser_next(const bool keep=false) { - if (keep) { alpha[alpha_pos++] = parser_get_char(); alpha[alpha_pos]=0; } else { alpha[0]=alpha_pos=0; } - if (parser_pos < 80) parser_pos++; -} - -#define ISZERO (parser_get_char()=='0') -#define ISX (parser_get_char()=='z' || parser_get_char()=='Z') -#define ISDIGIT (parser_get_char()>='0' && parser_get_char() <='9') -#define WILLBEDIGIT (parser_get_char(1)>='0' && parser_get_char(1) <='9') -#define ISPOINT (parser_get_char()=='.') -#define ISALPHA (parser_get_char()>='_' || (parser_get_char()>='a' && parser_get_char()<='z') || (parser_get_char()>='A' && parser_get_char()<='Z')) -#define ISQUOTES (parser_get_char()=='"' || parser_get_char()=='\'') -#define ISMINUS (parser_get_char()=='-') -#define WILLBEMINUS (parser_get_char(1)=='-') -#define ISPAREN (parser_get_char()=='(') -#define ENDED (parser_get_char()==0) - -const char* keywords[] = { "and", "break", "do", "else", "elseif", "end", "false", "for", "function", "goto", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while" }; - -const bool is_keyword() { - for (int i=0;i<22;++i) if (strcmp(alpha, keywords[i]) == 0) return true; - return false; -} - -void parser_do_color(uint8_t type) { - uint8_t color = COLOR_WHITE; - switch (type) { - case PARSER_NUMBER: color = COLOR_LIGHT_GREEN; break; - case PARSER_COMMENT: color = COLOR_LIGHT_GRAY; break; - case PARSER_STRING: color = COLOR_RED; break; - case PARSER_IDENTIFIER: if (is_keyword()) color = COLOR_MAGENTA; break; - case PARSER_FUNCTION: color = COLOR_YELLOW; break; - }; - color = (color&0x0f)+(0x10); - for (int i=parser_start;i::iterator it = code.begin(); - int i=0; - while (it != code.end() && i<28) { - ls[i] = it; - print((*it).c_str(), 0, i+1); - ++i; ++it; - } - refresh_color_highlight(); -} - -void init_code_editor() { - mode(3); - code.clear(); - load_code(); - refresh_code_editor(); -} - -std::string get_current_line() { - return *ls[line]; -} - -void invert_cursor() { - cursor_inverted = !cursor_inverted; - uint16_t pos = 0x1200 + col + (line+1)*80; - uint8_t col = peek(pos); - poke(pos, ((col >> 4) & 0x0f) + ((col << 4) & 0xf0) ); -} - -void move_cursor_up() { - if (line > 0) { - if (cursor_inverted) invert_cursor(); - line--; - if (get_current_line().size() < col) col = get_current_line().size(); - blink_wait=1; - } -} - -void move_cursor_down() { - if (line < code.size()-1) { - if (cursor_inverted) invert_cursor(); - line++; - if (get_current_line().size() < col) col = get_current_line().size(); - blink_wait=1; - } -} - -void move_cursor_right() { - if ( col < get_current_line().size() ) { - if (cursor_inverted) invert_cursor(); - col++; - blink_wait=1; - } else { - if (line < code.size()-1) { - col = 0; - move_cursor_down(); - } - } -} - -void move_cursor_left() { - if (col > 0) { - if (cursor_inverted) invert_cursor(); - col--; - blink_wait=1; - } else { - if (line > 0) { - move_cursor_up(); - col = get_current_line().size(); - } - } -} - -void move_line_end() { - if (cursor_inverted) invert_cursor(); - col = get_current_line().size(); - blink_wait=1; -} - -void move_line_home() { - if (cursor_inverted) invert_cursor(); - col = 0; - blink_wait=1; -} - -void split_line() { - std::string str = get_current_line(); - *ls[line] = str.substr(col); - std::list::iterator newline = ls[line]++; - code.insert(newline, str.substr(0, col)); - - if (cursor_inverted) invert_cursor(); - line++; col=0; - blink_wait=1; - refresh_code_editor(); -} - -void join_lines() { - if (cursor_inverted) invert_cursor(); - std::string str = get_current_line(); - //std::list::iterator prevline = ls[line]--; - code.erase(ls[line]); - line--; - const int line_size = (*ls[line]).size(); - *ls[line] += str; - col = line_size; - blink_wait=1; - refresh_code_editor(); -} - -void delete_char() { - if (col == 0) { - if (line > 0) join_lines(); - } else { - if (cursor_inverted) invert_cursor(); - std::string str = get_current_line(); - std::string a = str.substr(0,col-1); - std::string b = str.substr(col); - *ls[line] = a+b; - col--; - blink_wait=1; - refresh_code_editor(); - } -} - -void supr_char() { - if ((col == (*ls[line]).size()) && (line == code.size()-1)) return; - move_cursor_right(); - delete_char(); -} - -void add_char(uint8_t chr) { - std::string str = get_current_line(); - std::string a = str.substr(0,col); - std::string b = str.substr(col); - std::string c = " "; c[0] = chr; - *ls[line] = a+c+b; - col++; - blink_wait=1; - refresh_code_editor(); -} - -void do_code_editor() { - const uint8_t key = whichbtn(); - if (key != KEY_UNKNOWN) { - if (key == KEY_RETURN or key == KEY_KP_ENTER) { - split_line(); - } - else if (key == KEY_UP) move_cursor_up(); - else if (key == KEY_DOWN) move_cursor_down(); - else if (key == KEY_LEFT) move_cursor_left(); - else if (key == KEY_RIGHT) move_cursor_right(); - else if (key == KEY_BACKSPACE) delete_char(); - else if (key == KEY_DELETE) supr_char(); - else if (key == KEY_END) move_line_end(); - else if (key == KEY_HOME) move_line_home(); - else { - uint8_t chr = get_char(key); - if (chr != 0) add_char(chr); - } - } - - blink_wait--; - if (blink_wait == 0) { - blink_wait = 30; - invert_cursor(); - } -} \ No newline at end of file From 3dfa177cd2461ad64d97fe0f5130f1253ab56f58 Mon Sep 17 00:00:00 2001 From: JailDoctor Date: Mon, 21 Feb 2022 16:43:57 +0100 Subject: [PATCH 2/3] [FIX] Wrong color screen address for mode 3 --- ascii.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ascii.cpp b/ascii.cpp index 32e6aab..fa3d599 100644 --- a/ascii.cpp +++ b/ascii.cpp @@ -120,7 +120,7 @@ void reinit() { cursor_x = 0; cursor_y = 0; char_screen = &mem[0]; - color_screen = &mem[1200]; + color_screen = &mem[768]; //SDL_RenderSetLogicalSize(mini_ren, 640, 480); mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 256, 192); break; From fa85d3cb3404b6ef4a59103403d4f8ae130f13a2 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 4 May 2022 15:12:12 +0200 Subject: [PATCH 3/3] added chuleta --- .gitignore | 1 + chuleta_font.png | Bin 0 -> 35706 bytes 2 files changed, 1 insertion(+) create mode 100644 chuleta_font.png diff --git a/.gitignore b/.gitignore index d5aba9c..10fc2af 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ wiki/* scr_min.c tests.lua fake_editor.lua +*.bin diff --git a/chuleta_font.png b/chuleta_font.png new file mode 100644 index 0000000000000000000000000000000000000000..5356fa55020b571abe77e6eb92ed122de79021d4 GIT binary patch literal 35706 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 A6aWAK literal 0 HcmV?d00001