kaos/KaosSrc/xms.cpp
2024-10-12 20:32:30 -05:00

139 lines
No EOL
2.5 KiB
C++

/************************************************************************
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
************************************************************************/
// XMS - Low Level Routines - (C)1997 NicosoŸt (Valentini Domenico)
#include "std.hpp"
#include "xms.hpp"
char XMSok;
static void (far *XMSControl)(void);
char XMSinstalled() {
asm {
MOV AX, 0x4300
INT 0x2f
CMP AL, 0x80
MOV AL, 0
JNE end
MOV AX, 0x4310
INT 0x2f
MOV WORD PTR XMSControl, BX
MOV WORD PTR XMSControl[2], ES
MOV AL, 1
} end: return XMSok=_AL; }
int XMSgetver() {
if (!XMSok) return 0;
asm XOR AX, AX;
XMSControl();
return _AX;
}
int XMSgetrev() {
if (!XMSok) return 0;
asm XOR AX, AX;
XMSControl();
return _BX;
}
word XMSmemfree() {
if (!XMSok) return 0;
_AX = 0x0800;
XMSControl();
return _AX;
}
word XMSblockfree() {
if (!XMSok) return 0;
_AX = 0x0800;
XMSControl();
return _DX;
}
word XMSnew(word size) {
if (!XMSok) return 0;
_DX = size;
_AX = 0x0900;
XMSControl();
if (_AX) return _DX;
else return 0;
}
char XMSdelete(word handle) {
if (!XMSok) return 0;
_DX = handle;
_AX = 0x0a00;
XMSControl();
return _AL;
}
#pragma warn -rvl
char XMSmove(TXMSMoveStruct far *movestruct) {
if (!XMSok) return 0;
asm {
LDS SI, DWORD PTR movestruct
MOV AX, 0x0b00
CALL DWORD PTR XMSControl
// !!! SS==DS !!!
MOV DX, SS
MOV DS, DX
}}
#pragma warn +rvl
/*
char XMSgetinfo(word handle, unsigned long &offset, word &size) {
unsigned long _off = 0;
word _siz = 0;
if (!XMSok) return 0;
asm { MOV AX, 0x0e00
MOV DX, handle
PUSH BP
}
XMSControl();
asm { POP BP
OR AX, AX
JZ erend
MOV _siz, DX
MOV AX, 0x0c00
MOV DX, handle
PUSH BP
}
XMSControl();
asm { POP BP
OR AX, AX
JZ erend
MOV WORD PTR _off, BX
MOV WORD PTR _off[2], DX
MOV AX, 0x0d00
MOV DX, handle
}
XMSControl();
asm { OR AX, AX
JZ erend
} end: offset = _off;
size = _siz;
return 1;
erend: return 0; }
*/
char XMSgetsize(word handle, word &size) {
word _siz;
if (!XMSok) return 0;
asm {
MOV AX, 0x0e00
MOV DX, handle
PUSH BP
CALL DWORD PTR XMSControl;
POP BP
OR AX, AX
JZ erend
MOV _siz, DX
} end: size = _siz;
return 1;
erend: return 0; }