]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/doscmd/int2f.c
Enable the new libmp in the build, and disable libgmp and its
[FreeBSD/FreeBSD.git] / usr.bin / doscmd / int2f.c
1 /*
2  * Copyright (c) 1992, 1993, 1996
3  *      Berkeley Software Design, Inc.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Berkeley Software
16  *      Design, Inc.
17  *
18  * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  *      BSDI int2f.c,v 2.2 1996/04/08 19:32:53 bostic Exp
31  *
32  * $FreeBSD$
33  */
34
35 #include "doscmd.h"
36 #include "dispatch.h"
37 #include "tty.h"
38
39 /*
40 ** Multiplex interrupt.
41 **
42 ** subfunctions 0-0x7f reserved for DOS, some are implemented here.
43 **
44 */
45
46 /*
47 ** 2f:00 2f:01 2f:02 2f:03
48 **
49 ** Various PRINT.COM functions
50 */
51 static int
52 int2f_printer(regcontext_t *REGS)
53 {
54     debug (D_FILE_OPS, "Called printer function 0x%02x", R_AH);
55     R_AL = FUNC_NUM_IVALID;
56     return(0);
57 }
58
59 /*
60 ** 2f:12
61 **
62 ** DOS internal functions.  Only one we support is 0x2e, and then only to
63 ** complain about it.
64 */
65 static int
66 int2f_dosinternal(regcontext_t *REGS)
67 {
68     switch (R_AL) {
69     case 0x2e:          /* XXX - GET/SET ERROR TABLE ADDRESSES */
70         switch (R_DL) {
71         case 0x00:
72         case 0x02:
73         case 0x04:
74         case 0x06:
75             debug(D_ALWAYS,"DOS program attempted to get internal error table.\n");
76             break;
77             
78         case 0x01:
79         case 0x03:
80         case 0x05:
81         case 0x07:
82         case 0x09:
83             debug(D_ALWAYS,"DOS program attempted to set error table.\n");
84             break;
85         }       
86         
87     default:
88         unknown_int4(0x2f, 0x12, R_AL, R_DL, REGS);
89         break;
90     }
91     R_AL = FUNC_NUM_IVALID;
92     return(0);
93 }
94
95 /*
96 ** 2f:16
97 **
98 ** Windows Enhanced Mode functions.  Aigh!
99 */
100 static int
101 int2f_windows(regcontext_t *REGS)
102 {
103     switch (R_AL) {
104     case 0x00:
105         R_AL = 0x00;                    /* Neither Win 3.x nor 2.x running */
106         return(0);
107
108     case 0x80:                          /* installation check */
109         tty_pause();
110         R_AL = 0x00;
111         return(0);
112
113     default:
114         unknown_int3(0x2f, 0x16, R_AL, REGS);
115         break;
116     }
117     R_AL = FUNC_NUM_IVALID;
118     return(0);
119 }
120
121 /*
122 ** 2f:43
123 **
124 ** XMS interface
125 */
126 static int
127 int2f_xms(regcontext_t *REGS)
128 {
129     switch(R_AL) {
130     case 0:                     /* installation check */
131         return(0);              /* %al = 0 */
132     default:
133         R_AL = FUNC_NUM_IVALID;
134         return(0);
135     }
136 }
137         
138
139 static struct intfunc_table int2f_table[] = {
140
141     { 0x00,     IFT_NOSUBFUNC,  int2f_printer,          "printer"},
142     { 0x01,     IFT_NOSUBFUNC,  int2f_printer,          "printer"},
143     { 0x02,     IFT_NOSUBFUNC,  int2f_printer,          "printer"},
144     { 0x03,     IFT_NOSUBFUNC,  int2f_printer,          "printer"},
145     { 0x12,     IFT_NOSUBFUNC,  int2f_dosinternal,      "DOS internal function"},
146     { 0x16,     IFT_NOSUBFUNC,  int2f_windows,          "Windows detect"},
147     { 0x43,     IFT_NOSUBFUNC,  int2f_xms,              "XMS"},
148     { -1,       0,              NULL,                   NULL}
149 };
150
151 /*
152 ** int2f (multiplex) handler.
153 **
154 ** Note that due to the widely varied and inconsistent conventions, handlers
155 ** called from here are expected to manage their own return values.
156 */
157 void
158 int2f(regcontext_t *REGS)
159 {
160     int         idx;
161    
162     /* look up the handler for the current function */
163     idx = intfunc_search(int2f_table, R_AH, R_AL);
164
165     if (idx >= 0) {             /* respond on multiplex chain */
166         int2f_table[idx].handler(REGS);
167     } else {
168         unknown_int2(0x2f, R_AH, REGS);
169     }
170 }
171
172
173