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"
37 DEFUN ("mode25", Fmode25
, Smode25
, 0, 0, "", "\
38 Changes the number of rows to 25.")
44 if (!inhibit_window_system
)
47 if (have_mouse
) mouse_off ();
49 int86 (0x10, ®s
, ®s
);
52 int86 (0x10, ®s
, ®s
);
55 int86 (0x10, ®s
, ®s
);
57 int86 (0x10, ®s
, ®s
);
58 Fset_frame_size (Fselected_frame (), ScreenCols (), ScreenRows ());
61 if (have_mouse
) mouse_init ();
65 DEFUN ("mode4350", Fmode4350
, Smode4350
, 0, 0, "", "\
66 Changes the number of rows to 43 (EGA) or 50 (VGA).")
72 if (!inhibit_window_system
)
75 if (have_mouse
) mouse_off ();
77 int86 (0x10, ®s
, ®s
);
80 int86 (0x10, ®s
, ®s
);
83 int86 (0x10, ®s
, ®s
);
86 int86 (0x10, ®s
, ®s
);
87 Fset_frame_size (Fselected_frame (), ScreenCols (), ScreenRows ());
90 if (have_mouse
) mouse_init ();
94 DEFUN ("int86", Fint86
, Sint86
, 2, 2, 0,
95 "Call specific MSDOS interrupt number INTERRUPT with REGISTERS.\n\
96 Return the updated REGISTER vector.\n\
98 INTERRUPT should be an integer in the range 0 to 255.\n\
99 REGISTERS should be a vector produced by `make-register' and\n\
100 `set-register-value'.")
102 Lisp_Object intno
, regs
;
106 union REGS inregs
, outregs
;
109 CHECK_NUMBER (intno
, 0);
110 no
= (unsigned long) XINT (intno
);
111 CHECK_VECTOR (regs
, 1);
112 if (no
< 0 || no
> 0xff || XVECTOR (regs
)-> size
!= 8)
114 for (i
= 0; i
< 8; i
++)
115 CHECK_NUMBER (XVECTOR (regs
)->contents
[i
], 1);
117 inregs
.x
.ax
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[0]);
118 inregs
.x
.bx
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[1]);
119 inregs
.x
.cx
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[2]);
120 inregs
.x
.dx
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[3]);
121 inregs
.x
.si
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[4]);
122 inregs
.x
.di
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[5]);
123 inregs
.x
.cflag
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[6]);
124 inregs
.x
.flags
= (unsigned long) XFASTINT (XVECTOR (regs
)->contents
[7]);
126 int86 (no
, &inregs
, &outregs
);
128 XVECTOR (regs
)->contents
[0] = make_number (outregs
.x
.ax
);
129 XVECTOR (regs
)->contents
[1] = make_number (outregs
.x
.bx
);
130 XVECTOR (regs
)->contents
[2] = make_number (outregs
.x
.cx
);
131 XVECTOR (regs
)->contents
[3] = make_number (outregs
.x
.dx
);
132 XVECTOR (regs
)->contents
[4] = make_number (outregs
.x
.si
);
133 XVECTOR (regs
)->contents
[5] = make_number (outregs
.x
.di
);
134 XVECTOR (regs
)->contents
[6] = make_number (outregs
.x
.cflag
);
135 XVECTOR (regs
)->contents
[7] = make_number (outregs
.x
.flags
);
140 int dos_country_code
;
142 Lisp_Object Vdos_version
;
148 _go32_dpmi_seginfo info
;
149 _go32_dpmi_registers dpmiregs
;
151 get_lim_data (); /* why the hell isn't this called elsewhere? */
154 intdos (®s
, ®s
);
155 Vdos_version
= Fcons (make_number (regs
.h
.al
), make_number (regs
.h
.ah
));
157 /* Obtain the country code by calling Dos via Dpmi. Don't rely on GO32. */
158 info
.size
= (34 + 15) / 16;
159 if (_go32_dpmi_allocate_dos_memory (&info
))
160 dos_country_code
= 1;
163 dpmiregs
.x
.ax
= 0x3800;
164 dpmiregs
.x
.ds
= info
.rm_segment
;
166 dpmiregs
.x
.ss
= dpmiregs
.x
.sp
= 0;
167 _go32_dpmi_simulate_int (0x21, &dpmiregs
);
168 dos_country_code
= dpmiregs
.x
.bx
;
169 _go32_dpmi_free_dos_memory (&info
);
173 intdos (®s
, ®s
);
175 /* Estimate code page from country code */
176 switch (dos_country_code
)
178 case 45: /* Denmark */
179 case 47: /* Norway */
187 dos_codepage
= regs
.x
.bx
& 0xffff;
196 defsubr (&Smode4350
);
199 DEFVAR_INT ("dos-country-code", &dos_country_code
,
200 "The country code returned by Dos when Emacs was started.\n\
201 Usually this is the international telephone prefix.");
203 DEFVAR_INT ("dos-codepage", &dos_codepage
,
204 "The codepage active when Emacs was started.\n\
205 The following are known:\n\
207 850 Multilingual (Latin I)\n\
208 852 Slavic (Latin II)\n\
212 863 Canada (French)\n\
213 865 Norway/Denmark");
215 DEFVAR_LISP ("dos-version", &Vdos_version
,
216 "The (MAJOR . MINOR) Dos version (subject to modification with setver).");