#include #include #include #include "cpu.h" #define WCOLS 80 #define WLINES 25 #ifndef FBIN_PATH #error FBIN_PATH needed #endif #ifndef BLKFS_PATH #error BLKFS_PATH needed #endif extern uint8_t byteregtable[8]; extern union _bytewordregs_ regs; extern INTHOOK INTHOOKS[0x100]; static FILE *fp; static FILE *blkfp; static int retcode = 0; WINDOW *bw, *dw, *w; /* we have a fake INT API: INT 1: EMIT. AL = char to spit INT 2: KEY. AL = char read INT 3: AT-XY. AL = x, BL = y INT 4: BLKREAD. AX = blkid, BX = dest addr INT 5: BLKWRITE. AX = blkid, BX = src addr INT 6: RETCODE. AX = retcode. */ void int1() { uint8_t val = regs.byteregs[regal]; if (fp != NULL) { putchar(val); } else { if (val >= 0x20 || val == '\n') { wechochar(w, val); } else if (val == 0x08) { int y, x; getyx(w, y, x); wmove(w, y, x-1); } } } void int2() { int c; if (fp != NULL) { c = getc(fp); } else { // debug_panel(); c = wgetch(w); } if (c == EOF) { c = 4; // ASCII EOT } regs.byteregs[regal] = c; } void int3() { wmove(w, regs.byteregs[regbl], regs.byteregs[regal]); } void int4() { uint16_t blkid = getreg16(regax); uint16_t dest = getreg16(regbx); fseek(blkfp, blkid*1024, SEEK_SET); for (int i=0; i<1024; i++) { write86(dest+i, getc(blkfp)); } } void int5() { uint16_t blkid = getreg16(regax); uint16_t dest = getreg16(regbx); fseek(blkfp, blkid*1024, SEEK_SET); for (int i=0; i<1024; i++) { putc(read86(dest+i), blkfp); } } void int6() { retcode = getreg16(regax); } int main(int argc, char *argv[]) { INTHOOKS[1] = int1; INTHOOKS[2] = int2; INTHOOKS[3] = int3; INTHOOKS[4] = int4; INTHOOKS[5] = int5; INTHOOKS[6] = int6; reset86(0); fprintf(stderr, "Using blkfs %s\n", BLKFS_PATH); blkfp = fopen(BLKFS_PATH, "r+"); if (!blkfp) { fprintf(stderr, "Can't open\n"); return 1; } fseek(blkfp, 0, SEEK_END); if (ftell(blkfp) < 100 * 1024) { fclose(blkfp); fprintf(stderr, "emul/blkfs too small, something's wrong, aborting.\n"); return 1; } fseek(blkfp, 0, SEEK_SET); // initialize memory FILE *bfp = fopen(FBIN_PATH, "r"); if (!bfp) { fprintf(stderr, "Can't open forth.bin\n"); return 1; } int i = 0; int c = getc(bfp); while (c != EOF) { write86(i++, c); c = getc(bfp); } fclose(bfp); w = NULL; if (argc == 2) { fp = fopen(argv[1], "r"); if (fp == NULL) { fprintf(stderr, "Can't open %s\n", argv[1]); return 1; } while (exec86(100)); fclose(fp); } else if (argc == 1) { initscr(); cbreak(); noecho(); nl(); clear(); // border window bw = newwin(WLINES+2, WCOLS+2, 0, 0); wborder(bw, 0, 0, 0, 0, 0, 0, 0, 0); wrefresh(bw); // debug panel dw = newwin(1, 30, LINES-1, COLS-30); w = newwin(WLINES, WCOLS, 1, 1); scrollok(w, 1); while (exec86(100)) { //debug_panel(); } nocbreak(); echo(); delwin(w); delwin(bw); delwin(dw); endwin(); printf("\nDone!\n"); //emul_printdebug(); } return retcode; }