;	XPRegCmd - XP register commands and service procedures
;	---------------------------------------------------------------
;	on entry:
;		esi -> XP module definition structure
;	===============================================================
;	XPUnregCmd - XP un-register commands
;	---------------------------------------------------------------
;	on entry:
;		esi -> XP module definition structure
;	===============================================================
;	XPRegTool - XP register screen tool service procedure
;	---------------------------------------------------------------
;	on entry:
;		esi -> Tool CTRL definition structure
;	===============================================================
;	XPRegESR - XP register std entity svc routine
;	---------------------------------------------------------------
;	on entry:
;		esi -> Entity SVC Procedure
;		eax = entity ID # 1..255
;	on exit:
;		The standard ESR for the specified entity has been
;		replaced by the one in the XP module
;	===============================================================
;	XPRegImport - Register XP Import Filter
;	---------------------------------------------------------------
;	This SVC must be called from the XP DllMain proc only.
;
;	On entry:
;		esi = adrs/rscid of file type description string (ANSIZ)
;		edi = adrs/rscid of file type "FCW",0 string (ANSIZ)
;		ebx = File Import Service Procedure
;	---------------------------------------------------------------
;	When the file import service procedure is called:
;		RSC_LoadFileName = file path & name to load
;		All existing InfoBlocks have been cleared
;		The Memory Drawing File Image is empty
;	On exit:
;		Carry is set if an error occurs, else clear
;	---------------------------------------------------------------
;	Translated entities are appended with SVC DFApnd,<offset EntRec>
;
;	RSC_LoadFileName has the .XXX file type set, the resulting
;	loaded drawing will be .FCW and is named in RSC_CurFileName
;
;	If there is a load error, make a message error box to inform
;	the user & return with Carry set. All appropriate post-proc
;	will be done. Leave no file handles open.
;	===============================================================
;	XPRegExport - Register XP Export Filter
;	---------------------------------------------------------------
;	This SVC must be called from the XP DllMain proc only.
;
;	On entry:
;		esi = adrs/rscid of file type description string (ANSIZ)
;		edi = adrs/rscid of file type "FCW",0 string (ANSIZ)
;		ebx = File Import Service Procedure
;	---------------------------------------------------------------
;	When the file export service procedure is called:
;		RSC_CurSaveName = file path & name to save
;		(RSC_CurSaveName has the .XXX file type set)
;		The Memory Drawing File Image is ready to save
;	On exit:
;		Carry is set if an error occurs, else clear
;	---------------------------------------------------------------
;	If there is a save error, make a message error box to inform
;	the user & return with Carry set. Leave no file handles open.
;	===============================================================
;	SVC XPMessage - Send Messages to XP Modules
;	---------------------------------------------------------------
;	Entry:	EAX = Message ID
;		EDX = XPID of Receiving module (0=broadcast)
;		ESI -> Parameter 1
;		EDI -> Parameter 2
;	===============================================================
GetVerAdr********** NOT FOUND ******
;	==============================================================
;	RedrawTools - Redraw all visible tool windows
;		      using ToolList to find them
;	===============================================================
;	AllocTool - Allocate Screen Space for a tool control
;	---------------------------------------------------------------
;	On entry:
;		eax = Take size, in pixels
;		ebx = TOOL structure to initialize/modify
;		esi -> CTRL structure (CTRL.hWin = handle var)
;		edi -> TAKE structure
;	---------------------------------------------------------------
;	If CTRL.hWin is <>0 then
;		1 - CTRL.IRec is used in place of EBX
;		1 - the control is resized/repositioned
;		    and then sent a PM_RESIZE message.
;		2 - Carry is set.
;	===============================================================
;	UpdateIRecs - Update Instance Record Ptrs in CTRLs
;	---------------------------------------------------------------
;	On entry:
;		ESI -> The instance record stack of TOOL records
;	===============================================================
;	CmdEnd: Prompt for command, direct input -> NewCmd
;	===============================================================
CmdEndFlush********** NOT FOUND ******
;	==============================================================
CmdEndRedraw********** NOT FOUND ******
;	==============================================================
;	SVC ExecProgram  - Start another pgm running
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ Commandline
;	On exit:
;		Carry clear if successfuly started
;	===============================================================
;	SVC ExecDoc  - Open program for a document
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ DocfilePathAndName
;	===============================================================
;	AllocMem - Allocate a block of Memory
;	---------------------------------------------------------------
;	On entry:
;		EAX = # bytes to allocate
;	On exit:
;		carry set if error
;		ESI = address of memory block
;	===============================================================
;	RelMem - Release a block of Memory
;	---------------------------------------------------------------
;	On entry:
;		ESI = address of memory block (0=ignored)
;	On exit:
;		carry set if error
;	===============================================================
;	ResizeMem - ReAllocate a block of Memory
;	---------------------------------------------------------------
;	On entry:
;		EAX = new total # bytes for memory block
;		ESI = old address of memory block
;	On exit:
;		carry set if error
;		ESI = new address of memory block
;	===============================================================
;	CloneMem - Clone a block of memory
;	---------------------------------------------------------------
;	On entry:
;		ESI -> existing block of memory;
;			its 1st 4 bytes are its length
;	On exit:
;		ESI -> clone of the memory block unless
;			carry set = unable to clone
;	===============================================================
;	InsertBytes - Move data up to make space in a memory range
;	---------------------------------------------------------------
;	On entry:
;		eax = current valid data size (# bytes)
;		      (length before added data)
;		ecx = # bytes to insert
;		esi -> block data starting address
;		edi -> insert starting at (data moved up)
;		Insert at current end of range is handled
;	On exit:
;		ecx = # bytes to insert
;		edi -> insert starting at (data moved up)
;	(setup to facilitate move data into space made available)
;	---------------------------------------------------------------
;	Note that this function makes no changes to memory allocation.
;	It is a convienience service to consolidate the logic needed
;	to prepare to insert data bytes within a memory range.
;	===============================================================
;	RemoveBytes - Move data down to remove space in a memory range
;	---------------------------------------------------------------
;	On entry:
;		eax = current valid data size (# bytes)
;		ecx = # bytes to remove
;		esi -> block data starting address
;		edi -> remove starting at (data moved down)
;		Remove from current end of range is handled
;	---------------------------------------------------------------
;	Note that this function makes no changes to memory allocation.
;	It is a convienience service to consolidate the logic needed
;	to remove data bytes from within a memory range.
;	===============================================================
;	ResizeBytes - Move data to add or remove space in a memory range
;	---------------------------------------------------------------
;	On entry:
;		eax = current valid data block size (# bytes)
;		ecx = # bytes to remove (<0) or insert (>0)
;		esi -> block data starting address
;		edi -> start of record within block
;		ebx = Current record length before resize
;	---------------------------------------------------------------
;		Add/Remove from current end of range is handled
;		Space is added or removed from the end of the record.
;	---------------------------------------------------------------
;	Note that this function makes no changes to memory allocation.
;	It is a convienience service to consolidate the logic needed
;	to resize records within a memory block range.
;	===============================================================
;	RscAdr2 - Point both ESI & EDI -> actual resource data (valid adrs)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Valid data address if >=0001.0000h
;		    else it is a resource id #
;		EDI -> Valid data address if >=0001.0000h
;		    else it is a resource id #
;	On exit:
;		ESI -> Valid data address always
;		EDI -> Valid data address always
;		All other registers unchanged except flags
;	===============================================================
;	RscAdr2 - Point both ESI & EDI -> actual resource data (valid adrs)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Valid data address if >=0001.0000h
;		    else it is a resource id #
;		EDI -> Valid data address if >=0001.0000h
;		    else it is a resource id #
;	On exit:
;		ESI -> Valid data address always
;		EDI -> Valid data address always
;		All other registers unchanged except flags
;	===============================================================
;	SetXPRscTbl - Set XP local resources
;	---------------------------------------------------------------
;	On entry:
;		EAX -> XP Local Resource Table
;	===============================================================
;	RMGetValue - Get Value Data from registry
;	---------------------------------------------------------------
;	On entry:
;		esi -> REGKEY packet
;	On exit:
;		Value data in packet has been updated
;	===============================================================
;	RMSetValue - Set Value Data into registry
;	---------------------------------------------------------------
;	On entry:
;		esi -> REGKEY packet
;	On exit:
;		Value data in packet has been updated
;	===============================================================
;	RMDelValue - Delete Value Data from registry
;	---------------------------------------------------------------
;	On entry:
;		esi -> REGKEY packet
;	On exit:
;		Value data in packet has been deleted
;	===============================================================
;	DevAskSize - Ask the Size of the current DC
;	---------------------------------------------------------------
;	On entry:
;		ESI -> RECT structure to get size data
;	On exit:
;		EAX = Text Line Height
;		EBX = 1 if maximized, 0 if not
;		ECX = Screen Resolution 0..3 (640/800/1024/1280)
;		EDX = Title Bar Bitmap Width
;		RECT structure has been set to current client RECT
;	-}-------------------------------------------------------------
;	DevGetState - Get information about current Device Context
;	---------------------------------------------------------------
;	On Exit:
;		EBX = device context handle (hDC)
;		EAX = device state flags:
;			DCS_PRINT	=	Now printing OR preview
;			DCS_XOR		=	Now in XOR mode
;			DCS_META	=	Now drawing to metafile
;			DCS_PREVIEW	=	Now print preview
;	=}=============================================================
;	DevInit - Initialize Device Context Management
;	-}-------------------------------------------------------------
;	DevNeedBrush - Need Brush in current color & style
;	-}-------------------------------------------------------------
;	DevNeedNBrush - Need NULL Brush (no fill)
;	-}-------------------------------------------------------------
;	DevNeedNPen - Need Null Pen (no outline on fills)
;	-}-------------------------------------------------------------
;	DevNeedPen - Need Pen in current color & style
;	=}=============================================================
;	DevNeedSBrush - Need Solid Brush in current color
;	-}-------------------------------------------------------------
;	DevNeedSPen - Need Solid Pen in current color, 1-pixel wide
;	-}-------------------------------------------------------------
;	DevTextColors - Specify colors for text drawing
;	---------------------------------------------------------------
;	On entry:
;		EAX = Desired Text Color # (0..18)
;		ECX = Desired Background color # (0..18)
;	=}=============================================================
;	DevUseBkColor - Specify Background Color for Drawing Tools
;	---------------------------------------------------------------
;	On entry:
;		EAX = Desired Color # (0..Color_Max)
;	Call before DevUseColor (it does the DevReTool needed)
;	=}=============================================================
;	DevUseColor - Specify Color for Drawing Tools
;	DevUseColorE - Specify Color for Drawing Entities
;			(saves color for Color_NoChg use)
;	---------------------------------------------------------------
;	On entry:
;		EAX = Desired Color # (0..Color_Max)
;		EAX = Color_NoChg = no change color
;	On exit:
;		EAX = COLORREF selected into DevU structure
;	=}=============================================================
;	DevUseColorE - Specify Color for Drawing Entities
;			(saves color for Color_NoChg use)
;	---------------------------------------------------------------
;	On entry:
;		EAX = Desired Color # (0..Color_Max)
;		EAX = Color_NoChg = no change color
;	On exit:
;		EAX = COLORREF selected into DevU structure
;	=}=============================================================
;	DevUseDraw - Start USE=DRAW Device Context
;	---------------------------------------------------------------
;	On entry:
;		ECX = Handle of window being drawn
;	On exit:
;		EAX = hDC for this use
;	=}=============================================================
;	DevUseFStyle - Specify Fill Style for Drawing Tools
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Fill Style BITMAP data
;			or 0=HOLLOW, 1=SOLID style
;	---------------------------------------------------------------
;	This call invalidates the current brush, forcing a fill
;	style change in the current DevU.hDC.
;	-}-------------------------------------------------------------
;	DevUseOwnerDraw - Start USE=DRAW of Dialog Owner Draw Control
;	---------------------------------------------------------------
;	On entry:
;		EDI -> DRAWITEMSTRUCT
;	=}=============================================================
;	DevUsePrint - Start USE=PRINT Device Context
;	---------------------------------------------------------------
;	On entry:
;		EAX = Print Device Context Handle
;	=}=============================================================
;	DevUsePrior - End Current Use & Restore Prior Device Context
;	-}-------------------------------------------------------------
;	DevUseRepaint - Start USE=REPAINT Device Context
;	---------------------------------------------------------------
;	On entry:
;		EAX = Repaint Device Context Handle
;		ECX = Handle of window being repainted
;	=}=============================================================
;	DevBrushBitmap - Create Bitmap from the current FStyle Brush
;	---------------------------------------------------------------
;	On exit:
;		eax = DevU.hDC compatible bitmap in current color
;	={=============================================================
;	DevUseBitmap - Start USE=Bitmap DRAW Device Context
;	---------------------------------------------------------------
;	On entry:
;		EAX = Bitmap hDC
;	=}=============================================================
;	DevSetColor - Set Specific RGB color value
;	---------------------------------------------------------------
;	On entry:
;		EAX = COLORREF 00BBGGRRh
;	==============================================================
GetPalAdr********** NOT FOUND ******
;	==============================================================
;	DevBitmap - Draw a bitmap in a rectangle
;	---------------------------------------------------------------
;	On entry:
;		ESI	: handle to the bitmap
;		EDI	: address of RECT structure
;	---------------------------------------------------------------
;	This will clip a bitmap to the rectangle without distortion.
;	The bitmap may not fill the rectangle if it is too small.
;	There is no scaling.
;	===============================================================
;	DevCText - Draw a line of prompt text centered in rect
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of ANSIZ text string/RSC
;		EDI	: address of RECT struct to center text
;	===============================================================
;	DevDipRect - Draw a slightly-sink rectangle frame (W95 style)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	=}=============================================================
;	DevFBitmap - Fit a bitmap in a rectangle (stretch to fit)
;	---------------------------------------------------------------
;	On entry:
;		ESI =  handle to the bitmap
;		EDI -> dest RECT structure
;		EBX -> Source rectangle
;	===============================================================
;	DevFileBitmap - Load a bitmap from .BMP file
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ bitmap file name string
;	On exit:
;		EAX = bitmap handle
;		carry set if error
;	===============================================================
;	DevFont - Specify new font for DevText,DevCText,DevVText
;	---------------------------------------------------------------
;	On entry:
;		eax = handle of new font to use
;	On exit:
;		eax = handle of prior font
;	===============================================================
;	DevFRect - Draw a filled rectangle with outline
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevGetBitmap - Load a bitmap from RSC of .EXE file or file
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ bitmap name string
;		if it contains a "." then bitmap is loaded from a file
;	On exit:
;		EAX = bitmap handle
;		JC = unable to load bitmap
;	===============================================================
;	DevGetDC - Get the current hDC in use (use win win API draws)
;	---------------------------------------------------------------
;	On exit:
;		eax = the current hDC to use in drawing
;	===============================================================
;	DevHRect - Draw a hollow rectangle
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevLine - Draw a line (styled)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevPoint - Draw a point
;	---------------------------------------------------------------
;	On entry:
;		ESI -> x,y draw at point
;	===============================================================
;	DevPRect - Draw a patterned rectangle with NO outline
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevRaiseRect - Draw a raised rectangle frame (W95 style)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	=}=============================================================
;	DevSBitmap - Stretch & Draw a bitmap to fit a rectangle
;	---------------------------------------------------------------
;	On entry:
;		ESI	: File Name String of .BMP file
;		EDI	: address of RECT structure
;	On exit:
;		carry set if error loading bitmap
;	---------------------------------------------------------------
;	This will distort the bitmap aspect ratio to match the
;	target rectangle.
;	===============================================================
;	DevSetDraw - Set current DC to DRAW mode
;	===============================================================
;	DevSetXOR - Set current DC to XOR mode
;	===============================================================
;	DevSinkRect - Draw a sink rectangle frame (W95 style)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	=}=============================================================
;	DevSInRect - Draw a solid-filled rectangle (inside a frame)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevSLine - Draw a Solid Line (1-pixel wide)
;	DevLine - Draw a line (styled)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevSRect - Draw a solid-filled rectangle
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of RECT structure
;	===============================================================
;	DevText - Draw a line of prompt text in rect (left-justified)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of ANSIZ text string/RSC
;		EDI	: address of RECT struct to center text
;	On return:
;		EAX = next X position
;		EDX = next Y position
;	===============================================================
;	DevTextAlign - Specify text alignment
;	---------------------------------------------------------------
;	On entry:
;		eax = text alignment
;	===============================================================
;	DevVText - Draw a line of text vertically-centered in rect
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of ANSIZ text string/RSC
;		EDI	: address of RECT struct to center text
;	===============================================================
;	DSText - Draw drawing text
;	Entry:	ESI-> ANSI-Z text string to draw
;		EDI-> RECT structure to center text
;		EAX = font handle
;	===============================================================
;	RelFileBitmap - Release a DevFileBitmap handle
;	---------------------------------------------------------------
;	On entry:
;		ESI = bitmap handle
;	===============================================================
;	DevCir - Draw a hollow circle with outline
;	===============================================================
;	On entry:
;		ESI,EDI = x,y center point
;		ECX     = radius in horizontal pixels
;	===============================================================
;	DevFCir - Draw a filled circle with outline
;	===============================================================
;	On entry:
;		ESI,EDI = x,y center point
;		ECX     = radius in horizontal pixels
;	===============================================================
;	DevTBitmap - Tile-fill a rectangle with a bitmap
;	---------------------------------------------------------------
;	On entry:
;		ESI	: handle to the bitmap
;		EDI	: address of RECT structure
;	===============================================================
;	DevXBitmap - Expand a bitmap to fill a rectangle (keep aspect)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: handle to the bitmap
;		EDI	: address of RECT structure
;	---------------------------------------------------------------
;	The bitmap will be scaled so that either height or width just
;	fits the rectangle, and the other fits inside the rectangle.
;	===============================================================
;	DevAskXOR - Ask if current DC is in XOR mode
;	===============================================================
;	DevMemBitmap - Load a bitmap from memory file image
;	---------------------------------------------------------------
;	On entry:
;		ESI -> BMP file image in memory
;		ECX = image size in bytes
;	On exit:
;		EAX = bitmap handle
;		carry set if error
;	===============================================================
;	DevSMemBitmap - Stretch & Draw a bitmap to fit a rectangle
;	---------------------------------------------------------------
;	On entry:
;		ESI-> Bitmap image in memory
;		ECX = Bitmap data size in bytes
;		EDI	: address of RECT structure
;	On exit:
;		carry set if error loading bitmap
;	---------------------------------------------------------------
;	This will distort the bitmap aspect ratio to match the
;	target rectangle.
;	===============================================================
;	DevFPoly - Draw a poly-polygon filled with current brush pattern
;		(as set by DevUseStyle), no outline.
;	---------------------------------------------------------------
;	Entry:	EDI -> dword integer x,y node list, already clipped
;		ESI -> dword integer list # of nodes for each poly
;		EAX = # of polygons
;	===============================================================
;	DevPolyLine - Draw polyline with solid pen
;	---------------------------------------------------------------
;	On entry:
;		esi -> dword integer x,y node list, already clipped
;		EAX = # of nodes
;	===============================================================
;	DevPolyLine - Draw polyline with solid pen
;	---------------------------------------------------------------
;	On entry:
;		esi -> dword integer x,y node list, already clipped
;		EAX = # of nodes
;	===============================================================
;	DevSPoly - Draw a poly-polygon with solid brush, no outline
;	---------------------------------------------------------------
;	Entry:	EDI -> dword integer x,y node list, already clipped
;		ESI -> dword integer list # of nodes for each poly
;		EAX = # of polygons
;	===============================================================
;	DevPolyClip - Make a poly-polygon clip region
;	---------------------------------------------------------------
;	Entry:	EDI -> dword integer x,y node list, already clipped
;		ESI -> dword integer list # of nodes for each poly
;		EAX = # of polygons
;		EDX = Routine to draw in clip rgn
;	===============================================================
;	ClearCursors - Remove cursors from all DWINs
;	---------------------------------------------------------------
;	This routine is called when cursor goes out of any DWIN
;	===============================================================
;	DrawCursors - Draw the current DWIN cursors
;	---------------------------------------------------------------
;	On entry:
;		esi = X draw at position
;		edi = Y draw at position
;		CsrType = Desired new cursor type
;		GeoDWAdr -> DWIN struc for window dig'd in.
;	---------------------------------------------------------------
;	The following is done for all DWINs:
;		The old cursor, if present, is undrawn.
;		The new cursor, is drawn unless CsrType=Csr_None
;	---------------------------------------------------------------
;	The drawing window cursor is considered a program-wide multi-
;	window resource, its state maintained by CSRMGR from global
;	variables. This works because in fact, there is only one on-
;	screen DWIN cursor at any one time. The rest of the program is
;	responsible the validity of this.
;	===============================================================
;	DynTrak - Track attributes of idealized object during dyn csr
;	---------------------------------------------------------------
;	Entry:
;		esi,edi = cursor pixel position
;		8087 = RealX,Y cursor position
;	Exit:
;		EDI->DYNPACK struct containing idealized object data
;	===============================================================
;	InitDynTrak - Initialize idealized object for DYNTRAK
;
;	Entry:	8087:	X,Y,Scale,Incl
;		AL:	allowed operations
;		AH:	default operation flag
;	===============================================================
;	NewCsrOrg - Change Origin of DWIN cursor
;	---------------------------------------------------------------
;	On entry:
;		8087 = OrgX, OrgY (tos)
;	On exit:
;		No registers changed, point removed from 8087
;	===============================================================
;	NewCsrOrg3 - Change Origin of DWIN 3d cursor
;	---------------------------------------------------------------
;	On entry:
;		8087 = OrgX, OrgY, OrgZ (tos)
;	On exit:
;		No registers changed, point removed from 8087
;	===============================================================
;	NewCsrType - Change type of DWIN cursor in use & draw cursors
;	---------------------------------------------------------------
;	On entry:
;		eax = New CsrTpe value Csr_XXXX
;	===============================================================
;	NewCsrVec3 - Set Direction Vector Point of DWIN 3d cursor
;	---------------------------------------------------------------
;	On entry:
;		8087 = VecX, VecY, VecZ (tos)
;	On exit:
;		No registers changed, point removed from 8087
;	===============================================================
;	ReCursor - Force Redraw of Cursor at Current Position
;	===============================================================
;	ContextSave/ContextRestore
;	===============================================================
ContextRestore********** NOT FOUND ******
;	==============================================================
;	StatusMsg - Display string in status bar tracking button
;	---------------------------------------------------------------
;	On entry:
;		esi -> ANSIZ message string text/rscid
;		esi = 0 ends status message display
;	---------------------------------------------------------------
;	Dig click on tracking button to resume tracking display
;	===============================================================
;	SVC BitClear - Clear Selected Bit in a bit string (multi-byte)
;	---------------------------------------------------------------
;	On entry:
;		EAX = Bit # 0..N-1
;		ESI = Bit String Starting Address
;	===============================================================
;	SVC BitInv - Invert Selected Bit in a bit string (multi-byte)
;	---------------------------------------------------------------
;	On entry:
;		EAX = Bit # 0..N-1
;		ESI = Bit String Starting Address
;	===============================================================
;	SVC BitSet - Set Selected Bit in a bit string (multi-byte)
;	---------------------------------------------------------------
;	On entry:
;		EAX = Bit # 0..N-1
;		ESI = Bit String Starting Address
;	===============================================================
;	SVC BitTest - Test Selected Bit in a bit string (multi-byte)
;	---------------------------------------------------------------
;	On entry:
;		EAX = Bit # 0..N-1
;		ESI = Bit String Starting Address
;	On exit:
;		JNZ if bit was set, JZ if clear
;	===============================================================
;	SVC DIndexAdd - lookup word in dynamic index, add if not found
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Argument string/RSC (what to find)
;			(this is converted to uppercase)
;		EDI -> DINDEX structure for an initialized DINDEX
;	On exit:
;		If a match is found or argument appended:
;			EBX = Index number 1..N
;			Carry flag is clear
;		If not able to add to table:
;			EBX = 0
;			Carry flag is set
;	===============================================================
;	SVC DIndexApnd - append text to end of dynamic index (no lookup)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Argument string/RSC (what to find)
;			(this is converted to uppercase)
;		EDI -> DINDEX structure for an initialized DINDEX
;	On exit:
;		Carry flag set if unable to append
;	===============================================================
;	DIndexInit - Initialize Empty Dynamic Index
;	---------------------------------------------------------------
;	On entry:
;		ESI -> DINDEX structure
;	===============================================================
;	DIndexRel - Release Dynamic Index
;	---------------------------------------------------------------
;	On entry:
;		ESI -> DINDEX structure
;	===============================================================
;	SVC Index - lookup word in wordlist
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Argument string/RSC (what to find)
;			(this is converted to uppercase)
;		EDI -> Table list of ANSIZ strings/RSC, ended with NULL stg
;			(this table nust already be uppercase)
;	On exit:
;		If a match is found:
;			EBX = Index number 1..N
;			Carry flag is clear
;		If not:	
;			EBX = 0
;			ECX = Next Index number for adding
;			EDI -> end of list 00h byte (apnd start posn)
;			Carry flag is set
;	===============================================================
;	SVC IndexAdd - lookup word in wordlist, add if not found
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Argument string/RSC (what to find)
;			(this is converted to uppercase)
;		EDI -> Table list of ANSIZ strings/RSC, ended with NULL stg
;			(this table nust already be uppercase)
;		ECX -> Maximum # bytes in table list
;	On exit:
;		If a match is found or argument appended:
;			EBX = Index number 1..N
;			Carry flag is clear
;		If not able to add to table:
;			EBX = 0
;			Carry flag is set
;	===============================================================
;	IndexFind
;	---------------------------------------------------------------
;	On entry:
;		EAX = Item ID # (0..MaxItem-1)
;		ESI -> Table list of ANSIZ strings/RSC, ended with NULL stg
;			(this table nust already be uppercase)
;	On exit:
;		ESI -> ANSIZ argument string to find
;		Carry set if ID not defined
;	===============================================================
;	SVC IndexRep - Replace word in index list
;	---------------------------------------------------------------
;	On entry:
;		EAX = Item ID # (0..MaxItem-1) to replace
;		ESI -> Argument string/RSC (what to replace with)
;			(this is converted to uppercase)
;		EDI -> Table list of ANSIZ strings/RSC, ended with NULL stg
;			(this table nust already be uppercase)
;		ECX -> Maximum # bytes in table list
;	On exit:
;		Carry flag is set if unable to replace
;	===============================================================
;	IndexRmv - Remove entry from an index table
;	---------------------------------------------------------------
;	On entry:
;		EAX = Item ID # (0..MaxItem-1)
;		ESI -> Table list of ANSIZ strings/RSC, ended with NULL stg
;			(this table nust already be uppercase)
;	On exit:
;		Carry set if ID not defined
;	===============================================================
;	SVC StApnd - Append ANSIZ string
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Source string/RSC
;		EDI -> Destination string/RSC
;	On exit:
;		ECX = # characters in the string
;		EDI -> Destination EOS byte
;	===============================================================
;	SVC StComp - Compare ANSIZ strings (case-insensitive)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Source string/RSC
;		EDI -> Destination string/RSC
;	On exit:
;		Carry set if strings match
;	===============================================================
;	SVC StCopy - Copy ANSIZ string
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Source string/RSC
;		EDI -> Destination string/RSC
;	On exit:
;		ECX = # characters in the string
;		EDI -> Destination EOS byte
;	===============================================================
;	SVC StType - Append or Replace .TYP ANSIZ string
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Source string/RSC (".TYP",0)
;		EDI -> Destination string/RSC
;	On exit:
;		EDI -> Destination EOS byte
;	===============================================================
;	SVC StUCase - Convert ANSIZ string to upper case
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ string to convert in place
;	===============================================================
;	SVC FltrApnd - Append entry to a file open filter list
;	---------------------------------------------------------------
;	On entry:
;		esi -> Description string
;		edi -> file type string "FCW",0
;		ebx -> Filter list
;	===============================================================
;	SVC StCompN - Compare ANSI strings (case-insensitive) by count
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Source string/RSC
;		EDI -> Destination string/RSC
;		ECX = # characters to compare
;	On exit:
;		Carry set if strings match
;	===============================================================
;	StMatch - Match Pattern in String
;	---------------------------------------------------------------
;	On entry:
;		ESI -> pattern string
;		 * = zero or more characters may be skipped to match
;		 ? = any character matches
;		 case ignored
;		EDI -> test against this string
;		 case ignored
;	On exit:
;		EAX = 0, carry clear, if pattern doesn't match
;		EAX = 1, carry set, if pattern does match
;	===============================================================
FindFNTyp********** NOT FOUND ******
;	==============================================================
;	SVC StCopyCR - Copy ANSIZ string (may end with CR/LF or EOS)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Source string/RSC
;		EDI -> Destination string/RSC
;	On exit:
;		ECX = # characters in the string
;		ESI -> Source delimiter (CR or EOS)
;		EDI -> Destination EOS byte
;	===============================================================
;	SVC FClose - Close a file
;	---------------------------------------------------------------
;	On entry:
;		EAX = file handle
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	SVC FCopy - Make a copy of a file
;	---------------------------------------------------------------
;	On entry:
;		ESI = existing file path/rscid
;		EDI = desired new file path/rscid
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	SVC FCreate - Create and open a file
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ file name string/rscid
;	On exit:
;		carry set if an error occurs, else:
;		EAX = file handle
;	===============================================================
;	SVC FDelete - Delete a file
;	---------------------------------------------------------------
;	On entry:
;		ESI = existing file path/rscid
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	SVC FMove - Move/Rename file
;	---------------------------------------------------------------
;	On entry:
;		ESI = existing file path/rscid
;		EDI = desired new file path/rscid
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	SVC FOpen - Open a file that must exist for read/write
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ file name string/rscid
;	On exit:
;		carry set if an error occurs, else:
;		EAX = file handle
;	===============================================================
;	SVC FOpenRO - Open a file that must exist for read only
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ file name string/rscid
;	On exit:
;		carry set if an error occurs, else:
;		EAX = file handle
;	===============================================================
;	SVC FRead - Read data from a file
;	---------------------------------------------------------------
;	On entry:
;		EAX = file handle
;		ECX = # bytes to read
;		ESI = data starting address
;	On exit:
;		EAX = # bytes actually read
;		carry set if an error occurs
;	===============================================================
;	SVC FSeek - Seek file to position
;	---------------------------------------------------------------
;	On entry:
;		EAX = file handle
;		ECX = # bytes from start of file
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	SVC FSize - Ask file size
;	---------------------------------------------------------------
;	On entry:
;		EAX = file handle
;	On exit:
;		EAX = File Size in Bytes
;		carry set if an error occurs
;	===============================================================
;	FullFileName - Convert file name to full drive:path\name.typ
;	---------------------------------------------------------------
;	On entry:
;		ESI -> source file name/rscid
;		EDI -> destination file name/rscid
;		ESI can = EDI
;	On exit:
;		EAX -> name only part in EDI buffer
;		carry set if an error occurs (NULL string)
;	===============================================================
;	SVC FWrite - Write data to a file
;	---------------------------------------------------------------
;	On entry:
;		EAX = file handle
;		ECX = # bytes to write
;		ESI = data starting address
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	GetOurPath - Get path to FCW32.EXE into RSC_OurPath
;	---------------------------------------------------------------
;	On exit:
;		RSC_OurPath contains our load path ending with \ NULL
;	===============================================================
;	SVC LoadFile - Load a specified file into a fixed-memory image
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ file name string/RSCID for file name
;	On exit:
;		EAX = Memory image pointer/handle
;		ECX = Memory image size in bytes
;		(a 1-byte 00 null has been appended but NOT
;		 included in the count)
;		(SVC RelMem,mPtr to release)
;		carry set if error
;	===============================================================
;	SVC SaveFile - Save a specified file from a fixed-memory image
;	---------------------------------------------------------------
;	On entry:
;		ESI -> file image data buffer
;		EDI -> ANSIZ file name string/RSCID for file name
;		ECX =  # bytes in image
;	On exit:
;		carry set if error
;	=}=============================================================
;	SplitFileName - Split file name into path and file name strings
;	---------------------------------------------------------------
;	On entry:
;		ESI -> source file name/rscid
;		EDI -> destination file name/rscid
;	On exit:
;		Source string truncated after last \ or :
;		Dest string contains only chars after last \ or :
;		EBX -> new eos byte of path string (source)
;	===============================================================
;	CopyFilePath - Copy path name from a full file name
;	---------------------------------------------------------------
;	On entry:
;		ESI -> source file path & name/rscid
;		EDI -> destination file path/rscid
;	On exit:
;		EBX -> Destination EOS address
;		Destination string NULL if no path specified.
;	===============================================================
;	GetWinPath - Get path to windows directory
;	---------------------------------------------------------------
;	On entry:
;		ESI -> buffer\RSCID to hold path
;	===============================================================
;	SVC CreateDir
;	---------------------------------------------------------------
;	On entry:
;		ESI->Drive:\Path ANSIZ string\RSCID
;	On exit:
;		carry set if an error occurs
;	===============================================================
;	FExist - Does File Exist?
;	---------------------------------------------------------------
;	On entry:
;		ESI -> File Name String
;	On exit:
;		Carry set if file does NOT exist
;	===============================================================
;	FileTypeAdr - Scan file name for last . or eos
;	---------------------------------------------------------------
;	On entry:
;		ESI -> file path\name.typ string or RSC
;	On exit:
;		ESI -> the . of the .TYP string or the EOS byte
;		Carry set if no . after the file name
;		Only registers ESI, Flags, and AL have been changed.
;	---------------------------------------------------------------
;	This routine properly ignores "."s in the directory path
;	===============================================================
;	MakeRelPath - Change path\name to $ relative path
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Drawing file\path name or rscid
;		EDI -> Filename or rscid to change
;	On exit:
;		Carry clear if both paths matched, and EDI path
;		was replaced with $, else carry set.
;	---------------------------------------------------------------
;	If the two files have the same path name, the EDI filename
;	is changed to be $filename with no path explicitly stated.
;	This is for filenames that will later be processed by
;	SVC FullFileName, and allows files related to the current
;	drawing to "follow" it in a move without editing a stored
;	filename value.
;	===============================================================
;	RListInit - Initialize Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;		ECX =  max # of bytes in RList
;	Exit:	Carry SET if unable to initialize (not enough memory)
;	===============================================================
;	RListEnd - End Using Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;	===============================================================
;	RListAdd - Add Space for (pushed) Record to Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;		ECX =  # bytes in new record to create & add
;	Exit:	Carry SET if unable to add
;		EDI -> new record location (=length dword adrs)
;	===============================================================
;	RListIns - Insert Record into Record List 
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;		EDI -> Record to insert
;		EBX -> position in list data to insert record
;			for list:  before (closer to Start) ebx recd
;			for stack: before (closer to TOS) ebx recd
;	Exit:	Carry SET if unable to insert (no room or invalid position)
;			Jumps to RListPush if EBX at/above EOL (for List) 
;			or at/below TOS (for Stack) 
;	===============================================================
;	RListPop - Pop (discard) TOS Record of Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;	Exit:	Carry SET if unable to pop (empty)
;	===============================================================
;	RListPush - Push Record to Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;		EDI -> Record to push
;	Exit:	Carry SET if unable to push
;	===============================================================
;	RListRmv - Remove Record from Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;		EBX = position in list of record to remove (AtAdr)
;	Exit:	Carry SET if unable to remove (empty or invalid record)
;	===============================================================
;	RListSize - Change Size of Record in Record List
;	---------------------------------------------------------------
;	Entry:	ESI -> Record List Structure
;		EBX = position in list of record to change
;		ECX =  max # of bytes in revised record
;	Exit:	EDI -> changed record
;		Carry set if unable to change
;	===============================================================
;	ReqData - Request data assembly
;	---------------------------------------------------------------
;	Entry:	ESI -> RDATA structure for request
;	    	EBX = optional base address for parameters with FT_EBX set
;	AbortSel - Selection cancelled or aborted - unselect all
;	---------------------------------------------------------------
;	ClearSel - Clear All Selection bits
;	---------------------------------------------------------------
;	GetOpenFN - Get open file name
;	---------------------------------------------------------------
;	On entry:
;		esi -> box title string /RSCID
;		edi -> GETFN data structure
;	On exit:
;		Carry set if no valid name entered
;	===============================================================
;	GetSaveFN - Get save file name
;	---------------------------------------------------------------
;	On entry:
;		esi -> box title string /RSCID
;		edi -> GETFN data structure
;	On exit:
;		Carry set if no valid name entered
;	===============================================================
GetOpenFND********** NOT FOUND ******
;	==============================================================
GetSaveFND********** NOT FOUND ******
;	==============================================================
;	GetOpenPath - Get open path name
;	---------------------------------------------------------------
;	On entry:
;		esi -> box title string /RSCID
;		edi -> GETFN data structure
;	On exit:
;		Carry set if no valid name entered
;	===============================================================
;	GetSavePath - Get save path name
;	---------------------------------------------------------------
;	On entry:
;		esi -> box title string /RSCID
;		edi -> GETFN data structure
;	On exit:
;		Carry set if no valid name entered
;	===============================================================
;	FormSt - String Formating
;	---------------------------------------------------------------
;	On entry:
;
;	    ESI =  address of edit packet:
;		dword	string address or resource ID for pattern
;		ItemFmt	Variable|RSC,DataType,Justify,FWidth,NDecP
;		.....	(as many format items as needed !01..!nn)
;
;		If ESI is an RSCID then it will be stored
;		locally and that address used as the packet address.
;		Note that tis does not allow ItemFmts to follow!
;
;	    EDI = Destination Address or Std Destination ID
;		= FD_MsgBox to display output in a message box, etc
;		= FD_Prompt to display in the prompt bar
;		= FD_TxWin to display in selected text window
;
;	    EBX = optional base address for parameters with FT_EBX set
;
;	On exit: (for message box Std Destinations only)
;	   EAX = button ID user selected to close message box
;	=}=============================================================
;	SetDecP - specify # decimal places for subsequent output
;		when # dec pl specified in ItemFmt = FDP_User
;	---------------------------------------------------------------
;	Entry: AL = desired places 0-9
;	Exit: AL = prior setting
;	===============================================================
;	SetDFmt - specify distance format for subsequent FormDS output
;	---------------------------------------------------------------
;	Entry: AL = desired format #
;	Exit: AL = prior format
;	===============================================================
;	SetDimDecP - specify # decimal places for dimension use
;		when DecPl in format pkt = FDP_Dim
;	---------------------------------------------------------------
;	Entry: AL = desired places 0-9
;	Exit: AL = prior setting
;	===============================================================
;	SetLeftMargin - EAX = # blanks to pad on left for each line
;	===============================================================
AddCmbStr********** NOT FOUND ******
;	==============================================================
AddLstStr********** NOT FOUND ******
;	==============================================================
ClrCmbStr********** NOT FOUND ******
;	==============================================================
ClrDefBtn********** NOT FOUND ******
;	==============================================================
ClrLstStr********** NOT FOUND ******
;	==============================================================
;	Dlog - display a modal dialog box
;	---------------------------------------------------------------
;	On entry:
;		esi	: address of DLG structure
;		ebx	: FT_EBX parm value (optional)
;	On Exit:
;		eax=ID of button used to quit dialog
;		eax=IDCANCEL if close picked from the system menu
;		Carry set if not IDOK
;	===============================================================
DsAbCtl********** NOT FOUND ******
;	==============================================================
EnAbCtl********** NOT FOUND ******
;	==============================================================
FndCmbStr********** NOT FOUND ******
;	==============================================================
FndLstStr********** NOT FOUND ******
;	==============================================================
FocusCtl********** NOT FOUND ******
;	==============================================================
GetCmbStr********** NOT FOUND ******
;	==============================================================
GetCmbStrN********** NOT FOUND ******
;	==============================================================
;	GetDlgWin - Get current dialog window handle
;		(use when a callback procedure needs dialog's 
;		window -- for example to invoke common dialog nested
;		in FastCAD dialog.)
;	---------------------------------------------------------------
;	On Exit:
;		Dialog box handle in eax
;	===============================================================
GetLstDta********** NOT FOUND ******
;	==============================================================
GetLstStr********** NOT FOUND ******
;	==============================================================
GetLstStrN********** NOT FOUND ******
;	==============================================================
HideCtl********** NOT FOUND ******
;	==============================================================
RstCmbStr********** NOT FOUND ******
;	==============================================================
RstLstStr********** NOT FOUND ******
;	==============================================================
SelEdCtl********** NOT FOUND ******
;	==============================================================
SetCtlText********** NOT FOUND ******
;	==============================================================
SetDefBtn********** NOT FOUND ******
;	==============================================================
SetDlgTitle********** NOT FOUND ******
;	==============================================================
SetLstDta********** NOT FOUND ******
;	==============================================================
ShowCtl********** NOT FOUND ******
;	==============================================================
UpdCtl********** NOT FOUND ******
;	==============================================================
UpdCtlA********** NOT FOUND ******
;	==============================================================
;	XPDlog - display a modal dialog box
;	---------------------------------------------------------------
;	On entry:
;		esi	: address of DLG structure
;		edi	: module handle for XP resources
;		ebx	: FT_EBX parm value (optional)
;	On Exit:
;		eax=ID of button used to quit dialog
;		eax=IDCANCEL if close picked from the system menu
;		Carry set if not IDOK
;	===============================================================
SetCmbDta********** NOT FOUND ******
;	==============================================================
GetCmbDta********** NOT FOUND ******
;	==============================================================
;	SetDlgOwner - Specify owner window for next dialog
;	---------------------------------------------------------------
;	On entry:
;		esi	: handle of owner window
;	===============================================================
GetLstMSel********** NOT FOUND ******
;	==============================================================
;	InfoBox:  Message with Information icon (asterisk)
;	WarnBox:  Message with Warning Icon (exclamation)
;	ErrorBox: Message with Error icon (stopsign/hand)	
;	---------------------------------------------------------------
;	Entry: 	esi -> message text /rscid
;	===============================================================
;	WarnBox:  Message with Warning Icon (exclamation)
;	ErrorBox: Message with Error icon (stopsign/hand)	
;	---------------------------------------------------------------
;	Entry: 	esi -> message text /rscid
;	===============================================================
;	ErrorBox: Message with Error icon (stopsign/hand)	
;	---------------------------------------------------------------
;	Entry: 	esi -> message text /rscid
;	===============================================================
;	QuestBox:   Message with Question icon, yes/no buttons
;	CancelBox:  Message with Question icon, yes/no/cancel
;	RetryBox:   Message with Warning icon, cancel/retry buttons	
;	---------------------------------------------------------------
;	Entry: 	esi -> message text /rscid
;	Exit:	eax = ID of button returned by the message dialog 
;	===============================================================
;	CancelBox:  Message with Question icon, yes/no/cancel
;	RetryBox:   Message with Warning icon, cancel/retry buttons	
;	---------------------------------------------------------------
;	Entry: 	esi -> message text /rscid
;	Exit:	eax = ID of button returned by the message dialog 
;	===============================================================
;	RetryBox:   Message with Warning icon, cancel/retry buttons	
;	---------------------------------------------------------------
;	Entry: 	esi -> message text /rscid
;	Exit:	eax = ID of button returned by the message dialog 
;	===============================================================
;	MsgBox - Displays message text in a message box (no icon)
;	---------------------------------------------------------------
;	On entry:
;		esi -> message text /rscid
;		edi -> message box title /rscid
;	===============================================================
;	SVC TEdit - Text editor pre-defined dialog
;
;	On Entry:
;		esi->TDLG packet (see dialog.cpy)
;
;	On Exit:
;		CY=Cancel
;	===============================================================
ChkAccelKeyC********** NOT FOUND ******
;	==============================================================
ChkAccelKeyF********** NOT FOUND ******
;	==============================================================
GetAccKeyAdr********** NOT FOUND ******
;	==============================================================
;	LoadMenuFile - Load a specified menu file
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ASIZ menu file name/rscid
;	On exit:
;		Carry set if unable to load - std menu reloaded
;	===============================================================
;	AddMenu - Append A Menu Image to Main Menu File Image
;	---------------------------------------------------------------
;	On entry:
;		esi -> Menu Image to Append
;	---------------------------------------------------------------
;	This service can only be safely called during processing
;	of an XPM_AddMenu XP Message.
;	===============================================================
;	GetMenuMarker - Get Marker Data
;	---------------------------------------------------------------
;	On entry:
;		eax = marker id # 1..nMarker
;	On exit:
;		eax = hMarker popup menu handle
;		edx = item # preceding marker
;	===============================================================
;	SetMarkerCmd - Insert Menu Command at Marker
;	---------------------------------------------------------------
;	On entry:
;		eax = marker id # 1..nMarker
;		ecx = item offset from marker (normally 0)
;		esi -> Menu Text String
;		edi -> Callback Procedure for command execution
;	On exit:
;		eax = new command id value
;	---------------------------------------------------------------
;	This SVC should only be called in response to an XPM_SetMarkers
;	message.
;	===============================================================
;	SetMarkerText - Change Menu Command Text at Marker
;	---------------------------------------------------------------
;	On entry:
;		eax = marker id # 1..nMarker
;		ecx = item offset from marker (normally 0)
;		esi -> New Menu Text String
;		edi = Command id value (returned by SetMarkerCmd)
;	===============================================================
;	SetMarkerCheck - Check/Uncheck Menu Item at Marker
;	---------------------------------------------------------------
;	On entry:
;		eax = marker id # 1..nMarker
;		ecx = item offset from marker (normally 0)
;		esi = 1 to check, 0 to uncheck
;	===============================================================
;	AbortAllScripts - Abort all running scripts
;	===============================================================
;	AbortScript - Abort the top running script
;	===============================================================
;	ChkAbortScript - Abort top script if it is in specified range
;	---------------------------------------------------------------
;	On entry:
;		esi = Memory image start
;		ecx = Memory image size
;	On exit:
;		If there is a currently running script,
;		and it is within the specified range,
;		then it is aborted. (1 level only)
;
;	This is used to allow a menu script to load new menus.
;	===============================================================
;	ExecScriptFile - Load & run script file
;	---------------------------------------------------------------
;	On entry:
;		ESI = adrs of ANSIZ file string or RSCID
;	===============================================================
;	ExecScriptMem - Run script string between memory limits
;	---------------------------------------------------------------
;	On entry:
;		ESI = start adrs of script string
;		EDI = end adrs of script string
;	===============================================================
;	ExecScriptStg - Run script string from memory
;	---------------------------------------------------------------
;	On entry:
;		ESI = adrs of ANSIZ script string
;	===============================================================
;	SVC AskScript - Any Script Currently Running?
;	---------------------------------------------------------------
;	On exit:
;		Carry Set and EAX = 1 if a script is running,
;		else Carry Clear and EAX = 0
;	===============================================================
;	ExecScriptCopy - Run copy of script string from memory
;	---------------------------------------------------------------
;	On entry:
;		ESI = adrs of ANSIZ script string
;	===============================================================
;	SetScriptsDone - ESI -> callback for all scripts completed
;		esi = 0 to stop callback
;	===============================================================
;	SVC IScan - Scan integer from input
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of dword string scan pointer
;			  Points to current posn to scan in ASCIIZ string
;	On exit:
;		ESI	: address of dword string scan pointer
;			  Points after delimiter if valid input
;			  (if delim=eos, points at the eos)
;			  Unchanged if no valid input
;		EAX	: dword value input
;		EBX	: delimiting key value
;		Carry	: set if no valid numeric term entered
;	===============================================================
;	SVC LScan - Scan Label-name from input
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of dword string scan pointer
;			  Points to current posn to scan in ASCIIZ string
;		EDI	; address of dword destination store ptr
;	On exit:
;		ESI	: address of dword string scan pointer
;			  Points after delimiter if valid input
;			  (if delim=eos, points at the eos)
;			  Unchanged if no valid input
;		EBX	: delimiting key value
;		ECX	: # characters in returned string
;		Carry	: set if no valid label was entered
;		EDI	; address of dword destination store ptr (unchanged)
;	===============================================================
;	SVC RScan - Scan real value from input
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of dword string scan pointer
;			  Points to current posn to scan in ASCIIZ string
;	On exit:
;		ESI	: address of dword string scan pointer
;			  Points after delimiter if valid input
;			  (if delim=eos, points at the eos)
;			  Unchanged if no valid input
;		8087 tos: dword value input
;		EBX	: delimiting key value
;		Carry	: set if no valid numeric term entered
;	===============================================================
;	SVC TenTo - Raise 8087 tos to AL power of 10
;	---------------------------------------------------------------
;	Entry:	AX = exponent
;	ExpScan - Algebraic expression parsing for real values
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Scan pointer, already set to start of expr scan
;	On Exit:
;		JC set if error in expression, else clear
;		Resulting value on 8087 tos
;		EBX = delimiter key value
;		ESI -> Scan pointer, points past delimiter
;			unless NULL, then points at delimiter	
;	===============================================================
;	ACOS - return arc cosine of 8087 tos on tos
;
;	ACOS(x)=-asin(x)+pi/2
;	----------------------------------------------------------------
;
;	ASIN - return arc sine of 8087 tos on tos
;
;	ASIN(x)=atan(x/sqrt(-x*x+1.0))
;	----------------------------------------------------------------
;
;	ATAN - return arc tangent of 8087 TOS in 8087 TOS
;	----------------------------------------------------------------
;
;	ATAN2 - return arc tangent of y/x.
;
;	Entry:	8087: y, x TOS
;	Exit:	8087: 0 <= atan(y/x) < 2*Pi
;
;	The signs on x and y are used to compute the quadrant of the
;	resultant angle:
;
;		 X   Y	 Quad
;		--- --- ------
;		 +   +	    I
;		 -   +	   II
;		 -   -	  III
;		 +   -	   IV
;	----------------------------------------------------------------
;
;	COS - return cosine of 8087 TOS on 8087 TOS
;	----------------------------------------------------------------
;
;	DEG - convert 8087 TOS from radians to degrees
;	----------------------------------------------------------------
;
;	ELPE - Computes the complete elliptic integral
;	   of the second kind (Euler elliptic integral) of k
;
;	Entry: 8087: 0  k  1 TOS
;
;	For k > 1 use ELPE(k) = k*ELPE(1/k)
;
;	Note: Our ELPE(k)  some authors ELPE((1-k)). To be precise:
;
;		   /2
;		  
;	ELPE(k) =  (1-(1-k)sin) d
;		  
;		   0
;
;	Our choice of k allows us to use the eccentricity of an ellipse
;	(minor radius/major radius) directly in the call to ELPE, so that
;	the arclength of an ellipse is 4*radius*ELPE(ecc).
;
;	The algorithm is based on series expansions in Gradshteyn pg. 906
;
;	The var EPREC controls the accuracy of the result.
;	----------------------------------------------------------------
;
;	LOG - Return log (base e) of 8087 TOS on 8087 TOS
;
;	The argument to log must be greater than zero.
;
;	Warning: be sure EYL2X is implemented in the emulator.
;	----------------------------------------------------------------
;
;	RAD - convert 8087 TOS from degrees to radians
;	----------------------------------------------------------------
;
;	SIN - return sine of 8087 TOS on 8087 TOS
;	----------------------------------------------------------------
;
;	SINCOS - return sin,cos (tos) of 8087 TOS
;	----------------------------------------------------------------
;	TAN - return tangent of 8087 TOS on 8087 TOS
;	----------------------------------------------------------------
;
;	Angle - Calculate bearing Angle between two points
;	entry: 	8087 = x1, y1, x2, y2 (tos)
;	exit: 	8087 = bearing Angle in radians (tos)
;		ESI unchanged
;	----------------------------------------------------------------
;
;	ANorm - Normalize bearing Angle to 0..<twopi
;	Entry:	8087 = angle (tos)
;	Exit:	8087 = normalized angle (tos)
;		ESI will not be changed.
;	----------------------------------------------------------------
;
;	DeNormT - Denormalize parameter to range [MinT..MaxT]
;
;	Entry:	8087: Normalized T,MaxT,MinT
;	Exit:	8087: T
;	----------------------------------------------------------------
;
;	Dist2P - Calculate distance between two points (2D)
;
;	entry: 	8087 = x1, y1, x2, y2 (tos)
;	exit: 	8087 = dist (tos)
;	----------------------------------------------------------------
;
;	DistP2L - Distance 2D line to 2D point
;
;	Entry:	8087 = px,py (tos)
;		esi -> 2D line geometry
;	Exit:	shortest distance (tos)
;
;	Uses the formula d=((AA)-(AB)/(BB)) where A=P-L1, B=L2-L1
;	----------------------------------------------------------------
;
;	FindRoot - Find the Root (Zero Crossing) of a Differentiable
;		Function.
;
;	Entry:	8087: low, high TOS
;		esi -> evaluator function
;
;	Exit:	8087: root TOS
;		cy set if 6 sig. digit precision could not be reached
;
;	Note: The derivative function should return zero for all
;		points where the derivative cannot be found. In fact,
;		this routine will still work if the derivative is
;		always zero. It is then a simple bisection search
;		and will converge linearly. (as opposed to
;		quadratically when f'(x) is provided.
;
;	The evaluator function should accept a single ordinate on the
;	8087, and return f'(x), f(x) TOS.
;
;	Example:
;
;	Suppose we wanted to find the cube root of a. The cube root
;	of a is a solution to the equation x^3-a=0.
;	So let f(x)=x^3-a, f'(x)=3*x (derivative of x^3-a). We know
;	that the cube root of a is between 1 and a if a positive.
;	and that cuberoot(-a)=-cuberoot(a).
;
;	Create routine FCUBERT as follows:
;
;	k3	dw	3		;constant
;	A	REAL4	0.0		;operand for cube root
;
;	FCubeRt proc	stdcall
;		fdup			;8087: x,x
;		fmul	st,st(0)	;8087: x,x
;		fdup			;8087: x,x,x
;		fimul	k3		;8087: x,x,3x
;		fxch	st(2)		;8087: 3x,x,x
;		fmulp	st(1),st	;8087: 3x,x^3
;		fsub	A		;8087: 3x,x^3-A
;		ret
;	FCubeRt endp
;
;	finally, here's our function to compute cube root a:
;
;	RtSign	dw	0
;
;	CubeRt 	proc	stdcall
;		mov	RtSign,1	;assume positive
;		fst	A		;save TOS in A
;		ftst			;compare to zero
;		fje	Done		;if zero, return zero
;		fjg	posA		;if positive, compute cube root
;		fchs			;if negative, save sign and invert
;		mov	RtSign,-1
;	posA:	fld1
;		SVC	FindRoot,<offset FCubeRt> 	;and find the root
;		fimul	RtSign		;apply correct sign to result
;	Done:	ret
;	CubeRt 	endp
;
;	----------------------------------------------------------------
;
;	FNSame:	Test if two values in RAM are nearly the same
;	Entry:	esi->1st real value, edi->2nd real value
;	Exit:	carry set if values nearly equal
;	----------------------------------------------------------------
;
;	FNSame2	Test if two 2D points in RAM are nearly the same
;	Entry:	esi->1st 2D point geometry, edi->2nd 2D point
;	Exit:	carry set if points nearly equal
;	----------------------------------------------------------------
;
;	FNSame3	Test if two 3D points in RAM are nearly the same
;	Entry:	esi->1st 3D point geometry, edi->2nd 3D point
;	Exit:	carry set if points nearly equal
;	----------------------------------------------------------------
;
;	FNZero - change |value|<2E-6 in RAM to exactly 0.0
;	Entry:	esi->value to check
;	Exit: 	carry set if result is zero
;	----------------------------------------------------------------
;	
;	Integrate - Numerically integrate a function
;
;	Entry:	8087: low, high TOS
;		esi -> function to integrate
;
;	Exit:	8087: Integral TOS
;		cy set if 6 sig. digit precision could not be reached
;
;	The function should accept a single ordinate on the 8087, and return
;	a single abscissa.
;
;	Example:
;
;	Suppose we wanted to integrate LOG(SIN(X)) from 1.5 to 2.5.
;
;	Create routine LOGSIN as follows:
;
;	LogSin	proc	stdcall
;		ENTRY
;		SVC	SIN
;		SVC	LOG
;		ret
;	LogSin	endp
;
;	To integrate LogSin accurate to prec, use the following code:
;
;		fld	istrt		;load 1.5
;		fld	iend		;load 2.5
;		SVC	Integrate,<offset LogSin>
;	----------------------------------------------------------------
;
;	L2OffsetDeltas - Calc line offset deltas given desired distance 
;	NearPL2 - Nearest point on a 2D line
;
;	entry:	8087 = px,py (tos)
;		esi -> line geometry
;
;	exit:	8087 = nx,ny (tos) point on the line
;	----------------------------------------------------------------
;
;	NormT - Normalized parameter to range [0..1]
;
;	Entry: 	8087: T,MaxT,MinT
;	Exit: 	8087: Normalized T
;	----------------------------------------------------------------
;
;	P2TL2:	Return location of given point on 2D line as t
;		parameter (proportion of length). Values <0 or >1
;		are off ends of the line segment.
; 
;	entry 8087:	px,py (tos)
;		  	esi -> line geometry
;
;	return 8087:	t (tos) on the line
;			max 4 8087 stack positions (incl x,y) are used
;	----------------------------------------------------------------
;
;	PConv - return point at spec dist and bearing from 1st point
;	Entry: 	8087 = x, y, dist, ang (tos)
;	Exit: 	8087 = newx, newy (tos)
;	----------------------------------------------------------------
;
;	SVC Polar2XY - convert 2D polar coordinate to X,Y
;	Entry:  8087 = brng dist (tos)
;	Exit:   8087 = x y (tos)
;	===============================================================
;	RND - Round st(0) to nearest increment of st(1)
;
;	Entry:	8087: Increment,Operand
;
;	Exit:	8087: Result
;	----------------------------------------------------------------
;
;	RNDDN - Round st(0) to next lesser increment of st(1)
;
;	Entry:	8087: Increment,Operand
;
;	Exit:	8087: Result
;	----------------------------------------------------------------
;
;	RNDUP - Round st(0) to next greater increment of st(1)
;
;	Entry:	8087: Increment,Operand
;
;	Exit:	8087: Result
;	----------------------------------------------------------------
;
;	SinCosRotate:	Rotate point  about 0,0
;		where X'=X*cos-Y*sin, Y'=X*sin+Y*cos
;
;	Entry:	8087 = sin,cos,X,Y (tos)
;	Exit:	8087 = X',Y'
;	----------------------------------------------------------------
;
;	T2PL2:	Return point on 2D line given t parameter
;		(proportion of length). T values <0 or >1
;		return points off ends of the line segment.
; 
;	entry 8087:	t (tos)
;		  	esi -> line geometry
;
;	return 8087:	px,py (tos)
;			max 3 8087 stack positions are used (incl x,y)
;	----------------------------------------------------------------
;
;	SVC XY2Polar - convert 2d point coordinate form
;	C2EAngle - Convert Circular Bearing to Elliptical Bearing
;	---------------------------------------------------------------
;	On entry:
;		8087 = Circular Bearing Angle,
;		       Ellipse Eccentricity,
;		       Ellipse Inclination (tos)
;	On exit:
;		8087 = Elliptical Bearing Angle
;	---------------------------------------------------------------
;	An elliptical bearing angle is the bearing angle from the
;	center thru a given point on an ellipse. Its corresponding
;	Circular bearing angle is the point on the circumscribed
;	circle that corresponds to the point on the ellipse if
;	the eccentricity were changed to 1.0.
;	===============================================================
;	E2CAngle - Convert Elliptical Bearing to Circular Bearing
;	---------------------------------------------------------------
;	On entry:
;		8087 = Elliptical Bearing Angle,
;		       Ellipse Eccentricity,
;		       Ellipse Inclination (tos)
;	On exit:
;		8087 = Circular Bearing Angle
;	---------------------------------------------------------------
;	An elliptical bearing angle is the bearing angle from the
;	center thru a given point on an ellipse. Its corresponding
;	Circular bearing angle is the point on the circumscribed
;	circle that corresponds to the point on the ellipse if
;	the eccentricity were changed to 1.0.
;	===============================================================
;	DOTP2:	Calculate the dot-product of two 2d Vectors
;		(d1d2 = dx1*dx2+dy1*dy2)
;	---------------------------------------------------------------
;	entry:	on 8087: dx1,dy1,dx2,dy2
;
;	return:	on 8087: dot product (tos)
;		changes no registers
;	---------------------------------------------------------------
;		Note: If the vectors have been normalized then the
;		      dot product = cosine of the angle between
;		      the vectors.
;	===============================================================
;
;	IntCC2 - Intersection of 2 circles
;	----------------------------------------------------------------
;	Entry:	
;		edi->GCir2 (1)
;		esi->GCir2 (2)
;		ebx->GPnt2 (intersections)
;	================================================================
;	IntEE2 - Intersection of 2 ellipses
;	IntL2:	Intersect two 2D line geometries
;
;	Entry:	ESI -> First 2D Line geometry (GLine2)
;		EDI -> Second 2D Line geometry (GLine2)
;		EBX -> 2D Point geometry (GPnt2) to hold result
;	IntLC2 - Intersection of a line and a circle
;	----------------------------------------------------------------
;	Entry:	esi->GLine2
;		edi->GCir2
;		ebx->GPnt2 -- Intersetions
;	================================================================
;	IntLE2 - Intersection of a line and a ellipse
P2Eval********** NOT FOUND ******
;	==============================================================
;	Poly2Rt - Find the real roots of a quadratic polynomial
;		(There are better ways of doing this!!! - Ken )
;	Poly3Rt - Find the real roots of a quadratic polynomial
;		(There are better ways of doing this!!! - Ken)
;	IntL2D:	Intersect two 2D double-precision line geometries
;
;	Entry:	ESI -> First 2D Line geometry (GDLine2)
;		EDI -> Second 2D Line geometry (GDLine2)
;	CTMI2 - Initialize CTM to 2D Identity Matrix
;	===============================================================
;
;	CTMMUL2 - Multiply CTM * TMat structure at [esi] -> CTM
;	---------------------------------------------------------------
;	8087 empty on entry and exit
;	Treated as 2X3 (assume last column = 0 0 1)
;	Note that row 3 is not used; it is stored inside row 4 of
;	the general 3d 4x4 matrix.
;
;		C11=A11*B11+A12*B21+A14*B41
;		C12=A11*B12+A12*B22+A14*B42
;		C21=A21*B11+A22*B21+A24*B41
;		C22=A21*B12+A22*B22+A24*B42
;		C41=A41*B11+A42*B21+A44*B41
;		C42=A41*B12+A42*B22+A44*B42
;	===============================================================
;	CTMPOP - Pop CTM stack
;	===============================================================
;	CTMPSH - Push Copy of CTM to CTM stack
;	===============================================================
;	CTMR2 - Rotate 2D XY plane of CTM by 8087 tos Angle
;	===============================================================
;	CTMS2 - Scale CTM by 8087 XScale,YScale (tos)
;	===============================================================
;	CTMSHX2 - Shear 2d CTM against X. 8087: VecX, VecY TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	CTMSHY2 - Shear 2d CTM againt Y. 8087: VecX, VecY TOS
;
;	Exit: CY set on error.
;	===============================================================
;	CTMSPC2 - Decompose CTM into elementary transformations.
;
;	Exit:	esi -> TSpec2 structure
;	---------------------------------------------------------------
;	The following pseudocode reconstructs the matrix:
;
;		CTMI2();
;		CTMS2(ScaleX,ScaleY);
;		CTMSHY2(ShearYX,ShearYY);
;		CTMR2(Rotate);
;		CTMT2(DeltaX,DeltaY);
;	===============================================================
;
;	CTMT2 - Translate CTM by 8087 XTrans,YTrans (tos)
;	===============================================================
;	CTMUSE - CTM ready for use
;	===============================================================
;	LDCTM - Load CTM from TMat structure at esi
;
;	Entry:	esi->TMat structure from which to copy to CTM
;	===============================================================
;	LDSymTM - Load Symbol partial CTM from esi
;	MATINV2 - Invert 3 by 3 matrix	INV(A)->B
;
;	Entry:	esi->TMat structure (A)
;		edi->TMat structure (B)
;	MATTRN2 - Transpose 3 by 3 matrix  TRN(A)->B
;	PREMUL2 - Multiply TMat structure at esi * CTM -> CTM
;	---------------------------------------------------------------
;	8087 empty on entry and exit
;	Treated as 2X3 (assume last column = 0 0 1)
;	Note that row 3 is not used; it is stored inside row 4 of
;	the general 3d 4x4 matrix.
;
;		C11=A11*B11+A12*B21+A14*B41
;		C12=A11*B12+A12*B22+A14*B42
;		C21=A21*B11+A22*B21+A24*B41
;		C22=A21*B12+A22*B22+A24*B42
;		C41=A41*B11+A42*B21+A44*B41
;		C42=A41*B12+A42*B22+A44*B42
;	===============================================================
;	PRER2 - PRERotate 2D XY plane of CTM by 8087 tos Angle
;	===============================================================
;	PRES2 - PREScale CTM by 8087 XScale,YScale (tos) ?????
;	===============================================================
;	PRESHX2 - PRESHear 2d CTM against X. 8087: VecX, VecY TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	PRESHY2 - PRESHear 2d CTM againt Y. 8087: VecX, VecY TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	PRET2 - PRETranslate CTM by 8087 XTrans,YTrans (tos)
;	===============================================================
;	STCTM - Store CTM to TMat structure at esi
;
;	Entry: esi->TMat structure into which to copy CTM
;	===============================================================
;	STSymTM - Store Symbol partial CTM to esi
;	TRNSBA2 - Transform 2D bearing Angle on 8087 stack by CTM
;	===============================================================
;	TRNSDA2 - Transform 2D dist,Angle on 8087 stack by CTM
;	===============================================================
;
;	TRNSEP2 - Transform 2D ellipse geometry on 8087 stack by CTM
;
;	Entry:	Bearing,Eccen,Radius TOS
;	Exit:	Bearing,Eccen,Radius TOS
;	===============================================================
;	TRNSP2 - Transform 2D Point on 8087 stack by CTM
;	===============================================================
;	QNUCTM - Query if CTM is non-uniform (Use ENUTran, not ETran)
;	---------------------------------------------------------------
;	On exit:
;		EAX = 0, Carry clear if uniform transformation
;		EAX = 1, Carry set if non-uniform transformation
;	===============================================================
;	UseSymTM - Apply Symbol TM to current SymCTM & make it active
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Symbol TM to apply to symbol stack
;	On exit:
;		The current CTM in use has been saved
;		The specified TM is now current
;	---------------------------------------------------------------
;		A matching call to EndSymTM must be made
;		Calls to UseSymTM/EndSymTM may be nested SYMDEEP deep
;	===============================================================
EndSymTM********** NOT FOUND ******
;	==============================================================
;	TrnSymTM - SymCTM * CTM -> SymCTM
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Symbol TM to modify
;	===============================================================
;	CTMI3 - Initialize CTM to 3D Identity Matrix
;	===============================================================
;	CTMP3 - PERSPECTIVE: CTM*perspective->CTM (post-operation)
;	8087 stack=PSpec on entry, empty on exit.
;	Pspec=z where z=eye viewing distance from screen
;	===============================================================
;	CTMRAX - Rotate CTM by Angle about given axis vector
;		(Computed with right-hand rule)
;
;	Entry:	Axis(X,Y,Z),Angle (TOS)
;	Exit:	Result in CTM
;
;	Note: This is an implementation of the algorithm found in
;	  Rogers and Adams "Mathematical Elements for Computer Graphics"
;	===============================================================
;	CTMRXY - ROTATE XY plane: CTM*rotate->CTM (post-operation)
;	8087 stack=Angle in radians on entry, empty on exit.
;	+ rotation is CCW from +x,0 towards 0,+y
;	===============================================================
;	CTMRYZ - ROTATE YZ plane: CTM*rotate->CTM (post-operation)
;	+ rotation is CCW from +y,0 towards 0,+z
;	8087 stack=Angle in radians on entry, empty on exit.
;	===============================================================
;	CTMRZX - ROTATE XZ plane: CTM*rotate->CTM (post-operation)
;	+ rotation is CCW from +z,0 towards 0,+x
;	8087 stack=Angle in radians on entry, empty on exit.
;	===============================================================
;	CTMS3 - SCALE: CTM*scale->CTM (post-operation)
;	8087 stack=SX,SY,SZ (tos) on entry, empty on exit.
;	===============================================================
;	CTMSHX3 - Shear 3d CTM against X. 8087: VecX, VecY, VecZ TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	CTMSHY3 - Shear 3d CTM against Y. 8087: VecX, VecY, VecZ TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	CTMSHZ3 - Shear 3d CTM against Z. 8087: VecX, VecY, VecZ TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	CTMT3 - TRANSLATE: CTM*translate->CTM (post-operation)
;	8087 stack=TX,TY,TZ (tos) on entry, empty on exit.
;	===============================================================
;	MATMUL3 - Multiply 4*4 matricies A*B->C:
;
;	Entry:	esi->matrix A
;		ebx->matrix B
;		edi->matrix C
;
;	8087 empty on entry and exit
;
;	Currently, treat as 3x4 (assume last column is 0 0 0 1)
;	since only perspective changed it, and perspective now
;	not in TMat. (Lines for 4th column commented out ";;;"?)
;
;	C11=A11*B11+A12*B21+A13*B31+A14*B41
;	C12=A11*B12+A12*B22+A13*B32+A14*B42
;	C13=A11*B13+A12*B23+A13*B33+A14*B43
;	C14=A11*B14+A12*B24+A13*B34+A14*B44
;
;	C21=A21*B11+A22*B21+A23*B31+A24*B41
;	C22=A21*B12+A22*B22+A23*B32+A24*B42
;	C23=A21*B13+A22*B23+A23*B33+A24*B43
;	C24=A21*B14+A22*B24+A23*B34+A24*B44
;
;	C31=A31*B11+A32*B21+A33*B31+A34*B41
;	C32=A31*B12+A32*B22+A33*B32+A34*B42
;	C33=A31*B13+A32*B23+A33*B33+A34*B43
;	C34=A31*B14+A32*B24+A33*B34+A34*B44
;
;	C41=A41*B11+A42*B21+A43*B31+A44*B41
;	C42=A41*B12+A42*B22+A43*B32+A44*B42
;	C43=A41*B13+A42*B23+A43*B33+A44*B43
;	C44=A41*B14+A42*B24+A43*B34+A44*B44
;	
;	===============================================================
;	PRERXY - ROTATE XY plane: rotate*CTM->CTM (pre-operation)
;	8087 stack=Angle in radians on entry, empty on exit.
;	+ rotation is CCW from +x,0 towards 0,+y
;	===============================================================
;	PRERYZ - ROTATE YZ plane: rotate*CTM->CTM (pre-operation)
;	+ rotation is CCW from +y,0 towards 0,+z
;	8087 stack=Angle in radians on entry, empty on exit.
;	===============================================================
;	PRERZX - ROTATE XZ plane: rotate*CTM->CTM (pre-operation)
;	+ rotation is CCW from +z,0 towards 0,+x
;	8087 stack=Angle in radians on entry, empty on exit.
;	===============================================================
;	PRES3 - SCALE: scale*CTM->CTM (pre-operation)
;	8087 stack=SX,SY,SZ (tos) on entry, empty on exit.
;	===============================================================
;	PRESHX3 - PRESHear 3d CTM against X. 8087: VecX, VecY, VecZ TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	PRESHY3 - PRESHear 3d CTM against Y. 8087: VecX, VecY, VecZ TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	PRESHZ3 - PRESHear 3d CTM against Z. 8087: VecX, VecY, VecZ TOS
;
;	EXIT: CY set on error.
;	===============================================================
;	PRET3 - TRANSLATE: translate*CTM->CTM (pre-operation)
;	8087 stack=TX,TY,TZ (tos) on entry, empty on exit.
;	===============================================================
;	TRNP3:	Transform 3D Point at [esi] by CTM
;	===============================================================
;
;	TRNSP3 - Transform 3D point on 8087 stack by 3D CTM
;
;	Result real 3D point X,Y,Z on 8087 stack.
;	no free 8087 stack space other than parameter point
;
;	ResQ=Px*B14+Py*B24+Pz*B34+B44
;	ResX=(Px*B11+Py*B21+Pz*B31+B41)/ResQ
;	ResY=(Px*B12+Py*B22+Pz*B32+B42)/ResQ
;	ResZ=(Px*B13+Py*B23+Pz*B33+B43)/ResQ
;
;	Currently, perspective not in TMat, Q will=1.0, so no divide
;	===============================================================
;	CTMSPC3 - Decompose CTM into elementary transformations.
;
;	Exit:	esi -> TSpec3 structure
;	===============================================================
TRNBX3********** NOT FOUND ******
;	==============================================================
TRNBX2********** NOT FOUND ******
;	==============================================================
;	DiscardCmd 
;	===============================================================
;	LoadCmd - Select drawing and load it
;	===============================================================
;	NewDwgCmd - Start new, empty drawing
;	===============================================================
;	RenameCmd - Rename the current drawing
;	===============================================================
;	RestoreCmd - Restore current drawing from last save
;	===============================================================
;	SaveAsCmd - Rename Current Drawing & Save drawing in new file
;	===============================================================
;	SaveCmd - Save drawing in Current Drawing File
;	===============================================================
;	MarkChanged - Mark drawing has changed
;	===============================================================
;	SVC SaveDwg - save drawing to disk w/ caller-provided name
;		Does NOT rename drawing in memory
;		Does NOT affect changed flag
;	Entry:	esi->drawing name (adds fcw32 drive:\path if first
;			character=#, or current drive:\path if
;			no path specified).
;	Exit:	Carry set if error saving file, else drawing saved
;	===============================================================
LoadDwg********** NOT FOUND ******
;	==============================================================
ASaveDwg********** NOT FOUND ******
;	==============================================================
UpdScreenTools********** NOT FOUND ******
;	==============================================================
;	AllDW call EBX for each existing drawing window
;	---------------------------------------------------------------
;	On entry:
;		ebx -> procedure to call
;		esi, edi are passed to the called routine
;	===============================================================
DWNew********** NOT FOUND ******
;	==============================================================
;	DWSetV - Drawing Window: Setup View
;	---------------------------------------------------------------
;	On entry:
;		ESI -> DWIN data structure to setup
;		       Dleft..Dbottom are the screen coordinates
;		       VWidth..VName are view to set up
;	On exit:
;		DWIN structure is valid for geometry drawing
;	===============================================================
;	SetEachPickView: set up PickWin for each pick "view"
;	---------------------------------------------------------------
;	Entry:	8087 = PickX, PickY (tos)
;		DigX, DigY has pixel coordinates of pick point
;		GeoDWAdr-> window which received digitize
;	===============================================================
;	SetODView: set up owner-draw window view
;	---------------------------------------------------------------
;	On entry:
;		8087 = lowX,lowY,highX,highY (tos)
;		esi -> DRAWITEMSTRUCT for the owner-draw control
;	===============================================================
;	SetStretchView: set up StretchWin for stretch-test "view"
;	---------------------------------------------------------------
;	Entry:	8087 = XLow, YLow, XHigh, YHigh (tos)
;	Note: 	Does not adjust to screen window aspect ratio, simply
;		uses input view corners
;	===============================================================
;	SetWinPickView: set up PickWin for window pick "view"
;	---------------------------------------------------------------
;	Entry:	8087 = XLow, YLow, XHigh, YHigh (tos)
;	Note: 	Does not adjust to screen window aspect ratio, simply
;		uses input view corners
;	===============================================================
;	SetBMView: set up bitmap window view
;	SetMFView: set up metafile window view
;	---------------------------------------------------------------
;	On entry:
;		8087 = lowX,lowY,highX,highY (tos)
;		esi -> Bitmap Rectangle to draw into
;	===============================================================
;	SetRectView: set up rectangle in window view
;	---------------------------------------------------------------
;	On entry:
;		8087 = lowX,lowY,highX,highY (tos)
;		eax = window handle to draw in
;		esi -> rectangle in hWin for display
;	---------------------------------------------------------------
;	Sets window view to 0.0..1.0 extents for current OD control
;	===============================================================
;	TextWin - Create a new text window
;	---------------------------------------------------------------
;	On entry:
;		esi -> TXWIN specification packet
;	On return:
;		Text window specs copied, and window launched
;		as a persistent object until it closes.
;	===============================================================
;	TWRcvInit - Init to Receive some lines of text for current image
;	---------------------------------------------------------------
;		Text is assigned to TWINStk.TOS text window
;		This routine is normally called only from TXWIN.eproc
;	===============================================================
;	TWRcvEnd - End Receiving some lines of text for current image
;	---------------------------------------------------------------
;		Text is assigned to TWINStk.TOS text window
;		This routine is normally called only from TXWIN.eproc
;	===============================================================
;	TWRcvInit - Init to Receive some lines of text for current image
;	---------------------------------------------------------------
;		Text is assigned to TWINStk.TOS text window
;		This routine is normally called only from TXWIN.eproc
;	===============================================================
;	ECalPt2 - Return 2D point at T parameter on entity
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		8087:  T
;	Exit:	Carry set if not supported, else clear and
;		8087:  X,Y
;		ESI preserved
;	=}==============================================================
;	ECalStoT - Convert S (curve length) parameter to T (natural)
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		8087:  S
;	Exit:	Carry set if not supported, else clear and
;		8087:  T
;		ESI preserved
;	=}==============================================================
;	ECalTan2 - Return Vector tangent to entity at T parameter
;		(Vector should point in direction of increasing T)
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		8087:  T
;	Exit:	Carry set if not supported, else clear and
;		8087:  TanX, TanY
;		ESI preserved
;	=}==============================================================
;	ECalTtoS - Convert T (natural) parameter to S (curve length)
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		8087:  T
;	Exit:	Carry set if not supported, else clear and
;		8087:  S
;		ESI preserved
;	=}==============================================================
;	EClass - Return entity class and handler flags
;		Mandatory service
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear
;		EAX = entity class flags (C_2D or C_3D, etc.)
;		EDX = handler permissions (H_MATH etc.)
;		ESI preserved
;	=}==============================================================
;	ECurv2 - Return Radius of curvature at parameter
;		(Curvature is positive if the curve is bending
;		counterclockwise from the tangent vector)
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		8087: T
;	Exit:	Carry set if not supported, else clear and
;		8087: Signed curvature
;		ESI preserved
;	=}==============================================================
;	EDraw - Draw an entity record in entity color 
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record to draw
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	---------------------------------------------------------------
;	The entity service routine EDraw also gets in register ECX:
;		EDrawMode = DM_DRAW, DM_MARK, or DM_UNDRAW
;	And in register EAX:
;		bit F_O set for styled outline
;		bit F_SO set for outline solid
;		bit F_F set for style filled
;		bit F_SF set for solid filled
;		neither F_F or F_SF for outline only
;	=}==============================================================
;	EDrawM - Draw an entity record in already set DRAWMODE
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record to draw
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EInfo (Length) are implemented.
;	=}==============================================================
;	EList - List entity
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EMark - Draw an entity record in marking color 
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record to draw
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EMir - Mirror transform entity by CTM
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	ENearT2 - Return T parameter on entity nearest input point
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		8087:  X, Y
;		EAX = 0 to permit values < 0.0 and > 1.0,
;		      1 to restrict to parameters on the entity
;	Exit:	Carry set if not supported, else clear and
;		8087:  T
;		ESI preserved
;	=}==============================================================
ENoSupp********** NOT FOUND ******
;	==============================================================
;	ENUTran - Non-uniform transform entity by CTM
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EPick - Pick test an entity record
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry set if entity picked
;		ESI preserved
;	=}==============================================================
;	ERay2 - Return entity intersections with 2D ray
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record to intersect
;		8087: x1,y1,x2,y2
;		EDI -> Callback procedure to receive intersections
;	Exit:	Carry set if not supported
;		ESI preserved
;	---------------------------------------------------------------
;		On entry to the callback:
;			8087: First intersection x, y
;		The callback returns:
;			EAX = 0 to continue, 1 to stop
;	=}==============================================================
;	EStretch - Stretch-test and transform Current Entity by CTM
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;
;	ETran - Transform entity by CTM
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EUndraw - Draw an entity record in background color
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record to draw
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EXCheck - Extent-check entity
;		Mandatory service (can be DFScan callback proc)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	Carry clear - will not abort the drawing list scan
;		ESI preserved
;	=}==============================================================
;	EEdge - Specify Edges for Multipoly
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;	Exit:	ESI preserved
;	---------------------------------------------------------------
;	EdgeHdlr -> proc to call for each edge.
;		ESI -> 2d line geometry on entry to proc
;	=}==============================================================
;	EAttach - Attach to entity record key point
;	---------------------------------------------------------------
;	On Entry:
;		EAX = desired key point type code
;		ESI -> Entity record
;		EDI -> Entity pick point geometry if needed
;	On Exit:
;		Carry set if key point not available (8087 empty), else
;		If EAX = EA_2dC then
;		8087 = X,Y key point, carry clear
;		If EAX = EA_3dC then
;		8087 = X,Y,Z key point, carry clear
;		ESI preserved
;	---------------------------------------------------------------
;	The called procedure may call StdEAttach2 to implement standard
;	modifiers if the functions ECalStoT, ECalPt2, ENearT2, and
;	EInfo (Length) are implemented.
;	=}==============================================================
StdEAttach2********** NOT FOUND ******
;	==============================================================
;	EExplode - Explode Entity
;		Optional service (cannot be DFScan callback)
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		EDI -> Process exploded component entity proc
;	Exit:	Carry set if not supported, else clear
;		and process callback was called.
;	---------------------------------------------------------------
;	If EDI callback adrs = 0 then :
;		a) Append component entity, b) draw appended entity.
;	---------------------------------------------------------------
;	If it is not 0, then just build component entities but do not
;	append or draw them, and pass the address of the entity in ESI
;	to the callback proc.
;	=}==============================================================
;	ExplodeInfo - Get Parms for current EExplode call
;	---------------------------------------------------------------
;	On return:
;		ESI -> original entity
;		EBX -> Entity process routine (0=use append/draw logic)
;	={==============================================================
;	EDraw1 - Draw entity record at ESI in entity color
;	=}==============================================================
;	ContainedEntAdr - Get address of picked entity in container
;	---------------------------------------------------------------
;	Call this in successful RcvData proc for RD_Pick1(Ref)
;	ESI -> Entity, On return, if container ent, points to
;	interior entity.
;	===============================================================
ExtentsView********** NOT FOUND ******
;	==============================================================
;	Redraw - Redraw the entire main & child windows (SVC)
;	===============================================================
RedrawDW********** NOT FOUND ******
;	==============================================================
;	RedrawCmd
;	===============================================================
ZCENCmd********** NOT FOUND ******
;	==============================================================
ZExtCmd********** NOT FOUND ******
;	==============================================================
;	ZINCmd - Zoom IN Command (magnify view)
;	---------------------------------------------------------------
;	Entry:
;		ActivDWAdr -> DWIN structure to use in drawing
;	Exit:
;	===============================================================
;	ZOUTCmd - Zoom OUT Command (back off - see more)
;	---------------------------------------------------------------
;	Entry:
;		ActivDWAdr -> DWIN structure to use in drawing
;	Exit:
;	===============================================================
ZWINCmd********** NOT FOUND ******
;	==============================================================
;	SVC CkButtonDig - Check for Dig in the specified button
;	---------------------------------------------------------------
;	On entry:
;		EDX = X dig coordinate
;		EAX = Y dig coordinate
;		ESI	: address of BTN structure
;	On Exit:
;		Carry set if Dig was in the button
;	===============================================================
;	DevBtnChgTxt - Change the text in an already-drawn button
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of ANSIZ text string
;		EDI	: address of RECT struct to center text
;		EDX	: style [8000h=left text, else centered]
;
;	This routine is used in place of DevButton when updating
;	text to reduce visible screen flicker. Use this call
;	when the existing text must be erased.
;	===============================================================
;	DevBtnNewTxt - Draw the longer text in an already-drawn button
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of ANSIZ text string
;		EDI	: address of RECT struct to center text
;		EDX	: style [8000h=left text, else centered]
;
;	This routine is used in place of DevButton when updating
;	text to reduce visible screen flicker. Use this call
;	when the existing text need not be erased (appended a char
;	to the string)
;	===============================================================
;	DevButton - Draw a button with its contained text
;		    (button specs in registers)
;	---------------------------------------------------------------
;	On entry:
;		EAX	: 0=raise button, 1=lower button
;		ESI	: address of ANSIZ text string
;		EDI	: address of RECT struct to center text
;		EDX	: style [8000h=left text, else centered]
;	===============================================================
;	SVC DrawButton - Display the specified button
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of BTN structure
;	===============================================================
;	SVC DrawButtonText - Redraw the specified buttons' Text
;			     (string has been changed)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of BTN structure
;	===============================================================
;	SVC MoreButtonText - Redraw the specified buttons' Text
;			     (string has had chrs appended)
;	---------------------------------------------------------------
;	On entry:
;		ESI	: address of BTN structure
;	===============================================================
AlignGrid********** NOT FOUND ******
;	==============================================================
CSnapOff********** NOT FOUND ******
;	==============================================================
CSnapOn********** NOT FOUND ******
;	==============================================================
;	CSnapP2 - Cursor Snap & Cursor Ortho-lock process a 2d point
;	---------------------------------------------------------------
;	On entry:
;		8087 = x,y (tos) point to snap
;	On exit:
;		8087 = x,y (tos) adjusted point if csnap & snap/osnap on
;				 point unchanged if not enabled
;	===============================================================
;	CSnapP3 - Cursor Snap & Cursor Ortho-lock process a 3d point
;	---------------------------------------------------------------
;	On entry:
;		8087 = x,y,z (tos) point to snap
;	On exit:
;		8087 = x,y,z (tos) adjusted point if csnap & snap/osnap on
;				 point unchanged if not enabled
;	===============================================================
;	DelGridDef: Callback to delete a grid def from list
;	---------------------------------------------------------------
EditGrid********** NOT FOUND ******
;	==============================================================
GridOff********** NOT FOUND ******
;	==============================================================
GridOn********** NOT FOUND ******
;	==============================================================
;	InitGrid - Initialize Grid Info Block after drawing load
;	===============================================================
;	InstallGrid - Install Grid System
;	---------------------------------------------------------------
;	On entry:
;		esi -> grid system service routine
;	On exit:
;		eax = grid class ID number to use
;	===============================================================
;	NewGridDef: Callback to add a new grid definition
;	---------------------------------------------------------------
OrthoOff********** NOT FOUND ******
;	==============================================================
OrthoOn********** NOT FOUND ******
;	==============================================================
;	UndrawGrids - Undraw Grids before Command Changes (all DWINs)
;	===============================================================
;	RestoreGrids - Redraw Grids after Command Changes (all DWINs)
;	UndrawGrids - Undraw Grids before Command Changes (all DWINs)
;	===============================================================
;	RepaintGrid - Repaint the current grid (WM_REPAINT 1 DWIN)
;	---------------------------------------------------------------
;	On entry:
;		UseDWAdr -> DWIN structure for the drawing window
;		DevUseRepaint DC currently active and useable
;	===============================================================
SelGrid********** NOT FOUND ******
;	==============================================================
SnapOff********** NOT FOUND ******
;	==============================================================
SnapOn********** NOT FOUND ******
;	==============================================================
;	SnapP2 - Snap & Ortho-lock process a 2d point
;	---------------------------------------------------------------
;	On entry:
;		8087 = x,y (tos) point to snap
;	On exit:
;		8087 = x,y (tos) adjusted point if snap on
;				 point unchanged if snap not on
;	===============================================================
;	SnapP3 - Snap & Ortho-lock process a 3d point
;	---------------------------------------------------------------
;	On entry:
;		8087 = x,y,z (tos) point to snap
;	On exit:
;		8087 = x,y,z (tos) adjusted point if snap on
;				 point unchanged if snap not on
;	===============================================================
;	UpdGrid - Update Grid Info Block before Drawing Save
;	---------------------------------------------------------------
;	On return, EAX = grid flags (GS_ORTHO, etc.)
;	===============================================================
;	BgnPExtents - Begin Partial Extents Calculation
;	---------------------------------------------------------------
;	CalcExtents - Calculate drawing extents and save in header
;	---------------------------------------------------------------
;	CheckFileID - Verify current FCW format
;	---------------------------------------------------------------
;	EndPExtents - End Partial Extents Calculation
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Where to store the calculated extents
;	---------------------------------------------------------------
;	GetCStuff - Get common stuff into entity at ESI
;	Entry:	ESI -> CStuff structure
;	Exit:	ESI unchanged
;	===============================================================
;	NewTag - Put a new Tag # on entity at ESI
;	Entry:	ESI -> CStuff structure
;	Exit:	ESI unchanged
;	---------------------------------------------------------------
GetHeaderBlock********** NOT FOUND ******
;	==============================================================
UpdHeaderBlock********** NOT FOUND ******
;	==============================================================
;	UseCStuff - Set up to use common stuff from entity at ESI
;	Entry:	ESI -> CStuff structure
;	Exit:	ESI unchanged
;		AL = fill, outline flags for geometry draw routines
;	---------------------------------------------------------------
;	WriteFileID - Write 128-byte file ID, updating version
;		number to reflect current FastCAD version
;	XCheckP2:	Extents Check 2D Point at ESI
;	XCheckP3:	Extents Check 3D Point at ESI
;	XCheckSP2:	Extents Check 2D Point on 8087
;	XCheckSP3:	Extents Check 3D Point on 8087
;		(used by EXCheck entity handlers)
;
;	Entry: 8087 px,py(,pz) (tos)
;
;	Exit: extents updated (ESI will not be changed)
;		carry clear (to distinguish from pick)
;	---------------------------------------------------------------
;	XCheckP3:	Extents Check 3D Point at ESI
;	XCheckSP2:	Extents Check 2D Point on 8087
;	XCheckSP3:	Extents Check 3D Point on 8087
;		(used by EXCheck entity handlers)
;
;	Entry: 8087 px,py(,pz) (tos)
;
;	Exit: extents updated (ESI will not be changed)
;		carry clear (to distinguish from pick)
;	---------------------------------------------------------------
;	XCheckSP2:	Extents Check 2D Point on 8087
;	XCheckSP3:	Extents Check 3D Point on 8087
;		(used by EXCheck entity handlers)
;
;	Entry: 8087 px,py(,pz) (tos)
;
;	Exit: extents updated (ESI will not be changed)
;		carry clear (to distinguish from pick)
;	---------------------------------------------------------------
;	XCheckSP3:	Extents Check 3D Point on 8087
;		(used by EXCheck entity handlers)
;
;	Entry: 8087 px,py(,pz) (tos)
;
;	Exit: extents updated (ESI will not be changed)
;		carry clear (to distinguish from pick)
;	---------------------------------------------------------------
;	GetHeaderAdr - XP Service to allow access to the header
;	---------------------------------------------------------------
;	On exit:
;		ESI -> Current Header Data
;		EDI -> Default Header Record (copy, do not change!)
;	===============================================================
;	DLine2 - Draw 2d Styled Line geometry - Normal
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Line Geometry
;		GeoDWAdr -> DWIN structure to use in drawing
;	On exit:
;		Line has been clipped and drawn in current color & style
;	===============================================================
;	DSLine2 - Draw Solid 2d Line geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Line Geometry
;		GeoDWAdr -> DWIN structure to use in drawing
;	On exit:
;		Line has been clipped and drawn
;		    in solid current color with no width
;	===============================================================
;	PkLine2 - Pick test 2d Line geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Line Geometry
;		PkDWAdr -> DWIN structure to use in testing
;	On exit:
;		carry set if line is picked
;	===============================================================
;	PickStatus - composite pick test assiatance
;	---------------------------------------------------------------
;	On exit:
;		carry set if value was 1 at entry
;		PickStat always reset to 0
;	===============================================================
;	XCheckL2 - Extents check line geometry at ESI
;	===============================================================
;	ExpLine2 - Explode 2d Line geometry -> 2d entity or callback
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Line Geometry
;	===============================================================
;	DLine2C - Draw 2d Styled Line geometry - Connecting
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Line Geometry
;		GeoDWAdr -> DWIN structure to use in drawing
;	On exit:
;		Line has been clipped and drawn in current color & style
;	===============================================================
;	EndWLine - End any wide path being constructed
;	===============================================================
;	StartWPoly - DLine2 will be getting parts of a wide poly
;	===============================================================
;	EndWPoly - Close the current wide poly
;	===============================================================
;	MakeNewSeg - Offset line geometry at esi by dx,dy on8087
;	Entry:	esi -> line geometry
;		8087 = dx,dy
;	Exit:	Carry set if error (too few nodes) else
;		the node list has been offset in place
;	=---------------------------------------------------------------
;	PointOnLine
;		carry set if point on 8087 is on line at ESI
;	=---------------------------------------------------------------
;	PolyClipArc2 - Clip a 2D Arc to a 2D convex polygon
;
;	Entry:	ESI->packet of addresses
;		dd	lpNList2 -> 2D convex polygon geometry
;		dd	lpArc2 -> 2D arc geometry to clip
;		dd	lpDestArray -> space for GNL2.Count+1 visible arcs
;
;	Exit:	carry set if operation failed, else
;		CX = number of visible arcs in array at lpDestArray
;		AX bit 0 set: original arc startpoint visible
;		   bit 1 set: original arc endpoint visible
;	=---------------------------------------------------------------
;	AddNdsNList - make room for CX nodes in nodelist at esi
;		before node #BX
;	DNList2 - Draw 2D Node List esi
;
;	On Entry: AL = Fill and Outline flags
;	----------------------------------------------------------------
;	Carry clear when drawn (to distinguish from Pick)
;	----------------------------------------------------------------
;	LenNList2 - Length of node list
;
;	Entry:	ESI points to nodelist geometry
;
;	Exit:	 8087:	Length (tos)
;	----------------------------------------------------------------
;	OffsetNList2 - Offset node list by distance on 8087
;	P2TNList2 - T of nearest point on a 2D node list
;
;	entry 8087:	px,py (tos)
;			ESI points to nodelist geometry
;	PkNList2 - Pick Check 2D Node List ESI against PKWIN
;
;	Carry flag set if list would draw in PKWIN
;	----------------------------------------------------------------
;	PointInPoly -  Test if 2d point is inside 2D convex polygon
;
;	Entry:	8087:  x y (tos)
;		esi->2D polygon geometry (GNL2)
;	PolyClipLine2 - Clip a 2D line to a 2D convex polygon
;
;	Entry:	esi->2D polygon geometry (GNL2)
;		8087: LX1,LY1,LX2,LY2 (TOS)
;
;	Exit:	esi->Array of 3 lines.
;		AX indicates which lines are actually generated:
;		    bit 0 - first exterior line
;		    bit 1 - interior line
;		    bit 2 - second exterior line
;	----------------------------------------------------------------
;	RmvNdsNList - Delete CX nodes from nodelist at esi
;		starting with node #BX
;	If nodelist is part of an entity in drawing list, follow
;	with ERResize.
;	----------------------------------------------------------------
;	S2TNList2 - Calc T on node list from given S parameter
;
;	entry 8087:	S (tos)
;			ESI points to nodelist geometry
;
;	return 8087:	T (tos)
;	----------------------------------------------------------------
;	SizeNList2 - Return size of 2D OR 3D Nodelist at esi
;
;	Return: EAX = Nodelist size in bytes (inc. count, flag bytes)
;		EBX = Size of one node (in bytes)
;	----------------------------------------------------------------
;	SpinNList2 - Spin nodelist at esi by AX nodes
;		Note: ax may be greater than the number of nodes
;	spin in downward direction:(for ax=1) N0=N1, N1=N2, N2=N3
;
;	Exit:	carry set if spin failed (not enough memory)
;	----------------------------------------------------------------
;	StrNList2 - Stretch 2D Node List ESI
;
;	Return carry clear (to distinguish from Pick)
;	----------------------------------------------------------------
;	T2PNList2 - Calc point on node list entity from given T
;
;	entry 8087:	T (tos)
;			ESI points to nodelist geometry
;
;	return 8087:	px,py (tos) point on node list
;	----------------------------------------------------------------
;	T2SNList2 - Calc S on node list entity from given T
;
;	entry 8087:	T (tos)
;			ESI points to nodelist geometry
;
;	return 8087:	S (tos)
;	----------------------------------------------------------------
;	TanNList2 - Tangent vector on node list geometry
;
;	entry 8087:	T (tos)
;			ESI points to nodelist geometry
;
;	return 8087:	tx,ty (tos) tangent vector
;	----------------------------------------------------------------
;	TrnNList2 - Transform 2D Node List esi
;
;	Return carry clear (to distinguish from Pick)
;	----------------------------------------------------------------
;	XCkNList2 - Extents Check 2D Node List ESI
;
;	Return carry clear (to distinguish from Pick)
;	----------------------------------------------------------------;
;	CVP2V3 - Convert real 3d point to DWIN vector
;	---------------------------------------------------------------
;	Entry:	8087 = RealX, RealY, RealZ (tos)
;		GeoDWAdr -> DWIN structure to use in converting
;	Exit:	ESI,EDI = PixelX,PixelY
;	===============================================================
;	CVV2P3 - Convert DWIN vector to real 3d point
;	---------------------------------------------------------------
;	Entry:	ESI,EDI = PixelX,PixelY
;		GeoDWAdr -> DWIN structure to use in conversion
;	Exit:	8087 = RealX,RealY,RealZ (tos)
;	===============================================================
;	DLine2d - Draw 2d Line Segment in 3d window
;	---------------------------------------------------------------
;	On entry:
;		ESI -> 2d line geometry
;		GeoDWAdr -> DWIN to use for clipping/drawing
;	On exit:
;		Carry clear when drawn (to distinguish from Pick)
;	===============================================================
;
;	DLine3 - Draw 3d Styled Line geometry
;	---------------------------------------------------------------
;	On entry:
;		ESI -> 3d Line Geometry
;	On exit:
;		Line has been clipped and drawn in styled current color
;		Carry clear when drawn (to distinguish from Pick)
;	===============================================================
;
;	DSLine3 - Draw Solid 3d Line geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 3d Line Geometry
;		GeoDWAdr -> DWIN structure to use in drawing
;	On exit:
;		Line has been clipped and drawn in solid current color
;	===============================================================
;	CVD2H - Convert real distance to DWIN horizontal pixels
;	---------------------------------------------------------------
;	Entry:	8087 = Real distance
;		GeoDWAdr -> DWIN structure to use in drawing
;	Exit:	ECX = distance in horizontal pixels
;	===============================================================
;	CVD2V - Convert real distance to DWIN vertical pixels
;	---------------------------------------------------------------
;	Entry:	8087 = Real distance
;		GeoDWAdr -> DWIN structure to use in drawing
;	Exit:	ECX = distance in vertical pixels
;	===============================================================
;	CVH2D - Convert DWIN horizontal pixels to real distance
;	---------------------------------------------------------------
;	Entry:	ECX = distance in horizontal pixels
;		GeoDWAdr -> DWIN structure to use in drawing
;	Exit:	8087 = Real distance
;	===============================================================
;	CVP2V - Convert real point to DWIN vector
;	---------------------------------------------------------------
;	Entry:	8087 = RealX, RealY (tos)
;		GeoDWAdr -> DWIN structure to use in converting
;	Exit:	ESI,EDI = PixelX,PixelY
;		two 8087 stack locations used
;	===============================================================
;	CVV2D - Convert DWIN vertical pixels to real distance
;	---------------------------------------------------------------
;	Entry:	ECX = distance in vertical pixels
;		GeoDWAdr -> DWIN structure to use in drawing
;	Exit:	8087 = Real distance
;	===============================================================
;	CVV2P - Convert DWIN vector to real point
;	---------------------------------------------------------------
;	Entry:	ESI,EDI = PixelX,PixelY
;		GeoDWAdr -> DWIN structure to use in drawing
;	Exit:	8087 = RealX,RealY (tos)
;	===============================================================
;	DPoint2 - Draw 2d Point geometry
;	---------------------------------------------------------------
;	Entry:	esi -> 2d Point Geometry
;	Exit:	Point has been clipped and drawn in current color
;	===============================================================
;	PkPoint2 - Pick test 2d Point geometry
;	---------------------------------------------------------------
;	Entry:	esi -> 2d Point Geometry
;	Exit:	carry set if point is picked
;		esi preserved
;	===============================================================
;	PointInWin - Test if 2d point is inside current window
;	---------------------------------------------------------------
;	On entry:
;		8087 = x y (tos)
;	On exit:
;		point removed from 8087
;		Carry set if point is inside GeoDWAdr DWIN
;	===============================================================
;	RectInWin: Is rectangle on 8087 completely in current window?
;	---------------------------------------------------------------
;	On Entry:
;		8087 = XLo,YLo,XHi,YHi
;	On Exit:
;		RECT removed from 8087
;		Carry set if RECT is completely inside GeoDWAdr DWIN
;	===============================================================
;	RectNotInWin: Is rectangle on 8087 completely offscreen?
;	RectNotInPkWin: Is rect on 8087 completely out of pick win?
;	---------------------------------------------------------------
;	On Entry:
;		8087 = XLo,YLo,XHi,YHi
;	On Exit:
;		RECT removed from 8087
;		Carry set if RECT is completely outside GeoDWAdr DWIN
;	---------------------------------------------------------------
;	(Detects rectangle offscreen to top, left, right or below,
;	 NOT case where rectangle completely encloses window.)
;	===============================================================
;	SCkP2 - Stretch-test 2D Point at ES:DI against StrCkWIN
;	Entry:	esi -> GPnt2 structure
;
;	Exit:	Carry set if should stretch (would draw in StretchWin)
;		esi preserved
;	===============================================================
;	TranP2:	Transform 2D Point in memory by CTM
;
;	Entry:	esi -> GPnt2 structure 
;	Exit:	esi unchanged, point transformed 
;	===============================================================
;	CrvPath2 - Signed curvature on 2D path/spline geometry
;	---------------------------------------------------------------
;	entry 8087:	T (tos)
;			ESI points to path/spline geometry
;	return 8087:	Curvature (tos) - carry clear if no error
;	===============================================================
;	DPath2 - Draw 2D Path/Spline geometry at ESI
;	---------------------------------------------------------------
;	Entry: AL = Fill and Outline flags
;	Carry clear when drawn (to distinguish from Pick)
;	===============================================================
;	FPath2 - Add 2D Path/Splines at ESI to edge list for fill
;	---------------------------------------------------------------
;	Entry: AL = Fill and Outline flags
;		If fill bit clear handle like DPath2
;	Carry clear when drawn (to distinguish from Pick)
;	===============================================================
;	LenPath2 - Length of 2D Path/Spline
;	---------------------------------------------------------------
;	entry 8087:	ESI points to path/spline geometry
;	return 8087:	Length (tos)
;	===============================================================
;	NearTPath2 - T of nearest point on a 2D path/spline
;	---------------------------------------------------------------
;	entry	8087: px,py (tos)
;		ESI points to path/spline geometry
;		EAX = 0 (may return T<0 or T>1.0) or
;			T_ON (prevent T<0 and T>1.0)
;	return 8087:	T (tos)
;	===============================================================
;	PkPath2 - Pick Check 2D Path/Spline geometry at ESI against PKWIN
;	---------------------------------------------------------------
;	Carry flag set if list would draw in PKWIN
;	===============================================================
;	PolyArea2 - Compute area of closed polygon at ESI
;	---------------------------------------------------------------
;	Exit:	8087: Area (TOS)
;		CY if can't calculate
;	---------------------------------------------------------------
;	The area is computed using the surveyor's formula:
;
;		A = Fabs(Sum(Det(p[i],p[i+1]),i=0..n-1)) (p[n]=p[0])
;
;	If the polygon is not simple, one may get unexpected results,
;	but these results agree with the computations in FastCAD 2.72.
;	===============================================================
;	RayPath2 - Find all intersections of the path/spline with a ray
;	---------------------------------------------------------------
;	Entry:	8087: x1,y1(,z1),x2,y2(z2) (tos)
;		ERayHdlr -> intersection point handler.
;			Handler Entry: 8087: x,y(,z) (tos)
;			Handler returns: ax=0 to continue, 1 otherwise.
;		ESI -> path/spline geometry
;	Return: Carry clear if function is supported
;	===============================================================
;	S2TPath2 - Calc T on Path/Spline Geometry from given S parameter
;	---------------------------------------------------------------
;	entry 8087:	S (tos)
;			ESI points to path/spline geometry
;	return 8087:	T (tos)
;	===============================================================
;	T2PPath2 - Calc point on Path/Spline Geometry from given T parameter
;	---------------------------------------------------------------
;	entry 8087:	T (tos)
;			ESI points to path/spline geometry
;	return 8087:	px,py (tos) point on spline
;	===============================================================
;	T2SPath2 - Calc S on Path/Spline geometry from given T parameter
;	---------------------------------------------------------------
;	entry 8087:	T (tos)
;			ES:DI points to path/spline geometry
;	return 8087:	S (tos)
;	================================================================
;	TanPath2 - Tangent vector on 2D path/spline geometry
;	---------------------------------------------------------------
;	entry 8087:	T (tos)
;			ES:DI points to path/spline geometry
;	return 8087:	tx,ty (tos) tangent vector
;	================================================================
;	XCkPath2 - Extent-check 2D Path/Spline geometry at ESI
;	---------------------------------------------------------------
;	Carry clear on exit (to distinguish from Pick)
;	===============================================================
;	XplPath2 - Explode 2D Path/Spline geometry at ESI
;		(append line entities for each segment)
;	Entry:	build record already has CStuff from original entity
;
;	Carry clear on exit (to distinguish from Pick)
;	===============================================================
;	DText2 - Draw 2d Text
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Text Geometry
;	===============================================================
;	GetFontName - Get a font name given a font number
;	---------------------------------------------------------------
;	Entry:	AX = Font number
;	Exit:	ESI -> Font name
;		Carry set if not found, ebx-> first entry
;	===============================================================
;	GetFontNum - Get a font number given a font name
;	===============================================================
;	Entry:	ESI -> Font Name
;
;	Exit:	AX = Font number to use
;		Carry set if not found, ebx-> first entry
;	===============================================================
;	LstTxt2	- List Text Geometry & following text at ESI
;	LstTxtSpec2 - List Text Geometry specs only at ESI
;	===============================================================
;	LstTxtSpec2 - List Text Geometry specs only at ESI
;	===============================================================
;	MirrTxt2 - Mirror 2D text geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Text Geometry
;	===============================================================
;	PkTxt2 - Pick Test 2d Text
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Text Geometry
;	On exit:
;		carry set if picked
;	===============================================================
;	TrnTxt2 - Transform 2D text geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Text Geometry
;	===============================================================
;	Tx2Box - Calc bounding box of 2D text geometry
;	Tx2BoxExt - Calc extended bounding box of 2D text geometry
;	---------------------------------------------------------------
;	Entry:
;		ESI -> Text Geometry Record
;	Exit:
;		CY set if error else
;		ESI -> Node List Geometry
;	===============================================================
;	Tx2BoxExt - Calc extended bounding box of 2D text geometry
;	---------------------------------------------------------------
;	Entry:
;		ESI -> Text Geometry Record
;	Exit:
;		CY set if error else
;		ESI -> Node List Geometry
;	===============================================================
;	Tx2Len - Calc real length of 2d text geometry Baseline
;	---------------------------------------------------------------
;	Entry:
;		ESI -> Text Geometry Record
;	Exit:
;		CY set if error else
;		8087: Length (TOS)
;	===============================================================
;	XCheckTx2 - Extent check 2d Text geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Text Geometry
;	===============================================================
;	ExpText2 - Explode Text Geometry
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Text Geometry
;	===============================================================
LoadFontNameCmb********** NOT FOUND ******
;	==============================================================
;	LoadFontNameLst/Cmb - Load current fonts to a list/combo ctrl
;	Entry:	ax: the control id
;	===============================================================
AbortEdit********** NOT FOUND ******
;	==============================================================
;	GetTextSpecs - Get Text Geometry Specifications
;	---------------------------------------------------------------
;	On entry:
;		ESI -> GTxt2 Geometry to receive current TSpecs
;	===============================================================
;	TSpecAlt - Set Alternate Text Specs with Dialog (for Change,etc)
;	TSpecEd - Edit Entity Text Specs with Dialog
;	===============================================================
GetTextSpecsAlt********** NOT FOUND ******
;	==============================================================
;	Text2Exp - Explode 2d Text
;	---------------------------------------------------------------
;	Entry:	ESI -> Entity record
;		EDI -> Process exploded component entity proc
;	Exit:	Carry set if not supported, else clear
;		and process callback was called.
;	---------------------------------------------------------------
;	If EDI callback adrs = 0 then :
;		a) Append component entity, b) draw appended entity.
;	---------------------------------------------------------------
;	If it is not 0, then just build component entities but do not
;	append or draw them, and pass the address of the entity in ESI
;	to the callback proc.
;	===============================================================
;	TSpecCmd - Set Current Text Specs with Dialog
;	TSpecAlt - Set Alternate Text Specs with Dialog (for Change,etc)
;	TSpecEd - Edit Entity Text Specs with Dialog
;	===============================================================
;	TSpecEd - Edit Entity Text Specs with Dialog
;	===============================================================
;	PostCmdMsg - Post WM_COMMAND message to hMainWin
;	---------------------------------------------------------------
;	On entry:
;		eax = wParam (command data)
;	===============================================================
;	PostScriptMsg - Post WM_COMMAND/IDM_SCRIPT message to hMainWin
;	===============================================================
;	Prompt - Display new prompt text
;	===============================================================
;	SendCmdMsg - Send WM_COMMAND message to hMainWin
;	---------------------------------------------------------------
;	On entry:
;		eax = wParam (command data)
;	---------------------------------------------------------------
;	This form completes msg processing before returning
;	===============================================================
;	StartTimer - Start a timer running
;	---------------------------------------------------------------
;	On entry:
;		eax = # milliseconds delay
;		esi = timer id # 0..15
;		edi = address of service proc
;	---------------------------------------------------------------
;	Call EndTimer to stop it
;	===============================================================
;	EndTimer - End a running timer
;	---------------------------------------------------------------
;	On entry:
;		esi = timer id # 0..15
;	===============================================================
;	A2TE2 - Compute T to point at bearing angle on ellipse
;
;	Entry:	8087: Angle (TOS)
;		ESI->Ellipse Geometry
;
;	Exit:	T (TOS)
;	===============================================================
;
;	BAng2P - Compute Bearing Angle to Associated Parameter
;
;	Input:	8087 = Eccentricity, Bearing Angle, (tos)
;	Result: 8087 = Parameter
;	---------------------------------------------------------------
;	===============================================================
;	BAng2P - Compute Bearing Angle to Associated Parameter
;
;	Input:	8087 = Eccentricity, Bearing Angle, (tos)
;	Result: 8087 = Parameter
;	===============================================================
;	CrvElp2 - Compute signed curvature on ellipse
;
;	Curvature on ellipse is given by:
;
;				eR
;		k = -----------------------------
;		    (eRCos(t) + RSin(t))^(3/2)
;
;	On entry: 8087: T (TOS)
;		  ESI -> 2D Ellipse Geometry
;
;	On exit:  curvature (TOS) - carry clear if no error
;	===============================================================
DArc2********** NOT FOUND ******
;	==============================================================
DCir2********** NOT FOUND ******
;	==============================================================
DElA2********** NOT FOUND ******
;	==============================================================
DElp2********** NOT FOUND ******
;	==============================================================
;	ElA2AngParm - Convert elliptical arc angles to parameter equivalents
;		(norm/denorm support routine for Elliptical Arc Math Handlers)
;
;	Entry:	ES:di -> elliptical arc geometry
;
;	Return: 8087: SAngParm,	AngWParm
;	===============================================================
;	ElpALen - Elliptical Arc Length
;
;	Entry:	ESI -> Ellitical Arc Geometry
;	===============================================================
;	ElpLen - Compute Ellipse Circumferance
;
;	Entry:	ESI -> Ellipse geometry
;	===============================================================
;	MirArc2 - Transform 2D Arc Geometry at ESI
;	Carry clear when done (to distinguish from Pick)
;	===============================================================
;
;	MirElA2 - Mirror-Transform 2D Ellipse Arc Geometry at ESI
;	Carry clear when done (to distinguish from Pick)
;	===============================================================
;
;	NUTElA2 - N.U.Transform 2D Ellipse Arc Geometry at ESI
;	Carry clear when done (to distinguish from Pick)
;	===============================================================
;	NUTElp2 - N.U.Transform 2D Ellipse Geometry at ESI
;	Carry clear when done (to distinguish from Pick)
;	===============================================================
;
;	P2BAng - Compute Associated Parameter to Bearing Angle
;
;	Input:	8087 = Eccentricity, Bearing Angle, (tos)
;	Result: 8087 = Bearing Angle
;	---------------------------------------------------------------
;
;	Here we invert the expression  = atan(tan()/Ecc)
;	to get  = atan(Ecc*tan())
;		 = /2-atan(tan(/2-)/Ecc)
;		 = /2-BAng2P(/2-)
;
;	P2TE2 - T of nearest point on a 2D ellipse/elliptical arc
;
;	entry 8087:	px,py (tos)
;			ESI points to ellipse geometry
;
;	return 8087:	T (tos)
;
;	The nearest point occurs when
;
;	F(theta)=MaxR*X*Sin(t)-MinR*Y*Cos(t)+(MinR^2-MaxR^2)*Cos(t)*Sin(t)
;		=0.0
;
;	To find theta, we use Newton's method with
;
;	F'(theta)=MaxR*X*Cos(t)-MinR*Y*Sin(t)+
;		(MinR^2-MaxR^2)*(Cos^2(t)-Sin^2(t))
;
;	We consider the process complete when the arclength between
;	successive iterations is small. This occurs when
;	radius*(delta theta) is small.
;
;	Extensive experimenting shows that this converges to a solution
;	in less than 6 iterations on the average.
;	===============================================================
;	PkArc2 - Pick test 2D Arc
;	PkElp2 - Pick test 2D Ellipse
;	PkElA2 - Pick test 2D Elliptical Arc
;	Entry:	esi-> 2D conic geometry
;	===============================================================
;	PkCir2 - Pick test 2D Circle
;	PkArc2 - Pick test 2D Arc
;	PkElp2 - Pick test 2D Ellipse
;	PkElA2 - Pick test 2D Elliptical Arc
;	Entry:	esi-> 2D conic geometry
;	===============================================================
;	PkElA2 - Pick test 2D Elliptical Arc
;	Entry:	esi-> 2D conic geometry
;	===============================================================
;	PkElp2 - Pick test 2D Ellipse
;	PkElA2 - Pick test 2D Elliptical Arc
;	Entry:	esi-> 2D conic geometry
;	===============================================================
;	S2TE2:	Return T on 2D ellipse given S
; 
;	entry 8087:	S (tos)
;			ESI points to ellipse geometry
;
;	return 8087:	T (tos)
;	===============================================================
;	S2TEA2: Return T on 2D ellipse arc given S
; 
;	entry 8087:	S (tos)
;			ESI points to ellipse arc geometry
;
;	return 8087:	T (tos)
;	===============================================================
;
;	T2AE2 - Compute bearing angle to point at T on ellipse
;
;	Entry:	8087: T (TOS)
;		ESI->Ellipse Geometry
;
;	Exit:	Angle (TOS)
;	===============================================================
;
;	T2PE2 - Compute point on ellipse at T
;
;	On entry: 8087: T (TOS)
;		  ESI -> 2D Ellipse Geometry
;
;	On exit:  X, Y (TOS)
;	===============================================================
;
;	T2SE2:	Return S given T on an ellipse
; 
;	entry 8087:	T (tos)
;			ESI points to ellipse geometry
;
;	return 8087:	S (tos) on the ellipse
;	===============================================================
;
;	T2SEA2:  Return S given T on an ellipse arc
; 
;	entry 8087:	T (tos)
;			ESI points to ellipse arc geometry
;
;	return 8087:	S (tos) on the ellipse
;	===============================================================
;
;	TanElp2 - Compute tangent vector on ellipse
;
;	On entry: 8087: T (TOS)
;		  ESI -> 2D Ellipse Geometry
;
;	On exit:  tx,ty (TOS)
;	===============================================================
;	TrnArc2 - Transform 2D Arc Geometry at esi
;	Carry clear when done (to distinguish from Pick)
;	---------------------------------------------------------------
;	TrnCir2 - Transform 2D Circle Geometry at esi
;	Carry clear when done (to distinguish from Pick)
;	---------------------------------------------------------------
;	TrnElA2 - Transform 2D Elliptical Arc Geometry at esi
;	Carry clear when done (to distinguish from Pick)
;	---------------------------------------------------------------
;	TrnElp2 - Transform 2D Ellipse Geometry at esi
;	Carry clear when done (to distinguish from Pick)
;	---------------------------------------------------------------
XCheckArc2********** NOT FOUND ******
;	==============================================================
XCheckCir2********** NOT FOUND ******
;	==============================================================
XCheckElp2********** NOT FOUND ******
;	==============================================================
XCheckElpA2********** NOT FOUND ******
;	==============================================================
;	IsInArc2 - Test if a point is within a 2d arc
;	---------------------------------------------------------------
;	The angle from the center to the point is tested for inclusion
;	within the arc starting and ending angles. No radius:distance
;	test is made
;	---------------------------------------------------------------
;	On entry:
;		8087 = X, Y (tos)
;		ESI -> Arc Geometry
;	On exit:
;		Carry set if NOT within arc angle
;	===============================================================
;	ExpArc2 - Explode Arc2 Geometry to Arc2 Entity
;	---------------------------------------------------------------
;	On entry:
;		esi -> 2d Arc Geometry
;	===============================================================
;	DisplayHelp - Display the appropriate help
;	---------------------------------------------------------------
;	EndF1HelpHook - Stop intercepting F1 key messages to dialogs
;	---------------------------------------------------------------
;	EndHelpContext - Restore prior help context
;	---------------------------------------------------------------
;	HelpRequest - Send MP_HELP to hMainWin (it calls DisplayHelp)
;	---------------------------------------------------------------
;	SetF1HelpHook - Setup to intercept F1 key msgs to dialogs
;	---------------------------------------------------------------
;	SetHelpContext - Specify context for following help requests
;	---------------------------------------------------------------
;	On entry:
;		eax = Help Context ID #
;		edx -> Help File name ANSIZ string (0=FCW32.HLP)
;	---------------------------------------------------------------
HelpCmd********** NOT FOUND ******
;	==============================================================
;	ForceHelp - Display the appropriate help # ESI
;	---------------------------------------------------------------
;	ClearIBlks - Release ALL current information blocks
;	---------------------------------------------------------------
;	DelIBlk - Delete (release memory) info block by IType
;	GetIBlk - Get handle and segment for info block by IType
;	ReadIBlk - Read Info Block data from ESI
;		(Allocates and registers entry, 
;		 Copies data from ESI to allocated segment)
;	RegIBlk - Register Info Block segment and handle by IType
;	SizeIBlk - Resize info block by IType
;	UnRegIBlk - Un-Register Info Block by IType
;		Does *not* release memory, presumably caller will
;		have already done this
;	WriteIBlks - Write ALL current info blocks to specified file
;	RestoreIBlk - Replace Info Block in info block table
;			and delete the current IBlk
;
;	Entry:	ESI -> The Clone IBlk to Restore to current
;
;	Exit:	Carry set if error
;	---------------------------------------------------------------
;	IBlkSVC - Call InfoBlock Service
;	---------------------------------------------------------------
;	On entry:
;		EAX = IBTYPE (-1 = Send to All IBlks)
;		EBX = Service ID Message
;			0 = ORIGIN Change: ESI-> X,Y,Z GPnt3 struc
;			1 = UNITS Change: ESI-> REAL4 Scale Difference
;			2 = Drawing Just Loaded (Init IBlk)
;			3 = Change to different current IBlock
;			    (ESI -> new current IBlk)
;			4 = Get ready for Save (Update IBlk)
;	On exit:
;		Carry set if service not supported (if EAX<>ALL)
;	===============================================================
GetFileIBlk********** NOT FOUND ******
;	==============================================================
;	Angle3 - Compute angle bet. two vectors with respect to an axis
;	---------------------------------------------------------------
;	On entry:
;		esi->Vec1
;		edi->Vec2
;		ebx->Axis
;	ret:	8087: Angle TOS
;	---------------------------------------------------------------
;	Note:	The angle is swept out according to the right hand rule
;		(Thumb along axis, fingers moving from vec1 to vec2)
;	===============================================================
;
;	CALOA3:	Calculate 3D Orientation Angles
;		(SPHERE style: +Z exact, +X meridian)
;	---------------------------------------------------------------
;	On entry:
;		Z-axis direction vector (planar DV - map to +Z)
;	        Meridian direction vector (map towards +X) (tos)
;	return:	Orientation angles from std gen to build TM:
;		RXY, RYZ, RZX (tos)
;	---------------------------------------------------------------
;	This routine calculates a set of angles to be used with PREOA3
;	that will transform a standard generation-space centered at
;	0,0,0 and aligned with simple +X,+Y,+Z directions to the
;	orientation in space described by a +Z direction vector, and
;	a +X meridian (180 arc) determined by a second direction vector.
;	===============================================================
;
;	CALXA3:	Calculate 3D Orientation Angles
;		(TEXT style: +X exact, +y meridian)
;	---------------------------------------------------------------
;	entry:  X-axis direction vector (planar DV - map to +X)
;	        Meridian direction vector (map towards +Y) (tos)
;	return:	Orientation angles from std XY gen to build TM:
;		RXY, RYZ, RZX (tos)
;	---------------------------------------------------------------
;	This routine calculates a set of angles to be used with PREOA3
;	that will transform a standard generation-space centered at
;	0,0,0 and aligned with simple +X,+Y,+Z directions to the
;	orientation in space described by a +X direction vector, and
;	a +Y meridian (180 arc) determined by a second direction vector.
;
;	Takes cross-product of the vectors to get +Z axis vector,
;	then jumps into CALOA3 using +Z axis, +X meridian
;	===============================================================
;
;	CROSSP:	Calculate the cross-product of two 3D vectors
;		(a vector perpendicular to the two input vectors)
;	---------------------------------------------------------------
;	fntry:	on 8087: x1,y1,z1,x2,y2,z2
;
;	return:	on 8087: xc,yc,zc (tos)
;		changes no registers
;	===============================================================
;
;	DIST2P3 - Calculate distance between two points (3D)
;	---------------------------------------------------------------
;	on entry:
;		x1, y1, z1, x2, y2, z2 (tos)
;	on exit:
;		dist (tos)
;	===============================================================
;
;	DOTP:	Calculate the dot-product of two 3D vectors
;		(d1d2 = dx1*dx2+dy1*dy2+dz1*dz2)
;	---------------------------------------------------------------
;	fntry:	on 8087: dx1,dy1,dz1,dx2,dy2,dz2
;
;	return:	on 8087: dot product (tos)
;		changes no registers
;	---------------------------------------------------------------
;		Note: If the vectors have been normalized (with NORMDV3)
;		      then the dot product = cosine of the angle between
;		      the vectors.
;	===============================================================
;
;	INTL3XY - Intersect 3D Line with XY Plane
;	---------------------------------------------------------------
;	entry:	on 8087: x1,y1,z1,x2,y2,z2
;
;	return:	carry set if line parallel to XY plane, else
;		on 8087: IntX,IntY (a 2D point)
;	---------------------------------------------------------------
;	Uses parametric equations for 3d line:
;		X=(x2-x1)*U+x1
;		Y=(y2-y1)*U+y1
;		Z=(z2-z1)*U+z1 -> U=-z1/(z2-z1), where Z=0.0
;	===============================================================
;
;	NORMDV3: Normalize 3D Direction Vector
;		(Make the length of the vector = 1.0)
;	---------------------------------------------------------------
;	entry:	on 8087: dx,dy,dz (tos)
;
;	return:	on 8087: dx,dy,dz (tos)
;	---------------------------------------------------------------
;	uses 2 additional 8087 stack positions
;	0 length returns 1,0,0 with carry set, else clear
;	===============================================================
;
;	NPONL3:	Nearest point on 3D line to given point
;	---------------------------------------------------------------
;	entry:	esi-> 3D line geometry
;		on 8087: x,y,z (tos) of point not on line
;
;	return:	8087 = x,y,z (tos) of point on line
;	===============================================================
;
;	P2TL3:	Return location of given 3D point on 3D line as t
;		parameter (proportion of length). Values <0 or >1
;		are off ends of the line segment.
;	---------------------------------------------------------------
;	On entry:
;		8087:	px,py,pz (tos)
;		esi -> line geometry
;	On exit:
;		8087:	t (tos) on the line
;	===============================================================
;
;	PREIA3:	Pre-rotate CTM by inverse of 3D orientation angles
;	---------------------------------------------------------------
;	entry:	on 8087: RXY, RYZ, RZX (TOS)
;		(Orientation angles from std gen to build TM)
;	---------------------------------------------------------------
;	This will tilt World to Object coordinates
;
;	The inverse orientation angle rotations are PREfixed to the
;	current transform matrix (CTM).
;	===============================================================
;
;	PREOA3:	Pre-rotate CTM by 3D orientation angles
;	---------------------------------------------------------------
;	entry:	on 8087: RXY, RYZ, RZX (TOS)
;		(Orientation angles from std gen to build TM)
;	---------------------------------------------------------------
;	This will tilt Object to World coordinates
;
;	The specified orientation angle rotations are PREfixed to the
;	current transform matrix (CTM).
;	===============================================================
;
;	PROJPLN - Project Vec2 onto plane determined by Vec1
;	---------------------------------------------------------------
;	entry:	8087: Vec1(x,y,z),Vec2(x,y,z) TOS
;	ret:	8087: Projection of Vec2 onto plane Vec1 (x,y,z) TOS
;	===============================================================
;
;	PROJVEC - Project Vec2 onto Vec1
;	---------------------------------------------------------------
;	entry:	8087: Vec1(x,y,z),Vec2(x,y,z) TOS
;	ret:	8087: Projection of Vec2 onto Vec1 (x,y,z) TOS
;	===============================================================
;
;	T2PL3:	Return point on 3D line given t parameter
;		(proportion of length). T values <0 or >1
;		return points off ends of the line segment.
;	---------------------------------------------------------------
;	On entry:
;		8087:	t (tos)
;		esi -> line geometry
;	On exit:
;		8087:	px,py,pz (tos)
;	===============================================================
;
;	AllowPrCancel - Allow printer cancel during long draw ops.
;	===============================================================
PrintCmd********** NOT FOUND ******
;	==============================================================
PrintText********** NOT FOUND ******
;	==============================================================
PrintJob********** NOT FOUND ******
;	==============================================================
PrintView********** NOT FOUND ******
;	==============================================================
DrawView********** NOT FOUND ******
;	==============================================================
PrTxSetup********** NOT FOUND ******
;	==============================================================
PrintADlg********** NOT FOUND ******
;	==============================================================
;	QKeyCtrlShift - Get CtrlShift key status
;	Exit: 	Carry set if pressed
;	===============================================================
;	QKeyCtrlShift - Get CtrlShift key status
;	Exit: 	Carry set if pressed
;	===============================================================
;	QKeyShift - Get shift key status
;	Exit: 	Carry set if pressed
;	---------------------------------------------------------------
;	ReceiveKey: Receive single characters from any source
;	---------------------------------------------------------------
;	On entry:
;		EAX = Character ANSI value
;		DestSink = KEYSINK currently in use
;	On exit:
;		Carry set if key is a token delimiter, else clear
;	---------------------------------------------------------------
;	This routine gathers keystrokes from all sources and
;	assembles them into tokens, calling a TknProc procedure
;	when a token has been assembled. The token assembly is
;	displayed in a BTN object if desired.
;	===============================================================
;	ReceiveFKey: Receive function/special keys from event loop
;	---------------------------------------------------------------
;	On entry:
;		EAX = Character ANSI value
;	===============================================================
;	ReceiveRDig: Receive Real X,Y digitize from any source
;	---------------------------------------------------------------
;	On entry:
;		EAX = EA_2dC or EA_3dC
;		if 2d: 8087 = RealX, RealY (tos)
;		if 3d: 8087 = RealX, RealY, RealZ (tos)
;	On exit:
;	===============================================================
;	Z3dCmd - 3d Zoom (by specs dialog) Command
;	===============================================================
;	SymEnum - Enumerate each entity of a nested SYMREF
;	---------------------------------------------------------------
;	On entry:
;		esi -> SYMREF entity to enumerate
;		edi -> proc to call for each transformed entity
;	On exit:
;		carry set if callback aborted enumeration
;	---------------------------------------------------------------
;	On entry to callback:
;		esi -> transformed copy of entity
;	On exit from callback:
;		Carry set = stop iteration
;	===============================================================
;	EntTempCopy - Make Temporary Copy of Entity (SYM Recursion)
;	EntTempCopy2 - Make Temporary Copy of Entity (DRAG Cmd)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> original entity
;	On exit:
;		ESI -> Copy buffer (only one exists)
;	===============================================================
;	EntTempCopy2 - Make Temporary Copy of Entity (DRAG Cmd)
;	---------------------------------------------------------------
;	On entry:
;		ESI -> original entity
;	On exit:
;		ESI -> Copy buffer (only one exists)
;	===============================================================
EntTempReset********** NOT FOUND ******
;	==============================================================
;	SRefEntity - Get Entity within SYMREF that is picked
;	---------------------------------------------------------------
;	On entry:
;		ESI -> SREF entity
;		EDI -> Pick Point Geometry
;	On exit:
;		Carry set if entity picked, and
;		ESI -> Transformed copy of Picked entity
;		ECX = handle of sublist for source
;		EBX -> Untransformed source of picked entity
;	===============================================================
;	SRefClone - Duplicate Entity within SYMREF that is picked
;	---------------------------------------------------------------
;	On entry:
;		ESI -> SREF entity
;		EDI -> Pick Point Geometry
;	On exit:
;		Carry set if entity picked, and
;		EAX -> Transformed DLDup of Picked XFormed entity
;		else carry clear and EAX = 0
;		Release clone with DLDelete.
;	===============================================================
;	Extract - Extract Attributes for processing
;	---------------------------------------------------------------
;	On entry:
;		ESI -> proc to process each atrib entity
;	---------------------------------------------------------------
;	On entry to the callback:
;		ESI -> the Atrib2 entity record
;		ESI = 0 to signal end of extract
;	On exit from the callback:
;		EAX <> 0 will abort the scan
;	===============================================================
;	DrawAH - Draw Current arrowhead
;			using parameters set by SetAH
;			(called by by UseCStuff or by UseDStyle)
;
;	Entry:	8087: x,y,rotation (tos)
;			where rotation=0.0 points left
;	===============================================================
;	SetAH - Set up Arrowhead style, size for use
;
;	Entry:	AX = Arrow Style #
;		8087 = Arrowhead length, height (tos)
;	Exit:	CurAHOfs,CurAHXScl,CurAHYScl set
;	===============================================================
;	ExpAH - Explode Current arrowhead
;			using parameters set by SetAH
;			(called by UseCStuff or by UseDStyle)
;
;	Entry:	8087: x,y,rotation (tos)
;			where rotation=0.0 points left
;		AL = Arrowhead Color
;	===============================================================
;	NullAH - Do Nothing ArrowHead Handler
;	===============================================================
;	ExpEntArrows - Explode Arrows on Entities
;	---------------------------------------------------------------
;	esi -> entity
;	edi -> process callback
;	===============================================================
;	DoFill:	Clip and draw finished filled edge list
;	---------------------------------------------------------------
;	Entry:
;		AL = fill flags (bits 2,3 allow solid pen/brush override)
;	===============================================================
;	FLine2S:Add line segment to edge list for fill
;	---------------------------------------------------------------
;	Entry:
;		AL = outline flag (01h norm, 04h solid)
;		8087 = x1,y1,x2,y2 (tos)
;	Exit:
;		Carry clear (to distinguish from Pick)
;	---------------------------------------------------------------
;		(Use between IniFill and DoFill - for multipolys etc.) 
;	===============================================================
;	FLine2S:Add line segment to edge list for fill
;	---------------------------------------------------------------
;	Entry:
;		AL = outline flag (01h norm, 04h solid)
;		8087 = x1,y1,x2,y2 (tos)
;	Exit:
;		Carry clear (to distinguish from Pick)
;	---------------------------------------------------------------
;		(Use between IniFill and DoFill - for multipolys etc.) 
;	===============================================================
;	IniFill - Init fill process (start building new edge list)
;	===============================================================
;	AskLayerFrozen
;	---------------------------------------------------------------
;	On entry:
;		EAX = Layer ID #
;	On exit:
;		ESI unchanged
;		Carry set if layer is currently frozen
;	===============================================================
;	AskLayerHidden
;	---------------------------------------------------------------
;	On entry:
;		EAX = Layer ID #
;	On exit:
;		ESI unchanged
;		Carry set if layer is currently hidden
;	===============================================================
;	GetLayerDlg - Get layer ID from a user select dialog
;	---------------------------------------------------------------
;	On exit:
;		EAX = Layer ID #
;		carry set if dialog canceled
;	===============================================================
;	GetLayerName
;	---------------------------------------------------------------
;	On entry:
;		EAX = Layer ID #
;	On exit:
;		ESI -> ANSIZ Layer name string
;		Carry set if layer ID not defined
;	===============================================================
;	GetLayerNr - Get layer ID from text name
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ layer name string
;	On exit:
;		EAX = Style ID #
;		carry set if layer not found
;	===============================================================
;	ChangeCurLayer - Set Current Layer to LayerID EAX
;	===============================================================
;	AddLayerBtn - define new layer name
;	---------------------------------------------------------------
;	GetColorNr - Conduct color selection dialog using ColorCtl
;	===============================================================
;	GetLStyleNr - RDATA RD_LStyle data request support procedure
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ style name string
;		NULL stg will trigger selection dialog
;	On exit:
;		EAX = Line Style ID #
;		EBX = adrs of LS struc
;		carry set if style not found/dialog canceled
;	===============================================================
;	GetLSName - Get address of line style name
;	---------------------------------------------------------------
;	On entry:
;		EAX = desired line style ID #
;		UseLStyIB -> LSTYIB to use
;	On exit:
;		ESI -> LS name string
;	===============================================================
;	LSSync - Sync Line Style to draw from start of pattern
;	===============================================================
;	LSSyncAt - Sync Line Style to draw from start of pattern
;			plus specified offset in LS T (on 8087)
;	===============================================================
;	UseLStyle - Select line style for use during current entity
;	---------------------------------------------------------------
;	On entry:
;		AX = desired line style ID #
;	On exit:
;		CurLStyleAdr -> selected LS data structure
;		(line style now sync'd to start of definition)
;		AL = F_O or F_SO for outline style
;	===============================================================
;	LSseq2id - Convert sequence # to id #
;	---------------------------------------------------------------
;	On entry:
;		AX = sequence #
;	On exit:
;		EAX = ID # unless
;		Carry set if LS for sequence # doesn't exist
;		All but eax unchanged
;	===============================================================
;	LSid2seq - Convert id # to sequence #
;	---------------------------------------------------------------
;	On entry:
;		AX = ID # assigned to LS
;	On exit:
;		EAX = sequence # (order in LS list in LSTYIB) unless
;		Carry set if LS for sequence # doesn't exist
;		All but eax unchanged
;	===============================================================
;	LSAdr - Get address of specified LS data
;	---------------------------------------------------------------
;	On entry:
;		AX = desired line style ID #
;		UseLStyIB -> LSTYIB to use
;	On exit:
;		EBX -> LS data structure
;		Only EBX has been changed
;		Carry set if id not found - style 0 adr returned
;	===============================================================
;	GetFSName - Get address of a fill style name
;	---------------------------------------------------------------
;	On entry:
;		EAX = desired fill style ID #
;		UseFStyIB -> FSTYIB to use
;	On exit:
;		ESI -> fill style name
;		EDI -> FSTY record address
;		other registers unchanged
;		Carry set if ID was not found,
;		 (if not found, ESI, EDI set for ID=0)
;	===============================================================
;	FindFSAdr - Find FSTY from a fill style name
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ style name string
;	On exit:
;		ESI -> fill style data
;		EDI -> FSTY record address
;		other registers unchanged
;		Carry set if ID was not found,
;		 (if not found, ESI, EDI set for ID=0)
;	===============================================================
;	GetFSAdr - Get address of a fill style record  from ID
;	---------------------------------------------------------------
;	On entry:
;		EAX = desired fill style ID #
;		UseFStyIB -> FSTYIB to use
;	On exit:
;		ESI -> fill style data
;		EDI -> FSTY record address
;		other registers unchanged
;		Carry set if ID was not found,
;		 (if not found, ESI, EDI set for ID=0)
;	===============================================================
;	GetFStyleNr - RDATA RD_FStyle data request support procedure
;	---------------------------------------------------------------
;	On entry:
;		ESI -> ANSIZ style name string
;		NULL stg will trigger selection dialog
;	On exit:
;		EAX = Line Style ID #
;		carry set if style not found/dialog canceled
;	===============================================================
;	LookupVar - Lookup Value of a Variable
;	---------------------------------------------------------------
;	On entry:
;		ESI -> keyword buffer (ANSIZ)
;	On exit:
;		ESI -> Variable text value
;		Carry set if keyword is not a defined variable
;	===============================================================
;	MacroCmdChk - Check for Valid Macro Command
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Command buffer
;	On exit:
;		carry set if a macro WAS found & processed
;	===============================================================
;	SVC SetVar,pLabel,pValue - Set variable pLabel to value pValue
;	===============================================================
;	GetErrFlagAdr - return address of IFERR variable
;	===============================================================
;	MakeSymbol - Complete a Symbol Insertion Command
;	---------------------------------------------------------------
;	On entry:
;		ESI -> Symbol Name
;	On exit:
;		Symbol insertion complete
;		CmdEnd has been called
;	---------------------------------------------------------------
;	This starts a multi-bead chain to insert multiple SYMREFs
;	===============================================================
;	SVC FindSymDef - Find Symbol definition record
;	---------------------------------------------------------------
;	On entry:
;		ESI -> name stg to find (ANSIZ)
;	On exit:
;		ESI -> Record if found
;		Carry set if NOT found
;	===============================================================
;	InsSymRef - Insert a SYMREF to a given SYMDEF (XP)
;	---------------------------------------------------------------
;	On entry:
;		esi -> SYMDEF entity
;		edi = hSymCatDL
;	On exit:
;		If the SYMDEF is not in the main dwg file,
;		it is appended.
;		A SYMREF to the specified DEF is located and placed.
;	===============================================================
;	AbortCurSRef - Abort InsSymRef now in progress...
;	---------------------------------------------------------------
;	Note that this is not a normal termination - it does not
;	call SVC CmdEnd - this service should only be used in
;	preparation of changing the symbol definition being referenced,
;	and then continuing with the current symbol reference command.
;	===============================================================
;	FindAllInts - Find all intersections of two entities
;	---------------------------------------------------------------
;	On entry:
;		ESI -> first entity
;		EDI -> 2nd entity
;	On exit:
;		EBX -> List of Intersections
;		EAX = # of Intersections
;		carry set if no intersection calculated
;	===============================================================
;	FindNearInt - Find nearest intersection of two entities
;			to a specified point
;	---------------------------------------------------------------
;	On entry:
;		ESI -> first entity
;		EDI -> 2nd entity
;		EBX -> GPnt2 geometry of point determining nearest
;	On exit:
;		EBX -> GPnt2 data for intersection, unless
;		carry set if no intersection calculated
;	===============================================================
;	InsPart - Insert a Part from a File Command
;	===============================================================
PartEntity********** NOT FOUND ******
;	==============================================================
;	CopyCurDStyle - Copy current DStyle data to [esi]
;	===============================================================
;	DStyleList - List Dimension Style Info at ESI
;	===============================================================
;	EdDimSty2 - Edit A Dimension Style at ESI (Entity Edit)
;	===============================================================
;	CopyCurDStyle - Copy current DStyle data to [esi]
;	===============================================================
;	GetDStyle2Alt - Post DStyle2Alt changes to DStyle2 at ESI
;	===============================================================
;	DStyleCmd2 - Set Dimension Styles with dialog
;	===============================================================
;	DStyle2Alt - Get alternate Dimension Styles (for Change)
;	===============================================================
AtLine2********** NOT FOUND ******
;	==============================================================
;	SaveLWidth/RestoreLWidth: S&R the current line width setting
;	(Currently only 1 level deep)
;	===============================================================
RestoreLWidth********** NOT FOUND ******
;	==============================================================
;	ZeroLWidth - Disable line width drawing for this entity
;	---------------------------------------------------------------
;	A later call to SetLWidth or the next call to UseLWidth
;	will restore line width drawing.
;	===============================================================
;	UseLWidth - Set Line width from entity record ESI
;	===============================================================
;	SetLWidth - Specify line width value from 8087 tos
;	---------------------------------------------------------------
;	This is only intended to be used with entities that support
;	multiple widths - this overrides width by color mapping.
;	===============================================================
;	GetLWidthV - Get LWidth value to use adjusted for paper space
;	===============================================================
;	GetLWFlagsAdr - Return address of LWFlags in EAX
;	===============================================================
;	CenterMark - Generate CenterLine or CenterMark
;	---------------------------------------------------------------
;	On entry:
;		AX = DFlags DS2_RDCL or DS_RDCM bits matter
;		ESI -> Line Geometry Handler
;		8087 = CenX, CenY, Radius, ALen (tos)
;	===============================================================
;	SaveAbort - XPMessage XPM_BeforeSave proc calls to cancel save.
;	===============================================================
;	AskProtected - Set carry if protected flag ESI bits set
;	---------------------------------------------------------------
;		ESI = flags PROT_CHG,PROT_PRINT,PROT_LYR
;		EDI -> hDLIST (NULL = hCurDL)
;	(also issue protected drawing message box)
;	---------------------------------------------------------------
;	AskProtectedX - EAX-> Header IBlock to use for testing
;	ChkProtected - no message box, just status returned
;	===============================================================
;	ChkProtected - no message box, just status returned
;	===============================================================
;	AskProtectedX - EAX-> Header IBlock to use for testing
;	ChkProtected - no message box, just status returned
;	===============================================================
