/* ----------- console.c ---------- */ #include #include #include #include "system.h" #include "keys.h" /* ----- table of alt keys for finding shortcut keys ----- */ char altconvert[] = { ALT_A,ALT_B,ALT_C,ALT_D,ALT_E,ALT_F,ALT_G,ALT_H, ALT_I,ALT_J,ALT_K,ALT_L,ALT_M,ALT_N,ALT_O,ALT_P, ALT_Q,ALT_R,ALT_S,ALT_T,ALT_U,ALT_V,ALT_W,ALT_X, ALT_Y,ALT_Z,ALT_0,ALT_1,ALT_2,ALT_3,ALT_4,ALT_5, ALT_6,ALT_7,ALT_8,ALT_9,0 }; unsigned video_mode; unsigned video_page; static int near cursorpos[MAXSAVES]; static int near cursorshape[MAXSAVES]; static int cs = 0; static union REGS regs; #ifndef POWERC #ifndef MSC #define ZEROFLAG 0x40 /* ---- Test for keystroke ---- */ int keyhit(void) { _AH = 1; geninterrupt(KEYBRD); return (_FLAGS & ZEROFLAG) == 0; } #endif #endif /* ---- Read a keystroke ---- */ int getkey(void) { int c; while (keyhit() == 0) ; if (((c = bioskey(0)) & 0xff) == 0) c = (c >> 8) | 0x80; return c & 0xff; } /* ---------- read the keyboard shift status --------- */ int getshift(void) { regs.h.ah = 2; int86(KEYBRD, ®s, ®s); return regs.h.al; } /* ------- macro to wait one clock tick -------- */ #define wait() \ { \ int now = peek(0x40,0x6c); \ while (now == peek(0x40,0x6c)) \ ; \ } /* -------- sound a buzz tone ---------- */ void beep(void) { wait(); outp(0x43, 0xb6); /* program the frequency */ outp(0x42, (int) (COUNT % 256)); outp(0x42, (int) (COUNT / 256)); outp(0x61, inp(0x61) | 3); /* start the sound */ wait(); outp(0x61, inp(0x61) & ~3); /* stop the sound */ } /* -------- get the video mode and page from BIOS -------- */ void videomode(void) { regs.h.ah = 15; int86(VIDEO, ®s, ®s); video_mode = regs.h.al; video_page = regs.x.bx; video_page &= 0xff00; video_mode &= 0x7f; } /* ------ position the cursor ------ */ void cursor(int x, int y) { videomode(); regs.x.dx = ((y << 8) & 0xff00) + x; regs.x.ax = 0x0200; regs.x.bx = video_page; int86(VIDEO, ®s, ®s); } /* ------ get cursor shape and position ------ */ static void near getcursor(void) { videomode(); regs.h.ah = READCURSOR; regs.x.bx = video_page; int86(VIDEO, ®s, ®s); } /* ------- get the current cursor position ------- */ void curr_cursor(int *x, int *y) { getcursor(); *x = regs.h.dl; *y = regs.h.dh; } /* ------ save the current cursor configuration ------ */ void savecursor(void) { if (cs < MAXSAVES) { getcursor(); cursorshape[cs] = regs.x.cx; cursorpos[cs] = regs.x.dx; cs++; } } /* ---- restore the saved cursor configuration ---- */ void restorecursor(void) { if (cs) { --cs; videomode(); regs.x.dx = cursorpos[cs]; regs.h.ah = SETCURSOR; regs.x.bx = video_page; int86(VIDEO, ®s, ®s); set_cursor_type(cursorshape[cs]); } } /* ------ make a normal cursor ------ */ void normalcursor(void) { set_cursor_type(0x0607); } /* ------ hide the cursor ------ */ void hidecursor(void) { getcursor(); regs.h.ch |= HIDECURSOR; regs.h.ah = SETCURSORTYPE; int86(VIDEO, ®s, ®s); } /* ------ unhide the cursor ------ */ void unhidecursor(void) { getcursor(); regs.h.ch &= ~HIDECURSOR; regs.h.ah = SETCURSORTYPE; int86(VIDEO, ®s, ®s); } /* ---- use BIOS to set the cursor type ---- */ void set_cursor_type(unsigned t) { videomode(); regs.h.ah = SETCURSORTYPE; regs.x.bx = video_page; regs.x.cx = t; int86(VIDEO, ®s, ®s); } /* ---- test for EGA -------- */ int isEGA(void) { if (isVGA()) return 0; regs.h.ah = 0x12; regs.h.bl = 0x10; int86(VIDEO, ®s, ®s); return regs.h.bl != 0x10; } /* ---- test for VGA -------- */ int isVGA(void) { regs.x.ax = 0x1a00; int86(VIDEO, ®s, ®s); return regs.h.al == 0x1a && regs.h.bl > 6; } static void Scan350(void) { regs.x.ax = 0x1201; regs.h.bl = 0x30; int86(VIDEO, ®s, ®s); } static void Scan400(void) { regs.x.ax = 0x1202; regs.h.bl = 0x30; int86(VIDEO, ®s, ®s); } /* ---------- set 25 line mode ------- */ void Set25(void) { if (isVGA) Scan400(); regs.x.ax = 0x1114; regs.x.bx = 0; int86(VIDEO, ®s, ®s); } /* ---------- set 43 line mode ------- */ void Set43(void) { if (isVGA) Scan350(); regs.x.ax = 0x1112; regs.x.bx = 0; int86(VIDEO, ®s, ®s); } /* ---------- set 50 line mode ------- */ void Set50(void) { if (isVGA) Scan400(); regs.x.ax = 0x1112; regs.x.bx = 0; int86(VIDEO, ®s, ®s); }