summaryrefslogtreecommitdiff
path: root/programs/c-ports/subeditor.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2020-04-02 19:04:12 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2020-04-02 19:04:12 -0400
commit59dc46ca8fe1eb6f98abb98fe8579aeaedd2ff15 (patch)
tree4a762bad3013693c8640a36fa626042cfaa13d83 /programs/c-ports/subeditor.c
parent6bad8fa605f5011cadab428156c18b4067922185 (diff)
Made the emulator less bloated, and faster.
Diffstat (limited to 'programs/c-ports/subeditor.c')
-rw-r--r--programs/c-ports/subeditor.c205
1 files changed, 182 insertions, 23 deletions
diff --git a/programs/c-ports/subeditor.c b/programs/c-ports/subeditor.c
index 76ee544..44ca288 100644
--- a/programs/c-ports/subeditor.c
+++ b/programs/c-ports/subeditor.c
@@ -45,6 +45,7 @@ uint8_t scr_trow = 0;
uint8_t scr_tcol = 0;
uint16_t scr_ptr = 0;
uint16_t scr_ptr2 = 0;
+uint16_t scr_ptr3 = 0;
uint8_t byte = 0;
uint8_t mask = 0;
@@ -141,6 +142,62 @@ void clr_cbuf() {
}
}
+#define dir(a) tokline[a].dir
+#define mne(a) tokline[a].mne
+#define amo(a) tokline[a].am
+#define opb(a) tokline[a].opbase
+#define com(a) tokline[a].com
+#define lab(a) tokline[a].label
+#define opc(a) tokline[a].op
+
+#define tok(a) { \
+ dir(a) = 0xFF; \
+ mne(a) = 0xFF; \
+ amo(a) = 0xFF; \
+ opb(a) = 0xFF; \
+ com(a) = 0xFFFF; \
+ lab(a) = 0xFFFF; \
+ opc(a) = 0xFF; \
+}
+void clr_tokline() {
+ uint16_t i = 0;
+ for (; i < 0x2000;) {
+ tok(i+0x00);
+ tok(i+0x01);
+ tok(i+0x02);
+ tok(i+0x03);
+ tok(i+0x04);
+ tok(i+0x05);
+ tok(i+0x06);
+ tok(i+0x07);
+ tok(i+0x08);
+ tok(i+0x09);
+ tok(i+0x0A);
+ tok(i+0x0B);
+ tok(i+0x0C);
+ tok(i+0x0D);
+ tok(i+0x0E);
+ tok(i+0x0F);
+ tok(i+0x10);
+ tok(i+0x11);
+ tok(i+0x12);
+ tok(i+0x13);
+ tok(i+0x14);
+ tok(i+0x15);
+ tok(i+0x16);
+ tok(i+0x17);
+ tok(i+0x18);
+ tok(i+0x19);
+ tok(i+0x1A);
+ tok(i+0x1B);
+ tok(i+0x1C);
+ tok(i+0x1D);
+ tok(i+0x1E);
+ tok(i+0x1F);
+ i+=0x20;
+ }
+}
+
void update_pos() {
scr_ptr = (scr_row+scr_str)*80;
scr_ptr += scr_col;
@@ -163,12 +220,26 @@ void rdrw_row() {
}
scr_col++;
if (!buffer[ptr+i]) {
- update_pos();
+ #if !debug
+ waddch(scr, ' ');
+ #endif
}
}
scr_col = 0;
}
+void rdrw_ln(uint8_t start, uint8_t end) {
+ uint8_t tmp_row = scr_row;
+ uint8_t tmp_col = scr_col;
+ scr_row = start;
+ for (; scr_row <= end; ) {
+ rdrw_row();
+ ++scr_row;
+ }
+ scr_row = tmp_row;
+ scr_col = tmp_col;
+}
+
void scrl_down() {
scr_str++;
scr_end++;
@@ -201,9 +272,6 @@ void bitpos(uint8_t row) {
bit = row & 7;
mask = bits[bit];
byte = bitmask >> 3;
- #if debug
- /*mvwprintw(scr, 2, 0, "bit: $%02X, row: $%02X, byte: $%02X, mask: $%02X, bitmask: $%02X\r", bit, row, byte, mask, bitmask);*/
- #endif
}
void clrbit (uint8_t row) {
@@ -231,28 +299,68 @@ uint8_t getbit() {
return (mask & bitabl[byte]);
}
-void findst() {
+uint8_t findst() {
+ uint8_t line_count = 0;
while (getbit()) {
+ line_count++;
scr_row--;
if ((int8_t)scr_row < 0) {
+ line_count--;
scr_row++;
+ break;
}
}
+ return line_count;
}
+void fndend() {
+ uint16_t i = scr_ptr;
+ for (; buffer[i] != '\0'; i++);
+ scr_ptr3 = i;
+}
+
+void findend() {
+ fndend();
+ c = (uint16_t)(scr_ptr3/80);
+}
+
+
void shftln(uint16_t src, uint16_t dst, uint8_t flag) {
if (!flag) {
while (buffer[src] != '\0') {
buffer[dst++] = buffer[src];
buffer[src++] = '\0';
}
+ scr_ptr2 = scr_ptr;
+ scr_ptr = src;
+ findend();
+ scr_ptr = scr_ptr2;
+ if ((scr_ptr3 % 80 == 0) && (c > scr_row)) {
+ clrbit(c);
+ }
} else {
while (scr_ptr <= src) {
- mvwprintw(scr, 2, 0, "buffer[0x%04X]: $%02X, buffer[0x%04X]: $%02X, src: $%04X, dst: $%04X, scr_ptr: $%04X\r", src, buffer[src], dst, buffer[dst], src, dst, scr_ptr);
- wrefresh(scr);
+ if ((int16_t) src < 0) {
+ src = 0;
+ buffer[src] = '\0';
+ break;
+ }
buffer[dst--] = buffer[src];
buffer[src--] = '\0';
}
+ if (buffer[src+1] == '\0') {
+ buffer[src+1] = ' ';
+ }
+ scr_ptr2 = scr_ptr;
+ scr_ptr = src;
+ findend();
+ scr_ptr = scr_ptr2;
+ if (buffer[src+1] == ' ') {
+ buffer[src+1] = '\0';
+ }
+ if (c > scr_row) {
+ setbit(c);
+ }
}
}
@@ -262,6 +370,8 @@ void print_char(char ch) {
uint8_t is_esc = 0;
uint8_t done = 0;
uint16_t i = 0;
+ uint16_t x = 0;
+ uint16_t y = 0;
a = ch;
switch (ch) {
case 0x1B:
@@ -387,6 +497,7 @@ void print_char(char ch) {
scr_str = 0;
clr_bitabl();
clr_buf();
+ clr_tokline();
clr_cbuf();
scr_row = 0;
scr_col = 0;
@@ -409,7 +520,6 @@ void print_char(char ch) {
break;
}
}
- clrbit(scr_row+scr_str);
scr_row--;
scr_col = 80;
update_pos();
@@ -417,23 +527,52 @@ void print_char(char ch) {
break;
}
}
- scr_col--;
- update_pos();
- buffer[scr_ptr] = 0;
+ e = 0;
+ scr_trow = scr_row;
+ findend();
+ scr_row = c;
+ e = findst();
+ buffer[--scr_ptr] = 0;
shftln(scr_ptr+1, scr_ptr, 0);
#if !debug
- wdelch(scr);
+ int y, x;
+ getyx(scr, y, x);
+ if (x > 0) {
+ wmove(scr, y, x-1);
+ }
+ wdelch(scr);
#endif
+ if (e) {
+ findend();
+ scr_tcol = scr_col;
+ rdrw_ln(scr_row, c);
+ scr_col = scr_tcol;
+ }
+ scr_row = scr_trow;
+ scr_col--;
+ update_pos();
break;
default:
- if (buffer[scr_ptr] != '\0') {
- for (i = scr_ptr; buffer[i] != '\0'; i++);
- scr_ptr2 = scr_ptr-1;
- shftln(i-1, i, 1);
- i = 0;
+ d = 0;
+ if (buffer[scr_ptr] != '\0' && !b) {
+ fndend();
+ scr_ptr3++;
+ shftln(scr_ptr3-2, scr_ptr3-1, 1);
+ scr_trow = scr_row;
+ scr_tcol = scr_col;
+ a = ch;
+ buffer[scr_ptr] = ch;
+ findend();
+ scr_row = c;
+ findst();
+ rdrw_ln(scr_row, c);
+ scr_row = scr_trow;
+ scr_col = scr_tcol;
+ update_pos();
+ } else {
+ a = ch;
+ buffer[scr_ptr] = ch;
}
- a = ch;
- buffer[scr_ptr] = ch;
scr_col++;
#if !debug
waddch(scr, ch);
@@ -457,19 +596,26 @@ void print_char(char ch) {
uint8_t getkey(char ch) {
e = 0;
+ b = 0;
if (ch == '\n') {
uint16_t i = 0;
uint16_t ptr;
+ scr_trow = scr_row;
+ findend();
+ scr_row = c;
e = scr_row;
- findst(scr_row);
+ findst();
ptr = (scr_row+scr_str)*80;
for (;buffer[ptr+i] != '\0';i++) {
cmd_buf[i] = buffer[ptr+i];
}
+ if (e <= 23) {
+ scr_row = e;
+ } else {
+ scr_row = 23;
+ }
}
- if (e) {
- scr_row = e;
- }
+
print_char(ch);
wrefresh(scr);
if (a == '\n') {
@@ -481,9 +627,11 @@ uint8_t getkey(char ch) {
void print_str(const char *str) {
uint16_t i = 0;
+ b = 1;
for (;str[i] != '\0'; i++) {
print_char(str[i]);
}
+ b = 0;
}
uint8_t dabbed() {
@@ -525,6 +673,7 @@ int main() {
cmd_buf = malloc(0x400);
clr_bitabl();
clr_buf();
+ clr_tokline();
uint8_t end = 0;
uint8_t next = 1;
char ch;
@@ -541,6 +690,7 @@ int main() {
#define maxline 24
#endif
uint8_t ln = 0;
+ int row, col;
mvwprintw(scr, ln++, 0, "scr_row: $%02X, scr_col: $%02X\r", scr_row, scr_col);
mvwprintw(scr, ln++, 0, "scr_str: $%02X, scr_end: $%02X, scr_ptr: $%04X\r", scr_str, scr_end, scr_ptr);
wmove(scr, ++ln, 0);
@@ -550,6 +700,15 @@ int main() {
for (uint16_t i = 0; i < maxline; i++) {
for (uint16_t j = 0; j < 80; j++) {
wprintw(scr, "%02x", buffer[(j+(i*80))]);
+ if (j == scr_col && i == scr_row) {
+ getyx(scr, row, col);
+ wmove(scr, ln++, 0);
+ wclrtoeol(scr);
+ wmove(scr, row+1, col-2);
+ wprintw(scr, "/\\\r");
+ wmove(scr, row, col);
+ wrefresh(scr);
+ }
}
wprintw(scr, ", i: $%02X\r", i);
wmove(scr, ln++, 0);