| AH |
= |
00h unused
| Return: |
AH |
= |
84h (unsupported function) |
|
| AH |
= |
01h get high memory information
| Call: |
ES:DI |

|
buffer for array of high memory info records (see #01478) |
| Return: |
CX |
= |
number of records placed in buffer |
|
| AH |
= |
02h get shadowed ROM info
| Call: |
ES:DI |

|
buffer for array of ROM shadowing records (see #01479) |
| Return: |
CX |
= |
number of records placed in buffer |
|
| AH |
= |
03h get 386MAX state
| Call: |
ES:DI |

|
90-byte buffer for state (see #01467) |
| Return: |
AH |
= |
00h (successful) |
| buffer filled |
|
| AH |
= |
04h get memory types???
| Call: |
ES:DI |

|
buffer for memory type info (array of bytes, one per 16K
page) (see #01480 |
| Return: |
CX |
= |
number of bytes placed in buffer |
|
| AH |
= |
05h get page table entries
| Call: |
AL |
= |
A20 control
| 00h |
= |
enable A20 first |
| 01h |
= |
leave unchanged |
|
| CX |
= |
buffer size in bytes (0000h = enough for all memory
from given start to end of memory managed by 386MAX) |
| SI |
= |
first K to report (rounded down to 4K page) |
| ES:DI |

|
buffer for returned page table entries |
| Return: |
CX |
= |
number of bytes returned (four per 4K page) |
|
ES:DI |
- |
buffer filled |
|
| AH |
= |
06h get memory speed info
| Call: |
ES:DI |
 |
buffer for memory speed records (see #01482)
|
| Return: |
AX |
= |
00h (successful) |
| CX |
= |
number of bytes placed in buffer |
| Note: |
This function can take over a
second to execute. |
|
| AH |
= |
07h map/unmap multiple handle pages
| Call: |
DX |
=
|
EMS handle (on stack)
|
| STACK |
DWORD |
EMS mapping record |
|
Return:
|
AX |
= |
status (00h,80h,83h,8Ah,8Bh) |
|
|
Format of EMS mapping record:
| Offset |
Size |
Description |
|
00h
|
WORD
|
function
| 0000h |
= |
use physical page numbers |
| 0001h |
= |
use segment addresses |
|
|
02h
|
WORD
|
EMS handle |
|
04h
|
WORD
|
number of mapping entries
following |
|
06h
|
2N WORDs
|
logical page number and physical
page/segment
logical page FFFFh means unmap physical page |
|
|
See Also:
|
INT 67/AH=50h
|
|
| AH |
= |
08h "EMM2_GOREAL" check whether possible to disable
386MAX
| Call: |
AL |
= |
??? (00h or nonzero)
|
| Return: |
AH |
= |
status (00h OK, A4h not possible at this time) |
| Note: |
If AL=00h, this function always returns success. |
|
| AH |
= |
09h toggle Bit Flags 1 flags
| Call: |
BX |
= |
bitmask of bit flags 1's flags to toggle (see #01468)
|
| Return: |
AH |
= |
00h (successful) |
| Note: |
Enables A20 first. |
|
| AH |
= |
0Ah toggle Debugging Flags 1 flags
| Call: |
BX |
= |
bitmask of Debugging Flags 1's bits to toggle (see #01470)
|
| Return: |
AH |
= |
00h (successful) |
| Note: |
Enables A20 first.
Does ??? if bit 3 on after specified bits are toggled. |
|
| AH |
= |
0Bh toggle Debugging Flags 2 flags
| Call: |
BX |
= |
bitmask of Debugging Flags 2's bits to toggle (see #01471)
|
| Return: |
AH |
= |
00h (successful) |
| Note: |
Enables A20 first. |
|
| AH |
= |
0Ch toggle feature flags 3
| Call: |
BX |
= |
bitmask of feature flags 3's bits to toggle (see #01475)
|
| Return: |
AH |
= |
00h (successful) |
| Note: |
Enables A20 first. |
|
| AH |
= |
0Dh specify 386MAX high-memory location
| Call: |
BX |
= |
segment address of high-memory real-mode portion of 386MAX
|
| CX |
= |
current segment of real-mode stub??? |
| Return: |
AH |
= |
status (00h successful) |
|
??? |
|
|
|
| AH |
= |
0Eh CRT controller register virtualization
| Call: |
AL |
= |
subfunction
| 00h |
= |
allow access to CRTC I/O ports 03B4h/03B5h, 03D4h/03D5h |
| 01h |
= |
trap accesses to CRTC I/O ports |
|
|
| AH |
= |
0Fh reboot system
|
| AH |
= |
10h unused
| Return: |
AH |
= |
AH = 84h (unsupported function) |
|
| AH |
= |
11h get high memory information
| Call: |
ES:DI |
 |
96-byte buffer for high memory info
|
|
Return:
|
AH |
= |
00h (successful) |
| ES:DI |
- |
buffer filled |
| Note: |
Each byte in buffer contains bit flags for a
4K page in the A000h-FFFFh region:
| bit 0 |
: |
page is writeable |
| bit 1 |
: |
physical address same as linear address |
| bit 2 |
: |
EMS page frame |
| bit 6 |
: |
page is part of the QPMS window |
this function can take over a second to execute, because it
does a 128K read for each page in an attempt to flush any RAM
cache the system may have
|
|
| AH |
= |
12h shadow RAM mapping
| Call: |
AL |
= |
subfunction
| 00h |
= |
unshadow ROMs (except page FFh if NOWARMBOOT set) |
| 01h |
= |
map shadow RAM into ROM regions??? |
|
|
Return:
|
AH |
= |
00h (successful) if AL=00h or 01h |
| AH |
= |
8Fh otherwise |
|
| AH |
= |
13h shadow RAM page protection
| Call: |
AL |
= |
subfunction
| 00h |
= |
set all shadowed ROM 4K pages to read-only |
| 01h |
= |
set all shadowed ROM 4K pages to read-write |
|
|
Return:
|
AH |
= |
00h (successful) if AL=00h or 01h |
| AH |
= |
8Fh otherwise |
|
| AH |
= |
14h get Programmable Option Select info???
| Call: |
ES:DI |
 |
54-byte buffer for POS data???
|
|
Return:
|
AH |
= |
00h if successful |
| AH |
= |
A4h on error |
| Note: |
The buffer consists of nine 6-byte fields; the
first eight for slots 1-8, the last for the system board. |
|
| AH |
= |
15h ???
|
| AH |
= |
16h get 386MAX memory usage screen
| Call: |
ES:DI |
 |
buffer for memory info display
|
| CX |
= |
size of buffer in bytes |
| Return: |
ES:DI |
- |
buffer filled with '$'-terminated string (if large enough to
hold entire usage screen) |
| Note: |
the screen is 0303h bytes in v7.00 |
|
| AH |
= |
17h Windows 3 startup/termination
| Call: |
AL |
= |
subfunction
| 00h |
= |
Windows3 initializing
|
Call:
|
DX (on stack) |
= |
Windows startup flags
|
| DI |
= |
Windows version number (major in upper byte)
|
| ES:BX |
= |
0000h:0000h
|
| DS:SI |
= |
0000h:0000h
|
|
Return:
|
CX |
= |
0000h if OK for Windows to load |
| CX |
<> |
0 if Windows should not load |
| ES:BX |
|
startup info structure |
| DS:SI |
|
Virtual86 mode enable/disable callback |
|
| 01h |
= |
Windows3 terminating
|
Call:
|
DX (on stack) |
= |
Windows exit flags
|
| ES:BX |
|
???
|
|
Return:
|
??? |
|
|
|
| AH |
= |
18h QPMS (Qualitas Protected Memory Services)
| Call: |
AL |
= |
subfunction
| 00h |
= |
get QPMS configuration
|
Return: |
BX |
= |
starting segment of QPMS memory window |
| CX |
= |
number of 4K pages reserved for QPMS??? |
| DX |
= |
number of 4K pages in QPMS window??? |
|
| 01h |
= |
map QPMS memory page???
|
Call: |
BX |
= |
4K page number within memory reserved for QPMS??? |
| CL |
= |
page number within QPMS memory window??? |
|
| 02h |
= |
mark all QPMS memory read-only |
| 03h |
= |
mark all QPMS memory read-write |
|
| Return: |
AH |
= |
status (00h,8Ah,8Bh,8Fh)
|
|
| AH |
= |
19h get linear address for physical address
| Call: |
EDX |
= |
physical address (low word on stack)
|
| Return: |
AH |
= |
status
| 00h |
= |
successful
| EDX |
= |
linear address at which physical address may be
accessed |
|
| 8Bh |
= |
physical address currently not addressable |
|
| Note: |
enables A20 first |
|
| AH |
= |
1Ah set page table entry
| Call: |
EDX |
= |
new page table entry (low word on stack)
|
| ESI |
= |
linear address of page to map (bits 0-11 clear) |
| Return: |
AH |
= |
status (00h,8Bh) |
| Note: |
enables A20 first |
|
| AH |
= |
1Bh get ???
|
Return:
|
AH |
= |
status |
| BX |
= |
??? |
| CX |
= |
number of ??? |
| EDX |
= |
physical address of ??? |
|
| AH |
= |
1Ch get original interrupt vector
| Call: |
AL |
= |
interrupt vector (00h-7Fh)
|
|
Return:
|
AH |
= |
00h (successful) |
| DX |
= |
original vector before 386MAX loaded (segment in high word,
offset in low word) |
| Note: |
No range checking is performed; requests for
INTs 80h- FFh will return random values. |
|
| AH |
= |
1Dh display string???
| Call: |
AI |
= |
???
|
|
Return:
|
AH |
= |
00h (successful) |
| ??? |
| Note: |
This function appears to be broken in v7.00. |
|
| AH |
= |
1Eh get memory info
| Call: |
| ES:DI |
 |
memory info (see #01483) |
| Return: |
??? |
|
| AH |
= |
1Fh get DPMI host information
|
Return:
|
AX |
= |
0000h if successful |
| BX |
= |
DPMI flags (see #03152
at INT 31/AX=0400h) |
| CL |
= |
CPU type
| 02h |
= |
80286 |
| 03h |
= |
80386 |
|
etc. |
|
| DX |
= |
DPMI ver supported
| DH |
= |
major |
| DL |
= |
2-digit minor |
|
| SI |
= |
??? |
| ES???:DI |

|
??? |
| Note: |
NOP if NODPMI switch specified. |
|
| AH |
= |
20h (v7.00) get ???
| Call: |
AL |
= |
index of ???
|
| Return: |
EDX |
= |
??? for specified ??? |
|
| AH |
= |
21h (v7.00) STACKS support
| Call: |
AL |
= |
| 00h |
= |
|
Return:
|
BX |
= |
??? (0060h for v7.00) |
| CX |
= |
number of stacks for hardware interrupts |
| DX |
= |
size of each stack in bytes |
| SI |
= |
??? (low and high bytes are separate values) |
| DI |
= |
??? (low and high bytes are separate values) low byte =
logical page number set by subfn 02h |
| ES |
= |
??? |
|
| 01h |
= |
| Call: |
EBX |
= |
???
|
| ECX |
= |
??? |
|
| 02h |
= |
| Call: |
BL |
= |
logical page number for ??? (00h-03h)
|
| Return: |
AH |
= |
status (00h,8Ah) |
|
|
|
| AH |
= |
22h (v7.00) call ??? for every load module
| Call: |
AL |
= |
which function to call
| 00h |
= |
call ??? |
| else |
- |
call ???? |
|
| Return: |
AH |
= |
00h |
| Note: |
If AL=00h, calls the protected-mode function
pointed at by the DWORD at offset 22h from the start of each
module installed by a LOAD= directive; if AL<>00h, it
calls the function pointed at by the DWORD at offset 28h of
the load module. |
|
| AH |
= |
23h (v7.00) ???
| Call: |
AL |
= |
subfunction
| 00h |
= |
00h set ???
| Call: |
BL |
= |
???
|
| Return: |
AH |
= |
00h or unchanged (depending on ???) |
|
| 01h |
= |
01h set ???
|
Call:
|
BL |
= |
???
|
| BH |
= |
??? |
| CX |
= |
??? |
| DX |
= |
??? (on top of stack) |
| Return: |
AH |
= |
status
| 00h |
= |
if successful |
| 8Fh |
= |
once table full |
|
| Note: |
This call adds one entry to an internal table
on each call, until the table is full. |
|
| 02h |
= |
02h get ???
| Call: |
CX |
= |
size of buffer
|
| ES:DI |
 |
buffer for ??? (60 bytes total data) |
| Return: |
CX |
= |
number of bytes actually returned |
| Note: |
Returns the array storing the values set with
AX=2301h.
Format of one entry in array:
| Offset |
Size |
Description |
| 00h |
BYTE |
??? (BL from subfn 01h) |
| 01h |
WORD |
??? (CX from subfn 01h) |
| 02h |
BYTE |
??? (BH from subfn 01h) |
| 03h |
WORD |
??? (DX from subfn 01h) |
|
|
| 03h |
= |
03h set ??? name/path
| Call: |
| ES:DI |
 |
buffer containing ASCIZ ??? |
|
| 04h |
= |
04h get ???
| Call: |
| ES:DI |
 |
buffer for ASCIZ ??? |
|
|
| Note: |
The ASCIZ string for subfunctions 03h and 04h
does not appear to be used by 386MAX, and may serve merely for
communication between two other Qualitas programs. |
|
| AH |
= |
24h (v7.00) high memory control
| Call: |
AL |
= |
subfunction
| 00h |
= |
get high memory state
| Return: |
BX |
= |
current state
| 00h |
= |
high memory removed from DOS memory chain |
| 01h |
= |
high memory included in DOS memory chain |
|
|
| 01h |
= |
set high memory state
| Return: |
BX |
= |
new state
| 00h |
= |
high memory removed from DOS memory chain |
| 01h |
= |
high memory included in DOS memory chain |
| else |
- |
| Return: |
??? (error, but return
varies according to ???) |
|
|
|
|
|
| AH |
= |
25h (v7.00) remove high RAM from DOS memory chain
|
| AH |
= |
26h (v7.00) ???
|
Call:
|
BX |
= |
???
|
| CX |
= |
??? |
| SI |
= |
??? |
| DI |
= |
??? |
|
Return:
|
AH |
= |
status |
| BX |
= |
??? |
| CX |
= |
??? |
|
| AH |
= |
27h (v7.00) ???
| Call: |
AL |
= |
subfunction
| 00h |
= |
get ???
| Return: |
BX |
= |
number of paragraphs for ??? |
|
| 01h |
= |
???
| Call: |
BX |
= |
???
|
| ES??? |
= |
??? |
|
| 02h |
= |
???
|
| 03h |
= |
???
|
Call:
|
CX |
= |
???
|
| DX |
= |
??? |
| ES??? |
= |
??? |
| Return: |
??? |
|
|
|
| AH |
= |
28h (v7.00) get ???
|
Return:
|
AH |
= |
status 00h (see #03648
at INT 67/AH=40h)
|
Return: |
CX |
= |
??? |
| DX |
= |
??? |
|
| AH |
= |
status 8Fh (see #03648
at INT 67/AH=40h) |
|
| AH |
= |
29h (v7.00) get ???
|
| AH |
= |
40h-5Dh EMS services (see INT 67/AH=40h, etc.)
|
| AH |
= |
DEh VCPI services (see INT 67/AX=DE00h, etc.)
|