mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-17 16:44:00 +00:00
Fix some files with CRLF (DOS) line endings to have LF (Unix).
modified: doskbd.c modified: launch.asm modified: lpkit.c modified: lplexyy.c modified: lpytab.c modified: mouseif.c
This commit is contained in:
parent
5481a14812
commit
91dc1d7410
640
src/doskbd.c
640
src/doskbd.c
@ -1,320 +1,320 @@
|
||||
/* $Id: doskbd.c,v 1.2 1999/01/03 02:06:55 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
|
||||
*/
|
||||
static char *id = "$Id: doskbd.c,v 1.2 1999/01/03 02:06:55 sybalsky Exp $ Copyright (C) Venue";
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* D O S K E Y B O A R D H A N D L E R */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* (C) Copyright 1989, 1990, 1990, 1991, 1992, 1993, 1994, 1995 Venue. */
|
||||
/* All Rights Reserved. */
|
||||
/* Manufactured in the United States of America. */
|
||||
/* */
|
||||
/* The contents of this file are proprietary information */
|
||||
/* belonging to Venue, and are provided to you under license. */
|
||||
/* They may not be further distributed or disclosed to third */
|
||||
/* parties without the specific permission of Venue. */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include <dos.h> /* defines REGS & other structs */
|
||||
#include <i32.h> /* "#pragma interrupt" & '_chain_intr'*/
|
||||
#include <stk.h>
|
||||
#include <conio.h>
|
||||
|
||||
#include "lispemul.h"
|
||||
#include "keyboard.h"
|
||||
#include "keysym.h"
|
||||
#include "devif.h"
|
||||
|
||||
int nokbdflag = FALSE;
|
||||
extern int eurokbd;
|
||||
extern KbdInterface currentkbd;
|
||||
extern MouseInterface currentmouse;
|
||||
extern IOPAGE *IOPage68K;
|
||||
extern IFPAGE *InterfacePage;
|
||||
extern int KBDEventFlg;
|
||||
|
||||
extern keybuffer *CTopKeyevent;
|
||||
|
||||
extern LispPTR *LASTUSERACTION68k;
|
||||
extern LispPTR *KEYBUFFERING68k;
|
||||
|
||||
/************************************************/
|
||||
/* Keyboard-Interface Registers, Status Codes */
|
||||
/************************************************/
|
||||
#define KBD_COMMAND_PORT 0x64 /* I/O port commands go out on */
|
||||
#define KBD_ENABLE 0xAE
|
||||
#define KBD_DISABLE 0xAD
|
||||
#define KBD_RESET 0xF6
|
||||
|
||||
#define PORT_8042 0x60 /* Port scan codes come in on */
|
||||
#define KBD_SCAN_CODE_PORT 0x60
|
||||
#define KBD_resend 0xFE /* KBD asked for resend */
|
||||
#define KBD_ack 0xFA /* KBD ack's our command */
|
||||
#define KBD_echo_response 0xEE /* KBD responds to echo req */
|
||||
#define KBD_failure 0xFD /* Failure code */
|
||||
#define KBD_prefix 0xE0 /* Prefix for extended chars */
|
||||
#define KBD_pause_prefix 0xE1 /* Pause prefix?? */
|
||||
#define KBD_overflow 0x00 /* Overflow of some kind */
|
||||
#define KBD_overrun 0xFF /* KBD buffer overrun */
|
||||
|
||||
#define KBD_STATUS_PORT 0x64 /* Port KBD status comes in on */
|
||||
#define KBD_INP_FULL 0x02 /* input buffer full */
|
||||
|
||||
#define INTA00 0x20 /* The 8259 port, to reset irq */
|
||||
#define ENDOFINTERRUPT 0x20
|
||||
|
||||
#define PRTSC_KEY 0x37 /* Keyboard codes for extended chars */
|
||||
#define HOME_KEY 0x47
|
||||
#define UPARROW_KEY 0x48
|
||||
#define PGUP_KEY 0x49
|
||||
#define LEFTARROW_KEY 0x4b
|
||||
#define RIGHTARROW_KEY 0x4d
|
||||
#define END_KEY 0x4f
|
||||
#define DOWNARROW_KEY 0x50
|
||||
#define PGDOWN_KEY 0x51
|
||||
#define INS_KEY 0x52
|
||||
#define DEL_KEY 0x53
|
||||
|
||||
/******************************************************/
|
||||
/* Tell the Interrupt-dispatch IC we're done, and */
|
||||
/* Tell the keyboard itself that we're ready again. */
|
||||
/* */
|
||||
/* (This process is critical to the proper function */
|
||||
/* of the handler, so let's do it once, correctly.) */
|
||||
/******************************************************/
|
||||
#define ENABLE_KBD \
|
||||
{ \
|
||||
outp(INTA00, ENDOFINTERRUPT); \
|
||||
outp(KBD_COMMAND_PORT, KBD_ENABLE); /* Turn kbd on again. */ \
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* K B D _ E V E N T */
|
||||
/* */
|
||||
/* Keyboard interrupt handler routine */
|
||||
/************************************************************************/
|
||||
extern DLword *DisplayRegion68k;
|
||||
|
||||
#pragma interrupt(Kbd_event)
|
||||
|
||||
void Kbd_event() {
|
||||
_XSTACK *ebp; /* Real-mode handler stack frame */
|
||||
DLword w, r;
|
||||
KBEVENT *kbevent;
|
||||
unsigned char keycode, tmpkey;
|
||||
|
||||
ebp = (_XSTACK *)_get_stk_frame(); /* Get stack frame address */
|
||||
ebp->opts |= _STK_NOINT; /* Bypass real-mode handler */
|
||||
|
||||
/*************************************************/
|
||||
/* First, get the scan code from the keyboard. */
|
||||
/* Handle exceptional conditions & errors, and */
|
||||
/* the extended-character prefix, 0xE0 */
|
||||
/* generated for, e.g., the INSERT key. */
|
||||
/*************************************************/
|
||||
|
||||
_disable(); /* prevent further interrupts from killing us */
|
||||
outp(KBD_COMMAND_PORT, KBD_DISABLE); /* Turn the kbd off. */
|
||||
do { tmpkey = inp(KBD_STATUS_PORT); } while (tmpkey & KBD_INP_FULL);
|
||||
|
||||
/* Finite state machine that either returns or goes to label handle: */
|
||||
switch (tmpkey = inp(KBD_SCAN_CODE_PORT)) {
|
||||
case KBD_overflow: /* Ignore these. */
|
||||
case KBD_pause_prefix:
|
||||
case KBD_echo_response:
|
||||
case KBD_ack:
|
||||
case KBD_failure:
|
||||
case KBD_resend:
|
||||
case KBD_overrun:
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
break;
|
||||
|
||||
case KBD_prefix: /* It's a prefix, so really use next char. */
|
||||
/* Remember that we saw the prefix: */
|
||||
currentkbd->lastbyte = tmpkey;
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
break;
|
||||
|
||||
default:
|
||||
tmpkey = inp(KBD_SCAN_CODE_PORT);
|
||||
if (currentkbd->lastbyte == KBD_prefix)
|
||||
switch (tmpkey) /* deal with prefixed characters */
|
||||
{
|
||||
case 0x2A: /* by ignoring some (what are they??) */
|
||||
case 0xAA:
|
||||
case 0xB6:
|
||||
case 0x36:
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
break;
|
||||
|
||||
default: /* and passing the rest thru as-is */
|
||||
currentkbd->lastbyte = tmpkey; /* Set the state. */
|
||||
goto handle;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
currentkbd->lastbyte = tmpkey; /* Set the state. */
|
||||
goto handle;
|
||||
}
|
||||
}
|
||||
|
||||
return; /* Don't have anything to handle yet, so just return */
|
||||
|
||||
/*****************************************************/
|
||||
/* Second, translate the scan code into a LISP key */
|
||||
/* transition, add it to the ring buffer, and set */
|
||||
/* the interrupt-request flags so lisp sees it. */
|
||||
/*****************************************************/
|
||||
handle:
|
||||
/* The upflag is the eight bit in the char ie. upflag = currentkbd->lastbyte >> 7 */
|
||||
/* The event is the lower seven bits of the byte */
|
||||
|
||||
keycode = currentkbd->KeyMap[currentkbd->lastbyte & 0x7f];
|
||||
|
||||
if (keycode != 0xff) {
|
||||
if (keycode < 64) {
|
||||
PUTBASEBIT68K(&(IOPage68K->dlkbdad0), keycode, (currentkbd->lastbyte >> 7) & 1);
|
||||
} else if (keycode >= 80) {
|
||||
PUTBASEBIT68K(&(IOPage68K->dlkbdad0), keycode - 16, (currentkbd->lastbyte >> 7) & 1);
|
||||
} else {
|
||||
PUTBASEBIT68K(&(IOPage68K->dlutilin), (keycode & 0xf), (currentkbd->lastbyte >> 7) & 1);
|
||||
PUTBASEBIT68K(&(InterfacePage->fakemousebits), (keycode & 0xf),
|
||||
(currentkbd->lastbyte >> 7) & 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* In DOS we can't enter uraid inside an exception handler. */
|
||||
/* Uraid may touch a swapped out address and that dumps Medley */
|
||||
if (((IOPage68K->dlkbdad2 & 2113) == 0) || /* Ctrl-shift-NEXT */
|
||||
((IOPage68K->dlkbdad2 & 2114) == 0)) { /* Ctrl-shift-DEL */
|
||||
currentkbd->URaid = TRUE; /* Tell the dispatch loop about it. */
|
||||
return;
|
||||
}
|
||||
|
||||
r = CTopKeyevent->ring.vectorindex.read;
|
||||
w = CTopKeyevent->ring.vectorindex.write;
|
||||
|
||||
if (r != w) {
|
||||
kbevent = (KBEVENT *)((DLword *)CTopKeyevent + w);
|
||||
/* Copy the Hardware bits. */
|
||||
kbevent->W0 = IOPage68K->dlkbdad0;
|
||||
kbevent->W1 = IOPage68K->dlkbdad1;
|
||||
kbevent->W2 = IOPage68K->dlkbdad2;
|
||||
kbevent->W3 = IOPage68K->dlkbdad3;
|
||||
kbevent->W4 = IOPage68K->dlkbdad4;
|
||||
kbevent->W5 = IOPage68K->dlkbdad5;
|
||||
kbevent->WU = IOPage68K->dlutilin;
|
||||
|
||||
/* If queue was empty, update the read pointer */
|
||||
if (r == 0) CTopKeyevent->ring.vectorindex.read = w;
|
||||
|
||||
/* Update the write pointer */
|
||||
if (w >= currentkbd->maxkeyevent)
|
||||
CTopKeyevent->ring.vectorindex.write = MINKEYEVENT;
|
||||
else
|
||||
CTopKeyevent->ring.vectorindex.write += currentkbd->keyeventsize;
|
||||
}
|
||||
if (*KEYBUFFERING68k == NIL) *KEYBUFFERING68k = ATOM_T;
|
||||
|
||||
KBDEventFlg++;
|
||||
Irq_Stk_End = 0;
|
||||
Irq_Stk_Check = 0;
|
||||
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
}
|
||||
|
||||
extern u_char DOSLispKeyMap_101[];
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* E X I T D O S K B D */
|
||||
/* */
|
||||
/* Turn off the DOS keyboard handler, and reinstall the */
|
||||
/* normal DOS handler. */
|
||||
/************************************************************************/
|
||||
|
||||
void ExitDosKbd(KbdInterface kbd)
|
||||
{
|
||||
if (kbd->device.active == TRUE) {
|
||||
kbd->device.active = FALSE;
|
||||
|
||||
_dpmi_unlockregion((void *)¤tkbd, sizeof(currentkbd));
|
||||
_dpmi_unlockregion((void *)kbd, sizeof(*kbd));
|
||||
_dpmi_unlockregion((void *)&InterfacePage, sizeof(InterfacePage));
|
||||
_dpmi_unlockregion((void *)InterfacePage, sizeof(IFPAGE));
|
||||
_dpmi_unlockregion((void *)&IOPage68K, sizeof(IOPage68K));
|
||||
_dpmi_unlockregion((void *)IOPage68K, sizeof(IOPAGE));
|
||||
|
||||
_dpmi_unlockregion((void *)&CTopKeyevent, sizeof(CTopKeyevent));
|
||||
_dpmi_unlockregion((void *)CTopKeyevent, sizeof(*CTopKeyevent));
|
||||
|
||||
_dpmi_unlockregion((void *)&MachineState, sizeof(MachineState));
|
||||
_dpmi_unlockregion((void *)&KEYBUFFERING68k, sizeof(KEYBUFFERING68k));
|
||||
_dpmi_unlockregion((void *)&ExitDosKbd, 4096);
|
||||
_dpmi_unlockregion((void *)&Kbd_event, 4096);
|
||||
|
||||
_dos_setvect(0x09, kbd->prev_handler); /* unhook our handlr, install previous*/
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* E N T E R D O S K B D */
|
||||
/* */
|
||||
/* Turn on the DOS keyboard device. */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
void EnterDosKbd(KbdInterface kbd)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (kbd->device.active == FALSE) {
|
||||
kbd->device.active = TRUE;
|
||||
for (i = 0; i < 0x80; i++) kbd->KeyMap[i] = DOSLispKeyMap_101[i];
|
||||
|
||||
if (eurokbd)
|
||||
kbd->keyeventsize = EUROKEYEVENTSIZE;
|
||||
else
|
||||
kbd->keyeventsize = NOEUROKEYEVENTSIZE;
|
||||
kbd->eurokbd = eurokbd;
|
||||
|
||||
/* Offset of the end of the ring buffer */
|
||||
kbd->maxkeyevent = (MINKEYEVENT + (NUMBEROFKEYEVENTS * kbd->keyeventsize));
|
||||
|
||||
_dpmi_lockregion((void *)¤tkbd, sizeof(currentkbd));
|
||||
_dpmi_lockregion((void *)kbd, sizeof(*kbd));
|
||||
_dpmi_lockregion((void *)&InterfacePage, sizeof(InterfacePage));
|
||||
_dpmi_lockregion((void *)InterfacePage, sizeof(IFPAGE));
|
||||
_dpmi_lockregion((void *)&IOPage68K, sizeof(IOPage68K));
|
||||
_dpmi_lockregion((void *)IOPage68K, sizeof(IOPAGE));
|
||||
_dpmi_lockregion((void *)&MachineState, sizeof(MachineState));
|
||||
|
||||
_dpmi_lockregion((void *)&CTopKeyevent, sizeof(CTopKeyevent));
|
||||
_dpmi_lockregion((void *)CTopKeyevent, sizeof(*CTopKeyevent));
|
||||
|
||||
_dpmi_lockregion((void *)&KEYBUFFERING68k, sizeof(KEYBUFFERING68k));
|
||||
_dpmi_lockregion((void *)&ExitDosKbd, 4096);
|
||||
_dpmi_lockregion((void *)&Kbd_event, 4096);
|
||||
|
||||
/* Don't hook in our handler if the user flagged he wants to run */
|
||||
/* without a kbd. */
|
||||
if (!nokbdflag) {
|
||||
kbd->prev_handler = _dos_getvect(0x09); /* get addr of currnt 09 hndlr */
|
||||
_dos_setvect(0x09, kbd->device_event); /* hook our int handler to interrupt */
|
||||
}
|
||||
}
|
||||
}
|
||||
/* $Id: doskbd.c,v 1.2 1999/01/03 02:06:55 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
|
||||
*/
|
||||
static char *id = "$Id: doskbd.c,v 1.2 1999/01/03 02:06:55 sybalsky Exp $ Copyright (C) Venue";
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* D O S K E Y B O A R D H A N D L E R */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* (C) Copyright 1989, 1990, 1990, 1991, 1992, 1993, 1994, 1995 Venue. */
|
||||
/* All Rights Reserved. */
|
||||
/* Manufactured in the United States of America. */
|
||||
/* */
|
||||
/* The contents of this file are proprietary information */
|
||||
/* belonging to Venue, and are provided to you under license. */
|
||||
/* They may not be further distributed or disclosed to third */
|
||||
/* parties without the specific permission of Venue. */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include <dos.h> /* defines REGS & other structs */
|
||||
#include <i32.h> /* "#pragma interrupt" & '_chain_intr'*/
|
||||
#include <stk.h>
|
||||
#include <conio.h>
|
||||
|
||||
#include "lispemul.h"
|
||||
#include "keyboard.h"
|
||||
#include "keysym.h"
|
||||
#include "devif.h"
|
||||
|
||||
int nokbdflag = FALSE;
|
||||
extern int eurokbd;
|
||||
extern KbdInterface currentkbd;
|
||||
extern MouseInterface currentmouse;
|
||||
extern IOPAGE *IOPage68K;
|
||||
extern IFPAGE *InterfacePage;
|
||||
extern int KBDEventFlg;
|
||||
|
||||
extern keybuffer *CTopKeyevent;
|
||||
|
||||
extern LispPTR *LASTUSERACTION68k;
|
||||
extern LispPTR *KEYBUFFERING68k;
|
||||
|
||||
/************************************************/
|
||||
/* Keyboard-Interface Registers, Status Codes */
|
||||
/************************************************/
|
||||
#define KBD_COMMAND_PORT 0x64 /* I/O port commands go out on */
|
||||
#define KBD_ENABLE 0xAE
|
||||
#define KBD_DISABLE 0xAD
|
||||
#define KBD_RESET 0xF6
|
||||
|
||||
#define PORT_8042 0x60 /* Port scan codes come in on */
|
||||
#define KBD_SCAN_CODE_PORT 0x60
|
||||
#define KBD_resend 0xFE /* KBD asked for resend */
|
||||
#define KBD_ack 0xFA /* KBD ack's our command */
|
||||
#define KBD_echo_response 0xEE /* KBD responds to echo req */
|
||||
#define KBD_failure 0xFD /* Failure code */
|
||||
#define KBD_prefix 0xE0 /* Prefix for extended chars */
|
||||
#define KBD_pause_prefix 0xE1 /* Pause prefix?? */
|
||||
#define KBD_overflow 0x00 /* Overflow of some kind */
|
||||
#define KBD_overrun 0xFF /* KBD buffer overrun */
|
||||
|
||||
#define KBD_STATUS_PORT 0x64 /* Port KBD status comes in on */
|
||||
#define KBD_INP_FULL 0x02 /* input buffer full */
|
||||
|
||||
#define INTA00 0x20 /* The 8259 port, to reset irq */
|
||||
#define ENDOFINTERRUPT 0x20
|
||||
|
||||
#define PRTSC_KEY 0x37 /* Keyboard codes for extended chars */
|
||||
#define HOME_KEY 0x47
|
||||
#define UPARROW_KEY 0x48
|
||||
#define PGUP_KEY 0x49
|
||||
#define LEFTARROW_KEY 0x4b
|
||||
#define RIGHTARROW_KEY 0x4d
|
||||
#define END_KEY 0x4f
|
||||
#define DOWNARROW_KEY 0x50
|
||||
#define PGDOWN_KEY 0x51
|
||||
#define INS_KEY 0x52
|
||||
#define DEL_KEY 0x53
|
||||
|
||||
/******************************************************/
|
||||
/* Tell the Interrupt-dispatch IC we're done, and */
|
||||
/* Tell the keyboard itself that we're ready again. */
|
||||
/* */
|
||||
/* (This process is critical to the proper function */
|
||||
/* of the handler, so let's do it once, correctly.) */
|
||||
/******************************************************/
|
||||
#define ENABLE_KBD \
|
||||
{ \
|
||||
outp(INTA00, ENDOFINTERRUPT); \
|
||||
outp(KBD_COMMAND_PORT, KBD_ENABLE); /* Turn kbd on again. */ \
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* K B D _ E V E N T */
|
||||
/* */
|
||||
/* Keyboard interrupt handler routine */
|
||||
/************************************************************************/
|
||||
extern DLword *DisplayRegion68k;
|
||||
|
||||
#pragma interrupt(Kbd_event)
|
||||
|
||||
void Kbd_event() {
|
||||
_XSTACK *ebp; /* Real-mode handler stack frame */
|
||||
DLword w, r;
|
||||
KBEVENT *kbevent;
|
||||
unsigned char keycode, tmpkey;
|
||||
|
||||
ebp = (_XSTACK *)_get_stk_frame(); /* Get stack frame address */
|
||||
ebp->opts |= _STK_NOINT; /* Bypass real-mode handler */
|
||||
|
||||
/*************************************************/
|
||||
/* First, get the scan code from the keyboard. */
|
||||
/* Handle exceptional conditions & errors, and */
|
||||
/* the extended-character prefix, 0xE0 */
|
||||
/* generated for, e.g., the INSERT key. */
|
||||
/*************************************************/
|
||||
|
||||
_disable(); /* prevent further interrupts from killing us */
|
||||
outp(KBD_COMMAND_PORT, KBD_DISABLE); /* Turn the kbd off. */
|
||||
do { tmpkey = inp(KBD_STATUS_PORT); } while (tmpkey & KBD_INP_FULL);
|
||||
|
||||
/* Finite state machine that either returns or goes to label handle: */
|
||||
switch (tmpkey = inp(KBD_SCAN_CODE_PORT)) {
|
||||
case KBD_overflow: /* Ignore these. */
|
||||
case KBD_pause_prefix:
|
||||
case KBD_echo_response:
|
||||
case KBD_ack:
|
||||
case KBD_failure:
|
||||
case KBD_resend:
|
||||
case KBD_overrun:
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
break;
|
||||
|
||||
case KBD_prefix: /* It's a prefix, so really use next char. */
|
||||
/* Remember that we saw the prefix: */
|
||||
currentkbd->lastbyte = tmpkey;
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
break;
|
||||
|
||||
default:
|
||||
tmpkey = inp(KBD_SCAN_CODE_PORT);
|
||||
if (currentkbd->lastbyte == KBD_prefix)
|
||||
switch (tmpkey) /* deal with prefixed characters */
|
||||
{
|
||||
case 0x2A: /* by ignoring some (what are they??) */
|
||||
case 0xAA:
|
||||
case 0xB6:
|
||||
case 0x36:
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
break;
|
||||
|
||||
default: /* and passing the rest thru as-is */
|
||||
currentkbd->lastbyte = tmpkey; /* Set the state. */
|
||||
goto handle;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
currentkbd->lastbyte = tmpkey; /* Set the state. */
|
||||
goto handle;
|
||||
}
|
||||
}
|
||||
|
||||
return; /* Don't have anything to handle yet, so just return */
|
||||
|
||||
/*****************************************************/
|
||||
/* Second, translate the scan code into a LISP key */
|
||||
/* transition, add it to the ring buffer, and set */
|
||||
/* the interrupt-request flags so lisp sees it. */
|
||||
/*****************************************************/
|
||||
handle:
|
||||
/* The upflag is the eight bit in the char ie. upflag = currentkbd->lastbyte >> 7 */
|
||||
/* The event is the lower seven bits of the byte */
|
||||
|
||||
keycode = currentkbd->KeyMap[currentkbd->lastbyte & 0x7f];
|
||||
|
||||
if (keycode != 0xff) {
|
||||
if (keycode < 64) {
|
||||
PUTBASEBIT68K(&(IOPage68K->dlkbdad0), keycode, (currentkbd->lastbyte >> 7) & 1);
|
||||
} else if (keycode >= 80) {
|
||||
PUTBASEBIT68K(&(IOPage68K->dlkbdad0), keycode - 16, (currentkbd->lastbyte >> 7) & 1);
|
||||
} else {
|
||||
PUTBASEBIT68K(&(IOPage68K->dlutilin), (keycode & 0xf), (currentkbd->lastbyte >> 7) & 1);
|
||||
PUTBASEBIT68K(&(InterfacePage->fakemousebits), (keycode & 0xf),
|
||||
(currentkbd->lastbyte >> 7) & 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* In DOS we can't enter uraid inside an exception handler. */
|
||||
/* Uraid may touch a swapped out address and that dumps Medley */
|
||||
if (((IOPage68K->dlkbdad2 & 2113) == 0) || /* Ctrl-shift-NEXT */
|
||||
((IOPage68K->dlkbdad2 & 2114) == 0)) { /* Ctrl-shift-DEL */
|
||||
currentkbd->URaid = TRUE; /* Tell the dispatch loop about it. */
|
||||
return;
|
||||
}
|
||||
|
||||
r = CTopKeyevent->ring.vectorindex.read;
|
||||
w = CTopKeyevent->ring.vectorindex.write;
|
||||
|
||||
if (r != w) {
|
||||
kbevent = (KBEVENT *)((DLword *)CTopKeyevent + w);
|
||||
/* Copy the Hardware bits. */
|
||||
kbevent->W0 = IOPage68K->dlkbdad0;
|
||||
kbevent->W1 = IOPage68K->dlkbdad1;
|
||||
kbevent->W2 = IOPage68K->dlkbdad2;
|
||||
kbevent->W3 = IOPage68K->dlkbdad3;
|
||||
kbevent->W4 = IOPage68K->dlkbdad4;
|
||||
kbevent->W5 = IOPage68K->dlkbdad5;
|
||||
kbevent->WU = IOPage68K->dlutilin;
|
||||
|
||||
/* If queue was empty, update the read pointer */
|
||||
if (r == 0) CTopKeyevent->ring.vectorindex.read = w;
|
||||
|
||||
/* Update the write pointer */
|
||||
if (w >= currentkbd->maxkeyevent)
|
||||
CTopKeyevent->ring.vectorindex.write = MINKEYEVENT;
|
||||
else
|
||||
CTopKeyevent->ring.vectorindex.write += currentkbd->keyeventsize;
|
||||
}
|
||||
if (*KEYBUFFERING68k == NIL) *KEYBUFFERING68k = ATOM_T;
|
||||
|
||||
KBDEventFlg++;
|
||||
Irq_Stk_End = 0;
|
||||
Irq_Stk_Check = 0;
|
||||
|
||||
ENABLE_KBD;
|
||||
return;
|
||||
}
|
||||
|
||||
extern u_char DOSLispKeyMap_101[];
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* E X I T D O S K B D */
|
||||
/* */
|
||||
/* Turn off the DOS keyboard handler, and reinstall the */
|
||||
/* normal DOS handler. */
|
||||
/************************************************************************/
|
||||
|
||||
void ExitDosKbd(KbdInterface kbd)
|
||||
{
|
||||
if (kbd->device.active == TRUE) {
|
||||
kbd->device.active = FALSE;
|
||||
|
||||
_dpmi_unlockregion((void *)¤tkbd, sizeof(currentkbd));
|
||||
_dpmi_unlockregion((void *)kbd, sizeof(*kbd));
|
||||
_dpmi_unlockregion((void *)&InterfacePage, sizeof(InterfacePage));
|
||||
_dpmi_unlockregion((void *)InterfacePage, sizeof(IFPAGE));
|
||||
_dpmi_unlockregion((void *)&IOPage68K, sizeof(IOPage68K));
|
||||
_dpmi_unlockregion((void *)IOPage68K, sizeof(IOPAGE));
|
||||
|
||||
_dpmi_unlockregion((void *)&CTopKeyevent, sizeof(CTopKeyevent));
|
||||
_dpmi_unlockregion((void *)CTopKeyevent, sizeof(*CTopKeyevent));
|
||||
|
||||
_dpmi_unlockregion((void *)&MachineState, sizeof(MachineState));
|
||||
_dpmi_unlockregion((void *)&KEYBUFFERING68k, sizeof(KEYBUFFERING68k));
|
||||
_dpmi_unlockregion((void *)&ExitDosKbd, 4096);
|
||||
_dpmi_unlockregion((void *)&Kbd_event, 4096);
|
||||
|
||||
_dos_setvect(0x09, kbd->prev_handler); /* unhook our handlr, install previous*/
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* E N T E R D O S K B D */
|
||||
/* */
|
||||
/* Turn on the DOS keyboard device. */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
void EnterDosKbd(KbdInterface kbd)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (kbd->device.active == FALSE) {
|
||||
kbd->device.active = TRUE;
|
||||
for (i = 0; i < 0x80; i++) kbd->KeyMap[i] = DOSLispKeyMap_101[i];
|
||||
|
||||
if (eurokbd)
|
||||
kbd->keyeventsize = EUROKEYEVENTSIZE;
|
||||
else
|
||||
kbd->keyeventsize = NOEUROKEYEVENTSIZE;
|
||||
kbd->eurokbd = eurokbd;
|
||||
|
||||
/* Offset of the end of the ring buffer */
|
||||
kbd->maxkeyevent = (MINKEYEVENT + (NUMBEROFKEYEVENTS * kbd->keyeventsize));
|
||||
|
||||
_dpmi_lockregion((void *)¤tkbd, sizeof(currentkbd));
|
||||
_dpmi_lockregion((void *)kbd, sizeof(*kbd));
|
||||
_dpmi_lockregion((void *)&InterfacePage, sizeof(InterfacePage));
|
||||
_dpmi_lockregion((void *)InterfacePage, sizeof(IFPAGE));
|
||||
_dpmi_lockregion((void *)&IOPage68K, sizeof(IOPage68K));
|
||||
_dpmi_lockregion((void *)IOPage68K, sizeof(IOPAGE));
|
||||
_dpmi_lockregion((void *)&MachineState, sizeof(MachineState));
|
||||
|
||||
_dpmi_lockregion((void *)&CTopKeyevent, sizeof(CTopKeyevent));
|
||||
_dpmi_lockregion((void *)CTopKeyevent, sizeof(*CTopKeyevent));
|
||||
|
||||
_dpmi_lockregion((void *)&KEYBUFFERING68k, sizeof(KEYBUFFERING68k));
|
||||
_dpmi_lockregion((void *)&ExitDosKbd, 4096);
|
||||
_dpmi_lockregion((void *)&Kbd_event, 4096);
|
||||
|
||||
/* Don't hook in our handler if the user flagged he wants to run */
|
||||
/* without a kbd. */
|
||||
if (!nokbdflag) {
|
||||
kbd->prev_handler = _dos_getvect(0x09); /* get addr of currnt 09 hndlr */
|
||||
_dos_setvect(0x09, kbd->device_event); /* hook our int handler to interrupt */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
724
src/launch.asm
Executable file → Normal file
724
src/launch.asm
Executable file → Normal file
@ -1,363 +1,363 @@
|
||||
;; # @(#) launch.asm Version 1.1 (12/29/94). Copyright Venue #
|
||||
;************************************************************************
|
||||
;* *
|
||||
;* l a u n c h . a s m *
|
||||
;* *
|
||||
;* This is the launcher for Medley on DOS. It: *
|
||||
;* *
|
||||
;* * Looks for and validates any -m memsize argument on the *
|
||||
;* command line. Only values in the range 8 - 32 are allowed. *
|
||||
;* *
|
||||
;* * Loads the real Medley emulator, emul.exe, from the same *
|
||||
;* directory that the launcher came from. *
|
||||
;* *
|
||||
;* * Sets the Intel DOS Extender's profile to the requested *
|
||||
;* memory size + 3Mb (to allow for the emulator, internal *
|
||||
;* data areas, etc.) *
|
||||
;* *
|
||||
;* * Set the termination address in the child process's PSP, *
|
||||
;* so control returns to the launcher when Medley terminates. *
|
||||
;* *
|
||||
;* * Jumps to the emulator's start address. *
|
||||
;* *
|
||||
;* * Upon return, just terminates cleanly. *
|
||||
;* *
|
||||
;* [We could perhaps do some diagnosis here of error returns?] *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;************************************************************************
|
||||
|
||||
;************************************************************************/
|
||||
;* */
|
||||
;* (C) Copyright 1993, 1994 Venue. All Rights Reserved. */
|
||||
;* Manufactured in the United States of America. */
|
||||
;* */
|
||||
;* The contents of this file are proprietary information */
|
||||
;* belonging to Venue, and are provided to you under license. */
|
||||
;* They may not be further distributed or disclosed to third */
|
||||
;* parties without the specific permission of Venue. */
|
||||
;* */
|
||||
;************************************************************************/
|
||||
|
||||
.model small
|
||||
.386p
|
||||
.stack 100h
|
||||
.data
|
||||
align 8
|
||||
;********************************************************
|
||||
;* Parameter block for INT 214B, that loads medley.exe *
|
||||
;********************************************************
|
||||
envseg DW 0 ; environment (0 = copy mine)
|
||||
cmdip DW ? ; command-line-tail pointer
|
||||
cmdcs DW ?
|
||||
fcb1 DD ? ; dummy first FCB to fill in
|
||||
fcb2 DD ? ; " 2nd FCB, not here in DOS 4.01???
|
||||
stk DD ? ; SS:SP for emul.exe, filled in by loader
|
||||
csip DD ? ; start addr for emul.exe, filled in by loader
|
||||
|
||||
|
||||
|
||||
retad DD FAR PTR myret ; cs:ip return address, to put in
|
||||
; child PSP, so we get control back.
|
||||
|
||||
|
||||
;* Error messages, misc strings, and work areas*
|
||||
align 8
|
||||
memval dd 0
|
||||
errstg DB 'ERROR: Couldn''t free excess storage.',13,10,'$'
|
||||
noload db 'ERROR: Loading emulator failed: $'
|
||||
loaded db 'LOAD SUCCESSFUL.',13,10,'$'
|
||||
nominfo db 'ERROR: -m must be followed by a number 8 - 64.',13,10,'$'
|
||||
badexe db 'ERROR: emul.exe is corrupted.',13,10,'$'
|
||||
emulpath DB 'emul.exe',0 ; name of the real emulator.
|
||||
mflag db '-m' ; to search for -m/-M in cmd line
|
||||
mmflag db '-M'
|
||||
profile db 'PRO' ; to find the DOS extender profile
|
||||
cmdline db 128 dup (?) ; hold the cmd line tail for real emulator
|
||||
|
||||
;* Error-message table for failures loading emul.exe
|
||||
align 2
|
||||
errtbl dw OFFSET ng0msg ; 0 = unknown failure
|
||||
dw OFFSET ng1msg ; 1 = "invalid function"
|
||||
dw OFFSET ng2msg ; 2 = file not found
|
||||
dw OFFSET ng3msg ; 3 = path not found
|
||||
dw OFFSET ng4msg ; 4 = too many open files
|
||||
dw OFFSET ng5msg ; 5 = access denied
|
||||
dw OFFSET ng0msg ; 6 = not possible error
|
||||
dw OFFSET ng0msg ; 7 = not possible error
|
||||
dw OFFSET ng8msg ; 8 = insufficient storage
|
||||
dw OFFSET ng0msg ; 9 = not possible
|
||||
dw OFFSET ngamsg ; A = bad environment
|
||||
dw OFFSET ngbmsg ; B = bad format (corrupt .exe?)a
|
||||
|
||||
ng0msg db 'Unknown problem',13,10,'$'
|
||||
ng1msg db 'Invalid Function',13,10
|
||||
db 'Make sure you are running DOS 4.0 or later.',13,10,'$'
|
||||
ng2msg db 'File not found.',13,10
|
||||
db 'CD to proper directory, or set PATH.',13,10,'$'
|
||||
ng3msg db 'Path not found.',13,10
|
||||
db 'CD to proper directory, or set PATH.',13,10,'$'
|
||||
ng4msg db 'Too many files open.',13,10
|
||||
db 'Shut down some TSRs that have file open?',13,10,'$'
|
||||
ng5msg db 'Access denied.',13,10
|
||||
db 'Make sure of your access rights to emul.exe?',13,10,'$'
|
||||
ng8msg db 'Not enough memory.',13,10
|
||||
db 'Shut down some TSR applications?',13,10,'$'
|
||||
ngamsg db 'Environment corrupt.',13,10
|
||||
db 'Check using SET; You may need to re-boot.',13,10,'$'
|
||||
ngbmsg db 'EXE file corrupted.',13,10,'$'
|
||||
db 'You may need to restore from backup or re-install.',13,10,'$'
|
||||
.code
|
||||
|
||||
|
||||
|
||||
;************************************************************************
|
||||
;* *
|
||||
;* M A C R O S *
|
||||
;* *
|
||||
;* prints Given a string ptr in DX, print it to the display. *
|
||||
;* *
|
||||
;* kill Exit cleanly, using INT 21/4C *
|
||||
;* *
|
||||
;************************************************************************
|
||||
|
||||
prints macro text
|
||||
mov dx, OFFSET text
|
||||
mov ah,9
|
||||
int 21h
|
||||
endm
|
||||
|
||||
kill macro
|
||||
mov ah,4ch
|
||||
int 21h
|
||||
endm
|
||||
|
||||
|
||||
|
||||
;************************************************************************
|
||||
;* *
|
||||
;* M A I N E N T R Y *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;************************************************************************
|
||||
|
||||
PUBLIC main
|
||||
main PROC NEAR
|
||||
|
||||
mov ax,ds ; Save memory-block start for freeing
|
||||
mov es,ax ; excess memory in a bit.
|
||||
|
||||
mov ax,@data ; DS points to start of data segment
|
||||
mov ds,ax
|
||||
|
||||
mov cmdcs, ax ; Copy the command line for the emulator
|
||||
mov cmdip, OFFSET cmdline
|
||||
|
||||
mov di, OFFSET cmdline
|
||||
mov cx,128
|
||||
mov bx,es
|
||||
mov dx,ds
|
||||
mov es,dx
|
||||
mov ds,bx
|
||||
mov si,80h
|
||||
|
||||
rep
|
||||
movsb
|
||||
|
||||
mov es,bx ; Free the excess memory that DOS gives
|
||||
mov ds,dx ; us (we need it for the emulator)
|
||||
|
||||
mov ax,4a00h
|
||||
mov bx,090h ; We only need 900h bytes for this program
|
||||
int 21h
|
||||
jnc freeok
|
||||
|
||||
prints errstg ; Couldn't free spare space; punt.
|
||||
kill
|
||||
|
||||
;************************************************
|
||||
;* Search the command line for -m or -M *
|
||||
;************************************************
|
||||
freeok:
|
||||
mov di,81h ; start of command line tail
|
||||
mov si, OFFSET mflag
|
||||
mov cx, 2
|
||||
|
||||
mov bx,81h
|
||||
add bl,es:[80h]
|
||||
|
||||
m1lp: call strcmp
|
||||
je fndm
|
||||
|
||||
add di, 1
|
||||
cmp di, bx
|
||||
jl m1lp
|
||||
|
||||
mov di,81h ; start of command line tail
|
||||
mov si, OFFSET mmflag
|
||||
|
||||
m2lp: call strcmp
|
||||
je fndm
|
||||
|
||||
add di, 1
|
||||
cmp di, bx
|
||||
jl m2lp
|
||||
|
||||
mov memval,02400000h ; memory value not set--use 35MB total.
|
||||
jmp doload
|
||||
|
||||
fndm: add di,2 ; Found "-m". Now look for a number
|
||||
cmp di,bx ; (Make sure it's not end of line)
|
||||
jnl nogoodm
|
||||
|
||||
ok1:
|
||||
mov edx, 0 ; Holds the memory-requirement value
|
||||
mov ax,0 ; holds characters as we read
|
||||
|
||||
;************************************************
|
||||
;* Skip over spaces/tabs before any number *
|
||||
;************************************************
|
||||
skiplp:
|
||||
mov al, es:[di]
|
||||
inc di
|
||||
cmp al, 20h ; spaces
|
||||
je skiplp
|
||||
cmp al, 09h ; tabs
|
||||
je skiplp
|
||||
cmp di,bx ; make sure we're still in the string
|
||||
jle cnvst ; Yup, we've got the first char, so enter
|
||||
; the conversion loop part-way down.
|
||||
|
||||
nogoodm:
|
||||
prints nominfo ; no arg to -m, or it's bad; Punt.
|
||||
kill
|
||||
|
||||
;********************************************************
|
||||
; Convert the numeric argument to -m; result in edx. *
|
||||
;********************************************************
|
||||
cnvlp: mov al,es:[di]
|
||||
add di, 1
|
||||
cnvst: cmp al, 30h
|
||||
jl endcnv
|
||||
cmp al, 39h
|
||||
jg endcnv
|
||||
sub al, 30h
|
||||
imul dx, 10
|
||||
add dx, ax
|
||||
jmp cnvlp
|
||||
|
||||
endcnv:
|
||||
cmp edx,0 ; if still 0, no valid chars!
|
||||
je nogoodm
|
||||
cmp edx, 8 ; must be in the range [8, 32]
|
||||
jl nogoodm
|
||||
cmp edx,64
|
||||
jg nogoodm
|
||||
|
||||
add edx, 3 ; add 3mb for data areas, etc, and
|
||||
sal edx, 20 ; convert to megabytes
|
||||
mov memval, edx ; save memory requested
|
||||
|
||||
;************************************************
|
||||
;* Load the real emulator .EXE file, emul.exe *
|
||||
;************************************************
|
||||
doload: mov dx, OFFSET emulpath
|
||||
mov ax, seg envseg
|
||||
mov es, ax
|
||||
mov bx, OFFSET envseg
|
||||
mov ax,4b01h ; load-don't-start
|
||||
int 21h
|
||||
jnc loadok
|
||||
|
||||
add ax,ax
|
||||
mov si,ax
|
||||
prints noload
|
||||
mov bx,OFFSET errtbl
|
||||
mov dx,ds:[bx+si]
|
||||
mov ah,9
|
||||
int 21h
|
||||
kill
|
||||
|
||||
loadok: ; Load succeeded.
|
||||
mov ah,51h ; get PSP address for child
|
||||
int 21h
|
||||
mov es, bx ; get segment for DI addressing
|
||||
|
||||
; mov cx,128 ; copy the command line tail
|
||||
; mov di,80h ; (which appears to be flaky in DOS 4)
|
||||
; mov si, offset cmdline
|
||||
; rep
|
||||
; movsb
|
||||
|
||||
mov eax,retad
|
||||
mov dword ptr es:[+0ah], eax ; set up return address.
|
||||
|
||||
cmp memval, 0 ; If no -m value given, just
|
||||
je dorun ; go start the emulator.
|
||||
|
||||
mov di,0 ; Search for the Intel Extender's PROFILE
|
||||
mov si, OFFSET profile ; (see extender.h)
|
||||
mov cx, 3 ; (length is 3 bytes)
|
||||
|
||||
srchlp: call strcmp
|
||||
je gotprof ; found the profile; fix it.
|
||||
add di, 1
|
||||
cmp di, 2048
|
||||
jle srchlp
|
||||
|
||||
prints badexe ; No extender profile, so the emulator
|
||||
kill ; EXE must be corrupt. Punt.
|
||||
|
||||
gotprof:
|
||||
mov eax,memval ; Fill in the memory requirement.
|
||||
mov es:[di+1bch], eax
|
||||
|
||||
;********************************************************
|
||||
;* *
|
||||
;* Set up the stack seg/pointer & start medley. *
|
||||
;* *
|
||||
;********************************************************
|
||||
dorun: lss sp,stk ; load stack SS & SP regs
|
||||
mov ax, es ; copy PSP ptr to ax & ds, since some
|
||||
mov bx, ds ; code expects it in both places.
|
||||
mov fs,bx ; Also, copy DS to FS, so we still have
|
||||
mov ds,ax ; a base for the indirect jump . . .
|
||||
jmp fs:[csip] ; to start-of-medley.
|
||||
|
||||
myret: kill ; we get back here, so quit gracefully.
|
||||
|
||||
main endp
|
||||
|
||||
|
||||
|
||||
;************************************************************************/
|
||||
;* */
|
||||
;* s t r c m p */
|
||||
;* */
|
||||
;* Compare [ds]di and es:[si] for (CX) characters. If the */
|
||||
;* strings are equal, the Zero flag is set when this returns. */
|
||||
;* */
|
||||
;* All registers are preserved. */
|
||||
;* */
|
||||
;************************************************************************/
|
||||
|
||||
strcmp proc near
|
||||
cld
|
||||
push di
|
||||
push si
|
||||
push cx
|
||||
|
||||
repe
|
||||
cmpsb
|
||||
|
||||
pop cx
|
||||
pop si
|
||||
pop di
|
||||
ret
|
||||
strcmp endp
|
||||
|
||||
END
|
||||
;************************************************************************
|
||||
;* *
|
||||
;* l a u n c h . a s m *
|
||||
;* *
|
||||
;* This is the launcher for Medley on DOS. It: *
|
||||
;* *
|
||||
;* * Looks for and validates any -m memsize argument on the *
|
||||
;* command line. Only values in the range 8 - 32 are allowed. *
|
||||
;* *
|
||||
;* * Loads the real Medley emulator, emul.exe, from the same *
|
||||
;* directory that the launcher came from. *
|
||||
;* *
|
||||
;* * Sets the Intel DOS Extender's profile to the requested *
|
||||
;* memory size + 3Mb (to allow for the emulator, internal *
|
||||
;* data areas, etc.) *
|
||||
;* *
|
||||
;* * Set the termination address in the child process's PSP, *
|
||||
;* so control returns to the launcher when Medley terminates. *
|
||||
;* *
|
||||
;* * Jumps to the emulator's start address. *
|
||||
;* *
|
||||
;* * Upon return, just terminates cleanly. *
|
||||
;* *
|
||||
;* [We could perhaps do some diagnosis here of error returns?] *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;************************************************************************
|
||||
|
||||
;************************************************************************/
|
||||
;* */
|
||||
;* (C) Copyright 1993, 1994 Venue. All Rights Reserved. */
|
||||
;* Manufactured in the United States of America. */
|
||||
;* */
|
||||
;* The contents of this file are proprietary information */
|
||||
;* belonging to Venue, and are provided to you under license. */
|
||||
;* They may not be further distributed or disclosed to third */
|
||||
;* parties without the specific permission of Venue. */
|
||||
;* */
|
||||
;************************************************************************/
|
||||
|
||||
.model small
|
||||
.386p
|
||||
.stack 100h
|
||||
.data
|
||||
align 8
|
||||
;********************************************************
|
||||
;* Parameter block for INT 214B, that loads medley.exe *
|
||||
;********************************************************
|
||||
envseg DW 0 ; environment (0 = copy mine)
|
||||
cmdip DW ? ; command-line-tail pointer
|
||||
cmdcs DW ?
|
||||
fcb1 DD ? ; dummy first FCB to fill in
|
||||
fcb2 DD ? ; " 2nd FCB, not here in DOS 4.01???
|
||||
stk DD ? ; SS:SP for emul.exe, filled in by loader
|
||||
csip DD ? ; start addr for emul.exe, filled in by loader
|
||||
|
||||
|
||||
|
||||
retad DD FAR PTR myret ; cs:ip return address, to put in
|
||||
; child PSP, so we get control back.
|
||||
|
||||
|
||||
;* Error messages, misc strings, and work areas*
|
||||
align 8
|
||||
memval dd 0
|
||||
errstg DB 'ERROR: Couldn''t free excess storage.',13,10,'$'
|
||||
noload db 'ERROR: Loading emulator failed: $'
|
||||
loaded db 'LOAD SUCCESSFUL.',13,10,'$'
|
||||
nominfo db 'ERROR: -m must be followed by a number 8 - 64.',13,10,'$'
|
||||
badexe db 'ERROR: emul.exe is corrupted.',13,10,'$'
|
||||
emulpath DB 'emul.exe',0 ; name of the real emulator.
|
||||
mflag db '-m' ; to search for -m/-M in cmd line
|
||||
mmflag db '-M'
|
||||
profile db 'PRO' ; to find the DOS extender profile
|
||||
cmdline db 128 dup (?) ; hold the cmd line tail for real emulator
|
||||
|
||||
;* Error-message table for failures loading emul.exe
|
||||
align 2
|
||||
errtbl dw OFFSET ng0msg ; 0 = unknown failure
|
||||
dw OFFSET ng1msg ; 1 = "invalid function"
|
||||
dw OFFSET ng2msg ; 2 = file not found
|
||||
dw OFFSET ng3msg ; 3 = path not found
|
||||
dw OFFSET ng4msg ; 4 = too many open files
|
||||
dw OFFSET ng5msg ; 5 = access denied
|
||||
dw OFFSET ng0msg ; 6 = not possible error
|
||||
dw OFFSET ng0msg ; 7 = not possible error
|
||||
dw OFFSET ng8msg ; 8 = insufficient storage
|
||||
dw OFFSET ng0msg ; 9 = not possible
|
||||
dw OFFSET ngamsg ; A = bad environment
|
||||
dw OFFSET ngbmsg ; B = bad format (corrupt .exe?)a
|
||||
|
||||
ng0msg db 'Unknown problem',13,10,'$'
|
||||
ng1msg db 'Invalid Function',13,10
|
||||
db 'Make sure you are running DOS 4.0 or later.',13,10,'$'
|
||||
ng2msg db 'File not found.',13,10
|
||||
db 'CD to proper directory, or set PATH.',13,10,'$'
|
||||
ng3msg db 'Path not found.',13,10
|
||||
db 'CD to proper directory, or set PATH.',13,10,'$'
|
||||
ng4msg db 'Too many files open.',13,10
|
||||
db 'Shut down some TSRs that have file open?',13,10,'$'
|
||||
ng5msg db 'Access denied.',13,10
|
||||
db 'Make sure of your access rights to emul.exe?',13,10,'$'
|
||||
ng8msg db 'Not enough memory.',13,10
|
||||
db 'Shut down some TSR applications?',13,10,'$'
|
||||
ngamsg db 'Environment corrupt.',13,10
|
||||
db 'Check using SET; You may need to re-boot.',13,10,'$'
|
||||
ngbmsg db 'EXE file corrupted.',13,10,'$'
|
||||
db 'You may need to restore from backup or re-install.',13,10,'$'
|
||||
.code
|
||||
|
||||
|
||||
|
||||
;************************************************************************
|
||||
;* *
|
||||
;* M A C R O S *
|
||||
;* *
|
||||
;* prints Given a string ptr in DX, print it to the display. *
|
||||
;* *
|
||||
;* kill Exit cleanly, using INT 21/4C *
|
||||
;* *
|
||||
;************************************************************************
|
||||
|
||||
prints macro text
|
||||
mov dx, OFFSET text
|
||||
mov ah,9
|
||||
int 21h
|
||||
endm
|
||||
|
||||
kill macro
|
||||
mov ah,4ch
|
||||
int 21h
|
||||
endm
|
||||
|
||||
|
||||
|
||||
;************************************************************************
|
||||
;* *
|
||||
;* M A I N E N T R Y *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;* *
|
||||
;************************************************************************
|
||||
|
||||
PUBLIC main
|
||||
main PROC NEAR
|
||||
|
||||
mov ax,ds ; Save memory-block start for freeing
|
||||
mov es,ax ; excess memory in a bit.
|
||||
|
||||
mov ax,@data ; DS points to start of data segment
|
||||
mov ds,ax
|
||||
|
||||
mov cmdcs, ax ; Copy the command line for the emulator
|
||||
mov cmdip, OFFSET cmdline
|
||||
|
||||
mov di, OFFSET cmdline
|
||||
mov cx,128
|
||||
mov bx,es
|
||||
mov dx,ds
|
||||
mov es,dx
|
||||
mov ds,bx
|
||||
mov si,80h
|
||||
|
||||
rep
|
||||
movsb
|
||||
|
||||
mov es,bx ; Free the excess memory that DOS gives
|
||||
mov ds,dx ; us (we need it for the emulator)
|
||||
|
||||
mov ax,4a00h
|
||||
mov bx,090h ; We only need 900h bytes for this program
|
||||
int 21h
|
||||
jnc freeok
|
||||
|
||||
prints errstg ; Couldn't free spare space; punt.
|
||||
kill
|
||||
|
||||
;************************************************
|
||||
;* Search the command line for -m or -M *
|
||||
;************************************************
|
||||
freeok:
|
||||
mov di,81h ; start of command line tail
|
||||
mov si, OFFSET mflag
|
||||
mov cx, 2
|
||||
|
||||
mov bx,81h
|
||||
add bl,es:[80h]
|
||||
|
||||
m1lp: call strcmp
|
||||
je fndm
|
||||
|
||||
add di, 1
|
||||
cmp di, bx
|
||||
jl m1lp
|
||||
|
||||
mov di,81h ; start of command line tail
|
||||
mov si, OFFSET mmflag
|
||||
|
||||
m2lp: call strcmp
|
||||
je fndm
|
||||
|
||||
add di, 1
|
||||
cmp di, bx
|
||||
jl m2lp
|
||||
|
||||
mov memval,02400000h ; memory value not set--use 35MB total.
|
||||
jmp doload
|
||||
|
||||
fndm: add di,2 ; Found "-m". Now look for a number
|
||||
cmp di,bx ; (Make sure it's not end of line)
|
||||
jnl nogoodm
|
||||
|
||||
ok1:
|
||||
mov edx, 0 ; Holds the memory-requirement value
|
||||
mov ax,0 ; holds characters as we read
|
||||
|
||||
;************************************************
|
||||
;* Skip over spaces/tabs before any number *
|
||||
;************************************************
|
||||
skiplp:
|
||||
mov al, es:[di]
|
||||
inc di
|
||||
cmp al, 20h ; spaces
|
||||
je skiplp
|
||||
cmp al, 09h ; tabs
|
||||
je skiplp
|
||||
cmp di,bx ; make sure we're still in the string
|
||||
jle cnvst ; Yup, we've got the first char, so enter
|
||||
; the conversion loop part-way down.
|
||||
|
||||
nogoodm:
|
||||
prints nominfo ; no arg to -m, or it's bad; Punt.
|
||||
kill
|
||||
|
||||
;********************************************************
|
||||
; Convert the numeric argument to -m; result in edx. *
|
||||
;********************************************************
|
||||
cnvlp: mov al,es:[di]
|
||||
add di, 1
|
||||
cnvst: cmp al, 30h
|
||||
jl endcnv
|
||||
cmp al, 39h
|
||||
jg endcnv
|
||||
sub al, 30h
|
||||
imul dx, 10
|
||||
add dx, ax
|
||||
jmp cnvlp
|
||||
|
||||
endcnv:
|
||||
cmp edx,0 ; if still 0, no valid chars!
|
||||
je nogoodm
|
||||
cmp edx, 8 ; must be in the range [8, 32]
|
||||
jl nogoodm
|
||||
cmp edx,64
|
||||
jg nogoodm
|
||||
|
||||
add edx, 3 ; add 3mb for data areas, etc, and
|
||||
sal edx, 20 ; convert to megabytes
|
||||
mov memval, edx ; save memory requested
|
||||
|
||||
;************************************************
|
||||
;* Load the real emulator .EXE file, emul.exe *
|
||||
;************************************************
|
||||
doload: mov dx, OFFSET emulpath
|
||||
mov ax, seg envseg
|
||||
mov es, ax
|
||||
mov bx, OFFSET envseg
|
||||
mov ax,4b01h ; load-don't-start
|
||||
int 21h
|
||||
jnc loadok
|
||||
|
||||
add ax,ax
|
||||
mov si,ax
|
||||
prints noload
|
||||
mov bx,OFFSET errtbl
|
||||
mov dx,ds:[bx+si]
|
||||
mov ah,9
|
||||
int 21h
|
||||
kill
|
||||
|
||||
loadok: ; Load succeeded.
|
||||
mov ah,51h ; get PSP address for child
|
||||
int 21h
|
||||
mov es, bx ; get segment for DI addressing
|
||||
|
||||
; mov cx,128 ; copy the command line tail
|
||||
; mov di,80h ; (which appears to be flaky in DOS 4)
|
||||
; mov si, offset cmdline
|
||||
; rep
|
||||
; movsb
|
||||
|
||||
mov eax,retad
|
||||
mov dword ptr es:[+0ah], eax ; set up return address.
|
||||
|
||||
cmp memval, 0 ; If no -m value given, just
|
||||
je dorun ; go start the emulator.
|
||||
|
||||
mov di,0 ; Search for the Intel Extender's PROFILE
|
||||
mov si, OFFSET profile ; (see extender.h)
|
||||
mov cx, 3 ; (length is 3 bytes)
|
||||
|
||||
srchlp: call strcmp
|
||||
je gotprof ; found the profile; fix it.
|
||||
add di, 1
|
||||
cmp di, 2048
|
||||
jle srchlp
|
||||
|
||||
prints badexe ; No extender profile, so the emulator
|
||||
kill ; EXE must be corrupt. Punt.
|
||||
|
||||
gotprof:
|
||||
mov eax,memval ; Fill in the memory requirement.
|
||||
mov es:[di+1bch], eax
|
||||
|
||||
;********************************************************
|
||||
;* *
|
||||
;* Set up the stack seg/pointer & start medley. *
|
||||
;* *
|
||||
;********************************************************
|
||||
dorun: lss sp,stk ; load stack SS & SP regs
|
||||
mov ax, es ; copy PSP ptr to ax & ds, since some
|
||||
mov bx, ds ; code expects it in both places.
|
||||
mov fs,bx ; Also, copy DS to FS, so we still have
|
||||
mov ds,ax ; a base for the indirect jump . . .
|
||||
jmp fs:[csip] ; to start-of-medley.
|
||||
|
||||
myret: kill ; we get back here, so quit gracefully.
|
||||
|
||||
main endp
|
||||
|
||||
|
||||
|
||||
;************************************************************************/
|
||||
;* */
|
||||
;* s t r c m p */
|
||||
;* */
|
||||
;* Compare [ds]di and es:[si] for (CX) characters. If the */
|
||||
;* strings are equal, the Zero flag is set when this returns. */
|
||||
;* */
|
||||
;* All registers are preserved. */
|
||||
;* */
|
||||
;************************************************************************/
|
||||
|
||||
strcmp proc near
|
||||
cld
|
||||
push di
|
||||
push si
|
||||
push cx
|
||||
|
||||
repe
|
||||
cmpsb
|
||||
|
||||
pop cx
|
||||
pop si
|
||||
pop di
|
||||
ret
|
||||
strcmp endp
|
||||
|
||||
END
|
||||
|
||||
3026
src/lpkit.c
3026
src/lpkit.c
File diff suppressed because it is too large
Load Diff
1318
src/lplexyy.c
1318
src/lplexyy.c
File diff suppressed because it is too large
Load Diff
1298
src/lpytab.c
1298
src/lpytab.c
File diff suppressed because it is too large
Load Diff
250
src/mouseif.c
250
src/mouseif.c
@ -1,125 +1,125 @@
|
||||
/* $Id: mouseif.c,v 1.2 1999/01/03 02:07:26 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
|
||||
*/
|
||||
static char *id = "$Id: mouseif.c,v 1.2 1999/01/03 02:07:26 sybalsky Exp $ Copyright (C) Venue";
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* (C) Copyright 1989, 1990, 1990, 1991, 1992, 1993, 1994, 1995 Venue. */
|
||||
/* All Rights Reserved. */
|
||||
/* Manufactured in the United States of America. */
|
||||
/* */
|
||||
/* The contents of this file are proprietary information */
|
||||
/* belonging to Venue, and are provided to you under license. */
|
||||
/* They may not be further distributed or disclosed to third */
|
||||
/* parties without the specific permission of Venue. */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/* * * * D O S M O U S E I N T E R F A C E * * * */
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include "lispemul.h"
|
||||
#include "dbprint.h"
|
||||
#include "devif.h"
|
||||
|
||||
MouseInterfaceRec _curmouse;
|
||||
MouseInterface currentmouse = &_curmouse;
|
||||
|
||||
#ifdef DOS
|
||||
#include <dos.h>
|
||||
|
||||
int nomouseflag = FALSE;
|
||||
extern DLword *Lisp_world;
|
||||
extern LispPTR *LASTUSERACTION68k;
|
||||
extern int twobuttonflag;
|
||||
|
||||
extern void EnterDosMouse();
|
||||
extern void ExitDosMouse();
|
||||
extern void DosMouseAfterRaid();
|
||||
extern void DosMouseBeforeRaid();
|
||||
extern unsigned long GenericReturnT();
|
||||
extern void ThreeButtonHandler();
|
||||
extern void TwoButtonHandler();
|
||||
#endif /* DOS */
|
||||
|
||||
/*****************************************************************/
|
||||
/* p r o b e m o u s e */
|
||||
/* */
|
||||
/* Probe for mouse and return the number of buttons available. */
|
||||
/*****************************************************************/
|
||||
int probemouse() {
|
||||
union REGS regs;
|
||||
char c;
|
||||
/***************************************************************************
|
||||
* Reset mouse driver, exit if no mouse driver present
|
||||
***************************************************************************/
|
||||
/* int 33h, case 0000, ax = drive installed, bx = # of buttons. */
|
||||
if (nomouseflag) {
|
||||
return (666); /* return something, why not 666? */
|
||||
} else {
|
||||
regs.w.eax = 0; /* Func 0 = Reset mouse, ret. button info */
|
||||
int86(0x33, ®s, ®s);
|
||||
|
||||
if (regs.x.ax == 0x0000) VESA_errorexit("No mouse driver found.", -1);
|
||||
return (regs.x.bx);
|
||||
}
|
||||
}
|
||||
|
||||
void make_mouse_instance(MouseInterface mouse)
|
||||
{
|
||||
#ifdef DOS
|
||||
|
||||
int NumberOfButtons;
|
||||
if (nomouseflag) {
|
||||
mouse->device.enter = &GenericReturnT;
|
||||
mouse->device.exit = &GenericReturnT;
|
||||
mouse->device.before_raid = &GenericReturnT;
|
||||
mouse->device.after_raid = &GenericReturnT;
|
||||
mouse->device.active = FALSE;
|
||||
NumberOfButtons = 3;
|
||||
} else {
|
||||
mouse->device.enter = &EnterDosMouse;
|
||||
mouse->device.exit = &ExitDosMouse;
|
||||
mouse->device.before_raid = &DosMouseBeforeRaid;
|
||||
mouse->device.after_raid = &DosMouseAfterRaid;
|
||||
mouse->device.active = FALSE;
|
||||
NumberOfButtons = probemouse();
|
||||
}
|
||||
mouse->Button.StartTime = 2;
|
||||
|
||||
mouse->Cursor.Last.width = 16;
|
||||
mouse->Cursor.Last.height = 16;
|
||||
|
||||
if (nomouseflag == FALSE) {
|
||||
if (twobuttonflag) { /* We force two button handling. */
|
||||
mouse->Handler = &TwoButtonHandler;
|
||||
mouse->Button.TwoButtonP = TRUE;
|
||||
} else /* Determine how many buttons we have. */
|
||||
switch (NumberOfButtons) {
|
||||
case 0x0000: /* Other than 2 buttons, assume three */
|
||||
mouse->Button.TwoButtonP = FALSE;
|
||||
mouse->Handler = &ThreeButtonHandler;
|
||||
break;
|
||||
case 0x0002: /* Two buttons. */
|
||||
mouse->Button.TwoButtonP = TRUE;
|
||||
mouse->Handler = &TwoButtonHandler;
|
||||
break;
|
||||
case 0x0003: /* Three buttons. */
|
||||
mouse->Button.TwoButtonP = FALSE;
|
||||
mouse->Handler = &ThreeButtonHandler;
|
||||
break;
|
||||
case 0xffff: /* Two buttons. */
|
||||
mouse->Button.TwoButtonP = TRUE;
|
||||
mouse->Handler = &TwoButtonHandler;
|
||||
break;
|
||||
default: /* Strange case, assume three. */
|
||||
mouse->Button.TwoButtonP = FALSE;
|
||||
mouse->Handler = &ThreeButtonHandler;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* mouse->timestamp = ((*LASTUSERACTION68k& 0xffffff) + Lisp_world); */
|
||||
#elif XWINDOW
|
||||
#endif /* DOS or XWINDOW */
|
||||
}
|
||||
/* $Id: mouseif.c,v 1.2 1999/01/03 02:07:26 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
|
||||
*/
|
||||
static char *id = "$Id: mouseif.c,v 1.2 1999/01/03 02:07:26 sybalsky Exp $ Copyright (C) Venue";
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* (C) Copyright 1989, 1990, 1990, 1991, 1992, 1993, 1994, 1995 Venue. */
|
||||
/* All Rights Reserved. */
|
||||
/* Manufactured in the United States of America. */
|
||||
/* */
|
||||
/* The contents of this file are proprietary information */
|
||||
/* belonging to Venue, and are provided to you under license. */
|
||||
/* They may not be further distributed or disclosed to third */
|
||||
/* parties without the specific permission of Venue. */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/* * * * D O S M O U S E I N T E R F A C E * * * */
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include "lispemul.h"
|
||||
#include "dbprint.h"
|
||||
#include "devif.h"
|
||||
|
||||
MouseInterfaceRec _curmouse;
|
||||
MouseInterface currentmouse = &_curmouse;
|
||||
|
||||
#ifdef DOS
|
||||
#include <dos.h>
|
||||
|
||||
int nomouseflag = FALSE;
|
||||
extern DLword *Lisp_world;
|
||||
extern LispPTR *LASTUSERACTION68k;
|
||||
extern int twobuttonflag;
|
||||
|
||||
extern void EnterDosMouse();
|
||||
extern void ExitDosMouse();
|
||||
extern void DosMouseAfterRaid();
|
||||
extern void DosMouseBeforeRaid();
|
||||
extern unsigned long GenericReturnT();
|
||||
extern void ThreeButtonHandler();
|
||||
extern void TwoButtonHandler();
|
||||
#endif /* DOS */
|
||||
|
||||
/*****************************************************************/
|
||||
/* p r o b e m o u s e */
|
||||
/* */
|
||||
/* Probe for mouse and return the number of buttons available. */
|
||||
/*****************************************************************/
|
||||
int probemouse() {
|
||||
union REGS regs;
|
||||
char c;
|
||||
/***************************************************************************
|
||||
* Reset mouse driver, exit if no mouse driver present
|
||||
***************************************************************************/
|
||||
/* int 33h, case 0000, ax = drive installed, bx = # of buttons. */
|
||||
if (nomouseflag) {
|
||||
return (666); /* return something, why not 666? */
|
||||
} else {
|
||||
regs.w.eax = 0; /* Func 0 = Reset mouse, ret. button info */
|
||||
int86(0x33, ®s, ®s);
|
||||
|
||||
if (regs.x.ax == 0x0000) VESA_errorexit("No mouse driver found.", -1);
|
||||
return (regs.x.bx);
|
||||
}
|
||||
}
|
||||
|
||||
void make_mouse_instance(MouseInterface mouse)
|
||||
{
|
||||
#ifdef DOS
|
||||
|
||||
int NumberOfButtons;
|
||||
if (nomouseflag) {
|
||||
mouse->device.enter = &GenericReturnT;
|
||||
mouse->device.exit = &GenericReturnT;
|
||||
mouse->device.before_raid = &GenericReturnT;
|
||||
mouse->device.after_raid = &GenericReturnT;
|
||||
mouse->device.active = FALSE;
|
||||
NumberOfButtons = 3;
|
||||
} else {
|
||||
mouse->device.enter = &EnterDosMouse;
|
||||
mouse->device.exit = &ExitDosMouse;
|
||||
mouse->device.before_raid = &DosMouseBeforeRaid;
|
||||
mouse->device.after_raid = &DosMouseAfterRaid;
|
||||
mouse->device.active = FALSE;
|
||||
NumberOfButtons = probemouse();
|
||||
}
|
||||
mouse->Button.StartTime = 2;
|
||||
|
||||
mouse->Cursor.Last.width = 16;
|
||||
mouse->Cursor.Last.height = 16;
|
||||
|
||||
if (nomouseflag == FALSE) {
|
||||
if (twobuttonflag) { /* We force two button handling. */
|
||||
mouse->Handler = &TwoButtonHandler;
|
||||
mouse->Button.TwoButtonP = TRUE;
|
||||
} else /* Determine how many buttons we have. */
|
||||
switch (NumberOfButtons) {
|
||||
case 0x0000: /* Other than 2 buttons, assume three */
|
||||
mouse->Button.TwoButtonP = FALSE;
|
||||
mouse->Handler = &ThreeButtonHandler;
|
||||
break;
|
||||
case 0x0002: /* Two buttons. */
|
||||
mouse->Button.TwoButtonP = TRUE;
|
||||
mouse->Handler = &TwoButtonHandler;
|
||||
break;
|
||||
case 0x0003: /* Three buttons. */
|
||||
mouse->Button.TwoButtonP = FALSE;
|
||||
mouse->Handler = &ThreeButtonHandler;
|
||||
break;
|
||||
case 0xffff: /* Two buttons. */
|
||||
mouse->Button.TwoButtonP = TRUE;
|
||||
mouse->Handler = &TwoButtonHandler;
|
||||
break;
|
||||
default: /* Strange case, assume three. */
|
||||
mouse->Button.TwoButtonP = FALSE;
|
||||
mouse->Handler = &ThreeButtonHandler;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* mouse->timestamp = ((*LASTUSERACTION68k& 0xffffff) + Lisp_world); */
|
||||
#elif XWINDOW
|
||||
#endif /* DOS or XWINDOW */
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user