X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdos%2Fkeyb.c;h=98a1f3da20ee0a7cb3c16f63f90fa63a6c256e92;hp=9ec20a9de8d136081a2db11a5008d637ae100c67;hb=0165ec15f868a16a70b56ada2d42db0cb69ea193;hpb=a1f76b7a26c675e16cb78fecc9b6a1c0fc9c05c3 diff --git a/src/dos/keyb.c b/src/dos/keyb.c index 9ec20a9..98a1f3d 100644 --- a/src/dos/keyb.c +++ b/src/dos/keyb.c @@ -22,7 +22,17 @@ along with the program. If not, see #include #include #include + +#ifdef __WATCOMC__ #include +#endif +#ifdef __DJGPP__ +#include +#include +#include +#include +#endif + #include "keyb.h" #include "scancode.h" @@ -32,11 +42,24 @@ along with the program. If not, see #define PIC1_CMD_PORT 0x20 #define OCW2_EOI (1 << 5) +#ifdef __WATCOMC__ +#define INTERRUPT __interrupt __far + #define DONE_INIT (prev_handler) +static void (INTERRUPT *prev_handler)(); +#endif + +#ifdef __DJGPP__ +#define INTERRUPT -static void __interrupt __far kbintr(); +#define DONE_INIT prev_intr.pm_offset +static _go32_dpmi_seginfo intr, prev_intr; -static void (__interrupt __far *prev_handler)(); +#define outp(p, v) outportb(p, v) +#define inp(p) inportb(p) +#endif + +static void INTERRUPT kbintr(); static int *buffer; static int buffer_size, buf_ridx, buf_widx; @@ -67,8 +90,17 @@ int kb_init(int bufsz) /* set our interrupt handler */ _disable(); +#ifdef __WATCOMC__ prev_handler = _dos_getvect(KB_INTR); _dos_setvect(KB_INTR, kbintr); +#endif +#ifdef __DJGPP__ + _go32_dpmi_get_protected_mode_interrupt_vector(KB_INTR, &prev_intr); + intr.pm_offset = (intptr_t)kbintr; + intr.pm_selector = _go32_my_cs(); + _go32_dpmi_allocate_iret_wrapper(&intr); + _go32_dpmi_set_protected_mode_interrupt_vector(KB_INTR, &intr); +#endif _enable(); return 0; @@ -82,7 +114,13 @@ void kb_shutdown(void) /* restore the original interrupt handler */ _disable(); +#ifdef __WATCOMC__ _dos_setvect(KB_INTR, prev_handler); +#endif +#ifdef __DJGPP__ + _go32_dpmi_set_protected_mode_interrupt_vector(KB_INTR, &prev_intr); + _go32_dpmi_free_iret_wrapper(&intr); +#endif _enable(); free(buffer); @@ -103,6 +141,17 @@ int kb_isdown(int key) return keystate[key]; } +#ifdef __WATCOMC__ +void halt(void); +#pragma aux halt = \ + "sti" \ + "hlt"; +#endif + +#ifdef __DJGPP__ +#define halt() asm volatile("sti\n\thlt\n\t") +#endif + void kb_wait(void) { int key; @@ -110,10 +159,7 @@ void kb_wait(void) /* put the processor to sleep while waiting for keypresses, but first * make sure interrupts are enabled, or we'll sleep forever */ - __asm { - sti - hlt - } + halt(); } kb_putback(key); } @@ -157,7 +203,7 @@ void kb_putback(int key) } } -static void __interrupt __far kbintr() +static void INTERRUPT kbintr() { unsigned char code; int key, press;