1 /* MS-DOS specific Lisp utilities. Coded by Manabu Higashida, 1991.
2 Major changes May-July 1993 Morten Welinder (only 10% original code left)
3 Copyright (C) 1991, 1993 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 1, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
25 /* The entire file is within this conditional */
32 #include "termhooks.h"
40 Fset_screen_width (ScreenCols (), Qnil
);
41 Fset_screen_height (ScreenRows (), Qnil
);
44 DEFUN ("mode25", Fmode25
, Smode25
, 0, 0, "",
45 "Set the number of rows to 25.")
50 if (have_mouse
) Mouse_off ();
52 int86 (0x10, ®s
, ®s
);
55 int86 (0x10, ®s
, ®s
);
58 int86 (0x10, ®s
, ®s
);
60 int86 (0x10, ®s
, ®s
);
64 if (have_mouse
) Mouse_init ();
67 DEFUN ("mode4350", Fmode4350
, Smode4350
, 0, 0, "",
68 "Set the number of rows to 43 (EGA) or 50 (VGA).")
73 if (have_mouse
) Mouse_off ();
75 int86 (0x10, ®s
, ®s
);
78 int86 (0x10, ®s
, ®s
);
81 int86 (0x10, ®s
, ®s
);
84 int86 (0x10, ®s
, ®s
);
88 if (have_mouse
) Mouse_init ();
91 DEFUN ("int86", Fint86
, Sint86
, 2, 2, 0,
92 "Call specific MSDOS interrupt number INTERRUPT with REGISTERS.\n\
93 Return the updated REGISTER vector.\n\
95 INTERRUPT should be an integer in the range 0 to 255.\n\
96 REGISTERS should be a vector produced by `make-register' and\n\
97 `set-register-value'.")
99 Lisp_Object intno
, regs
;
103 union REGS inregs
, outregs
;
106 CHECK_NUMBER (intno
, 0);
107 no
= (unsigned long) XINT (intno
);
108 CHECK_VECTOR (regs
, 1);
109 if (no
< 0 || no
> 0xff || XVECTOR (regs
)-> size
!= 8)
111 for (i
= 0; i
< 8; i
++)
112 CHECK_NUMBER (XVECTOR (regs
)->contents
[i
], 1);
114 inregs
.x
.ax
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[0]);
115 inregs
.x
.bx
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[1]);
116 inregs
.x
.cx
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[2]);
117 inregs
.x
.dx
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[3]);
118 inregs
.x
.si
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[4]);
119 inregs
.x
.di
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[5]);
120 inregs
.x
.cflag
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[6]);
121 inregs
.x
.flags
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[7]);
123 int86 (no
, &inregs
, &outregs
);
125 XVECTOR (regs
)->contents
[0] = make_number (outregs
.x
.ax
);
126 XVECTOR (regs
)->contents
[1] = make_number (outregs
.x
.bx
);
127 XVECTOR (regs
)->contents
[2] = make_number (outregs
.x
.cx
);
128 XVECTOR (regs
)->contents
[3] = make_number (outregs
.x
.dx
);
129 XVECTOR (regs
)->contents
[4] = make_number (outregs
.x
.si
);
130 XVECTOR (regs
)->contents
[5] = make_number (outregs
.x
.di
);
131 XVECTOR (regs
)->contents
[6] = make_number (outregs
.x
.cflag
);
132 XVECTOR (regs
)->contents
[7] = make_number (outregs
.x
.flags
);
137 int dos_country_code
;
139 Lisp_Object Vdos_version
;
145 _go32_dpmi_seginfo info
;
146 _go32_dpmi_registers dpmiregs
;
148 get_lim_data (); /* why the hell isn't this called elsewhere? */
151 intdos (®s
, ®s
);
152 Vdos_version
= Fcons (make_number (regs
.h
.al
), make_number (regs
.h
.ah
));
154 /* Obtain the country code by calling Dos via Dpmi. Don't rely on GO32. */
155 info
.size
= (34 + 15) / 16;
156 if (_go32_dpmi_allocate_dos_memory (&info
))
157 dos_country_code
= 1;
160 dpmiregs
.x
.ax
= 0x3800;
161 dpmiregs
.x
.ds
= info
.rm_segment
;
163 dpmiregs
.x
.ss
= dpmiregs
.x
.sp
= 0;
164 _go32_dpmi_simulate_int (0x21, &dpmiregs
);
165 dos_country_code
= dpmiregs
.x
.bx
;
166 _go32_dpmi_free_dos_memory (&info
);
170 intdos (®s
, ®s
);
172 /* Estimate code page from country code */
173 switch (dos_country_code
)
175 case 45: /* Denmark */
176 case 47: /* Norway */
184 dos_codepage
= regs
.x
.bx
& 0xffff;
193 defsubr (&Smode4350
);
196 DEFVAR_INT ("dos-country-code", &dos_country_code
,
197 "The country code returned by Dos when Emacs was started.\n\
198 Usually this is the international telephone prefix.");
200 DEFVAR_INT ("dos-codepage", &dos_codepage
,
201 "The codepage active when Emacs was started.\n\
202 The following are known:
210 865 Norway/Denmark");
212 DEFVAR_LISP ("dos-version", &Vdos_version
,
213 "The (MAJOR . MINOR) Dos version (subject to modification with setver).");