changed coding style

This commit is contained in:
Daniel Borca 2005-01-14 08:37:20 +00:00
parent f4bff83c32
commit 7da875d55f
12 changed files with 966 additions and 939 deletions

View file

@ -1,7 +1,7 @@
/*
* PC/HW routine collection v1.3 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -16,6 +16,7 @@
#include "pc_hw.h"
/*
* atexit
*/
@ -24,52 +25,61 @@
static volatile int atexitcnt;
static VFUNC atexittbl[MAX_ATEXIT];
static void __attribute__((destructor)) doexit (void)
static void __attribute__((destructor))
doexit (void)
{
while (atexitcnt) atexittbl[--atexitcnt]();
while (atexitcnt) atexittbl[--atexitcnt]();
}
int pc_clexit (VFUNC f)
{
int i;
for (i=0;i<atexitcnt;i++) {
if (atexittbl[i]==f) {
for (atexitcnt--;i<atexitcnt;i++) atexittbl[i] = atexittbl[i+1];
atexittbl[i] = 0;
return 0;
}
}
return -1;
int
pc_clexit (VFUNC f)
{
int i;
for (i = 0; i < atexitcnt; i++) {
if (atexittbl[i] == f) {
for (atexitcnt--; i < atexitcnt; i++) atexittbl[i] = atexittbl[i+1];
atexittbl[i] = 0;
return 0;
}
}
return -1;
}
int pc_atexit (VFUNC f)
int
pc_atexit (VFUNC f)
{
pc_clexit(f);
if (atexitcnt<MAX_ATEXIT) {
atexittbl[atexitcnt++] = f;
return 0;
}
return -1;
pc_clexit(f);
if (atexitcnt < MAX_ATEXIT) {
atexittbl[atexitcnt++] = f;
return 0;
}
return -1;
}
/*
* locked memory allocation
*/
void *pc_malloc (size_t size)
void *
pc_malloc (size_t size)
{
void *p = malloc(size);
void *p = malloc(size);
if (p) {
if (_go32_dpmi_lock_data(p, size)) {
free(p);
return NULL;
}
}
if (p) {
if (_go32_dpmi_lock_data(p, size)) {
free(p);
return NULL;
}
}
return p;
return p;
}
/*
* standard redirection
*/
@ -78,68 +88,76 @@ static int h_out, h_outbak;
static char errname[L_tmpnam];
static int h_err, h_errbak;
int pc_open_stdout (void)
int
pc_open_stdout (void)
{
tmpnam(outname);
tmpnam(outname);
if ((h_out=open(outname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
h_outbak = dup(STDOUT_FILENO);
fflush(stdout);
dup2(h_out, STDOUT_FILENO);
}
if ((h_out=open(outname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
h_outbak = dup(STDOUT_FILENO);
fflush(stdout);
dup2(h_out, STDOUT_FILENO);
}
return h_out;
return h_out;
}
void pc_close_stdout (void)
void
pc_close_stdout (void)
{
FILE *f;
char *line = alloca(512);
FILE *f;
char *line = alloca(512);
if (h_out > 0) {
dup2(h_outbak, STDOUT_FILENO);
close(h_out);
close(h_outbak);
if (h_out > 0) {
dup2(h_outbak, STDOUT_FILENO);
close(h_out);
close(h_outbak);
f = fopen(outname, "rt");
while (fgets(line, 512, f)) {
fputs(line, stdout);
}
fclose(f);
f = fopen(outname, "rt");
while (fgets(line, 512, f)) {
fputs(line, stdout);
}
fclose(f);
remove(outname);
}
remove(outname);
}
}
int pc_open_stderr (void)
int
pc_open_stderr (void)
{
tmpnam(errname);
tmpnam(errname);
if ((h_err=open(errname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
h_errbak = dup(STDERR_FILENO);
fflush(stderr);
dup2(h_err, STDERR_FILENO);
}
if ((h_err=open(errname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
h_errbak = dup(STDERR_FILENO);
fflush(stderr);
dup2(h_err, STDERR_FILENO);
}
return h_err;
return h_err;
}
void pc_close_stderr (void)
void
pc_close_stderr (void)
{
FILE *f;
char *line = alloca(512);
FILE *f;
char *line = alloca(512);
if (h_err > 0) {
dup2(h_errbak, STDERR_FILENO);
close(h_err);
close(h_errbak);
if (h_err > 0) {
dup2(h_errbak, STDERR_FILENO);
close(h_err);
close(h_errbak);
f = fopen(errname, "rt");
while (fgets(line, 512, f)) {
fputs(line, stderr);
}
fclose(f);
f = fopen(errname, "rt");
while (fgets(line, 512, f)) {
fputs(line, stderr);
}
fclose(f);
remove(errname);
}
remove(errname);
}
}

View file

@ -1,7 +1,7 @@
/*
* PC/HW routine collection v1.4 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/

View file

@ -1,7 +1,7 @@
/*
* PC/HW routine collection v1.3 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/

View file

@ -1,7 +1,7 @@
/*
* PC/HW routine collection v1.3 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -14,7 +14,6 @@
#include "pc_hw.h"
#define KEYB_IRQ 1
#define KEY_BUFFER_SIZE 64
@ -25,8 +24,8 @@
static int keyboard_installed;
static volatile struct {
volatile int start, end;
volatile int key[KEY_BUFFER_SIZE];
volatile int start, end;
volatile int key[KEY_BUFFER_SIZE];
} key_buffer;
static volatile int key_enhanced, key_pause_loop, key_shifts;
@ -35,10 +34,8 @@ static int in_a_terrupt = FALSE;
static volatile char pc_key[KEY_MAX];
/* convert Allegro format scancodes into key_shifts flag bits */
static unsigned short modifier_table[KEY_MAX - KEY_MODIFIERS] =
{
static unsigned short modifier_table[KEY_MAX - KEY_MODIFIERS] = {
KB_SHIFT_FLAG, KB_SHIFT_FLAG, KB_CTRL_FLAG,
KB_CTRL_FLAG, KB_ALT_FLAG, KB_ALT_FLAG,
KB_LWIN_FLAG, KB_RWIN_FLAG, KB_MENU_FLAG,
@ -46,10 +43,8 @@ static unsigned short modifier_table[KEY_MAX - KEY_MODIFIERS] =
};
/* lookup table for converting hardware scancodes into Allegro format */
static unsigned char hw_to_mycode[128] =
{
static unsigned char hw_to_mycode[128] = {
/* 0x00 */ 0, KEY_ESC, KEY_1, KEY_2,
/* 0x04 */ KEY_3, KEY_4, KEY_5, KEY_6,
/* 0x08 */ KEY_7, KEY_8, KEY_9, KEY_0,
@ -85,10 +80,8 @@ static unsigned char hw_to_mycode[128] =
};
/* lookup table for converting extended hardware codes into Allegro format */
static unsigned char hw_to_mycode_ex[128] =
{
static unsigned char hw_to_mycode_ex[128] = {
/* 0x00 */ 0, KEY_ESC, KEY_1, KEY_2,
/* 0x04 */ KEY_3, KEY_4, KEY_5, KEY_6,
/* 0x08 */ KEY_7, KEY_8, KEY_9, KEY_0,
@ -124,10 +117,8 @@ static unsigned char hw_to_mycode_ex[128] =
};
/* default mapping table for the US keyboard layout */
static unsigned short standard_key_ascii_table[KEY_MAX] =
{
static unsigned short standard_key_ascii_table[KEY_MAX] = {
/* start */ 0,
/* alphabet */ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
/* numbers */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
@ -140,10 +131,8 @@ static unsigned short standard_key_ascii_table[KEY_MAX] =
};
/* capslock mapping table for the US keyboard layout */
static unsigned short standard_key_capslock_table[KEY_MAX] =
{
static unsigned short standard_key_capslock_table[KEY_MAX] = {
/* start */ 0,
/* alphabet */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
/* numbers */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
@ -156,10 +145,8 @@ static unsigned short standard_key_capslock_table[KEY_MAX] =
};
/* shifted mapping table for the US keyboard layout */
static unsigned short standard_key_shift_table[KEY_MAX] =
{
static unsigned short standard_key_shift_table[KEY_MAX] = {
/* start */ 0,
/* alphabet */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
/* numbers */ ')', '!', '@', '#', '$', '%', '^', '&', '*', '(',
@ -172,10 +159,8 @@ static unsigned short standard_key_shift_table[KEY_MAX] =
};
/* ctrl+key mapping table for the US keyboard layout */
static unsigned short standard_key_control_table[KEY_MAX] =
{
static unsigned short standard_key_control_table[KEY_MAX] = {
/* start */ 0,
/* alphabet */ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
/* numbers */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@ -188,215 +173,217 @@ static unsigned short standard_key_control_table[KEY_MAX] =
};
/* convert numeric pad scancodes into arrow codes */
static unsigned char numlock_table[10] =
{
static unsigned char numlock_table[10] = {
KEY_INSERT, KEY_END, KEY_DOWN, KEY_PGDN, KEY_LEFT,
KEY_5_PAD, KEY_RIGHT, KEY_HOME, KEY_UP, KEY_PGUP
};
/* kb_wait_for_write_ready:
* Wait for the keyboard controller to set the ready-for-write bit.
*/
static __inline int kb_wait_for_write_ready (void)
static __inline int
kb_wait_for_write_ready (void)
{
int timeout = 4096;
int timeout = 4096;
while ((timeout>0) && (inportb(0x64)&2)) timeout--;
while ((timeout > 0) && (inportb(0x64) & 2)) timeout--;
return (timeout>0);
return (timeout > 0);
}
/* kb_wait_for_read_ready:
* Wait for the keyboard controller to set the ready-for-read bit.
*/
static __inline int kb_wait_for_read_ready (void)
static __inline int
kb_wait_for_read_ready (void)
{
int timeout = 16384;
int timeout = 16384;
while ((timeout>0) && (!(inportb(0x64)&1))) timeout--;
while ((timeout > 0) && (!(inportb(0x64) & 1))) timeout--;
return (timeout>0);
return (timeout > 0);
}
/* kb_send_data:
* Sends a byte to the keyboard controller. Returns 1 if all OK.
*/
static __inline int kb_send_data (unsigned char data)
static __inline int
kb_send_data (unsigned char data)
{
int resends = 4;
int timeout, temp;
int resends = 4;
int timeout, temp;
do {
if (!kb_wait_for_write_ready())
return 0;
do {
if (!kb_wait_for_write_ready())
return 0;
outportb(0x60, data);
timeout = 4096;
outportb(0x60, data);
timeout = 4096;
while (--timeout>0) {
if (!kb_wait_for_read_ready())
return 0;
while (--timeout > 0) {
if (!kb_wait_for_read_ready())
return 0;
temp = inportb(0x60);
temp = inportb(0x60);
if (temp == 0xFA)
return 1;
if (temp == 0xFA)
return 1;
if (temp == 0xFE)
break;
}
} while ((resends-- > 0) && (timeout > 0));
if (temp == 0xFE)
break;
}
} while ((resends-- > 0) && (timeout > 0));
return 0;
return 0;
}
static void update_leds (int leds)
static void
update_leds (int leds)
{
if (leds_ok) {
if (!in_a_terrupt)
DISABLE();
if (leds_ok) {
if (!in_a_terrupt)
DISABLE();
if (!kb_send_data(0xED)) {
kb_send_data(0xF4);
leds_ok = FALSE;
} else if (!kb_send_data((leds>>8)&7)) {
kb_send_data(0xF4);
leds_ok = FALSE;
}
if (!kb_send_data(0xED)) {
kb_send_data(0xF4);
leds_ok = FALSE;
} else if (!kb_send_data((leds >> 8) & 7)) {
kb_send_data(0xF4);
leds_ok = FALSE;
}
if (!in_a_terrupt)
ENABLE();
}
if (!in_a_terrupt)
ENABLE();
}
} ENDOFUNC(update_leds)
static void inject_key (int scancode)
static void
inject_key (int scancode)
{
unsigned short *table;
unsigned short *table;
if ((scancode >= KEY_0_PAD) && (scancode <= KEY_9_PAD)) {
if (((key_shifts & KB_NUMLOCK_FLAG) != 0) == ((key_shifts & KB_SHIFT_FLAG) != 0)) {
scancode = numlock_table[scancode - KEY_0_PAD];
}
table = standard_key_ascii_table;
} else if (key_shifts & KB_CTRL_FLAG) {
table = standard_key_control_table;
} else if (key_shifts & KB_SHIFT_FLAG) {
if (key_shifts & KB_CAPSLOCK_FLAG) {
if (standard_key_ascii_table[scancode]==standard_key_capslock_table[scancode]) {
table = standard_key_shift_table;
} else {
table = standard_key_ascii_table;
}
} else {
table = standard_key_shift_table;
}
} else if (key_shifts & KB_CAPSLOCK_FLAG) {
table = standard_key_capslock_table;
} else {
table = standard_key_ascii_table;
}
if ((scancode >= KEY_0_PAD) && (scancode <= KEY_9_PAD)) {
if (((key_shifts & KB_NUMLOCK_FLAG) != 0) == ((key_shifts & KB_SHIFT_FLAG) != 0)) {
scancode = numlock_table[scancode - KEY_0_PAD];
}
table = standard_key_ascii_table;
} else if (key_shifts & KB_CTRL_FLAG) {
table = standard_key_control_table;
} else if (key_shifts & KB_SHIFT_FLAG) {
if (key_shifts & KB_CAPSLOCK_FLAG) {
if (standard_key_ascii_table[scancode] == standard_key_capslock_table[scancode]) {
table = standard_key_shift_table;
} else {
table = standard_key_ascii_table;
}
} else {
table = standard_key_shift_table;
}
} else if (key_shifts & KB_CAPSLOCK_FLAG) {
table = standard_key_capslock_table;
} else {
table = standard_key_ascii_table;
}
key_buffer.key[key_buffer.end++] = (scancode<<16)|table[scancode];
key_buffer.key[key_buffer.end++] = (scancode << 16) | table[scancode];
if (key_buffer.end>=KEY_BUFFER_SIZE)
key_buffer.end = 0;
if (key_buffer.end==key_buffer.start) {
key_buffer.start++;
if (key_buffer.start>=KEY_BUFFER_SIZE)
key_buffer.start = 0;
}
if (key_buffer.end >= KEY_BUFFER_SIZE)
key_buffer.end = 0;
if (key_buffer.end == key_buffer.start) {
key_buffer.start++;
if (key_buffer.start >= KEY_BUFFER_SIZE)
key_buffer.start = 0;
}
} ENDOFUNC(inject_key)
static void handle_code (int scancode, int keycode)
static void
handle_code (int scancode, int keycode)
{
in_a_terrupt++;
in_a_terrupt++;
if (keycode==0) { /* pause */
inject_key(scancode);
pc_key[KEY_PAUSE] ^= TRUE;
} else if (scancode) {
int flag;
if (scancode>=KEY_MODIFIERS) {
flag = modifier_table[scancode - KEY_MODIFIERS];
} else {
flag = 0;
}
if ((char)keycode<0) { /* release */
pc_key[scancode] = FALSE;
if (flag&KB_MODIFIERS) {
key_shifts &= ~flag;
}
} else { /* keypress */
pc_key[scancode] = TRUE;
if (flag&KB_MODIFIERS) {
key_shifts |= flag;
}
if (flag&KB_LED_FLAGS) {
key_shifts ^= flag;
update_leds(key_shifts);
}
if (scancode<KEY_MODIFIERS) {
inject_key(scancode);
}
}
}
if (keycode == 0) { /* pause */
inject_key(scancode);
pc_key[KEY_PAUSE] ^= TRUE;
} else if (scancode) {
int flag;
in_a_terrupt--;
if (scancode >= KEY_MODIFIERS) {
flag = modifier_table[scancode - KEY_MODIFIERS];
} else {
flag = 0;
}
if ((char)keycode < 0) { /* release */
pc_key[scancode] = FALSE;
if (flag & KB_MODIFIERS) {
key_shifts &= ~flag;
}
} else { /* keypress */
pc_key[scancode] = TRUE;
if (flag & KB_MODIFIERS) {
key_shifts |= flag;
}
if (flag & KB_LED_FLAGS) {
key_shifts ^= flag;
update_leds(key_shifts);
}
if (scancode < KEY_MODIFIERS) {
inject_key(scancode);
}
}
}
in_a_terrupt--;
} ENDOFUNC(handle_code)
static int keyboard ()
static int
keyboard ()
{
unsigned char temp, scancode;
unsigned char temp, scancode;
temp = inportb(0x60);
temp = inportb(0x60);
if (temp<=0xe1) {
if (key_pause_loop) {
if (!--key_pause_loop) handle_code(KEY_PAUSE, 0);
} else
switch (temp) {
case 0xe0:
key_enhanced = TRUE;
break;
case 0xe1:
key_pause_loop = 5;
break;
default:
if (key_enhanced) {
key_enhanced = FALSE;
scancode = hw_to_mycode_ex[temp&0x7f];
} else {
scancode = hw_to_mycode[temp&0x7f];
}
handle_code(scancode, temp);
}
}
if (temp <= 0xe1) {
if (key_pause_loop) {
if (!--key_pause_loop) handle_code(KEY_PAUSE, 0);
} else
switch (temp) {
case 0xe0:
key_enhanced = TRUE;
break;
case 0xe1:
key_pause_loop = 5;
break;
default:
if (key_enhanced) {
key_enhanced = FALSE;
scancode = hw_to_mycode_ex[temp & 0x7f];
} else {
scancode = hw_to_mycode[temp & 0x7f];
}
handle_code(scancode, temp);
}
}
if (((temp==0x4F)||(temp==0x53))&&(key_shifts&KB_CTRL_FLAG)&&(key_shifts&KB_ALT_FLAG)) {
/* Hack alert:
only SIGINT (but not Ctrl-Break)
calls the destructors and will safely clean up
*/
__asm("\n\
if (((temp==0x4F)||(temp==0x53))&&(key_shifts&KB_CTRL_FLAG)&&(key_shifts&KB_ALT_FLAG)) {
/* Hack alert:
* only SIGINT (but not Ctrl-Break)
* calls the destructors and will safely clean up
*/
__asm("\n\
movb $0x79, %%al \n\
call ___djgpp_hw_exception \n\
":::"%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
}
":::"%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
}
__asm("\n\
__asm("\n\
inb $0x61, %%al \n\
movb %%al, %%ah \n\
orb $0x80, %%al \n\
@ -405,138 +392,149 @@ static int keyboard ()
outb %%al, $0x61 \n\
movb $0x20, %%al \n\
outb %%al, $0x20 \n\
":::"%eax");
return 0;
":::"%eax");
return 0;
} ENDOFUNC(keyboard)
int pc_keypressed (void)
int
pc_keypressed (void)
{
return (key_buffer.start!=key_buffer.end);
return (key_buffer.start!=key_buffer.end);
}
int pc_readkey (void)
int
pc_readkey (void)
{
if (keyboard_installed) {
int key;
if (keyboard_installed) {
int key;
while (key_buffer.start==key_buffer.end) {
__dpmi_yield();
}
while (key_buffer.start == key_buffer.end) {
__dpmi_yield();
}
DISABLE();
key = key_buffer.key[key_buffer.start++];
if (key_buffer.start>=KEY_BUFFER_SIZE)
key_buffer.start = 0;
ENABLE();
DISABLE();
key = key_buffer.key[key_buffer.start++];
if (key_buffer.start >= KEY_BUFFER_SIZE)
key_buffer.start = 0;
ENABLE();
return key;
} else {
return 0;
}
return key;
} else {
return 0;
}
}
int pc_keydown (int code)
int
pc_keydown (int code)
{
return pc_key[code];
return pc_key[code];
}
int pc_keyshifts (void)
int
pc_keyshifts (void)
{
return key_shifts;
return key_shifts;
}
void pc_remove_keyb (void)
void
pc_remove_keyb (void)
{
if (keyboard_installed) {
int s1, s2, s3;
keyboard_installed = FALSE;
pc_clexit(pc_remove_keyb);
if (keyboard_installed) {
int s1, s2, s3;
DISABLE();
_farsetsel(__djgpp_dos_sel);
_farnspokew(0x41c, _farnspeekw(0x41a));
keyboard_installed = FALSE;
pc_clexit(pc_remove_keyb);
s1 = _farnspeekb(0x417) & 0x80;
s2 = _farnspeekb(0x418) & 0xFC;
s3 = _farnspeekb(0x496) & 0xF3;
DISABLE();
_farsetsel(__djgpp_dos_sel);
_farnspokew(0x41c, _farnspeekw(0x41a));
if (pc_key[KEY_RSHIFT]) { s1 |= 1; }
if (pc_key[KEY_LSHIFT]) { s1 |= 2; }
if (pc_key[KEY_LCONTROL]) { s2 |= 1; s1 |= 4; }
if (pc_key[KEY_ALT]) { s1 |= 8; s2 |= 2; }
if (pc_key[KEY_RCONTROL]) { s1 |= 4; s3 |= 4; }
if (pc_key[KEY_ALTGR]) { s1 |= 8; s3 |= 8; }
s1 = _farnspeekb(0x417) & 0x80;
s2 = _farnspeekb(0x418) & 0xFC;
s3 = _farnspeekb(0x496) & 0xF3;
if (key_shifts&KB_SCROLOCK_FLAG) s1 |= 16;
if (key_shifts&KB_NUMLOCK_FLAG) s1 |= 32;
if (key_shifts&KB_CAPSLOCK_FLAG) s1 |= 64;
if (pc_key[KEY_RSHIFT]) { s1 |= 1; }
if (pc_key[KEY_LSHIFT]) { s1 |= 2; }
if (pc_key[KEY_LCONTROL]) { s2 |= 1; s1 |= 4; }
if (pc_key[KEY_ALT]) { s1 |= 8; s2 |= 2; }
if (pc_key[KEY_RCONTROL]) { s1 |= 4; s3 |= 4; }
if (pc_key[KEY_ALTGR]) { s1 |= 8; s3 |= 8; }
_farnspokeb(0x417, s1);
_farnspokeb(0x418, s2);
_farnspokeb(0x496, s3);
update_leds(key_shifts);
if (key_shifts & KB_SCROLOCK_FLAG) s1 |= 16;
if (key_shifts & KB_NUMLOCK_FLAG) s1 |= 32;
if (key_shifts & KB_CAPSLOCK_FLAG) s1 |= 64;
ENABLE();
pc_remove_irq(KEYB_IRQ);
}
_farnspokeb(0x417, s1);
_farnspokeb(0x418, s2);
_farnspokeb(0x496, s3);
update_leds(key_shifts);
ENABLE();
pc_remove_irq(KEYB_IRQ);
}
}
int pc_install_keyb (void)
int
pc_install_keyb (void)
{
if (keyboard_installed||pc_install_irq(KEYB_IRQ, keyboard)) {
return -1;
} else {
int s1, s2, s3;
if (keyboard_installed || pc_install_irq(KEYB_IRQ, keyboard)) {
return -1;
} else {
int s1, s2, s3;
LOCKDATA(key_buffer);
LOCKDATA(key_enhanced);
LOCKDATA(key_pause_loop);
LOCKDATA(key_shifts);
LOCKDATA(leds_ok);
LOCKDATA(in_a_terrupt);
LOCKDATA(pc_key);
LOCKDATA(modifier_table);
LOCKDATA(hw_to_mycode);
LOCKDATA(hw_to_mycode_ex);
LOCKDATA(standard_key_ascii_table);
LOCKDATA(standard_key_capslock_table);
LOCKDATA(standard_key_shift_table);
LOCKDATA(standard_key_control_table);
LOCKDATA(numlock_table);
LOCKFUNC(update_leds);
LOCKFUNC(inject_key);
LOCKFUNC(handle_code);
LOCKFUNC(keyboard);
DISABLE();
_farsetsel(__djgpp_dos_sel);
_farnspokew(0x41c, _farnspeekw(0x41a));
LOCKDATA(key_buffer);
LOCKDATA(key_enhanced);
LOCKDATA(key_pause_loop);
LOCKDATA(key_shifts);
LOCKDATA(leds_ok);
LOCKDATA(in_a_terrupt);
LOCKDATA(pc_key);
LOCKDATA(modifier_table);
LOCKDATA(hw_to_mycode);
LOCKDATA(hw_to_mycode_ex);
LOCKDATA(standard_key_ascii_table);
LOCKDATA(standard_key_capslock_table);
LOCKDATA(standard_key_shift_table);
LOCKDATA(standard_key_control_table);
LOCKDATA(numlock_table);
LOCKFUNC(update_leds);
LOCKFUNC(inject_key);
LOCKFUNC(handle_code);
LOCKFUNC(keyboard);
key_shifts = 0;
s1 = _farnspeekb(0x417);
s2 = _farnspeekb(0x418);
s3 = _farnspeekb(0x496);
DISABLE();
_farsetsel(__djgpp_dos_sel);
_farnspokew(0x41c, _farnspeekw(0x41a));
if (s1&1) { key_shifts |= KB_SHIFT_FLAG; pc_key[KEY_RSHIFT] = TRUE; }
if (s1&2) { key_shifts |= KB_SHIFT_FLAG; pc_key[KEY_LSHIFT] = TRUE; }
if (s2&1) { key_shifts |= KB_CTRL_FLAG; pc_key[KEY_LCONTROL] = TRUE; }
if (s2&2) { key_shifts |= KB_ALT_FLAG; pc_key[KEY_ALT] = TRUE; }
if (s3&4) { key_shifts |= KB_CTRL_FLAG; pc_key[KEY_RCONTROL] = TRUE; }
if (s3&8) { key_shifts |= KB_ALT_FLAG; pc_key[KEY_ALTGR] = TRUE; }
key_shifts = 0;
s1 = _farnspeekb(0x417);
s2 = _farnspeekb(0x418);
s3 = _farnspeekb(0x496);
if (s1&16) key_shifts |= KB_SCROLOCK_FLAG;
if (s1&32) key_shifts |= KB_NUMLOCK_FLAG;
if (s1&64) key_shifts |= KB_CAPSLOCK_FLAG;
update_leds(key_shifts);
if (s1 & 1) { key_shifts |= KB_SHIFT_FLAG; pc_key[KEY_RSHIFT] = TRUE; }
if (s1 & 2) { key_shifts |= KB_SHIFT_FLAG; pc_key[KEY_LSHIFT] = TRUE; }
if (s2 & 1) { key_shifts |= KB_CTRL_FLAG; pc_key[KEY_LCONTROL] = TRUE; }
if (s2 & 2) { key_shifts |= KB_ALT_FLAG; pc_key[KEY_ALT] = TRUE; }
if (s3 & 4) { key_shifts |= KB_CTRL_FLAG; pc_key[KEY_RCONTROL] = TRUE; }
if (s3 & 8) { key_shifts |= KB_ALT_FLAG; pc_key[KEY_ALTGR] = TRUE; }
key_enhanced = key_pause_loop = 0;
key_buffer.start = key_buffer.end = 0;
ENABLE();
if (s1 & 16) key_shifts |= KB_SCROLOCK_FLAG;
if (s1 & 32) key_shifts |= KB_NUMLOCK_FLAG;
if (s1 & 64) key_shifts |= KB_CAPSLOCK_FLAG;
update_leds(key_shifts);
pc_atexit(pc_remove_keyb);
keyboard_installed = TRUE;
return 0;
}
key_enhanced = key_pause_loop = 0;
key_buffer.start = key_buffer.end = 0;
ENABLE();
pc_atexit(pc_remove_keyb);
keyboard_installed = TRUE;
return 0;
}
}

View file

@ -1,7 +1,7 @@
/*
* PC/HW routine collection v1.3 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -14,16 +14,15 @@
#include "pc_hw.h"
#define PC_CUTE_WHEEL 1 /* CuteMouse WheelAPI */
#define MOUSE_STACK_SIZE 16384
#define CLEAR_MICKEYS() \
do { \
__asm __volatile ("movw $0xb, %%ax; int $0x33":::"%eax", "%ecx", "%edx"); \
ox = oy = 0; \
} while (0)
do { \
__asm __volatile ("movw $0xb, %%ax; int $0x33":::"%eax", "%ecx", "%edx"); \
ox = oy = 0; \
} while (0)
extern void mouse_wrap (void);
extern int mouse_wrap_end[];
@ -33,7 +32,7 @@ static long mouse_callback;
static __dpmi_regs mouse_regs;
static volatile struct {
volatile int x, y, z, b;
volatile int x, y, z, b;
} pc_mouse;
static int minx = 0;
@ -51,41 +50,44 @@ static int emulat3 = FALSE;
static int ox, oy;
static void mouse (__dpmi_regs *r)
static void
mouse (__dpmi_regs *r)
{
int nx = (signed short)r->x.si / sx;
int ny = (signed short)r->x.di / sy;
int dx = nx - ox;
int dy = ny - oy;
int nx = (signed short)r->x.si / sx;
int ny = (signed short)r->x.di / sy;
int dx = nx - ox;
int dy = ny - oy;
#if PC_CUTE_WHEEL
int dz = (signed char)r->h.bh;
int dz = (signed char)r->h.bh;
#endif
ox = nx;
oy = ny;
ox = nx;
oy = ny;
pc_mouse.b = r->h.bl;
pc_mouse.x = MID(minx, pc_mouse.x + dx, maxx);
pc_mouse.y = MID(miny, pc_mouse.y + dy, maxy);
pc_mouse.b = r->h.bl;
pc_mouse.x = MID(minx, pc_mouse.x + dx, maxx);
pc_mouse.y = MID(miny, pc_mouse.y + dy, maxy);
#if PC_CUTE_WHEEL
pc_mouse.z = MID(minz, pc_mouse.z + dz, maxz);
pc_mouse.z = MID(minz, pc_mouse.z + dz, maxz);
#endif
if (emulat3) {
if ((pc_mouse.b&3)==3) {
pc_mouse.b = 4;
}
}
if (emulat3) {
if ((pc_mouse.b & 3) == 3) {
pc_mouse.b = 4;
}
}
if (mouse_func) {
mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b);
}
if (mouse_func) {
mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b);
}
} ENDOFUNC(mouse)
void pc_remove_mouse (void)
void
pc_remove_mouse (void)
{
if (mouse_callback) {
pc_clexit(pc_remove_mouse);
__asm("\n\
if (mouse_callback) {
pc_clexit(pc_remove_mouse);
__asm("\n\
movl %%edx, %%ecx \n\
shrl $16, %%ecx \n\
movw $0x0304, %%ax \n\
@ -93,61 +95,63 @@ void pc_remove_mouse (void)
movw $0x000c, %%ax \n\
xorl %%ecx, %%ecx \n\
int $0x33 \n\
"::"d"(mouse_callback):"%eax", "%ecx");
"::"d"(mouse_callback):"%eax", "%ecx");
mouse_callback = 0;
mouse_callback = 0;
free((void *)(mouse_wrap_end[0] - MOUSE_STACK_SIZE));
}
free((void *)(mouse_wrap_end[0] - MOUSE_STACK_SIZE));
}
}
int pc_install_mouse (void)
int
pc_install_mouse (void)
{
int buttons;
int buttons;
/* fail if already call-backed */
if (mouse_callback) {
return 0;
}
/* fail if already call-backed */
if (mouse_callback) {
return 0;
}
/* reset mouse and get status */
__asm("\n\
/* reset mouse and get status */
__asm("\n\
xorl %%eax, %%eax \n\
int $0x33 \n\
andl %%ebx, %%eax \n\
movl %%eax, %0 \n\
":"=g" (buttons)::"%eax", "%ebx");
if (!buttons) {
return 0;
}
":"=g" (buttons)::"%eax", "%ebx");
if (!buttons) {
return 0;
}
/* lock wrapper */
LOCKDATA(mouse_func);
LOCKDATA(mouse_callback);
LOCKDATA(mouse_regs);
LOCKDATA(pc_mouse);
LOCKDATA(minx);
LOCKDATA(maxx);
LOCKDATA(miny);
LOCKDATA(maxy);
LOCKDATA(minz);
LOCKDATA(maxz);
LOCKDATA(sx);
LOCKDATA(sy);
LOCKDATA(emulat3);
LOCKDATA(ox);
LOCKDATA(oy);
LOCKFUNC(mouse);
LOCKFUNC(mouse_wrap);
/* lock wrapper */
LOCKDATA(mouse_func);
LOCKDATA(mouse_callback);
LOCKDATA(mouse_regs);
LOCKDATA(pc_mouse);
LOCKDATA(minx);
LOCKDATA(maxx);
LOCKDATA(miny);
LOCKDATA(maxy);
LOCKDATA(minz);
LOCKDATA(maxz);
LOCKDATA(sx);
LOCKDATA(sy);
LOCKDATA(emulat3);
LOCKDATA(ox);
LOCKDATA(oy);
LOCKFUNC(mouse);
LOCKFUNC(mouse_wrap);
mouse_wrap_end[1] = __djgpp_ds_alias;
/* grab a locked stack */
if ((mouse_wrap_end[0] = (int)pc_malloc(MOUSE_STACK_SIZE)) == NULL) {
return 0;
}
mouse_wrap_end[1] = __djgpp_ds_alias;
/* grab a locked stack */
if ((mouse_wrap_end[0] = (int)pc_malloc(MOUSE_STACK_SIZE)) == NULL) {
return 0;
}
/* try to hook a call-back */
__asm("\n\
/* try to hook a call-back */
__asm("\n\
pushl %%ds \n\
pushl %%es \n\
movw $0x0303, %%ax \n\
@ -163,86 +167,97 @@ int pc_install_mouse (void)
movw %%dx, %%cx \n\
movl %%ecx, %0 \n\
0: \n\
":"=g"(mouse_callback)
:"S" (mouse_wrap), "D"(&mouse_regs)
:"%eax", "%ecx", "%edx");
if (!mouse_callback) {
free((void *)mouse_wrap_end[0]);
return 0;
}
":"=g"(mouse_callback)
:"S" (mouse_wrap), "D"(&mouse_regs)
:"%eax", "%ecx", "%edx");
if (!mouse_callback) {
free((void *)mouse_wrap_end[0]);
return 0;
}
/* adjust stack */
mouse_wrap_end[0] += MOUSE_STACK_SIZE;
/* adjust stack */
mouse_wrap_end[0] += MOUSE_STACK_SIZE;
/* install the handler */
mouse_regs.x.ax = 0x000c;
/* install the handler */
mouse_regs.x.ax = 0x000c;
#if PC_CUTE_WHEEL
mouse_regs.x.cx = 0x7f | 0x80;
mouse_regs.x.cx = 0x7f | 0x80;
#else
mouse_regs.x.cx = 0x7f;
mouse_regs.x.cx = 0x7f;
#endif
mouse_regs.x.dx = mouse_callback&0xffff;
mouse_regs.x.es = mouse_callback>>16;
__dpmi_int(0x33, &mouse_regs);
mouse_regs.x.dx = mouse_callback & 0xffff;
mouse_regs.x.es = mouse_callback >> 16;
__dpmi_int(0x33, &mouse_regs);
CLEAR_MICKEYS();
CLEAR_MICKEYS();
emulat3 = buttons<3;
pc_atexit(pc_remove_mouse);
return buttons;
emulat3 = (buttons < 3);
pc_atexit(pc_remove_mouse);
return buttons;
}
MFUNC pc_install_mouse_handler (MFUNC handler)
MFUNC
pc_install_mouse_handler (MFUNC handler)
{
MFUNC old;
MFUNC old;
if (!mouse_callback && !pc_install_mouse()) {
return NULL;
}
if (!mouse_callback && !pc_install_mouse()) {
return NULL;
}
old = mouse_func;
mouse_func = handler;
return old;
old = mouse_func;
mouse_func = handler;
return old;
}
void pc_mouse_area (int x1, int y1, int x2, int y2)
void
pc_mouse_area (int x1, int y1, int x2, int y2)
{
minx = x1;
maxx = x2;
miny = y1;
maxy = y2;
minx = x1;
maxx = x2;
miny = y1;
maxy = y2;
}
void pc_mouse_speed (int xspeed, int yspeed)
void
pc_mouse_speed (int xspeed, int yspeed)
{
DISABLE();
DISABLE();
sx = MAX(1, xspeed);
sy = MAX(1, yspeed);
sx = MAX(1, xspeed);
sy = MAX(1, yspeed);
ENABLE();
ENABLE();
}
int pc_query_mouse (int *x, int *y, int *z)
int
pc_query_mouse (int *x, int *y, int *z)
{
*x = pc_mouse.x;
*y = pc_mouse.y;
*z = pc_mouse.z;
return pc_mouse.b;
*x = pc_mouse.x;
*y = pc_mouse.y;
*z = pc_mouse.z;
return pc_mouse.b;
}
void pc_warp_mouse (int x, int y)
void
pc_warp_mouse (int x, int y)
{
CLEAR_MICKEYS();
CLEAR_MICKEYS();
pc_mouse.x = MID(minx, x, maxx);
pc_mouse.y = MID(miny, y, maxy);
pc_mouse.x = MID(minx, x, maxx);
pc_mouse.y = MID(miny, y, maxy);
if (mouse_func) {
mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b);
}
if (mouse_func) {
mouse_func(pc_mouse.x, pc_mouse.y, pc_mouse.z, pc_mouse.b);
}
}
/* Hack alert:
* `mouse_wrap_end' actually holds the
* address of stack in a safe data selector.

View file

@ -1,7 +1,7 @@
/*
* PC/HW routine collection v1.5 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -25,15 +25,14 @@
static int timer_installed;
typedef struct {
volatile unsigned int counter, clock_ticks, freq;
volatile PFUNC func;
volatile void *parm;
volatile unsigned int counter, clock_ticks, freq;
volatile PFUNC func;
volatile void *parm;
} TIMER;
static TIMER timer_main, timer_func[MAX_TIMERS];
/* Desc: main timer callback
*
* In : -
@ -41,33 +40,33 @@ static TIMER timer_main, timer_func[MAX_TIMERS];
*
* Note: -
*/
static int timer ()
static int
timer ()
{
int i;
int i;
for (i = 0; i < MAX_TIMERS; i++) {
TIMER *t = &timer_func[i];
if (t->func) {
t->clock_ticks += t->counter;
if (t->clock_ticks >= timer_main.counter) {
t->clock_ticks -= timer_main.counter;
t->func(unvolatile(t->parm, void *));
}
}
}
for (i = 0; i < MAX_TIMERS; i++) {
TIMER *t = &timer_func[i];
if (t->func) {
t->clock_ticks += t->counter;
if (t->clock_ticks >= timer_main.counter) {
t->clock_ticks -= timer_main.counter;
t->func(unvolatile(t->parm, void *));
}
}
}
timer_main.clock_ticks += timer_main.counter;
if (timer_main.clock_ticks >= 0x10000) {
timer_main.clock_ticks -= 0x10000;
return 1;
} else {
outportb(0x20, 0x20);
return 0;
}
timer_main.clock_ticks += timer_main.counter;
if (timer_main.clock_ticks >= 0x10000) {
timer_main.clock_ticks -= 0x10000;
return 1;
} else {
outportb(0x20, 0x20);
return 0;
}
} ENDOFUNC(timer)
/* Desc: uninstall timer engine
*
* In : -
@ -75,24 +74,24 @@ static int timer ()
*
* Note: -
*/
void pc_remove_timer (void)
void
pc_remove_timer (void)
{
if (timer_installed) {
timer_installed = FALSE;
pc_clexit(pc_remove_timer);
if (timer_installed) {
timer_installed = FALSE;
pc_clexit(pc_remove_timer);
DISABLE();
outportb(0x43, 0x34);
outportb(0x40, 0);
outportb(0x40, 0);
ENABLE();
DISABLE();
outportb(0x43, 0x34);
outportb(0x40, 0);
outportb(0x40, 0);
ENABLE();
pc_remove_irq(TIMER_IRQ);
}
pc_remove_irq(TIMER_IRQ);
}
}
/* Desc: remove timerfunc
*
* In : timerfunc id
@ -100,65 +99,65 @@ void pc_remove_timer (void)
*
* Note: tries to relax the main timer whenever possible
*/
int pc_remove_int (int fid)
int
pc_remove_int (int fid)
{
int i;
unsigned int freq = 0;
int i;
unsigned int freq = 0;
/* are we installed? */
if (!timer_installed) {
return -1;
}
/* are we installed? */
if (!timer_installed) {
return -1;
}
/* sanity check */
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
return -1;
}
timer_func[fid].func = NULL;
/* sanity check */
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
return -1;
}
timer_func[fid].func = NULL;
/* scan for maximum frequency */
for (i = 0; i < MAX_TIMERS; i++) {
TIMER *t = &timer_func[i];
if (t->func) {
if (freq < t->freq) {
freq = t->freq;
}
}
}
/* scan for maximum frequency */
for (i = 0; i < MAX_TIMERS; i++) {
TIMER *t = &timer_func[i];
if (t->func) {
if (freq < t->freq) {
freq = t->freq;
}
}
}
/* if there are no callbacks left, cleanup */
if (!freq) {
pc_remove_timer();
return 0;
}
/* if there are no callbacks left, cleanup */
if (!freq) {
pc_remove_timer();
return 0;
}
/* if we just lowered the maximum frequency, try to relax the timer engine */
if (freq < timer_main.freq) {
unsigned int new_counter = PIT_FREQ / freq;
/* if we just lowered the maximum frequency, try to relax the timer engine */
if (freq < timer_main.freq) {
unsigned int new_counter = PIT_FREQ / freq;
DISABLE();
DISABLE();
for (i = 0; i < MAX_TIMERS; i++) {
if (timer_func[i].func) {
ADJUST(timer_func[i], freq);
}
}
for (i = 0; i < MAX_TIMERS; i++) {
if (timer_func[i].func) {
ADJUST(timer_func[i], freq);
}
}
outportb(0x43, 0x34);
outportb(0x40, (unsigned char)new_counter);
outportb(0x40, (unsigned char)(new_counter>>8));
timer_main.clock_ticks = 0;
timer_main.counter = new_counter;
timer_main.freq = freq;
outportb(0x43, 0x34);
outportb(0x40, (unsigned char)new_counter);
outportb(0x40, (unsigned char)(new_counter>>8));
timer_main.clock_ticks = 0;
timer_main.counter = new_counter;
timer_main.freq = freq;
ENABLE();
}
ENABLE();
}
return 0;
return 0;
} ENDOFUNC(pc_remove_int)
/* Desc: adjust timerfunc
*
* In : timerfunc id, new frequency (Hz)
@ -166,64 +165,64 @@ int pc_remove_int (int fid)
*
* Note: might change the main timer frequency
*/
int pc_adjust_int (int fid, unsigned int freq)
int
pc_adjust_int (int fid, unsigned int freq)
{
int i;
int i;
/* are we installed? */
if (!timer_installed) {
return -1;
}
/* are we installed? */
if (!timer_installed) {
return -1;
}
/* sanity check */
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
return -1;
}
timer_func[fid].freq = freq;
/* sanity check */
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
return -1;
}
timer_func[fid].freq = freq;
/* scan for maximum frequency */
freq = 0;
for (i = 0; i < MAX_TIMERS; i++) {
TIMER *t = &timer_func[i];
if (t->func) {
if (freq < t->freq) {
freq = t->freq;
}
}
}
/* scan for maximum frequency */
freq = 0;
for (i = 0; i < MAX_TIMERS; i++) {
TIMER *t = &timer_func[i];
if (t->func) {
if (freq < t->freq) {
freq = t->freq;
}
}
}
/* update main timer / sons to match highest frequency */
DISABLE();
/* update main timer / sons to match highest frequency */
DISABLE();
/* using '>' is correct still (and avoids updating
* the HW timer too often), but doesn't relax the timer!
*/
if (freq != timer_main.freq) {
unsigned int new_counter = PIT_FREQ / freq;
/* using '>' is correct still (and avoids updating
* the HW timer too often), but doesn't relax the timer!
*/
if (freq != timer_main.freq) {
unsigned int new_counter = PIT_FREQ / freq;
for (i = 0; i < MAX_TIMERS; i++) {
if (timer_func[i].func) {
ADJUST(timer_func[i], freq);
}
}
for (i = 0; i < MAX_TIMERS; i++) {
if (timer_func[i].func) {
ADJUST(timer_func[i], freq);
}
}
outportb(0x43, 0x34);
outportb(0x40, (unsigned char)new_counter);
outportb(0x40, (unsigned char)(new_counter>>8));
timer_main.clock_ticks = 0;
timer_main.counter = new_counter;
timer_main.freq = freq;
} else {
ADJUST(timer_func[fid], timer_main.freq);
}
outportb(0x43, 0x34);
outportb(0x40, (unsigned char)new_counter);
outportb(0x40, (unsigned char)(new_counter>>8));
timer_main.clock_ticks = 0;
timer_main.counter = new_counter;
timer_main.freq = freq;
} else {
ADJUST(timer_func[fid], timer_main.freq);
}
ENABLE();
ENABLE();
return 0;
return 0;
} ENDOFUNC(pc_adjust_int)
/* Desc: install timer engine
*
* In : -
@ -231,36 +230,36 @@ int pc_adjust_int (int fid, unsigned int freq)
*
* Note: initial frequency is 18.2 Hz
*/
static int install_timer (void)
static int
install_timer (void)
{
if (timer_installed || pc_install_irq(TIMER_IRQ, timer)) {
return -1;
} else {
memset(timer_func, 0, sizeof(timer_func));
LOCKDATA(timer_func);
LOCKDATA(timer_main);
LOCKFUNC(timer);
LOCKFUNC(pc_adjust_int);
LOCKFUNC(pc_remove_int);
if (timer_installed || pc_install_irq(TIMER_IRQ, timer)) {
return -1;
} else {
memset(timer_func, 0, sizeof(timer_func));
timer_main.counter = 0x10000;
LOCKDATA(timer_func);
LOCKDATA(timer_main);
LOCKFUNC(timer);
LOCKFUNC(pc_adjust_int);
LOCKFUNC(pc_remove_int);
DISABLE();
outportb(0x43, 0x34);
outportb(0x40, 0);
outportb(0x40, 0);
timer_main.clock_ticks = 0;
ENABLE();
timer_main.counter = 0x10000;
pc_atexit(pc_remove_timer);
timer_installed = TRUE;
return 0;
}
DISABLE();
outportb(0x43, 0x34);
outportb(0x40, 0);
outportb(0x40, 0);
timer_main.clock_ticks = 0;
ENABLE();
pc_atexit(pc_remove_timer);
timer_installed = TRUE;
return 0;
}
}
/* Desc: install timerfunc
*
* In : callback function, opaque pointer to be passed to callee, freq (Hz)
@ -268,60 +267,61 @@ static int install_timer (void)
*
* Note: returns -1 if error
*/
int pc_install_int (PFUNC func, void *parm, unsigned int freq)
int
pc_install_int (PFUNC func, void *parm, unsigned int freq)
{
int i;
TIMER *t = NULL;
int i;
TIMER *t = NULL;
/* ensure the timer engine is set up */
if (!timer_installed) {
if (install_timer()) {
return -1;
}
}
/* ensure the timer engine is set up */
if (!timer_installed) {
if (install_timer()) {
return -1;
}
}
/* find an empty slot */
for (i = 0; i < MAX_TIMERS; i++) {
if (!timer_func[i].func) {
t = &timer_func[i];
break;
}
}
if (t == NULL) {
return -1;
}
/* find an empty slot */
for (i = 0; i < MAX_TIMERS; i++) {
if (!timer_func[i].func) {
t = &timer_func[i];
break;
}
}
if (t == NULL) {
return -1;
}
DISABLE();
DISABLE();
t->func = func;
t->parm = parm;
t->freq = freq;
t->clock_ticks = 0;
t->func = func;
t->parm = parm;
t->freq = freq;
t->clock_ticks = 0;
/* update main timer / sons to match highest frequency */
if (freq > timer_main.freq) {
unsigned int new_counter = PIT_FREQ / freq;
/* update main timer / sons to match highest frequency */
if (freq > timer_main.freq) {
unsigned int new_counter = PIT_FREQ / freq;
for (i = 0; i < MAX_TIMERS; i++) {
if (timer_func[i].func) {
ADJUST(timer_func[i], freq);
}
}
for (i = 0; i < MAX_TIMERS; i++) {
if (timer_func[i].func) {
ADJUST(timer_func[i], freq);
}
}
outportb(0x43, 0x34);
outportb(0x40, (unsigned char)new_counter);
outportb(0x40, (unsigned char)(new_counter>>8));
timer_main.clock_ticks = 0;
timer_main.counter = new_counter;
timer_main.freq = freq;
} else {
/* t == &timer_func[i] */
ADJUST(timer_func[i], timer_main.freq);
}
outportb(0x43, 0x34);
outportb(0x40, (unsigned char)new_counter);
outportb(0x40, (unsigned char)(new_counter>>8));
timer_main.clock_ticks = 0;
timer_main.counter = new_counter;
timer_main.freq = freq;
} else {
/* t == &timer_func[i] */
ADJUST(timer_func[i], timer_main.freq);
}
i = t - timer_func;
i = t - timer_func;
ENABLE();
ENABLE();
return i;
return i;
}

View file

@ -21,7 +21,7 @@
/*
* DOS/DJGPP glut driver v1.3 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -31,29 +31,28 @@
#include "GL/dmesa.h"
#define CLAMP(i) ((i) > 1.0 ? 1.0 : ((i) < 0.0 ? 0.0 : (i)))
#define CLAMP(i) ((i) > 1.0F ? 1.0F : ((i) < 0.0F ? 0.0F : (i)))
void APIENTRY glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
void APIENTRY
glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
{
if (g_display_mode & GLUT_INDEX) {
if ((ndx >= 0) && (ndx < (256 - RESERVED_COLORS))) {
DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue));
}
}
if (g_display_mode & GLUT_INDEX) {
if ((ndx >= 0) && (ndx < (256 - RESERVED_COLORS))) {
DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue));
}
}
}
GLfloat APIENTRY glutGetColor (int ndx, int component)
GLfloat APIENTRY
glutGetColor (int ndx, int component)
{
return 0.0;
return 0.0;
}
void APIENTRY glutCopyColormap (int win)
void APIENTRY
glutCopyColormap (int win)
{
}

View file

@ -21,7 +21,7 @@
/*
* DOS/DJGPP glut driver v1.3 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -30,87 +30,86 @@
#include "glutint.h"
GLUTmenuStatusCB g_menu_status_func = NULL;
void APIENTRY glutMenuStateFunc (GLUTmenuStateCB func)
void APIENTRY
glutMenuStateFunc (GLUTmenuStateCB func)
{
g_menu_status_func = (GLUTmenuStatusCB)func;
g_menu_status_func = (GLUTmenuStatusCB)func;
}
void APIENTRY glutMenuStatusFunc (GLUTmenuStatusCB func)
void APIENTRY
glutMenuStatusFunc (GLUTmenuStatusCB func)
{
g_menu_status_func = func;
g_menu_status_func = func;
}
int APIENTRY glutCreateMenu (GLUTselectCB func)
int APIENTRY
glutCreateMenu (GLUTselectCB func)
{
return 0;
return 0;
}
void APIENTRY glutDestroyMenu (int menu)
void APIENTRY
glutDestroyMenu (int menu)
{
}
int APIENTRY glutGetMenu (void)
int APIENTRY
glutGetMenu (void)
{
return 0;
return 0;
}
void APIENTRY glutSetMenu (int menu)
void APIENTRY
glutSetMenu (int menu)
{
}
void APIENTRY glutAddMenuEntry (const char *label, int value)
void APIENTRY
glutAddMenuEntry (const char *label, int value)
{
}
void APIENTRY glutAddSubMenu (const char *label, int submenu)
void APIENTRY
glutAddSubMenu (const char *label, int submenu)
{
}
void APIENTRY glutChangeToMenuEntry (int item, const char *label, int value)
void APIENTRY
glutChangeToMenuEntry (int item, const char *label, int value)
{
}
void APIENTRY glutChangeToSubMenu (int item, const char *label, int submenu)
void APIENTRY
glutChangeToSubMenu (int item, const char *label, int submenu)
{
}
void APIENTRY glutRemoveMenuItem (int item)
void APIENTRY
glutRemoveMenuItem (int item)
{
}
void APIENTRY glutAttachMenu (int button)
void APIENTRY
glutAttachMenu (int button)
{
}
void APIENTRY glutDetachMenu (int button)
void APIENTRY
glutDetachMenu (int button)
{
}

View file

@ -21,7 +21,7 @@
/*
* DOS/DJGPP glut driver v1.3 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -30,31 +30,30 @@
#include "glutint.h"
int g_mouse;
int g_mouse_x = 0, g_mouse_y = 0;
void __glutInitMouse (void)
void
__glutInitMouse (void)
{
if ((g_mouse = pc_install_mouse())) {
pc_mouse_area(g_curwin->xpos, g_curwin->ypos, g_curwin->xpos + g_curwin->width - 1, g_curwin->ypos + g_curwin->height - 1);
if ((g_mouse = pc_install_mouse())) {
pc_mouse_area(g_curwin->xpos, g_curwin->ypos, g_curwin->xpos + g_curwin->width - 1, g_curwin->ypos + g_curwin->height - 1);
g_curwin->show_mouse = (g_curwin->mouse || g_curwin->motion || g_curwin->passive);
}
g_curwin->show_mouse = (g_curwin->mouse || g_curwin->motion || g_curwin->passive);
}
}
void APIENTRY glutSetCursor (int cursor)
void APIENTRY
glutSetCursor (int cursor)
{
/* XXX completely futile until full mouse support (maybe never) */
/* XXX completely futile until full mouse support (maybe never) */
}
void APIENTRY glutWarpPointer (int x, int y)
void APIENTRY
glutWarpPointer (int x, int y)
{
pc_warp_mouse(x, y);
pc_warp_mouse(x, y);
}

View file

@ -21,7 +21,7 @@
/*
* DOS/DJGPP glut driver v1.3 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -30,62 +30,62 @@
#include "glutint.h"
int APIENTRY glutLayerGet (GLenum info)
int APIENTRY
glutLayerGet (GLenum info)
{
switch (info) {
case GLUT_OVERLAY_POSSIBLE:
case GLUT_HAS_OVERLAY:
return GL_FALSE;
case GLUT_LAYER_IN_USE:
return GLUT_NORMAL;
case GLUT_NORMAL_DAMAGED:
return GL_FALSE;
case GLUT_OVERLAY_DAMAGED:
case GLUT_TRANSPARENT_INDEX:
default:
return -1;
}
switch (info) {
case GLUT_OVERLAY_POSSIBLE:
case GLUT_HAS_OVERLAY:
return GL_FALSE;
case GLUT_LAYER_IN_USE:
return GLUT_NORMAL;
case GLUT_NORMAL_DAMAGED:
return GL_FALSE;
case GLUT_OVERLAY_DAMAGED:
case GLUT_TRANSPARENT_INDEX:
default:
return -1;
}
}
void APIENTRY glutOverlayDisplayFunc (GLUTdisplayCB func)
void APIENTRY
glutOverlayDisplayFunc (GLUTdisplayCB func)
{
}
void APIENTRY glutEstablishOverlay (void)
void APIENTRY
glutEstablishOverlay (void)
{
}
void APIENTRY glutRemoveOverlay (void)
void APIENTRY
glutRemoveOverlay (void)
{
}
void APIENTRY glutUseLayer (GLenum layer)
void APIENTRY
glutUseLayer (GLenum layer)
{
}
void APIENTRY glutPostOverlayRedisplay (void)
void APIENTRY
glutPostOverlayRedisplay (void)
{
}
void APIENTRY glutShowOverlay (void)
void APIENTRY
glutShowOverlay (void)
{
}
void APIENTRY glutHideOverlay (void)
void APIENTRY
glutHideOverlay (void)
{
}

View file

@ -21,7 +21,7 @@
/*
* DOS/DJGPP glut driver v1.4 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
@ -32,7 +32,6 @@
#include "glutstroke.h"
#ifdef GLUT_IMPORT_LIB
extern StrokeFontRec glutStrokeRoman, glutStrokeMonoRoman;
extern BitmapFontRec glutBitmap8By13, glutBitmap9By15, glutBitmapTimesRoman10, glutBitmapTimesRoman24, glutBitmapHelvetica10, glutBitmapHelvetica12, glutBitmapHelvetica18;
@ -42,30 +41,31 @@ extern BitmapFontRec glutBitmap8By13, glutBitmap9By15, glutBitmapTimesRoman10, g
GLUT API constants such as GLUT_STROKE_ROMAN have to get passed
through a case statement to get mapped to the actual data structure
address. */
void *__glutFont (void *font)
void *
__glutFont (void *font)
{
switch ((int)font) {
case (int)GLUT_STROKE_ROMAN:
return &glutStrokeRoman;
case (int)GLUT_STROKE_MONO_ROMAN:
return &glutStrokeMonoRoman;
case (int)GLUT_BITMAP_9_BY_15:
return &glutBitmap9By15;
case (int)GLUT_BITMAP_8_BY_13:
return &glutBitmap8By13;
case (int)GLUT_BITMAP_TIMES_ROMAN_10:
return &glutBitmapTimesRoman10;
case (int)GLUT_BITMAP_TIMES_ROMAN_24:
return &glutBitmapTimesRoman24;
case (int)GLUT_BITMAP_HELVETICA_10:
return &glutBitmapHelvetica10;
case (int)GLUT_BITMAP_HELVETICA_12:
return &glutBitmapHelvetica12;
case (int)GLUT_BITMAP_HELVETICA_18:
return &glutBitmapHelvetica18;
default: /* NOTREACHED */
__glutFatalError("bad font!");
return NULL;
}
switch ((int)font) {
case (int)GLUT_STROKE_ROMAN:
return &glutStrokeRoman;
case (int)GLUT_STROKE_MONO_ROMAN:
return &glutStrokeMonoRoman;
case (int)GLUT_BITMAP_9_BY_15:
return &glutBitmap9By15;
case (int)GLUT_BITMAP_8_BY_13:
return &glutBitmap8By13;
case (int)GLUT_BITMAP_TIMES_ROMAN_10:
return &glutBitmapTimesRoman10;
case (int)GLUT_BITMAP_TIMES_ROMAN_24:
return &glutBitmapTimesRoman24;
case (int)GLUT_BITMAP_HELVETICA_10:
return &glutBitmapHelvetica10;
case (int)GLUT_BITMAP_HELVETICA_12:
return &glutBitmapHelvetica12;
case (int)GLUT_BITMAP_HELVETICA_18:
return &glutBitmapHelvetica18;
default: /* NOTREACHED */
__glutFatalError("bad font!");
return NULL;
}
}
#endif

View file

@ -21,7 +21,7 @@
/*
* DOS/DJGPP glut driver v1.4 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Copyright (C) 2002 - Daniel Borca
* Email : dborca@users.sourceforge.net
* Web : http://www.geocities.com/dborca
*/
@ -33,7 +33,6 @@
#include "GL/dmesa.h"
GLUTwindow *g_curwin;
static GLuint swaptime, swapcount;
@ -41,241 +40,241 @@ static DMesaVisual visual = NULL;
GLUTwindow *g_windows[MAX_WINDOWS];
static void clean (void)
static void
clean (void)
{
int i;
int i;
for (i=1; i<=MAX_WINDOWS; i++) {
glutDestroyWindow(i);
}
if (visual) DMesaDestroyVisual(visual);
for (i=1; i<=MAX_WINDOWS; i++) {
glutDestroyWindow(i);
}
if (visual) DMesaDestroyVisual(visual);
pc_close_stdout();
pc_close_stderr();
pc_close_stdout();
pc_close_stderr();
}
int APIENTRY glutCreateWindow (const char *title)
int APIENTRY
glutCreateWindow (const char *title)
{
int i;
int m8width = (g_init_w + 7) & ~7;
int i;
int m8width = (g_init_w + 7) & ~7;
/* We set the Visual once. This will be our desktop (graphic mode).
* We should do this in the `glutInit' code, but we don't have any idea
* about its geometry. Supposedly, when we are about to create one
* window, we have a slight idea about resolution.
*/
if (!visual) {
if ((visual=DMesaCreateVisual(g_init_x + m8width, g_init_y + g_init_h, g_bpp, g_refresh,
g_display_mode & GLUT_DOUBLE,
!(g_display_mode & GLUT_INDEX),
(g_display_mode & GLUT_ALPHA ) ? g_alpha : 0,
(g_display_mode & GLUT_DEPTH ) ? g_depth : 0,
(g_display_mode & GLUT_STENCIL) ? g_stencil : 0,
(g_display_mode & GLUT_ACCUM ) ? g_accum : 0))==NULL) {
return 0;
}
/* We set the Visual once. This will be our desktop (graphic mode).
* We should do this in the `glutInit' code, but we don't have any idea
* about its geometry. Supposedly, when we are about to create one
* window, we have a slight idea about resolution.
*/
if (!visual) {
if ((visual=DMesaCreateVisual(g_init_x + m8width, g_init_y + g_init_h, g_bpp, g_refresh,
g_display_mode & GLUT_DOUBLE,
!(g_display_mode & GLUT_INDEX),
(g_display_mode & GLUT_ALPHA ) ? g_alpha : 0,
(g_display_mode & GLUT_DEPTH ) ? g_depth : 0,
(g_display_mode & GLUT_STENCIL) ? g_stencil : 0,
(g_display_mode & GLUT_ACCUM ) ? g_accum : 0))==NULL) {
return 0;
}
/* Also hook stdio/stderr once */
pc_open_stdout();
pc_open_stderr();
pc_atexit(clean);
}
/* Also hook stdio/stderr once */
pc_open_stdout();
pc_open_stderr();
pc_atexit(clean);
}
/* Search for an empty slot.
* Each window has its own rendering Context and its own Buffer.
*/
for (i=0; i<MAX_WINDOWS; i++) {
if (g_windows[i] == NULL) {
DMesaContext c;
DMesaBuffer b;
GLUTwindow *w;
/* Search for an empty slot.
* Each window has its own rendering Context and its own Buffer.
*/
for (i=0; i<MAX_WINDOWS; i++) {
if (g_windows[i] == NULL) {
DMesaContext c;
DMesaBuffer b;
GLUTwindow *w;
if ((w = (GLUTwindow *)calloc(1, sizeof(GLUTwindow))) == NULL) {
return 0;
}
if ((w = (GLUTwindow *)calloc(1, sizeof(GLUTwindow))) == NULL) {
return 0;
}
/* Allocate the rendering Context. */
if ((c = DMesaCreateContext(visual, NULL)) == NULL) {
free(w);
return 0;
}
/* Allocate the rendering Context. */
if ((c = DMesaCreateContext(visual, NULL)) == NULL) {
free(w);
return 0;
}
/* Allocate the Buffer (displayable area).
* We have to specify buffer size and position (inside the desktop).
*/
if ((b = DMesaCreateBuffer(visual, g_init_x, g_init_y, m8width, g_init_h)) == NULL) {
DMesaDestroyContext(c);
free(w);
return 0;
}
/* Allocate the Buffer (displayable area).
* We have to specify buffer size and position (inside the desktop).
*/
if ((b = DMesaCreateBuffer(visual, g_init_x, g_init_y, m8width, g_init_h)) == NULL) {
DMesaDestroyContext(c);
free(w);
return 0;
}
/* Bind Buffer to Context and make the Context the current one. */
if (!DMesaMakeCurrent(c, b)) {
DMesaDestroyBuffer(b);
DMesaDestroyContext(c);
free(w);
return 0;
}
/* Bind Buffer to Context and make the Context the current one. */
if (!DMesaMakeCurrent(c, b)) {
DMesaDestroyBuffer(b);
DMesaDestroyContext(c);
free(w);
return 0;
}
g_curwin = g_windows[i] = w;
g_curwin = g_windows[i] = w;
w->num = ++i;
w->xpos = g_init_x;
w->ypos = g_init_y;
w->width = m8width;
w->height = g_init_h;
w->context = c;
w->buffer = b;
w->num = ++i;
w->xpos = g_init_x;
w->ypos = g_init_y;
w->width = m8width;
w->height = g_init_h;
w->context = c;
w->buffer = b;
return i;
}
}
return i;
}
}
return 0;
return 0;
}
int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)
int APIENTRY
glutCreateSubWindow (int win, int x, int y, int width, int height)
{
return GL_FALSE;
return GL_FALSE;
}
void APIENTRY glutDestroyWindow (int win)
void APIENTRY
glutDestroyWindow (int win)
{
if (g_windows[--win]) {
GLUTwindow *w = g_windows[win];
DMesaMakeCurrent(NULL, NULL);
DMesaDestroyBuffer(w->buffer);
DMesaDestroyContext(w->context);
free(w);
g_windows[win] = NULL;
}
if (g_windows[--win]) {
GLUTwindow *w = g_windows[win];
DMesaMakeCurrent(NULL, NULL);
DMesaDestroyBuffer(w->buffer);
DMesaDestroyContext(w->context);
free(w);
g_windows[win] = NULL;
}
}
void APIENTRY glutPostRedisplay (void)
void APIENTRY
glutPostRedisplay (void)
{
g_curwin->redisplay = GL_TRUE;
g_curwin->redisplay = GL_TRUE;
}
void APIENTRY glutSwapBuffers (void)
void APIENTRY
glutSwapBuffers (void)
{
if (g_curwin->show_mouse) {
/* XXX scare mouse */
DMesaSwapBuffers(g_curwin->buffer);
/* XXX unscare mouse */
} else {
DMesaSwapBuffers(g_curwin->buffer);
}
if (g_curwin->show_mouse) {
/* XXX scare mouse */
DMesaSwapBuffers(g_curwin->buffer);
/* XXX unscare mouse */
} else {
DMesaSwapBuffers(g_curwin->buffer);
}
if (g_fps) {
GLint t = glutGet(GLUT_ELAPSED_TIME);
swapcount++;
if (swaptime == 0)
swaptime = t;
else if (t - swaptime > g_fps) {
double time = 0.001 * (t - swaptime);
double fps = (double)swapcount / time;
fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n", swapcount, time, fps);
swaptime = t;
swapcount = 0;
}
}
if (g_fps) {
GLint t = glutGet(GLUT_ELAPSED_TIME);
swapcount++;
if (swaptime == 0)
swaptime = t;
else if (t - swaptime > g_fps) {
double time = 0.001 * (t - swaptime);
double fps = (double)swapcount / time;
fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n", swapcount, time, fps);
swaptime = t;
swapcount = 0;
}
}
}
int APIENTRY glutGetWindow (void)
int APIENTRY
glutGetWindow (void)
{
return g_curwin->num;
return g_curwin->num;
}
void APIENTRY glutSetWindow (int win)
void APIENTRY
glutSetWindow (int win)
{
g_curwin = g_windows[win - 1];
DMesaMakeCurrent(g_curwin->context, g_curwin->buffer);
g_curwin = g_windows[win - 1];
DMesaMakeCurrent(g_curwin->context, g_curwin->buffer);
}
void APIENTRY glutSetWindowTitle (const char *title)
void APIENTRY
glutSetWindowTitle (const char *title)
{
}
void APIENTRY glutSetIconTitle (const char *title)
void APIENTRY
glutSetIconTitle (const char *title)
{
}
void APIENTRY glutPositionWindow (int x, int y)
void APIENTRY
glutPositionWindow (int x, int y)
{
if (DMesaMoveBuffer(x, y)) {
g_curwin->xpos = x;
g_curwin->ypos = y;
}
if (DMesaMoveBuffer(x, y)) {
g_curwin->xpos = x;
g_curwin->ypos = y;
}
}
void APIENTRY glutReshapeWindow (int width, int height)
void APIENTRY
glutReshapeWindow (int width, int height)
{
if (DMesaResizeBuffer(width, height)) {
g_curwin->width = width;
g_curwin->height = height;
if (g_curwin->reshape) {
g_curwin->reshape(width, height);
} else {
glViewport(0, 0, width, height);
}
}
if (DMesaResizeBuffer(width, height)) {
g_curwin->width = width;
g_curwin->height = height;
if (g_curwin->reshape) {
g_curwin->reshape(width, height);
} else {
glViewport(0, 0, width, height);
}
}
}
void APIENTRY glutFullScreen (void)
void APIENTRY
glutFullScreen (void)
{
}
void APIENTRY glutPopWindow (void)
void APIENTRY
glutPopWindow (void)
{
}
void APIENTRY glutPushWindow (void)
void APIENTRY
glutPushWindow (void)
{
}
void APIENTRY glutIconifyWindow (void)
void APIENTRY
glutIconifyWindow (void)
{
}
void APIENTRY glutShowWindow (void)
void APIENTRY
glutShowWindow (void)
{
}
void APIENTRY glutHideWindow (void)
void APIENTRY
glutHideWindow (void)
{
}