#include "v3_ctrl.h"
+static int in_color = 0;
+static int color8 = 0;
+#define TRANS_STYLE(x) ( !color8 ? (x) : ((x)&0x7)|(((x)&0x70)>>1))
+
static int use_curses = 0;
static int debug_enable = 0;
return -1;
}
+ if (in_color) {wattron(console.win, COLOR_PAIR(TRANS_STYLE(msg->style)));}
mvwaddch(console.win, msg->y, msg->x, c);
+ if (in_color) {wattroff(console.win, COLOR_PAIR(TRANS_STYLE(msg->style)));}
} else {
//stdout text display
};
static const struct key_code ascii_to_key_code[] = { // ASCII Value Serves as Index
- NO_KEY, NO_KEY, NO_KEY, NO_KEY, // 0x00 - 0x03
- NO_KEY, NO_KEY, NO_KEY, { 0x0E, 0 }, // 0x04 - 0x07
+ NO_KEY, NO_KEY, {0x50, 0}, {0x48, 0}, // 0x00 - 0x03
+ {0x4B, 0}, {0x4D, 0}, NO_KEY, { 0x0E, 0 }, // 0x04 - 0x07
{ 0x0E, 0 }, { 0x0F, 0 }, { 0x1C, 0 }, NO_KEY, // 0x08 - 0x0B
NO_KEY, { 0x1C, 0 }, NO_KEY, NO_KEY, // 0x0C - 0x0F
NO_KEY, NO_KEY, NO_KEY, NO_KEY, // 0x10 - 0x13
}
return 0;
}
+
+
+#define MIN_TTY_COLS 80
+#define MIN_TTY_ROWS 25
+int check_terminal_size (void)
+{
+ unsigned short n_cols = 0;
+ unsigned short n_rows = 0;
+ struct winsize winsz;
+
+ ioctl (fileno(stdin), TIOCGWINSZ, &winsz);
+ n_cols = winsz.ws_col;
+ n_rows = winsz.ws_row;
+
+ if (n_cols < MIN_TTY_COLS || n_rows < MIN_TTY_ROWS) {
+ printf ("Your window is not large enough.\n");
+ printf ("It must be at least %dx%d, but yours is %dx%d\n",
+ MIN_TTY_COLS, MIN_TTY_ROWS, n_cols, n_rows);
+ return (-1);
+ }
+
+ /* SUCCESS */
+ return (0);
+}
+
+
+
+static void
+init_colors (void)
+{
+ unsigned short i;
+
+ if (!has_colors()) {
+ fprintf(stderr,"No color support\n");
+ in_color=0;
+ color8=0;
+ return;
+ }
+ start_color();
+
+ if (can_change_color() && COLORS>=16 && COLOR_PAIRS>=256) {
+ fprintf(stderr, "Modifyable color support with enough colors available\n");
+ // initialize first 16 colors to be the PC colors
+ // then create all the pairings
+ for (i=0;i<16;i++) {
+ unsigned short red, green, blue, intens;
+ // i = IRGB (4 bits)
+ intens = i>>3 & 0x1;
+ red = i>>2 & 0x1;
+ green = i>>1 & 0x1;
+ blue = i>>0 & 0x1;
+ init_color(i, 500*(red+intens), 500*(blue+intens), 500*(green+intens));
+ }
+ for (i=0;i<256;i++) {
+ init_pair(i, i & 0xf, (i >> 4) & 0xf);
+ }
+ in_color = 1;
+ color8 = 0;
+ return;
+ } else {
+ if (COLORS!=8 || COLOR_PAIRS<64) {
+ fprintf(stderr,"Insufficient number of fixed colors (%d) or color pairs (%d)\n",COLORS,COLOR_PAIRS);
+ in_color = 0;
+ color8 = 0;
+ return;
+ }
+ // We have only the low-intensity colors available, so
+ // map just to these
+ fprintf(stderr,"Only 8 color standard palette available\n");
+ for (i=0;i<64;i++) {
+ // VGA color order: black, blue, green, cyan, red, magenta, brown, gray
+ // curses color order: black, red, green, yellow, blue, magenta, cyan, white
+ short map[] = { 0, 4, 2, 6, 1, 5, 3, 7 };
+ unsigned short fg, bg;
+ // discard intensity bit
+ bg = (i>>3 & 0x7);
+ fg = i & 0x7;
+ init_pair(i, map[fg], map[bg]);
+ }
+ in_color = 1;
+ color8 = 1;
+ return;
+ }
+}
+
+
int main(int argc, char* argv[]) {
int vm_fd;
int cons_fd;
return -1;
}
+ /* Check for minimum Terminal size at start */
+ if (0 != check_terminal_size()) {
+ printf ("Error: terminal too small!\n");
+ return -1;
+ }
+
vm_dev = argv[1];
vm_fd = open(vm_dev, O_RDONLY);
scrollok(console.win, 1);
erase();
+ init_colors();
+ //abort();
}
/*
//ioctl(STDIN_FILENO, KDSKBMODE, K_RAW);
- if (LINES<25 || COLS<80) {
- printf("Your window is not large enough.\nIt must be at least 80x25, but yours is %dx%d\n",COLS,LINES);
- close(cons_fd);
- exit(-1);
- }
-
-
while (1) {
int ret;
int bytes_read = 0;
}
}
- if (FD_ISSET(STDIN_FILENO, &rset)) {
- unsigned char key = getch();
-
- if (key == '\\') { // ESC
- break;
- } else if (key == '`') {
- unsigned char sc = 0x44; // F10
- writeit(cons_fd,sc);
- sc |= 0x80;
- writeit(cons_fd,sc);
- } else if (key == '~') { // CTRL-C
- unsigned char sc;
- sc = 0x1d; // left ctrl down
- writeit(cons_fd,sc);
- sc = 0x2e; // c down
- writeit(cons_fd,sc);
- sc = 0x2e | 0x80; // c up
- writeit(cons_fd,sc);
- sc = 0x1d | 0x80; // left ctrl up
- writeit(cons_fd,sc);
- } else {
- if (send_char_to_palacios_as_scancodes(cons_fd,key)) {
- printf("Error sending key to console\n");
- return -1;
- }
- }
+ if (FD_ISSET(STDIN_FILENO, &rset)) {
+ unsigned char key = getch();
+
+ if (key == '\\') { // ESC
+ break;
+ } else if (key == '`') {
+ unsigned char sc = 0x44; // F10
+ writeit(cons_fd,sc);
+ sc |= 0x80;
+ writeit(cons_fd,sc);
+ } else if (key == '~') { // CTRL-C
+ unsigned char sc;
+ sc = 0x1d; // left ctrl down
+ writeit(cons_fd,sc);
+ sc = 0x2e; // c down
+ writeit(cons_fd,sc);
+ sc = 0x2e | 0x80; // c up
+ writeit(cons_fd,sc);
+ sc = 0x1d | 0x80; // left ctrl up
+ writeit(cons_fd,sc);
+ } else {
+ if (send_char_to_palacios_as_scancodes(cons_fd,key)) {
+ printf("Error sending key to console\n");
+ return -1;
+ }
+ }
}
}