home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
progjorn
/
pj_6_1.arc
/
CODE.EMM
< prev
next >
Wrap
Text File
|
1987-12-28
|
9KB
|
389 lines
(* TURBO PASCAL LIM 4.0 EXPANDED MEMORY CODING EXAMPLES *)
(*-------------------------------------------------------------------------*)
(* Most of the TYPE declarations in this listing are provided as Pascal *)
(* templates for data structures defined in the LIM 4.0 EMS specification. *)
(* Most of the function/procedure VAR parameters are declared as Turbo *)
(* Pascal untyped parameters due to the fact that the size of the data *)
(* structures will have to be determined dynamically at the time of the *)
(* function/procedure call. Note that this code is not a program, unit, *)
(* or other compilable structure and has not been tested in executable *)
(* form. Page 34 V6.1. Copyright 1987 John J. Newlin *)
TYPE
Str4 = string[4];
PartMapPtrType = ^integer;
HandleNameType = array[1..8] of char;
Regpack = record case integer of
1 : (ax,bx,cx,dx,bp,si,di,ds,es,flags:integer);
2 : (al,ah,bl,bh,cl,ch,dl,dh : byte);
end;
HandlePageRec = record
emm_handle,pages : integer;
end;
MapArrayType = array[0..255] of byte;
TargetAddrPtrType = ^integer;
MapArrayPtrType = ^integer;
MapJumpType = record
target_addr_ptr : TargetAddrPtrType;
map_length : byte;
map_array_ptr : MapArrayPtrType;
end;
MapCallType = record
target_addr_ptr : TargetAddrPtrType;
new_map_length : byte;
new_map_array_ptr : MapArrayPtrtype;
old_map_length : byte;
old_map_array_ptr : MapArrayPtrType;
reserved : array[1..4] of integer;
end;
LongIntType = Array[1..2] of integer;
SourceDestType = record
region_length : LongIntType;
source_mem_type : byte;
source_handle : integer;
source_init_offset : integer;
source_init_seg : integer;
dest_mem_type : byte;
dest_handle : integer;
dest_init_offset : integer;
dest_init_seg : integer;
end;
CONST
Emm = $67;
VAR
Regs : Regpack;
HandlePageArray : array[1..255] of HandlePageRec;
Function GetStatus : integer;
begin
Regs.ah := $40;
intr(Emm,Regs);
GetStatus := Regs.ah
end;
Function PageFrame : integer;
begin
Regs.ah := $41;
intr(Emm,Regs);
PageFrame := Regs.bx
end;
Function FreePages(var TotalPages : integer) : integer;
begin
Regs.ah := $42;
intr(Emm,Regs);
TotalPages := Regs.dx;
FreePages := Regs.bx;
end;
Procedure GetPages(var Handle,Pages : integer);
begin
Regs.ah := $43;
Regs.bx := Pages;
intr(Emm,Regs);
Handle := Regs.dx;
end;
Procedure MapPages(Handle,Logical,Physical : integer);
begin
Regs.ah := $44;
Regs.al := Physical;
Regs.bx := Logical;
Regs.dx := Handle;
intr(Emm,Regs);
end;
Procedure GivePages(Handle : integer);
begin
Regs.ah := $45;
Regs.dx := Handle;
intr(Emm,Regs);
end;
Function EmmVersion : str4;
var lobyte : byte;
s1,s2 : str4;
begin
Regs.ah := $46;
intr(Emm,Regs);
lobyte := Regs.al shl 4;
lobyte := lobyte shr 4;
str(Regs.al shr 4,s1);
str(lobyte,s2);
EmmVersion := s1 + '.' + s2;
end;
Procedure SavePageMap(Handle : integer);
begin
Regs.ah := $47;
Regs.dx := Handle;
intr(Emm,Regs);
end;
Procedure RestSaveMap(Handle : integer);
begin
Regs.ah := $48;
Regs.dx := Handle;
intr(Emm,Regs);
end;
Function HandleCount : integer;
begin
Regs.ah := $4B;
intr(Emm,Regs);
HandleCount := Regs.bx;
end;
Function HandlePages(Handle : integer) : integer;
begin
Regs.ah := $4C;
Regs.dx := Handle;
intr(Emm,Regs);
HandlePages := Regs.bx;
end;
Function GetAllHandles : integer;
begin
Regs.ah := $4D;
Regs.es := seg(HandlePageArray);
Regs.di := ofs(HandlePageArray);
intr(Emm,Regs);
GetAllHandles := Regs.bx;
end;
Procedure GetPageMap(var maparray);
begin
Regs.ax := $4E00;
Regs.es := seg(maparray);
Regs.di := ofs(maparray);
intr(Emm,Regs);
end;
Procedure SetPageMap(var maparray);
begin
Regs.ax := $4E01;
Regs.ds := seg(maparray);
Regs.si := ofs(maparray);
intr(Emm,Regs);
end;
Procedure GetSetMap(var getarray,setarray);
begin
Regs.ax := $4E02;
Regs.es := seg(getarray);
Regs.di := ofs(getarray);
Regs.ds := seg(setarray);
Regs.si := ofs(setarray);
intr(Emm,Regs);
end;
Function PageMapSize : integer;
begin
Regs.ax := $4E03;
intr(Emm,Regs);
PageMapSize := Regs.al;
end;
Procedure GetPartMap(var part_page_map,dest_array);
begin
Regs.ax := $4F00;
Regs.ds := seg(part_page_map);
Regs.si := ofs(part_page_map);
Regs.es := seg(dest_array);
Regs.di := ofs(dest_array);
intr(Emm,Regs);
end;
Procedure SetPartMap(var source_array);
begin
Regs.ax := $4F01;
Regs.ds := seg(source_array);
Regs.si := ofs(source_array);
intr(Emm,Regs);
end;
Function PartMapSize(pages : integer) : integer;
begin
Regs.ax := $4F02;
Regs.bx := pages;
intr(Emm,Regs);
PartMapSize := Regs.al;
end;
Procedure MapLogToPhys(var map_array; handle,map_array_len : integer);
begin
Regs.ax := $5000;
Regs.dx := handle;
Regs.cx := map_array_len;
Regs.ds := seg(map_array);
Regs.si := ofs(map_array);
intr(Emm,Regs);
end;
Procedure MapLogToSeg(var seg_array; handle,seg_array_len : integer);
begin
Regs.ax := $5001;
Regs.dx := handle;
Regs.cx := seg_array_len;
Regs.ds := seg(seg_array);
Regs.si := ofs(seg_array);
intr(Emm,Regs);
end;
Function ReAllocPages(handle,alloc_count : integer);
begin
Regs.ah := $51;
Regs.bx := alloc_count;
Regs.dx := handle;
intr(Emm,Regs);
ReAllocPages := Regs.bx;
end;
Function GetHandleAttr(handle : integer) : integer;
begin
Regs.ax := $5200;
Regs.dx := handle;
intr(Emm,Regs);
GetHandleAttr := regs.al;
end;
Procedure SetHandleAttr(handle,attr : integer);
begin
Regs.ax := $5201;
Regs.bl := attr;
Regs.dx := handle;
intr(Emm,Regs);
end;
Function GetAttr : integer;
begin
Regs.ax := $5202;
intr(Emm,Regs);
GetAttr := Regs.al;
end;
Procedure GetHandleName(handle : integer; var name : HandleNameType);
begin
Regs.ax := $5300;
Regs.dx := handle;
Regs.es := seg(name);
Regs.di := ofs(name);
intr(Emm,Regs);
end;
Procedure SetHandleName(handle : integer; var name : HandleNameType);
begin
Regs.ax := $5301;
Regs.dx := handle;
Regs.ds := seg(name);
Regs.si := ofs(name);
intr(Emm,Regs);
end;
Function GetHandleDir(var handle_dir) : integer;
begin
Regs.ax := $5400;
Regs.es := seg(handle_dir);
Regs.di := ofs(handle_dir);
intr(Emm,Regs);
GetHandleDir := Regs.al;
end;
Function GetHandleValue(var name : HandleNameType) : integer;
begin
Regs.ax := $5401;
Regs.ds := seg(name);
Regs.si := ofs(name);
intr(Emm,Regs);
GetHandleValue := Regs.dx;
end;
Function GetTotalHandles : integer;
begin
Regs.ax := $5402;
intr(Emm,Regs);
GetTotalHandles := Regs.bx;
end;
Procedure EmmJump(handle : integer; var map_jump_rec; page_selector : byte);
begin
Regs.ah := $55;
Regs.al := page_selector;
Regs.dx := handle;
Regs.ds := seg(map_jump_rec);
Regs.si := ofs(map_jump_rec);
intr(Emm,Regs);
end;
Procedure EmmCall(handle : integer; var map_call_rec; page_selector : byte);
begin
Regs.ah := $56;
Regs.al := page_selector;
Regs.dx := handle;
Regs.ds := seg(map_call_rec);
Regs.si := seg(map_call_rec);
intr(Emm,Regs);
end;
Function MapStackSize : integer;
begin
Regs.Ax := $5602;
intr(Emm,Regs);
MapStackSize := Regs.bx;
end;
Procedure MovMemRegion(var source_dest_rec);
begin
Regs.ax := $5700;
Regs.ds := seg(source_dest_rec);
Regs.si := ofs(source_dest_rec);
intr(Emm,Regs);
end;
Procedure ExcMemRegion(var source_dest_rec);
begin
Regs.ax := $5701;
Regs.ds := seg(source_dest_rec);
Regs.si := seg(source_dest_rec);
intr(Emm,Regs);
end;
Procedure PhysMapArray(var phys_map_array; var map_size : integer);
begin
Regs.ax := $5800;
Regs.es := seg(phys_map_array);
Regs.di := ofs(phys_map_array);
intr(Emm,Regs);
map_size := Regs.cx;
end;
Function PhysMapEntries : integer;
begin
Regs.ax := $5801;
intr(Emm,Regs);
PhysMapEntries := Regs.cx;
end;
Procedure PrepWarmBoot;
begin
Regs.ah := $5C;
intr(Emm,Regs);
end;