void DOS_Shell::CMD_LOADHIGH(char *args){ HELP("LOADHIGH"); Bit16u umb_start=dos_infoblock.GetStartOfUMBChain(); Bit8u umb_flag=dos_infoblock.GetUMBChainState(); Bit8u old_memstrat=(Bit8u)(DOS_GetMemAllocStrategy()&0xff); if (umb_start==0x9fff) { if ((umb_flag&1)==0) DOS_LinkUMBsToMemChain(1); DOS_SetMemAllocStrategy(0x80); // search in UMBs first this->ParseLine(args); Bit8u current_umb_flag=dos_infoblock.GetUMBChainState(); if ((current_umb_flag&1)!=(umb_flag&1)) DOS_LinkUMBsToMemChain(umb_flag); DOS_SetMemAllocStrategy(old_memstrat); // restore strategy } else this->ParseLine(args); }
Bitu XMS_Handler(void) { // LOG(LOG_MISC,LOG_ERROR)("XMS: CALL %02X",reg_ah); switch (reg_ah) { case XMS_GET_VERSION: /* 00 */ reg_ax=XMS_VERSION; reg_bx=XMS_DRIVER_VERSION; reg_dx=0; /* No we don't have HMA */ break; case XMS_ALLOCATE_HIGH_MEMORY: /* 01 */ reg_ax=0; reg_bl=HIGH_MEMORY_NOT_EXIST; break; case XMS_FREE_HIGH_MEMORY: /* 02 */ reg_ax=0; reg_bl=HIGH_MEMORY_NOT_EXIST; break; case XMS_GLOBAL_ENABLE_A20: /* 03 */ case XMS_LOCAL_ENABLE_A20: /* 05 */ SET_RESULT(XMS_EnableA20(true)); break; case XMS_GLOBAL_DISABLE_A20: /* 04 */ case XMS_LOCAL_DISABLE_A20: /* 06 */ SET_RESULT(XMS_EnableA20(false)); break; case XMS_QUERY_A20: /* 07 */ reg_ax = XMS_GetEnabledA20(); reg_bl = 0; break; case XMS_QUERY_FREE_EXTENDED_MEMORY: /* 08 */ reg_bl = XMS_QueryFreeMemory(reg_ax,reg_dx); break; case XMS_ALLOCATE_ANY_MEMORY: /* 89 */ reg_edx &= 0xffff; // fall through case XMS_ALLOCATE_EXTENDED_MEMORY: /* 09 */ { Bit16u handle = 0; SET_RESULT(XMS_AllocateMemory(reg_dx,handle)); reg_dx = handle; }; break; case XMS_FREE_EXTENDED_MEMORY: /* 0a */ SET_RESULT(XMS_FreeMemory(reg_dx)); break; case XMS_MOVE_EXTENDED_MEMORY_BLOCK: /* 0b */ SET_RESULT(XMS_MoveMemory(SegPhys(ds)+reg_si),false); break; case XMS_LOCK_EXTENDED_MEMORY_BLOCK: { /* 0c */ Bit32u address; Bitu res = XMS_LockMemory(reg_dx, address); if(res) reg_bl = (Bit8u)res; reg_ax = (res==0); if (res==0) { // success reg_bx=(Bit16u)(address & 0xFFFF); reg_dx=(Bit16u)(address >> 16); }; }; break; case XMS_UNLOCK_EXTENDED_MEMORY_BLOCK: /* 0d */ SET_RESULT(XMS_UnlockMemory(reg_dx)); break; case XMS_GET_EMB_HANDLE_INFORMATION: /* 0e */ SET_RESULT(XMS_GetHandleInformation(reg_dx,reg_bh,reg_bl,reg_dx),false); break; case XMS_RESIZE_ANY_EXTENDED_MEMORY_BLOCK: /* 0x8f */ if(reg_ebx > reg_bx) LOG_MSG("64MB memory limit!"); //fall through case XMS_RESIZE_EXTENDED_MEMORY_BLOCK: /* 0f */ SET_RESULT(XMS_ResizeMemory(reg_dx, reg_bx)); break; case XMS_ALLOCATE_UMB: { /* 10 */ if (!umb_available) { reg_ax=0; reg_bl=XMS_FUNCTION_NOT_IMPLEMENTED; break; } Bit16u umb_start=dos_infoblock.GetStartOfUMBChain(); if (umb_start==0xffff) { reg_ax=0; reg_bl=UMB_NO_BLOCKS_AVAILABLE; reg_dx=0; // no upper memory available break; } /* Save status and linkage of upper UMB chain and link upper memory to the regular MCB chain */ Bit8u umb_flag=dos_infoblock.GetUMBChainState(); if ((umb_flag&1)==0) DOS_LinkUMBsToMemChain(1); Bit8u old_memstrat=DOS_GetMemAllocStrategy()&0xff; DOS_SetMemAllocStrategy(0x40); // search in UMBs only Bit16u size=reg_dx;Bit16u seg; if (DOS_AllocateMemory(&seg,&size)) { reg_ax=1; reg_bx=seg; } else { reg_ax=0; if (size==0) reg_bl=UMB_NO_BLOCKS_AVAILABLE; else reg_bl=UMB_ONLY_SMALLER_BLOCK; reg_dx=size; // size of largest available UMB } /* Restore status and linkage of upper UMB chain */ Bit8u current_umb_flag=dos_infoblock.GetUMBChainState(); if ((current_umb_flag&1)!=(umb_flag&1)) DOS_LinkUMBsToMemChain(umb_flag); DOS_SetMemAllocStrategy(old_memstrat); } break; case XMS_DEALLOCATE_UMB: /* 11 */ if (!umb_available) { reg_ax=0; reg_bl=XMS_FUNCTION_NOT_IMPLEMENTED; break; } if (dos_infoblock.GetStartOfUMBChain()!=0xffff) { if (DOS_FreeMemory(reg_dx)) { reg_ax=0x0001; break; } } reg_ax=0x0000; reg_bl=UMB_NO_BLOCKS_AVAILABLE; break; case XMS_QUERY_ANY_FREE_MEMORY: /* 88 */ reg_bl = XMS_QueryFreeMemory(reg_ax,reg_dx); reg_eax &= 0xffff; reg_edx &= 0xffff; reg_ecx = (MEM_TotalPages()*MEM_PAGESIZE)-1; // highest known physical memory address break; case XMS_GET_EMB_HANDLE_INFORMATION_EXT: { /* 8e */ Bit8u free_handles; Bitu result = XMS_GetHandleInformation(reg_dx,reg_bh,free_handles,reg_dx); if (result != 0) reg_bl = result; else { reg_edx &= 0xffff; reg_cx = free_handles; } reg_ax = (result==0); } break; default: LOG(LOG_MISC,LOG_ERROR)("XMS: unknown function %02X",reg_ah); reg_ax=0; reg_bl=XMS_FUNCTION_NOT_IMPLEMENTED; }