29,13 → 29,57 |
#include <ll/stdlib.h> |
|
#define T 1000 |
#if 1 |
#define WAIT() for (w = 0; w < 0xFFFFFFFF; w++) |
|
#else |
#define WAIT() for (w = 0; w < 0xFFFFF; w++) |
#endif |
static unsigned long int w; |
|
#define __VM86__ |
|
#ifdef __VM86__ |
|
//void emulate(void) |
void emulate(DWORD intnum, struct registers r) |
{ |
TSS *vm86_tss; |
DWORD *bos; |
DWORD isr_cs, isr_eip; |
WORD *old_esp; |
DWORD *IRQTable_entry; |
CONTEXT c = get_TR(); |
|
vm86_tss = vm86_get_tss(); |
bos = (DWORD *)vm86_tss->esp0; |
if (c == X_VM86_TSS) { |
/* |
message("Entering ESP: %lx (= 0x%lx?)\n", |
(DWORD)(tos + 9), vm86_tss->esp0); |
message("Old EIP: 0x%lx 0x%lx\n", *(tos + 9), *(bos - 9)); |
message("Old CS: 0x%x 0x%x\n", (WORD)(*(tos + 10)), (WORD)*(bos - 8)); |
message("Old EFlags: 0x%lx 0x%lx\n", *(tos + 11), *(bos - 7)); |
message("Old ESP: 0x%lx 0x%lx\n", *(tos + 12), *(bos - 6)); |
message("Emulate, please!!!\n"); |
*/ |
old_esp = (WORD *)(*(bos - 6) + (*(bos - 5) << 4)); |
// *(old_esp - 1) = /*(WORD)(*(bos - 7))*/ CPU_FLAG_VM | CPU_FLAG_IOPL; |
r.flags = CPU_FLAG_VM | CPU_FLAG_IOPL; |
*(old_esp - 2) = (WORD)(*(bos - 8)); |
*(old_esp - 3) = (WORD)(*(bos - 9)); |
*(bos - 6) -= 6; |
/* We are emulating INT 0x6d */ |
IRQTable_entry = (void *)(0L); |
isr_cs= ((IRQTable_entry[0x6d]) & 0xFFFF0000) >> 16; |
isr_eip = ((IRQTable_entry[0x6d]) & 0x0000FFFF); |
/* |
message("I have to call 0x%lx:0x%lx\n", isr_cs, isr_eip); |
*/ |
*(bos - 8) = isr_cs; |
*(bos - 9) = isr_eip; |
} |
} |
|
void vm86BIOSDemo(void) |
{ |
X_REGS16 ir,or; |
72,9 → 116,22 |
register int i; |
/* Set video mode */ |
ir.h.ah = 0; |
|
#if 0 |
ir.h.al = 0x03; |
vm86_callBIOS(0x10,&ir,&or,&sr); |
|
ir.h.ah = 0x0C; |
ir.h.al = i % 16; |
ir.x.bx = 0; |
ir.x.dx = i+40; |
ir.x.cx = i+100; |
vm86_callBIOS(0x10,&ir,&or,&sr); |
|
|
#else |
ir.h.al = 0x12; |
vm86_callBIOS(0x10,&ir,&or,&sr); |
#if 1 |
/* Put some pixels */ |
for (i = 0; i < 200; i++) { |
ir.h.ah = 0x0C; |
112,7 → 169,13 |
message("CX=%x\n",c); |
for (i = 0; i < 0x4F000; i++); |
#ifdef __VM86__ |
vm86_init(); |
vm86_init(); |
|
l1_int_bind(0x6d, emulate); |
/* |
l1_irq_bind(0x6d, emulate); |
*/ |
|
BIOSDemo(); |
#else |
XBIOSDemo(); |