[comp.sys.ibm.pc] Rational Sys. DOS Extender?

scott@hpausla.HP.COM (Scott Cameron) (04/26/89)

Does anyone have any details of the *DOS Extender* by Rational Systems Inc.
which is used by Lotus 123 3.0 (such as price, development tools, features,
or an address for Rational Systems)?  

I recall reading about this DOS Extender, but would like to know more about
it.  Thanks,

Scott Cameron
___________________________________________________________________
Hewlett-Packard Australian Software Operation (ASO)  //|  ___  ___ 
PO Box 439, Ringwood, Victoria, 3134, AUSTRALIA.    // | |    |   |
phone: Inter.+613 8791999, FAX: Inter.+613 8702169 //--| !--| |   |
                                                  //   | ___| |___|
HP-UX Mail:    scott@hpausla.hp.com              //
HPdesk: Scott Cameron/HPY200/UX    ACSnet address: scott@hpausla.oz

rdas@suntops.UUCP (Rob Das) (05/04/89)

In article <2050002@hpausla.HP.COM> scott@hpausla.HP.COM (Scott Cameron) writes:
>
>Does anyone have any details of the *DOS Extender* by Rational Systems Inc.
>which is used by Lotus 123 3.0 (such as price, development tools, features,
>or an address for Rational Systems)?  
 
We are using this extensively for a major network product.  I reccommend it
highly for **most** applications that need lots of memory.  In general, a
program such as a spreadsheet or database that is more *applications* oriented
is much easier to port to a protected mode / real mode environment.  A TSR or
heavy systems projects such as a network are much more difficult to port. 

DOS/16M (as it is called) provides several 
object files that are linked in with your Microsoft C code. It also provides
a "post linker" called 'makepm' that creates a protected mode version of
your executable.  A very nice source debugger is included.  It looks similar to 
a combination of codeview and perisope.  It only works on protected mode 
portions of your code.  I reccommend using both Rationals debugger and 
Periscope (for real mode portions). 

When you run your program, a minimum of 24K will still reside in real mode
memory space (below 1meg.).  This is their run-time kernel.  Memory can be
allocated in PM memory space or RM memory space.  It can also be allocated as
'transparent'.  This means that this memory can be both referenced by a PM
selector that has the same value as the phyisical address.  This allows both 
real mode and protected mode portions of the application to access the same
memory without converting a real mode segment to a selector. An example:

	For time critical stuff (like a real-time interrupt handler) you MUST
avoid the mode switching time on each interrupt.  It can take anywhere between
90 and 1100 microseconds to do a round trip from RM to PM and back again.
In this example you must implement a 'bi-modal' interrupt handler. You must
implement a handler in PM and another handler in RM.  Protected mode has it's 
own int vector table called the IDT.  Dos 16/M supports calls to do this type
of stuff.  It can get quite hairy with real-time systems stuff as you can see.

Here is a list of the functions that are provided in their interface:

Interrupt Handling Functions
----------------------------
D16IntTransparent -- Installs BIOS interrupt handler in a PM vector
D16Passdown -- Sets a protected-mode interrupt vector to pass down.
               (A passdown int, is one that is signaled in PM.  The system will
		then switch to RM and resignal the interrupt).
D16Passup -- Sets a real-mode interrupt vector to pass up. (The opposite of
 		pass-down)
D16pmGetVector -- Gets the selector and offset for a PM vector.
D16pmInstall -- Installs a PM vector
D16rmGetVector -- Gets the segment and offset for a RM interrupt vector
D16rmInstall -- Installs a RM vector
D16rmInterrupt -- Signals a real-mode interrupt and sets the registers

Memory Management Functions
---------------------------
D16AbsAddress -- Returns the absolute address of a PM pointer
D16ExtAvail - Returns bytes of extended memory available for allocation
D16GetAccess - Returns the access byte for a protected-mode pointer
D16HugeAlloc -- Allocates a block of memory (very large)
D16LowAvail -- Returns the number of bytes in largest block of DOS managed
		memory
