home *** CD-ROM | disk | FTP | other *** search
-
- (* 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;
-