home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
magazine
/
drdobbs
/
1991
/
05
/
d_flat
/
console.c
< prev
next >
Wrap
Text File
|
1991-02-18
|
4KB
|
173 lines
/* ----------- console.c ---------- */
#include <conio.h>
#include <bios.h>
#include <dos.h>
#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 MSC
#define ZEROFLAG 0x40
/* ---- Test for keystroke ---- */
int keyhit(void)
{
_AH = 1;
geninterrupt(KEYBRD);
return (_FLAGS & ZEROFLAG) == 0;
}
#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);
}