forked from nonakap/xnp2
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathi286xcts.cpp
387 lines (339 loc) · 7.51 KB
/
i286xcts.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
#include "compiler.h"
#include "cpucore.h"
#include "i286x.h"
#include "i286xadr.h"
#include "i286xcts.h"
#include "i286x.mcr"
#include "i286xea.mcr"
typedef void (*I286OP_0F)(void);
// ---- 0f 00
I286 _sldt(void) {
__asm {
PREPART_EA16(2)
mov dx, I286_LDTR
mov word ptr I286_REG[eax*2], dx
GET_NEXTPRE2
ret
MEMORY_EA16(3)
mov ax, I286_LDTR
mov word ptr I286_MEM[ecx], ax
ret
extmem_eareg16:
mov dx, I286_LDTR
jmp i286_memorywrite_w
}
}
I286 _str(void) {
__asm {
PREPART_EA16(3)
mov dx, I286_TR
mov word ptr I286_REG[eax*2], dx
GET_NEXTPRE2
ret
MEMORY_EA16(6)
mov ax, I286_TR
mov word ptr I286_MEM[ecx], ax
ret
extmem_eareg16:
mov dx, I286_TR
jmp i286_memorywrite_w
}
}
I286 _lldt(void) {
__asm {
PREPART_EA16(17)
mov ax, word ptr I286_REG[eax*2]
call lldt_sub
GET_NEXTPRE2
ret
MEMORY_EA16(19)
mov ax, word ptr I286_MEM[ecx]
jmp short lldt_sub
EXTMEM_EA16
lldt_sub: mov word ptr I286_LDTR, ax
call i286x_selector
mov ecx, eax
call i286_memoryread_w
mov I286_LDTRC.limit, ax
add ecx, 2
call i286_memoryread_w
mov I286_LDTRC.base, ax
add ecx, 2
call i286_memoryread
mov I286_LDTRC.base24, al
ret
}
}
I286 _ltr(void) {
__asm {
PREPART_EA16(17)
mov ax, word ptr I286_REG[eax*2]
call ltr_sub
GET_NEXTPRE2
ret
MEMORY_EA16(19)
mov ax, word ptr I286_MEM[ecx]
jmp short ltr_sub
EXTMEM_EA16
ltr_sub: mov word ptr I286_TR, ax
call i286x_selector
mov ecx, eax
call i286_memoryread_w
mov I286_TRC.limit, ax
add ecx, 2
call i286_memoryread_w
mov I286_TRC.base, ax
add ecx, 2
call i286_memoryread
mov I286_TRC.base24, al
ret
}
}
I286 _verr(void) {
__asm {
PREPART_EA16(14)
mov ax, word ptr I286_REG[eax*2]
GET_NEXTPRE2
ret
MEMORY_EA16(16)
mov ax, word ptr I286_MEM[ecx]
ret
EXTMEM_EA16
ret
}
}
I286 _verw(void) {
__asm {
PREPART_EA16(14)
mov ax, word ptr I286_REG[eax*2]
GET_NEXTPRE2
ret
MEMORY_EA16(16)
mov ax, word ptr I286_MEM[ecx]
ret
EXTMEM_EA16
ret
}
}
static const I286OP_0F cts0x_table[] = {
_sldt, _str, _lldt, _ltr,
_verr, _verw, _verr, _verw};
// ---- 0f 01
I286 _sgdt(void) {
__asm {
cmp al, 0c0h
jnc register_eareg16
I286CLOCK(11)
call p_ea_dst[eax*4]
mov dx, word ptr I286_GDTR
call i286_memorywrite_w
add ecx, 2
mov dx, word ptr (I286_GDTR + 2)
call i286_memorywrite_w
add ecx, 2
mov dl, byte ptr (I286_GDTR + 4)
mov dh, -1
jmp i286_memorywrite_w
align 4
register_eareg16:
INT_NUM(6)
}
}
I286 _sidt(void) {
__asm {
cmp al, 0c0h
jnc register_eareg16
I286CLOCK(12)
call p_ea_dst[eax*4]
mov dx, word ptr I286_IDTR
call i286_memorywrite_w
add ecx, 2
mov dx, word ptr (I286_IDTR + 2)
call i286_memorywrite_w
add ecx, 2
mov dl, byte ptr (I286_IDTR + 4)
mov dh, -1
jmp i286_memorywrite_w
align 4
register_eareg16:
INT_NUM(6)
}
}
I286 _lgdt(void) {
__asm {
cmp al, 0c0h
jnc register_eareg16
I286CLOCK(11)
call p_ea_dst[eax*4]
call i286_memoryread_w
mov word ptr I286_GDTR, ax
add ecx, 2
call i286_memoryread_w
mov word ptr (I286_GDTR + 2), ax
add ecx, 2
call i286_memoryread
mov byte ptr (I286_GDTR + 4), al
ret
align 4
register_eareg16:
INT_NUM(6)
}
}
I286 _lidt(void) {
__asm {
cmp al, 0c0h
jnc register_eareg16
I286CLOCK(12)
call p_ea_dst[eax*4]
call i286_memoryread_w
mov word ptr I286_IDTR, ax
add ecx, 2
call i286_memoryread_w
mov word ptr (I286_IDTR + 2), ax
add ecx, 2
call i286_memoryread
mov byte ptr (I286_IDTR + 4), al
ret
align 4
register_eareg16:
INT_NUM(6)
}
}
I286 _smsw(void) {
__asm {
PREPART_EA16(3)
mov dx, I286_MSW
mov word ptr I286_REG[eax*2], dx
GET_NEXTPRE2
ret
MEMORY_EA16(6)
mov ax, I286_MSW
mov word ptr I286_MEM[ecx], ax
ret
extmem_eareg16:
mov dx, I286_MSW
jmp i286_memorywrite_w
}
}
I286 _lmsw(void) {
__asm {
and I286_MSW, MSW_PE
PREPART_EA16(2)
mov ax, word ptr I286_REG[eax*2]
or I286_MSW, ax
GET_NEXTPRE2
ret
MEMORY_EA16(3)
mov ax, word ptr I286_MEM[ecx]
or I286_MSW, ax
ret
EXTMEM_EA16
or I286_MSW, ax
ret
}
}
static const I286OP_0F cts1x_table[] = {
_sgdt, _sidt, _lgdt, _lidt,
_smsw, _smsw, _lmsw, _lmsw};
// ----
I286EXT _xcts(void) {
__asm {
mov edi, esi
GET_NEXTPRE1
test bl, bl
je short i286_cts0
dec bl
je short i286_cts1
cmp bl, (5 - 1)
je short loadall286
jmp expint6
align 4
i286_cts0: test I286_MSW, MSW_PE
je expint6
movzx eax, bh
mov edi, eax
shr edi, 3-2
and edi, 7*4
jmp cts0x_table[edi]
align 4
i286_cts1: movzx eax, bh
mov edi, eax
shr edi, 3-2
and edi, 7*4
jmp cts1x_table[edi]
align 4
loadall286: I286CLOCK(195)
mov ax, word ptr mem[0x0804] // MSW
mov I286_MSW, ax
mov ax, word ptr mem[0x0816] // TR
mov I286_TR, ax
mov ax, word ptr mem[0x0818] // flag
mov I286_FLAG, ax
and ah, 3
cmp ah, 3
sete I286_TRAP
mov si, word ptr mem[0x081a] // ip
mov ax, word ptr mem[0x081c] // LDTR
mov I286_LDTR, ax
mov ax, word ptr mem[0x081e] // ds
mov I286_DS, ax
mov ax, word ptr mem[0x0820] // ss
mov I286_SS, ax
mov ax, word ptr mem[0x0822] // cs
mov I286_CS, ax
mov ax, word ptr mem[0x0824] // es
mov I286_ES, ax
mov ax, word ptr mem[0x0826] // di
mov I286_DI, ax
mov ax, word ptr mem[0x0828] // si
mov I286_SI, ax
mov ax, word ptr mem[0x082a] // bp
mov I286_BP, ax
mov ax, word ptr mem[0x082c] // sp
mov I286_SP, ax
mov ax, word ptr mem[0x082e] // bx
mov I286_BX, ax
mov ax, word ptr mem[0x0830] // dx
mov I286_DX, ax
mov ax, word ptr mem[0x0832] // cx
mov I286_CX, ax
mov ax, word ptr mem[0x0834] // ax
mov I286_AX, ax
mov eax, dword ptr mem[0x0836] // es_desc
and eax, 00ffffffh
mov ES_BASE, eax
mov eax, dword ptr mem[0x083c] // cs_desc
and eax, 00ffffffh
mov CS_BASE, eax
mov eax, dword ptr mem[0x0842] // ss_desc
and eax, 00ffffffh
mov SS_BASE, eax
mov SS_FIX, eax
mov eax, dword ptr mem[0x0848] // ds_desc
and eax, 00ffffffh
mov DS_BASE, eax
mov DS_FIX, eax
mov eax, dword ptr mem[0x084e] // GDTR
mov dword ptr (I286_GDTR.base), eax
mov ax, word ptr mem[0x0852]
mov I286_GDTR.limit, ax
mov eax, dword ptr mem[0x0854] // LDTRC
mov dword ptr (I286_LDTRC.base), eax
mov ax, word ptr mem[0x0858]
mov I286_LDTRC.limit, ax
mov eax, dword ptr mem[0x085a] // IDTR
mov dword ptr (I286_IDTR.base), eax
mov ax, word ptr mem[0x085e]
mov I286_IDTR.limit, ax
mov eax, dword ptr mem[0x0860] // TRC
mov dword ptr (I286_TRC.base), eax
mov ax, word ptr mem[0x0864]
mov I286_TRC.limit, ax
RESET_XPREFETCH
I286IRQCHECKTERM
align 4
expint6: mov si, di // ver0.27 このタイプ・・・
I286CLOCK(20) // 全部修正しなきゃ(汗
INT_NUM(6) // i286とi386で挙動が違うから
} // いやらしいね…
}