D16MemAlloc -- Allocates a data segment
D16MemFree -- Frees a PM segment and cancels it's selector
D16MemStrategy -- Sets startegy used for memory allocation (ForceLow, ForceHi,
		(HiFirst, LowFirst, Transparent)
D16ProtectedPtr -- Creates a PM pointer from a RM pointer
D16RealPtr -- Creates a RM pointer from a PM pointer
D16SegAbsolute -- Creates a PM selector for a given address
D16SegCancel -- Cancels a PM selector
D16CSAlias -- Creates a selector of type CODE
D16SegDataPtr -- Creates a data selector whose base is offset of a given ptr.
D16SetProtect -- Specifies whether a segment is read-only or read/write
D16SegRealloc -- Compares segments allocation with current memory strategy
D16SegTransparent -- Returns a transparent pointer to a RM segment
D16SetAccess -- Sets the type or access byte for a PM segment.

Process Management Functions
----------------------------
D16MoveStack -- Switches the location of the cpu stack
D16rmCall -- Switches to real mode, loads registers from given structure
D16ToProtected -- Switches the cpu to protected mode
D16ToReal -- Switches the cpu to real mode, translates segment registers
_intflag -- Sets the cpu interrupts enabled flag
_is_pm -- Returns nonzero if cpu is in protected mode


  I could go on..and on... but I am running out of energy.  In general I am
very happy with the product.  The support from Rational Systems has been very
personal and very thorough.  Price:  I think you would need to talk to them
because they arrange different prices based on the volume of sales, source
code stuff, and other things.  I think $5000 + royalties sounds familier for
a typical arangement.  Please call them for a definitive price.

If you have any other questions, or any specific questions on this stuff feel
free to e-mail me @ rdas@tops.sun.com. 

raymond@ptolemy.arc.nasa.gov (Eric A. Raymond) (05/04/89)

Of course if your code is less than 640K (or whatever size your LOW
memory is), you can use a malloc which handles extended/expanded
memory for a LOT LESS HASSLE and $'s.

I beleive someone out there has some PD code.  There is also HEAP
EXTENDER which does all the above plus works with your disk too.


-- 
Eric A. Raymond  (raymond@ptolemy.arc.nasa.gov)
G7 C7 G7 G#7 G7 G+13 C7 GM7 Am7 Bm7 Bd7 Am7 C7 Do13 G7 C7 G7 D+13: Elmore James

cjeffery@arizona.edu (Clinton Jeffery) (05/04/89)

From an article, by raymond@ptolemy.arc.nasa.gov (Eric A. Raymond):
> Of course if your code is less than 640K (or whatever size your LOW
> memory is), you can use a malloc which handles extended/expanded
> memory for a LOT LESS HASSLE and $'s.

This statement is a bit naive.  There is no such thing as
a "malloc that handles extended/expanded memory" under MSDOS proper.
If you are willing to turn every memory ACCESS (read/write) into a
procedure call you can implement swapping using extended/expanded
memory (or disk) easily.  If you only need another 64K and have no other
application using extended memory you can directly address 64K of
the extended memory space from DOS (and simply never do any swapping).
If you have an AT you can get an (almost) real operating system which
breaks the 640K barrier.  If you write your application assuming file i/o
instead of memory then you can run as big a cache as you can afford and
most of the reads will be to memory.  But no malloc can "handle"
extended/expanded memory under normal MSDOS in the usual C fashion.
Correct me if I am wrong.
-- 
| Clint Jeffery, University of Arizona Department of Computer Science
| cjeffery@arizona.edu -or- {noao allegra}!arizona!cjeffery
--

barr@frog.UUCP (Chris Barr) (05/05/89)

In article <2050002@hpausla.HP.COM>, scott@hpausla.HP.COM (Scott Cameron) writes:
> or an address for Rational Systems)?  

Rational Systems, 220 N. Main St., Natick, MAssacusetts
tel: (508) 654-6194