Commit 1b94449f authored by Richard M. Stallman's avatar Richard M. Stallman

Initial revision

parent 54ad07d3
/* MS-DOS specific Lisp utilities. Coded by Manabu Higashida, 1991.
Major changes May-July 1993 Morten Welinder (only 10% original code left)
Copyright (C) 1991, 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "config.h"
#ifdef MSDOS
/* The entire file is within this conditional */
#include <stdio.h>
#include <dos.h>
#include "lisp.h"
#include "buffer.h"
#include "termchar.h"
#include "termhooks.h"
#include "frame.h"
#include "dosfns.h"
#include "msdos.h"
static void
mode_resetsize ()
{
Fset_screen_width (ScreenCols (), Qnil);
Fset_screen_height (ScreenRows (), Qnil);
}
DEFUN ("mode25", Fmode25, Smode25, 0, 0, "",
"Set the number of rows to 25.")
()
{
union REGS regs;
if (have_mouse) Mouse_off ();
regs.x.ax = 3;
int86 (0x10, &regs, &regs);
regs.x.ax = 0x1101;
regs.h.bl = 0;
int86 (0x10, &regs, &regs);
regs.x.ax = 0x1200;
regs.h.bl = 32;
int86 (0x10, &regs, &regs);
regs.x.ax = 3;
int86 (0x10, &regs, &regs);
mode_resetsize ();
Frecenter (Qnil);
Fredraw_display ();
if (have_mouse) Mouse_init ();
}
DEFUN ("mode4350", Fmode4350, Smode4350, 0, 0, "",
"Set the number of rows to 43 (EGA) or 50 (VGA).")
()
{
union REGS regs;
if (have_mouse) Mouse_off ();
regs.x.ax = 3;
int86 (0x10, &regs, &regs);
regs.x.ax = 0x1112;
regs.h.bl = 0;
int86 (0x10, &regs, &regs);
regs.x.ax = 0x1200;
regs.h.bl = 32;
int86 (0x10, &regs, &regs);
regs.x.ax = 0x0100;
regs.x.cx = 7;
int86 (0x10, &regs, &regs);
mode_resetsize ();
Frecenter (Qnil);
Fredraw_display ();
if (have_mouse) Mouse_init ();
}
DEFUN ("int86", Fint86, Sint86, 2, 2, 0,
"Call specific MSDOS interrupt number INTERRUPT with REGISTERS.\n\
Return the updated REGISTER vector.\n\
\n\
INTERRUPT should be an integer in the range 0 to 255.\n\
REGISTERS should be a vector produced by `make-register' and\n\
`set-register-value'.")
(intno, regs)
Lisp_Object intno, regs;
{
register int i;
int no;
union REGS inregs, outregs;
Lisp_Object val;
CHECK_NUMBER (intno, 0);
no = (unsigned long) XINT (intno);
CHECK_VECTOR (regs, 1);
if (no < 0 || no > 0xff || XVECTOR (regs)-> size != 8)
return Qnil;
for (i = 0; i < 8; i++)
CHECK_NUMBER (XVECTOR (regs)->contents[i], 1);
inregs.x.ax = (unsigned long) XFASTINT (XVECTOR (regs)->contents[0]);
inregs.x.bx = (unsigned long) XFASTINT (XVECTOR (regs)->contents[1]);
inregs.x.cx = (unsigned long) XFASTINT (XVECTOR (regs)->contents[2]);
inregs.x.dx = (unsigned long) XFASTINT (XVECTOR (regs)->contents[3]);
inregs.x.si = (unsigned long) XFASTINT (XVECTOR (regs)->contents[4]);
inregs.x.di = (unsigned long) XFASTINT (XVECTOR (regs)->contents[5]);
inregs.x.cflag = (unsigned long) XFASTINT (XVECTOR (regs)->contents[6]);
inregs.x.flags = (unsigned long) XFASTINT (XVECTOR (regs)->contents[7]);
int86 (no, &inregs, &outregs);
XVECTOR (regs)->contents[0] = make_number (outregs.x.ax);
XVECTOR (regs)->contents[1] = make_number (outregs.x.bx);
XVECTOR (regs)->contents[2] = make_number (outregs.x.cx);
XVECTOR (regs)->contents[3] = make_number (outregs.x.dx);
XVECTOR (regs)->contents[4] = make_number (outregs.x.si);
XVECTOR (regs)->contents[5] = make_number (outregs.x.di);
XVECTOR (regs)->contents[6] = make_number (outregs.x.cflag);
XVECTOR (regs)->contents[7] = make_number (outregs.x.flags);
return regs;
}
int dos_country_code;
int dos_codepage;
Lisp_Object Vdos_version;
void
init_dosfns ()
{
union REGS regs;
_go32_dpmi_seginfo info;
_go32_dpmi_registers dpmiregs;
get_lim_data (); /* why the hell isn't this called elsewhere? */
regs.x.ax = 0x3000;
intdos (&regs, &regs);
Vdos_version = Fcons (make_number (regs.h.al), make_number (regs.h.ah));
/* Obtain the country code by calling Dos via Dpmi. Don't rely on GO32. */
info.size = (34 + 15) / 16;
if (_go32_dpmi_allocate_dos_memory (&info))
dos_country_code = 1;
else
{
dpmiregs.x.ax = 0x3800;
dpmiregs.x.ds = info.rm_segment;
dpmiregs.x.dx = 0;
dpmiregs.x.ss = dpmiregs.x.sp = 0;
_go32_dpmi_simulate_int (0x21, &dpmiregs);
dos_country_code = dpmiregs.x.bx;
_go32_dpmi_free_dos_memory (&info);
}
regs.x.ax = 0x6601;
intdos (&regs, &regs);
if (regs.x.cflag)
/* Estimate code page from country code */
switch (dos_country_code)
{
case 45: /* Denmark */
case 47: /* Norway */
dos_codepage = 865;
break;
default:
/* US */
dos_codepage = 437;
}
else
dos_codepage = regs.x.bx & 0xffff;
}
/*
* Define everything
*/
syms_of_dosfns ()
{
defsubr (&Smode25);
defsubr (&Smode4350);
defsubr (&Sint86);
DEFVAR_INT ("dos-country-code", &dos_country_code,
"The country code returned by Dos when Emacs was started.\n\
Usually this is the international telephone prefix.");
DEFVAR_INT ("dos-codepage", &dos_codepage,
"The codepage active when Emacs was started.\n\
The following are known:
437 US
850 Multilingual
852 Slavic/Latin II
857 Turkish
860 Portugal
861 Iceland
863 Canada (French)
865 Norway/Denmark");
DEFVAR_LISP ("dos-version", &Vdos_version,
"The (MAJOR . MINOR) Dos version (subject to modification with setver).");
}
#endif /* MSDOS */
/* MS-DOS specific Lisp utilities interface.
Coded by Manabu Higashida, 1991.
Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern int dos_country_code;
extern int dos_codepage;
extern Lisp_Object Vdos_version;
/* Machine description file for MS-DOS
Copyright (C) 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Note: lots of stuff here was taken from m-dos386.h in demacs. */
/* The following three symbols give information on
the size of various data types. */
#define SHORTBITS 16 /* Number of bits in a short */
#define INTBITS 32 /* Number of bits in an int */
#define LONGBITS 32 /* Number of bits in a long */
/* Define BIG_ENDIAN iff lowest-numbered byte in a word
is the most significant byte. */
/* #define BIG_ENDIAN */
/* Define NO_ARG_ARRAY if you cannot take the address of the first of a
* group of arguments and treat it as an array of the arguments. */
/* #define NO_ARG_ARRAY */
/* Define WORD_MACHINE if addresses and such have
* to be corrected before they can be used as byte counts. */
/* #define WORD_MACHINE */
/* Define how to take a char and sign-extend into an int.
On machines where char is signed, this is a no-op. */
#define SIGN_EXTEND_CHAR(c) (c)
/* Now define a symbol for the cpu type, if your compiler
does not define it automatically:
Ones defined so far include vax, m68000, ns16000, pyramid,
orion, tahoe, APOLLO and many others */
#define INTEL386
/* Use type int rather than a union, to represent Lisp_Object */
/* This is desirable for most machines. */
#define NO_UNION_TYPE
/* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend
the 24-bit bit field into an int. In other words, if bit fields
are always unsigned.
If you use NO_UNION_TYPE, this flag does not matter. */
#define EXPLICIT_SIGN_EXTEND
/* Data type of load average, as read out of kmem. */
/* #define LOAD_AVE_TYPE long */
/* Convert that into an integer that is 100 for a load average of 1.0 */
/* #define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100.0 / FSCALE) */
/* Define CANNOT_DUMP on machines where unexec does not work.
Then the function dump-emacs will not be defined
and temacs will do (load "loadup") automatically unless told otherwise. */
/* #define CANNOT_DUMP */
/* Define VIRT_ADDR_VARIES if the virtual addresses of
pure and impure space as loaded can vary, and even their
relative order cannot be relied on.
Otherwise Emacs assumes that text space precedes data space,
numerically. */
/* #define VIRT_ADDR_VARIES */
/* Define C_ALLOCA if this machine does not support a true alloca
and the one written in C should be used instead.
Define HAVE_ALLOCA to say that the system provides a properly
working alloca function and it should be used.
Define neither one if an assembler-language alloca
in the file alloca.s should be used. */
#define HAVE_ALLOCA
#define alloca(x) __builtin_alloca(x)
/* Define NO_REMAP if memory segmentation makes it not work well
to change the boundary between the text section and data section
when Emacs is dumped. If you define this, the preloaded Lisp
code will not be sharable; but that's better than failing completely. */
#define NO_REMAP
/* We need a little extra space, see ../../lisp/loadup.el */
#define PURESIZE 210000
This diff is collapsed.
/* MS-DOS specific C utilities, interface.
Copyright (C) 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <time.h>
#include <dpmi.h>
int dos_ttraw ();
int dos_ttcooked ();
int getdefdir (int, char*);
void unixtodos_filename (char *);
void dostounix_filename (char *);
void sleep_or_kbd_hit (int, int);
void init_environment ();
void internal_terminal_init ();
#ifndef _stdio_h_
int internal_flush (FILE *);
#endif
void ctrl_break_func (_go32_dpmi_registers *);
void install_ctrl_break_check ();
extern int have_mouse;
int mouse_init1 ();
void mouse_init ();
void mouse_on ();
void mouse_off ();
void mouse_moveto (int, int);
void mouse_check_moved ();
int mouse_pressed (int, int *, int *);
int mouse_released (int, int *, int *);
/* System description file for MS-DOS
Copyright (C) 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Note: lots of stuff here was taken from s-msdos.h in demacs. */
/*
* Define symbols to identify the version of Unix this is.
* Define all the symbols that apply correctly.
*/
/* #define UNIPLUS */
/* #define USG5 */
/* #define USG */
/* #define HPUX */
/* #define UMAX */
/* #define BSD4_1 */
/* #define BSD4_2 */
/* #define BSD4_3 */
/* #define BSD */
/* #define VMS */
#ifndef MSDOS
#define MSDOS
#endif
#undef BSD
#undef VMS
/* SYSTEM_TYPE should indicate the kind of system you are using.
It sets the Lisp variable system-type. */
#define SYSTEM_TYPE "ms-dos"
#define SYMS_SYSTEM syms_of_dosfns()
/* NOMULTIPLEJOBS should be defined if your system's shell
does not have "job control" (the ability to stop a program,
run some other program, then continue the first one). */
#define NOMULTIPLEJOBS
/* Emacs can read input using SIGIO and buffering characters itself,
or using CBREAK mode and making C-g cause SIGINT.
The choice is controlled by the variable interrupt_input.
Define INTERRUPT_INPUT to make interrupt_input = 1 the default (use SIGIO)
SIGIO can be used only on systems that implement it (4.2 and 4.3).
CBREAK mode has two disadvatages
1) At least in 4.2, it is impossible to handle the Meta key properly.
I hear that in system V this problem does not exist.
2) Control-G causes output to be discarded.
I do not know whether this can be fixed in system V.
Another method of doing input is planned but not implemented.
It would have Emacs fork off a separate process
to read the input and send it to the true Emacs process
through a pipe.
*/
/* #define INTERRUPT_INPUT */
/* Letter to use in finding device name of first pty,
if system supports pty's. 'a' means it is /dev/ptya0 */
/* #define FIRST_PTY_LETTER 'a' */
/*
* Define HAVE_TIMEVAL if the system supports the BSD style clock values.
* Look in <sys/time.h> for a timeval structure.
*/
#define HAVE_TIMEVAL
/*
* Define HAVE_SELECT if the system supports the `select' system call.
*/
/* #define HAVE_SELECT */
/*
* Define HAVE_PTYS if the system supports pty devices.
*/
/* #define HAVE_PTYS */
/*
* Define NONSYSTEM_DIR_LIBRARY to make Emacs emulate
* The 4.2 opendir, etc., library functions.
*/
/* #define NONSYSTEM_DIR_LIBRARY */
#define SYSV_SYSTEM_DIR
/* Define this symbol if your system has the functions bcopy, etc. */
#define BSTRING
/* subprocesses should be defined if you want to
have code for asynchronous subprocesses
(as used in M-x compile and M-x shell).
This is generally OS dependent, and not supported
under most USG systems. */
#undef subprocesses
/* If your system uses COFF (Common Object File Format) then define the
preprocessor symbol "COFF". */
#define COFF
/* define MAIL_USE_FLOCK if the mailer uses flock
to interlock access to /usr/spool/mail/$USER.
The alternative is that a lock file named
/usr/spool/mail/$USER.lock. */
/* #define MAIL_USE_FLOCK */
/* Define CLASH_DETECTION if you want lock files to be written
so that Emacs can tell instantly when you try to modify
a file that someone else has modified in his Emacs. */
/* #define CLASH_DETECTION */
/* Here, on a separate page, add any special hacks needed
to make Emacs work on this system. For example,
you might define certain system call names that don't
exist on your system, or that do different things on
your system and must be used only through an encapsulation
(Which you should place, by convention, in sysdep.c). */
/* Some compilers tend to put everything declared static
into the initialized data area, which becomes pure after dumping Emacs.
On these systems, you must #define static as nothing to foil this.
Note that emacs carefully avoids static vars inside functions. */
/* #define static */
/* we use djgcc's malloc */
/* #define SYSTEM_MALLOC */
/* setjmp and longjmp can safely replace _setjmp and _longjmp,
but they will run slower. */
#define _setjmp setjmp
#define _longjmp longjmp
#define NO_MODE_T
/* we can use dj's getpagesize() */
#define HAVE_GETPAGESIZE
/* New chdir () routine. */
#ifdef chdir
#undef chdir
#endif
#define chdir sys_chdir
#define LIBS_SYSTEM -lpc
/* This somehow needs to be defined even though we use COFF. */
#define TEXT_START -1
#define ORDINARY_LINK
/* command.com does not under stand `...` so we define this. */
#define LIB_GCC -Lgcc
#define DONT_NEED_ENVIRON
#define SEPCHAR ';'
#define NULL_DEVICE "nul"
#define EXEC_SUFFIXES ".exe:.com:.bat:"
#define O_RDONLY 0x0001
#define O_WRONLY 0x0002
#define O_RDWR 0x0004
#define O_CREAT 0x0100
#define O_TRUNC 0x0200
#define O_EXCL 0x0400
#define O_APPEND 0x0800
#define O_TEXT 0x4000
#define O_BINARY 0x8000
#define HAVE_INVERSE_HYPERBOLIC
#define FLOAT_CHECK_DOMAIN
/* When $TERM is "internal" then this is substituted: */
#define INTERNAL_TERMINAL "pc|bios|IBM PC with colour display:\
:co#80:li#25:km:\
:cm=\E@%.%.:\
:do=^J:le=^H:up=\EU:ri=\ER:\
:ti=\EA\027:te=\EA\007\EE:\
:so=\EA\077:se=\EA\027:\
:ms:mb=\EX\200:md=\EX\010:mk=\EA\161:me=\EA\027:\
:cl=\EC:ce=\EE:\
:vb=\EB\140:bl=:"
#define fflush internal_flush
/* Define this to a function (Fdowncase, Fupcase) if your file system
likes that */
#define FILE_SYSTEM_CASE Fdowncase
/* MSDOS doesn't really have this function. */
#define getppid() 1
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment