Initial import from FreeBSD RELENG_4:
[games.git] / usr.bin / doscmd / register.h
1 /*
2 ** Copyright (c) 1996
3 **      Michael Smith.  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 **
14 ** THIS SOFTWARE IS PROVIDED BY Michael Smith ``AS IS'' AND
15 ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ** ARE DISCLAIMED.  IN NO EVENT SHALL Michael Smith BE LIABLE
18 ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 ** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 ** SUCH DAMAGE.
25 **
26 ** $FreeBSD: src/usr.bin/doscmd/register.h,v 1.4 1999/10/08 09:02:38 marcel Exp $
27 */
28
29 /******************************************************************************
30 ** Abstractions to hide register access methods across different platforms.
31 **
32 */
33
34 #ifndef _MACHINE_VM86_H_
35
36 /* standard register representation */
37 typedef union 
38 {
39     u_long      r_ex;
40     struct 
41     {
42         u_short r_x;
43         u_short :16;
44     } r_w;
45     struct
46     {
47         u_char  r_l;
48         u_char  r_h;
49         u_short :16;
50     } r_b;
51 } reg86_t;
52
53 #endif
54
55 #ifdef __FreeBSD__
56
57 /* layout must match definition of struct sigcontext in <machine/signal.h> */
58
59 typedef struct
60 {
61     int         onstack;
62     reg86_t     gs;
63     reg86_t     fs;
64     reg86_t     es;
65     reg86_t     ds;
66     reg86_t     edi;
67     reg86_t     esi;
68     reg86_t     ebp;
69     reg86_t     isp;
70     reg86_t     ebx;
71     reg86_t     edx;
72     reg86_t     ecx;
73     reg86_t     eax;
74     int         pad[2];
75     reg86_t     eip;
76     reg86_t     cs;
77     reg86_t     efl;
78     reg86_t     esp;
79     reg86_t     ss;
80 } registers_t;
81
82 typedef union 
83 {
84     mcontext_t  sc;
85     registers_t r;
86 } regcontext_t;
87
88 /* 
89 ** passed around as a reference to the registers.  This must be in
90 ** scope for the following register macros to work.
91 */
92
93 /* register shorthands */
94 #define R_ESP           (REGS->r.esp.r_ex)
95 #define R_SP            (REGS->r.esp.r_w.r_x)
96 #define R_EBP           (REGS->r.ebp.r_ex)
97 #define R_BP            (REGS->r.ebp.r_w.r_x)
98 #define R_ISP           (REGS->r.isp.r_ex)
99 #define R_EIP           (REGS->r.eip.r_ex)
100 #define R_IP            (REGS->r.eip.r_w.r_x)
101 #define R_EFLAGS        (REGS->r.efl.r_ex)
102 #define R_FLAGS         (REGS->r.efl.r_w.r_x)
103 #define R_EES           (REGS->r.es.r_ex)
104 #define R_ES            (REGS->r.es.r_w.r_x)
105 #define R_EDS           (REGS->r.ds.r_ex)
106 #define R_DS            (REGS->r.ds.r_w.r_x)
107 #define R_ECS           (REGS->r.cs.r_ex)
108 #define R_CS            (REGS->r.cs.r_w.r_x)
109 #define R_ESS           (REGS->r.ss.r_ex)
110 #define R_SS            (REGS->r.ss.r_w.r_x)
111 #define R_EDI           (REGS->r.edi.r_ex)
112 #define R_DI            (REGS->r.edi.r_w.r_x)
113 #define R_ESI           (REGS->r.esi.r_ex)
114 #define R_SI            (REGS->r.esi.r_w.r_x)
115 #define R_EBX           (REGS->r.ebx.r_ex)
116 #define R_BX            (REGS->r.ebx.r_w.r_x)
117 #define R_BL            (REGS->r.ebx.r_b.r_l)
118 #define R_BH            (REGS->r.ebx.r_b.r_h)
119 #define R_EDX           (REGS->r.edx.r_ex)
120 #define R_DX            (REGS->r.edx.r_w.r_x)
121 #define R_DL            (REGS->r.edx.r_b.r_l)
122 #define R_DH            (REGS->r.edx.r_b.r_h)
123 #define R_ECX           (REGS->r.ecx.r_ex)
124 #define R_CX            (REGS->r.ecx.r_w.r_x)
125 #define R_CL            (REGS->r.ecx.r_b.r_l)
126 #define R_CH            (REGS->r.ecx.r_b.r_h)
127 #define R_EAX           (REGS->r.eax.r_ex)
128 #define R_AX            (REGS->r.eax.r_w.r_x)
129 #define R_AL            (REGS->r.eax.r_b.r_l)
130 #define R_AH            (REGS->r.eax.r_b.r_h)
131 #define R_EGS           (REGS->r.gs.r_ex)
132 #define R_GS            (REGS->r.gs.r_w.r_x)
133 #define R_EFS           (REGS->r.fs.r_ex)
134 #define R_FS            (REGS->r.fs.r_w.r_x)
135
136 #endif
137
138 #ifdef __bsdi__
139 #endif
140
141 #ifdef __NetBSD__
142 #endif
143
144 /*
145 ** register manipulation macros 
146 */
147
148 #define PUTVEC(s, o, x) ((s) = ((x) >> 16), (o) = (x) & 0xffff)
149 #define MAKEVEC(s, o)           (((s) << 16) + (o))
150
151 #define PUTPTR(s, o, x) (((s) = ((x) & 0xf0000) >> 4), (o) = (x) & 0xffff)
152 #define MAKEPTR(s, o)           (((s) << 4) + (o))
153
154 #define VECPTR(x)               MAKEPTR((x) >> 16, (x) & 0xffff)
155
156 #define REGISTERS               regcontext_t *REGS
157
158 inline static void
159 PUSH(u_short x, REGISTERS)
160 {
161     R_SP -= 2;
162     *(u_short *)MAKEPTR(R_SS, R_SP) = (x);
163 }
164
165 inline static u_short
166 POP(REGISTERS)
167 {
168     u_short     x;
169     
170     x = *(u_short *)MAKEPTR(R_SS, R_SP);
171     R_SP += 2;
172     return(x);
173 }
174
175 # ifndef PSL_ALLCC      /* Grr, FreeBSD doesn't have this */
176 # define PSL_ALLCC        (PSL_C|PSL_PF|PSL_AF|PSL_Z|PSL_N)
177 # endif