// ncurses.c // Implements interface.h // Provides an in-terminal interface to the emulator. #include #include"interface.h" #include"signetics.c" #include"../apple.h" int TermX = 0; int TermY = 0; WINDOW *AppleWindow; char UserInput() { return getch(); } void TerminalInit() { initscr(); cbreak(); noecho(); curs_set(0); keypad(stdscr, TRUE); AppleWindow = newwin(24, 40, 1, 1); // Draw the border. attron(A_REVERSE); move(0, 0); printw(" "); for (int i = 1; i <= 24; i++) { mvaddch(i, 0, ' '); mvaddch(i, 41, ' '); } mvprintw(25, 0, " ~ "); mvprintw(26, 0, " Alekseis Apple I "); mvprintw(27, 0, " "); attroff(A_REVERSE); mvwaddch(AppleWindow, TermY, TermX, '@' | A_BLINK); TerminalShiftRegister = (byte*)malloc(960); TerminalShiftRegisterPosition = TerminalShiftRegister; TerminalShiftRegisterOffset = 0; refresh(); } void TerminalClose() { free(TerminalShiftRegister); curs_set(1); endwin(); } // Takes an an Apple I ASCII character. void TerminalInput(char n) { mvwaddch(AppleWindow, TermY, TermX, ' '); mvwaddch(AppleWindow, TermY, TermX, n); *TerminalShiftRegisterPosition = n; TerminalShiftRegisterPosition++; if (TerminalShiftRegisterPosition >= (TerminalShiftRegister + 960)) TerminalShiftRegisterPosition = TerminalShiftRegister; TermX++; //if (n == KEY_ENTER) { // TermY++; //} if (TermX >= 40) { TermX = 0; TermY++; } if (TermY >= 24) { TerminalShiftRegisterOffset += 40; // Discard first line if (TerminalShiftRegisterOffset >= 960) TerminalShiftRegisterOffset = TerminalShiftRegister; byte *offset = TerminalShiftRegister + TerminalShiftRegisterOffset; // For every position, fill with contents of the terminal shift register for (int i = 0; i < 23; i++) { for (int j = 0; j < 40; j++) { if (offset >= (TerminalShiftRegister + 960)) offset -= 960; mvwaddch(AppleWindow, i, j, ToAscii(*(offset))); offset++; }} TermY = 23; TermX = 0; // Clear bottom line. mvwprintw(AppleWindow, TermY, TermX, " "); } mvwaddch(AppleWindow, TermY, TermX, '@' | A_BLINK); wrefresh(AppleWindow); }