#include "subeditor.h"
#define clr_bitabl() {\
bitabl[0x00] = 0;\
bitabl[0x01] = 0;\
bitabl[0x02] = 0;\
bitabl[0x03] = 0;\
bitabl[0x04] = 0;\
bitabl[0x05] = 0;\
bitabl[0x06] = 0;\
bitabl[0x07] = 0;\
bitabl[0x08] = 0;\
bitabl[0x09] = 0;\
bitabl[0x0A] = 0;\
bitabl[0x0B] = 0;\
bitabl[0x0C] = 0;\
bitabl[0x0D] = 0;\
bitabl[0x0E] = 0;\
bitabl[0x0F] = 0;\
}
WINDOW *scr;
const char *tok = "dab";
const char *msg = "oof, you divided a, and b on me.\n";
const char *string = "Please, type something.\n";
const char *string2 = "You typed, ";
const uint8_t bits[8] = {
0x80,
0x40,
0x20,
0x10,
0x08,
0x04,
0x02,
0x01
};
char *buffer;
char *cmd_buf;
uint8_t scr_row = 0;
uint8_t scr_col = 0;
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;
uint8_t a = 0;
uint8_t b = 0;
uint8_t c = 0;
uint8_t d = 0;
uint8_t e = 0;
uint8_t f = 0;
uint8_t bitmask = 0;
uint8_t bitabl[16];
uint8_t scr_str = 0;
uint8_t scr_end = 23;
uint8_t wrapped = 0;
void clr_buf() {
uint16_t i = 0;
for (; i < 0x2000;) {
buffer[i+0x00] = 0;
buffer[i+0x01] = 0;
buffer[i+0x02] = 0;
buffer[i+0x03] = 0;
buffer[i+0x04] = 0;
buffer[i+0x05] = 0;
buffer[i+0x06] = 0;
buffer[i+0x07] = 0;
buffer[i+0x08] = 0;
buffer[i+0x09] = 0;
buffer[i+0x0A] = 0;
buffer[i+0x0B] = 0;
buffer[i+0x0C] = 0;
buffer[i+0x0D] = 0;
buffer[i+0x0E] = 0;
buffer[i+0x0F] = 0;
buffer[i+0x10] = 0;
buffer[i+0x11] = 0;
buffer[i+0x12] = 0;
buffer[i+0x13] = 0;
buffer[i+0x14] = 0;
buffer[i+0x15] = 0;
buffer[i+0x16] = 0;
buffer[i+0x17] = 0;
buffer[i+0x18] = 0;
buffer[i+0x19] = 0;
buffer[i+0x1A] = 0;
buffer[i+0x1B] = 0;
buffer[i+0x1C] = 0;
buffer[i+0x1D] = 0;
buffer[i+0x1E] = 0;
buffer[i+0x1F] = 0;
i+=0x20;
}
}
void clr_cbuf() {
uint16_t i = 0;
for (; i < 0x400;) {
cmd_buf[i+0x00] = 0;
cmd_buf[i+0x01] = 0;
cmd_buf[i+0x02] = 0;
cmd_buf[i+0x03] = 0;
cmd_buf[i+0x04] = 0;
cmd_buf[i+0x05] = 0;
cmd_buf[i+0x06] = 0;
cmd_buf[i+0x07] = 0;
cmd_buf[i+0x08] = 0;
cmd_buf[i+0x09] = 0;
cmd_buf[i+0x0A] = 0;
cmd_buf[i+0x0B] = 0;
cmd_buf[i+0x0C] = 0;
cmd_buf[i+0x0D] = 0;
cmd_buf[i+0x0E] = 0;
cmd_buf[i+0x0F] = 0;
cmd_buf[i+0x10] = 0;
cmd_buf[i+0x11] = 0;
cmd_buf[i+0x12] = 0;
cmd_buf[i+0x13] = 0;
cmd_buf[i+0x14] = 0;
cmd_buf[i+0x15] = 0;
cmd_buf[i+0x16] = 0;
cmd_buf[i+0x17] = 0;
cmd_buf[i+0x18] = 0;
cmd_buf[i+0x19] = 0;
cmd_buf[i+0x1A] = 0;
cmd_buf[i+0x1B] = 0;
cmd_buf[i+0x1C] = 0;
cmd_buf[i+0x1D] = 0;
cmd_buf[i+0x1E] = 0;
cmd_buf[i+0x1F] = 0;
i+=0x20;
}
}
#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;
#if !debug
wmove(scr, scr_row, scr_col);
#endif
}
void rdrw_row() {
uint8_t i = 0;
uint16_t ptr;
scr_col = 0;
update_pos();
ptr = scr_ptr;
for (;i < 80;i++) {
if (buffer[ptr+i]) {
#if !debug
waddch(scr, buffer[ptr+i]);
#endif
}
scr_col++;
if (!buffer[ptr+i]) {
#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++;
#if !debug
wscrl(scr, 1);
#endif
rdrw_row();
update_pos();
wrapped = 0;
}
void scrl_up() {
scr_str--;
scr_end--;
#if !debug
wscrl(scr, -1);
#endif
scr_trow = scr_row;
scr_tcol = scr_col;
rdrw_row();
scr_row = scr_trow;
scr_col = scr_tcol;
update_pos();
wrapped = 0;
}
void bitpos(uint8_t row) {
uint8_t bit;
bitmask = row;
bit = row & 7;
mask = bits[bit];
byte = bitmask >> 3;
}
void clrbit (uint8_t row) {
uint8_t tmp;
uint8_t invmsk;
bitpos(row);
invmsk = ~mask;
tmp = (invmsk & (bitabl[byte]));
bitabl[byte] = tmp;
}
void setbit (uint8_t row) {
uint8_t tmp;
bitpos(row);
tmp = (mask | (bitabl[byte]));
bitabl[byte] = tmp;
}
uint8_t getbit() {
if (scr_str) {
bitpos(scr_row+scr_str);
} else {
bitpos(scr_row);
}
return (mask & bitabl[byte]);
}
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) {
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);
}
}
}
void print_char(char ch) {
uint8_t is_wrap = 0;
uint8_t is_scroll = 0;
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:
if (wgetch(scr) == 0x1B) {
is_esc = 1;
}
ch = wgetch(scr);
if (!ch)
break;
switch (ch) {
case 'A':
if (!scr_row) {
if (scr_str) {
scrl_up();
update_pos();
break;
} else {
break;
}
}
scr_row--;
update_pos();
break;
case 'B':
if (scr_row == 23) {
scr_trow = scr_row;
scr_tcol = scr_col;
scrl_down();
scr_row = scr_trow;
scr_col = scr_tcol;
update_pos();
break;
}
scr_row++;
update_pos();
break;
case 'C':
if (scr_col >= 79) {
++scr_row;
if (getbit()) {
scr_col = 0;
if (scr_row > 23) {
wrapped = 1;
scrl_down();
is_wrap = 0;
done = 1;
} else {
is_wrap = 1;
done = 1;
}
} else {
is_wrap = 0;
done = 1;
}
} else {
scr_col++;
is_wrap = 1;
done = 1;
}
if (!is_wrap) {
--scr_row;
is_wrap = 0;
}
if (done) {
update_pos();
done = 0;
}
wrapped = 0;
break;
case 'D':
if (!scr_col) {
if (getbit()) {
if (scr_row) {
wrapped = 1;
scr_row--;
}
scr_col = 79;
if (!scr_row) {
if (wrapped) {
done = 1;
} else if (!scr_str) {
done = 0;
} else {
scrl_up();
done = 0;
}
} else {
done = 1;
}
} else {
done = 0;
}
} else {
scr_col--;
done = 1;
}
if (done) {
update_pos();
done = 0;
}
break;
}
break;
case '\n':
buffer[scr_ptr] = 0;
scr_col = 0;
if (scr_row == 23) {
scrl_down();
} else {
scr_row++;
update_pos();
}
a = '\n';
wrefresh(scr);
break;
case 0x0C:
scr_end = 23;
scr_str = 0;
clr_bitabl();
clr_buf();
clr_tokline();
clr_cbuf();
scr_row = 0;
scr_col = 0;
update_pos();
werase(scr);
break;
case 19:
break;
case 18:
break;
case '\b':
case 0x7F:
if (!scr_col) {
if (getbit()) {
if (!scr_row) {
if (scr_str) {
scrl_up();
scr_row++;
} else {
break;
}
}
scr_row--;
scr_col = 80;
update_pos();
} else {
break;
}
}
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
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:
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;
}
scr_col++;
#if !debug
waddch(scr, ch);
#endif
if (scr_col >= 80) {
if (scr_row >= 23) {
is_scroll = 1;
scrl_down();
} else {
is_scroll = 0;
scr_row++;
}
scr_col = 0;
setbit(scr_row+scr_str);
update_pos();
}
update_pos();
break;
}
}
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();
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;
}
}
print_char(ch);
wrefresh(scr);
if (a == '\n') {
return 0;
} else {
return 1;
}
}
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() {
uint8_t i = 0;
uint8_t done = 0;
while (!done) {
if (!cmd_buf[i]) {
done = 1;
} else if (cmd_buf[i] == tok[i]) {
i++;
if (i == 3) {
print_str(msg);
break;
}
} else {
done = 1;
}
}
return done;
}
int main() {
if(!scr)
scr = initscr();
nodelay(stdscr, 0);
crmode();
noecho();
nl();
curs_set(1);
werase(scr);
scrollok(scr, 1);
wrefresh(scr);
start_color();
use_default_colors();
init_pair(1, COLOR_WHITE, -1);
attron(COLOR_PAIR(1) | A_BOLD);
wmove(scr, 0, 0);
buffer = malloc(0x2000);
cmd_buf = malloc(0x400);
clr_bitabl();
clr_buf();
clr_tokline();
uint8_t end = 0;
uint8_t next = 1;
char ch;
while (!end) {
if (next) {
clr_cbuf();
print_str(string);
next = 0;
}
#if debug
#if !debug_cmd_buf
#define maxline 48
#else
#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);
wprintw(scr, "buffer:\r");
wmove(scr, ++ln, 0);
ln++;
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);
}
#if debug_cmd_buf
wprintw(scr, "cmd_buf:\r");
wmove(scr, ln++, 0);
for (uint16_t i = 0; i < 12; i++) {
for (uint16_t j = 0; j < 80; j++) {
wprintw(scr, "%02x", cmd_buf[(j+(i*80))]);
}
wprintw(scr, ", i: $%02X\r", i);
wmove(scr, ln++, 0);
}
#endif
wprintw(scr, "bitabl:\r");
wmove(scr, ln++, 0);
for (uint16_t i = 0; i < 0x10; i++) {
wprintw(scr, "%02x", bitabl[i]);
}
waddch(scr, '\r');
wrefresh(scr);
#endif
ch = wgetch(scr);
if (ch == 0x11) {
end = 1;
continue;
}
if (!getkey(ch)) {
if (subasm()) {
print_str(string2);
print_str(cmd_buf);
print_char('\n');
}
next = 1;
}
}
endwin();
free(buffer);
free(cmd_buf);
return 0;
}