static void DOSMEM_MakeIsrStubs(void) { DWORD *stub = (DWORD*)(DOSMEM_dosmem + (VM_STUB_SEGMENT << 4)); int x; for (x=0; x<256; x++) stub[x]=VM_STUB(x); }
/*********************************************************************** * DOSMEM_FillBiosSegments * * Fill the BIOS data segment with dummy values. */ static void DOSMEM_FillBiosSegments(void) { BYTE *pBiosSys = (BYTE*)DOSMEM_dosmem + 0xf0000; BYTE *pBiosROMTable = pBiosSys+0xe6f5; BIOSDATA *pBiosData = DOSVM_BiosData(); static const char bios_date[] = "13/01/99"; /* Clear all unused values */ memset( pBiosData, 0, sizeof(*pBiosData) ); /* FIXME: should check the number of configured drives and ports */ pBiosData->Com1Addr = 0x3f8; pBiosData->Com2Addr = 0x2f8; pBiosData->Lpt1Addr = 0x378; pBiosData->Lpt2Addr = 0x278; pBiosData->InstalledHardware = 0x5463; pBiosData->MemSize = 640; pBiosData->NextKbdCharPtr = 0x1e; pBiosData->FirstKbdCharPtr = 0x1e; pBiosData->VideoMode = 3; pBiosData->VideoColumns = 80; pBiosData->VideoPageSize = 80 * 25 * 2; pBiosData->VideoPageStartAddr = 0xb800; pBiosData->VideoCtrlAddr = 0x3d4; pBiosData->Ticks = DOSMEM_GetTicksSinceMidnight(); pBiosData->NbHardDisks = 2; pBiosData->KbdBufferStart = 0x1e; pBiosData->KbdBufferEnd = 0x3e; pBiosData->RowsOnScreenMinus1 = 24; pBiosData->BytesPerChar = 0x10; pBiosData->ModeOptions = 0x64; pBiosData->FeatureBitsSwitches = 0xf9; pBiosData->VGASettings = 0x51; pBiosData->DisplayCombination = 0x08; pBiosData->DiskDataRate = 0; /* fill ROM configuration table (values from Award) */ *(pBiosROMTable+0x0) = 0x08; /* number of bytes following LO */ *(pBiosROMTable+0x1) = 0x00; /* number of bytes following HI */ *(pBiosROMTable+0x2) = 0xfc; /* model */ *(pBiosROMTable+0x3) = 0x01; /* submodel */ *(pBiosROMTable+0x4) = 0x00; /* BIOS revision */ *(pBiosROMTable+0x5) = 0x74; /* feature byte 1 */ *(pBiosROMTable+0x6) = 0x00; /* feature byte 2 */ *(pBiosROMTable+0x7) = 0x00; /* feature byte 3 */ *(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */ *(pBiosROMTable+0x9) = 0x00; /* feature byte 5 */ /* BIOS date string */ memcpy(pBiosSys+0xfff5, bios_date, sizeof bios_date); /* BIOS ID */ *(pBiosSys+0xfffe) = 0xfc; /* Reboot vector (f000:fff0 or ffff:0000) */ *(DWORD*)(pBiosSys + 0xfff0) = VM_STUB(0x19); }
void* vm_get_object(vm_context* ctx, int index, vm_typespec *spec) { vm_frame* frame; vm_value value; frame = vm_stack_current_frame(ctx->stack); if (frame->base+index < frame->top) { value = vm_stack_current_base(ctx->stack)[index]; if (vm_get_interface(value) == vm_typespec_interface(spec)) { return vm_unbox_object(value); } else { VM_STUB(); } } VM_STUB(); }
void* vm_get_self_object(vm_context* ctx, vm_typespec *spec) { vm_value self; self = vm_stack_current_frame(ctx->stack)->self; if (vm_get_interface(self) == vm_typespec_interface(spec)) { return vm_unbox_object(self); } else { VM_STUB(); } }
long vm_get_integer(vm_context* ctx, int index) { vm_value value; value = vm_get_value(ctx, index); if (vm_unbox_tag(value) == vm_tag_integer) { return vm_unbox_integer(value); } else { VM_STUB(); } }
vm_value vm_get_interface(vm_value value) { switch (vm_unbox_tag(value)) { case vm_tag_object: if (value == 0) return 0; return ((vm_object*)vm_unbox_object(value))->interface; case vm_tag_string: return vm_typespec_interface(&vm_string_type); case vm_tag_apifunc: return vm_typespec_interface(&vm_apifunc_type); default: printf("object tag: %i\n", vm_unbox_tag(value)); VM_STUB(); } }