Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-1


				PAGE    60,132
				TITLE   INDEI15 - 386 XMA Emulator - Interrupt 15 handler
				
				COMMENT #
				* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
				*                                                                             *
				* MODULE NAME     : INDEI15                                                   *
				*                                                                             *
				*                                                                             *
				*                    5669-196 (C) COPYRIGHT 1988 Microsoft Corp.              *
				*                                                                             *
				* DESCRIPTIVE NAME: Interrupt 15H handler for the 80386 XMA emulator          *
				*                                                                             *
				* STATUS (LEVEL)  : Version (0) Level (2.0)                                   *
				*                                                                             *
				* FUNCTION        : This module emulates the MOVEBLOCK functions of interrupt *
				*                   15H.  The MOVEBLOCK functions are specified by an AH value*
				*                   of 87H to 89H.  The user can use the MOVEBLOCK functions  *
				*                   to copy a block of memory to another block of memory.     *
				*                   This includes copying to and from memory above 1M.  This  *
				*                   is really where this function comes in handy.  The user   *
				*                   can reserve memory above 1M for use by the MOVEBLOCK      *
				*                   functions by specifying the number of K to be reserved as *
				*                   a parameter on the line to load the emulator in the       *
				*                   CONFIG.SYS file.                                          *
				*                                                                             *
				*                        DEVICE=INDXMAEM.SYS bbb                              *
				*                                                                             *
				*                        "bbb" is the number of K to reserve for MOVEBLOCK    *
				*                        functions                                            *
				*                                                                             *
				*                   We allocate a buffer for the MOVEBLOCK functions at the   *
				*                   top of available memory.  Any functions dealing with this *
				*                   buffer area must be handles by us.                        *
				*                                                                             *
				*                   Function 87H is the actual MOVEBLOCK function.  The user  *
				*                   passes a 32 bit source address and a 32 bit destination   *
				*                   address in a parameter list pointed to by ES:SI.  CX      *
				*                   contains the number of words to copy.  We need to         *
				*                   intercept this call and check the source and destination  *
				*                   addresses.  If either or both of these addresses is above *
				*                   1M then we need to adjust the addresses so that they      *
				*                   access the MOVEBLOCK buffer up at the top of memory.  You *
				*                   see, the user thinks the extended memory starts right     *
				*                   after the 1M boundary.  We want to make it look like the  *
				*                   MOVEBLOCK buffer sits right after the 1M boundary.  So we *
				*                   monkey with the user's addresses so that they access the  *
				*                   MOVEBLOCK buffer instead of real memory after 1M, because *
				*                   that memory is us.                                        *
				*                                                                             *
				*                   Function 88H queries how many K are above the 1M          *
				*                   boundary.  We can't tell him how much is really there     *
				*                   because some of it is us and our XMA pages.  So for this  *
				*                   function we will just return the size of the MOVEBLOCK    *
				*                   buffer.  This function was moved to a real mode        P3C*
				*                   interrupt handler in module INDE15H.                   P3C*
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-2


				*                                                                             *
				*                   Function 89H is reserved for the MOVEBLOCK functions but  *
				*                   is not in use right now.  So for this function we just    *
				*                   return a bad return code in AH and set the carry flag.    *
				*                                                                             *
				* MODULE TYPE     : ASM                                                       *
				*                                                                             *
				* REGISTER USAGE  : 80386 Standard                                            *
				*                                                                             *
				* RESTRICTIONS    : None                                                      *
				*                                                                             *
				* DEPENDENCIES    : None                                                      *
				*                                                                             *
				* ENTRY POINT     : INT15                                                     *
				*                                                                             *
				* LINKAGE         : Jumped to from INDEEXC                                    *
				*                                                                             *
				* INPUT PARMS     : None                                                      *
				*                                                                             *
				* RETURN PARMS    : None                                                      *
				*                                                                             *
				* OTHER EFFECTS   : None                                                      *
				*                                                                             *
				* EXIT NORMAL     : Go to POPIO in INDEEMU to IRET to the V86 task            *
				*                                                                             *
				* EXIT ERROR      : None                                                      *
				*                                                                             *
				* EXTERNAL                                                                    *
				* REFERENCES      : EMULATE - Entry point for INDEEMU                         *
				*                   POPIO   - Entry in INDEEMU to check for single step       *
				*                             interrupts, pop the registers and IRET to the   *
				*                             V86 task                                        *
				*                   POPREGS - Entry point in INDEEXC to pop the registers     *
				*                             off the stack and IRET to the V86 task       P2C*
				*                                                                             *
				* SUB-ROUTINES    : None                                                      *
				*                                                                             *
				* MACROS          : DATAOV  - Add prefix for the next instruction so that it  *
				*                             accesses data as 32 bits wide                   *
				*                   ADDROV  - Add prefix for the next instruction so that it  *
				*                             uses addresses that are 32 bits wide            *
				*                                                                             *
				* CONTROL BLOCKS  : INDEDAT.INC                                               *
				*                                                                             *
				* CHANGE ACTIVITY :                                                           *
				*                                                                             *
				* $MOD(INDEI15) COMP(LOAD) PROD(3270PC) :                                     *
				*                                                                             *
				* $D0=D0004700 410 870603 D : NEW FOR RELEASE 1.1                             *
				* $P1=P0000293 410 870731 D : LIMIT LINES TO 80 CHARACTERS                    *
				* $P2=P0000312 410 870804 D : CLEAN UP WARNING MESSAGES                       *
				* $D1=D0007100 410 870817 D : CHANGE TO EMULATE XMA 2                         *
				* $P3=P0000xxx 120 880331 D : MOVE FUNCTION 88H HANDLING TO INDE15H           *
				*                                                                             *
				* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
				#
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-3


				
				        .286P                 ; Enable recognition of 286 privileged instructs.
				
				        .LIST                 ; Turn on the listing
				
 0000				PROG    SEGMENT PARA PUBLIC 'PROG'
				
				        ASSUME  CS:PROG
				        ASSUME  DS:PROG
				        ASSUME  ES:NOTHING
				        ASSUME  SS:NOTHING
				
 0000				INDEI15 LABEL   NEAR
				
				        EXTRN   EMULATE:NEAR            ; Entry point for INDEEMU
				        EXTRN   POPIO:NEAR              ; Entry in INDEEMU to check for single
				                                        ;   step interrupts and return to the
				                                        ;   V86 task
				        EXTRN   POPREGS:NEAR            ; Entry in INDEEXC to return to the  P2C
				                                        ;   V86 task
				
				        PUBLIC  INDEI15
				        PUBLIC  INT15
				        PUBLIC  TTTABLE
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-4
                                                            

				PAGE
				
 0000				INT15   PROC    NEAR
				
 0000  FC			        CLD                             ; All string operations go forward
				
				; We handle the INT 15H functions for MOVEBLOCK interface.  These functions
				; are specified by an AH value of 87H to 89H.  Function 87H is the MOVEBLOCK
				; function.  Function 88H queries the size of memory above 1M.  Function 89H
				; is reserved but not supported so we return a return code of 86H.
				
 0001  80 7E 1F 87		        CMP     SS:BYTE PTR [BP+BP_AX+1],87H ; Is AH asking for function 87H?
 0005  72 13			        JB      NOTMINE                 ; No.  It's too low.  It's out of our
				                                        ;   range so we'll pass it on to the
				                                        ;   real vector.
 0007  74 14			        JE      MOVEBLK                 ; It is 87H!  Let's go do the MOVEBLOCK.
				
 0009  80 7E 1F 89		        CMP     SS:BYTE PTR [BP+BP_AX+1],89H ; Is AH asking for function 89H?
 000D  75 0B			        JNE     NOTMINE                 ; No.  It's not our function so     @P3C
				                                        ;   so we'll pass it on to the real
				                                        ;   vector.
				                                        ;                                   @P3D
 000F  C6 46 1F 86		        MOV     SS:BYTE PTR [BP+BP_AX+1],86H ; It's 89H.  Sorry we don't support
				                                        ;   that function.  Put an 86H return
				                                        ;   code in AH.
 0013  83 4E 32 01		        OR      WORD PTR SS:[BP+BP_FL],1 ; Set the carry flag
 0017  E9 0000 E		        JMP     POPIO                   ; And return to the V86 task
				
				; Hey, it's not MY interrupt.
				
 001A				NOTMINE:
 001A  E9 00D0 R		        JMP     DOINT                   ; Go pass the interrupt back to the
				                                        ;   real INT 15H vector
				
				
				; Function 88H code to query the size of memory above 1M was moved to      3@P3D
				; INDE15H.
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-5
                                                            

				PAGE
				; The user wants to move a block of memory.  Now the source and target of the
				; MOVEBLOCK can each be below 1M or above 1M.  For addresses above 1M we must
				; make adjustments so that the MOVEBLOCK is done to and/or from the MOVEBLOCK
				; buffer in high memory.  The user passes a parameter list which is pointed
				; at by ES:SI.  At offset 0EH is a 32 bit pointer to the source block.  At
				; offset 1AH is a 32 bit pointer to the destination block.  CX contains the
				; number of words to move.  Here we go!
				
 001D				MOVEBLK:
 001D  B8 0020			        MOV     AX,HUGE_PTR             ; Load DS and ES with a selector that
 0020  8E D8			        MOV     DS,AX                   ;   accesses all of memory as data
 0022  8E C0			        MOV     ES,AX
				
				; Get the user's ES:SI and convert it to a 32 bit offset in ESI.
				
				        DATAOV                          ; Purge ESI
 0024  66                    1	         DB      066H 
 0025  2B F6			        SUB     SI,SI
 0027  8B 76 06			        MOV     SI,SS:[BP+BP_SI]        ; Load SI with the user's SI
				
				        DATAOV                          ; Purge EBX
 002A  66                    1	         DB      066H 
 002B  2B DB			        SUB     BX,BX
 002D  BB 0010			        MOV     BX,10H                  ; Set EBX to 1M by loading it with 10H
				        DATAOV                          ;   and shifting it left 16 bits to
 0030  66                    1	         DB      066H 
 0031  C1 E3 10			        SHL     BX,16                   ;   multiply by 64K
				
				        DATAOV                          ; Sterilize EAX
 0034  66                    1	         DB      066H 
 0035  2B C0			        SUB     AX,AX
 0037  8B 46 3E			        MOV     AX,SS:[BP+BP_VMES]      ; Load AX with the user's ES
				        DATAOV                          ; Shift it left four bits to convert it
 003A  66                    1	         DB      066H 
 003B  C1 E0 04			        SHL     AX,4                    ;   to an offset
				
				        DATAOV                          ; Add the ES offset on to SI.  Now ESI
 003E  66                    1	         DB      066H 
 003F  03 F0			        ADD     SI,AX                   ;   is the offset from 0 of the user's
				                                        ;   parameter list.
				        DATAOV                          ; Add 1AH to SI.  Now it points to the
 0041  66                    1	         DB      066H 
 0042  83 C6 1A			        ADD     SI,1AH                  ;   32 bit destination address.
				
				        DATAOV
 0045  66                    1	         DB      066H 
				        ADDROV                          ; Get the 32 bit destination address
 0046  67                    1	         DB      067H 
 0047  AD			        LODSW                           ;   into EAX
				
				        ADDROV                          ; Intel bug # A0-119
 0048  67                    1	         DB      067H 
 0049  90			        NOP                             ; Intel bug # A0-119
				
				        DATAOV                          ; Clear the top eight bits of any
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-6
                                                            

 004A  66                    1	         DB      066H 
 004B  C1 E0 08			        SHL     AX,8                    ;   residual gunk.  Only 24 bit     ;P1C
				        DATAOV                          ;   addresses (16M) are allowed anyway.
 004E  66                    1	         DB      066H 
 004F  C1 E8 08			        SHR     AX,8                    ;   Shift the bits off the left end and
				                                        ;   shift zeroes back in.
				        DATAOV                          ; Move this clean value into EDI
 0052  66                    1	         DB      066H 
 0053  8B F8			        MOV     DI,AX                   ; EDI now has the destination address
				
				        DATAOV                          ; Check if this address is over 1M.  If
 0055  66                    1	         DB      066H 
 0056  3B FB			        CMP     DI,BX                   ;   so then it's going to our MOVEBLOCK
				                                        ;   buffer.
 0058  72 1B			        JB      OK1                     ; It's below 1M?  OK.  Leave it alone.
				
				; The destination is above 1M so we have to modify the destination address so
				; that it points to our MOVEBLOCK buffer.
				
 005A  1E			        PUSH    DS                      ; Save DS
 005B  B8 0068			        MOV     AX,SYS_PATCH_DS         ; Load DS with the selector for our data
 005E  8E D8			        MOV     DS,AX                   ;   segment
				
				        DATAOV                          ; Clean up EAX
 0060  66                    1	         DB      066H 
 0061  2B C0			        SUB     AX,AX
 0063  A1 0132 R		        MOV     AX,MAXMEM               ; Load the total number of K on the box
 0066  2B 06 0130 R		        SUB     AX,BUFF_SIZE            ; Subtract the MOVEBLOCK buffer size
 006A  2D 0400			        SUB     AX,1024                 ; Subtract 1M (/1K) for 0 to 1M.  This
				                                        ;   leaves AX with the number of K from
				                                        ;   1M to the MOVEBLOCK buffer.
 006D  1F			        POP     DS                      ; Restore DS
				        DATAOV                          ; Multiply EAX by 1K (shift left 10) to
 006E  66                    1	         DB      066H 
 006F  C1 E0 0A			        SHL     AX,10                   ;   convert it to an offset from 1M of
				                                        ;   the MOVEBLOCK buffer
				        DATAOV                          ; Add this to EDI.  EDI now points to
 0072  66                    1	         DB      066H 
 0073  03 F8			        ADD     DI,AX                   ;   a location within (hopefully) the
				                                        ;   MOVEBLOCK buffer as if the buffer
				                                        ;   were located at the 1M boundary.
				
				; Now let's get the source address
				
 0075				OK1:
				        DATAOV                          ; Subtract 0C from ESI to point ESI to
 0075  66                    1	         DB      066H 
 0076  83 EE 0C			        SUB     SI,0CH                  ;   offset 0E in the parameter list
				
				        DATAOV
 0079  66                    1	         DB      066H 
				        ADDROV                          ; Get the 32 bit source address into
 007A  67                    1	         DB      067H 
 007B  AD			        LODSW                           ;   EAX
				
				        ADDROV                          ; Intel bug # A0-119
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-7
                                                            

 007C  67                    1	         DB      067H 
 007D  90			        NOP                             ; Intel bug # A0-119
				
				        DATAOV                          ; Clear the top eight bits of any
 007E  66                    1	         DB      066H 
 007F  C1 E0 08			        SHL     AX,8                    ;   residual gunk.  Only 24 bit address
				        DATAOV                          ;   (16M) are allowed.  Shift the gunky
 0082  66                    1	         DB      066H 
 0083  C1 E8 08			        SHR     AX,8                    ;   bits off the left end and shift
				                                        ;   zeroes back in.
				        DATAOV                          ; Move this clean value into ESI
 0086  66                    1	         DB      066H 
 0087  8B F0			        MOV     SI,AX                   ; ESI now has the source address
				
				        DATAOV                          ; Check if this address is over 1M.  If
 0089  66                    1	         DB      066H 
 008A  3B F3			        CMP     SI,BX                   ;   so then it's goin' to our MOVEBLOCK
				                                        ;   buffer.
 008C  72 1B			        JB      OK2                     ; It's below 1M?  OK.  Let it be.
				
				; The source is above 1M so we have to modify the source address so that it
				; points to our MOVEBLOCK buffer.
				
 008E  1E			        PUSH    DS                      ; Save DS
 008F  B8 0068			        MOV     AX,SYS_PATCH_DS         ; Load DS with the selector for our data
 0092  8E D8			        MOV     DS,AX                   ;   segment
				
				        DATAOV                          ; Sanitize up EAX
 0094  66                    1	         DB      066H 
 0095  2B C0			        SUB     AX,AX
 0097  A1 0132 R		        MOV     AX,MAXMEM               ; Load the total number of K on the box
 009A  2B 06 0130 R		        SUB     AX,BUFF_SIZE            ; Subtract the MOVEBLOCK buffer size
 009E  2D 0400			        SUB     AX,1024                 ; Subtract 1M (/1K) for 0 to 1M.  This
				                                        ;   leaves AX with the number of K from
				                                        ;   1M to the MOVEBLOCK buffer.
 00A1  1F			        POP     DS                      ; Restore DS
				        DATAOV                          ; Multiply EAX by 1K (shift left 10) to
 00A2  66                    1	         DB      066H 
 00A3  C1 E0 0A			        SHL     AX,10                   ;   convert it to an offset from 1M of
				                                        ;   the MOVEBLOCK buffer
				        DATAOV                          ; Add this to ESI.  ESI now points to
 00A6  66                    1	         DB      066H 
 00A7  03 F0			        ADD     SI,AX                   ;   a location within (hopefully) the
				                                        ;   MOVEBLOCK buffer as if the buffer
				                                        ;   were located at the 1M boundary.
				
				; Our pointers are all set.  Let's get CX and do the copy for the guy.
				
 00A9				OK2:
 00A9  8B 4E 1A			        MOV     CX,SS:[BP+BP_CX]        ; Get the user's CX
 00AC  F6 C1 01			        TEST    CL,01H                  ; Is this an even number?
 00AF  74 08			        JZ      MOV4                    ; If so, we can make the copy faster
				                                        ;   by moving double words
				        ADDROV                          ; Nope. It's odd.  We'll just do the
 00B1  67                    1	         DB      067H 
 00B2  F3/ A5			        REP     MOVSW                   ;   copy with words.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-8
                                                            

				
				        ADDROV                          ; Intel bug # A0-119
 00B4  67                    1	         DB      067H 
 00B5  90			        NOP                             ; Intel bug # A0-119
				
 00B6  EB 09 90			        JMP     MOVCOM                  ; Skip over the double word copy
				
 00B9				MOV4:
 00B9  D1 E9			        SHR     CX,1                    ; Divide the count by two since we'll
				                                        ;   be copying double words
				        DATAOV                          ; Do it 32 bits wide
 00BB  66                    1	         DB      066H 
				        ADDROV                          ; Use the 32 bit ESI and EDI
 00BC  67                    1	         DB      067H 
 00BD  F3/ A5			        REP     MOVSW                   ; Ready?  ZOOOOM!
				
				        ADDROV                          ; Intel bug # A0-119
 00BF  67                    1	         DB      067H 
 00C0  90			        NOP                             ; Intel bug # A0-119
				
				; Now let's set the flags and return code in AH to show that every thing went
				; A-OK.
				
 00C1				MOVCOM:
 00C1  C6 46 1F 00		        MOV     SS:BYTE PTR [BP+BP_AX+1],0    ; Set a zero return code in AH
 00C5  83 66 32 FE		        AND     WORD PTR SS:[BP+BP_FL],0FFFEH ; Reset the carry flag
 00C9  83 4E 32 40		        OR      WORD PTR SS:[BP+BP_FL],40H    ; Set the zero flag
				
 00CD  E9 0000 E		        JMP     POPIO                   ; Return to the V86 task
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-9
                                                            

				PAGE
				
				; It's not a MOVEBLOCK function so we'll just pass the interrupt on to the real
				; interrupt handler.
				
 00D0				DOINT:
 00D0  B8 0020			        MOV     AX,HUGE_PTR             ; Load ES with a selector that accesses
 00D3  8E C0			        MOV     ES,AX                   ;   all of memory as data
				        DATAOV                          ; Load EDI with the user's ESP
 00D5  66                    1	         DB      066H 
 00D6  8B 7E 36			        MOV     DI,SS:[BP+BP_SP]
				
 00D9  83 EF 06			        SUB     DI,6                    ; Decrement "SP" by six to make room
				                                        ;   for our simulated interrupt that
				                                        ;   will put the flags, CS and IP on
				                                        ;   the stack.   This assumes that there
				                                        ;   are indeed six bytes left on the
				                                        ;   stack.
 00DC  89 7E 36			        MOV     SS:WORD PTR [BP+BP_SP],DI ; Set the user's new SP
				
				        DATAOV                          ; Get the user's SS into our AX
 00DF  66                    1	         DB      066H 
 00E0  8B 46 3A			        MOV     AX,SS:[BP+BP_SS]
				        DATAOV                          ; Shift "SS" left four bits to convert
 00E3  66                    1	         DB      066H 
 00E4  C1 E0 04			        SHL     AX,4                    ;   it to an offset
				        DATAOV                          ; Add this to "SP" in DI to make EDI
 00E7  66                    1	         DB      066H 
 00E8  03 F8			        ADD     DI,AX                   ;   a 32 bit offset from 0 of the user's
				                                        ;   stack
				
				; Now put the flags, CS and IP on the V86 task's stack.  They are put on in the
				; order IP, CS, flags.  This is backwards from the INT push order of flags, CS
				; and then IP.  This is because we are moving forward through memory (CLD)
				; whereas the stack grows backwards through memory as things pushed on to it.
				
 00EA  8B 46 2A			        MOV     AX,SS:[BP+BP_IP]        ; Get the user's IP
				        ADDROV                          ; And put it on his stack
 00ED  67                    1	         DB      067H 
 00EE  AB			        STOSW
				
				        ADDROV                          ; Intel bug # A0-119
 00EF  67                    1	         DB      067H 
 00F0  90			        NOP                             ; Intel bug # A0-119
				
 00F1  8B 46 2E			        MOV     AX,SS:[BP+BP_CS]        ; Get the user's CS
				        ADDROV                          ; And put it on his stack
 00F4  67                    1	         DB      067H 
 00F5  AB			        STOSW
				
				        ADDROV                          ; Intel bug # A0-119
 00F6  67                    1	         DB      067H 
 00F7  90			        NOP                             ; Intel bug # A0-119
				
 00F8  8B 46 32			        MOV     AX,SS:[BP+BP_FL]        ; Get the user's flags
 00FB  0D 3000			        OR      AX,3000H                ; Set the IOPL to 3 so we get fewer
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-10
                                                            

				                                        ;   faults
				        ADDROV                          ; And put them on his stack
 00FE  67                    1	         DB      067H 
 00FF  AB			        STOSW
				
				        ADDROV                          ; Intel bug # A0-119
 0100  67                    1	         DB      067H 
 0101  90			        NOP                             ; Intel bug # A0-119
				
 0102  25 3CFF			        AND     AX,3CFFH                ; Clean up the flags for our IRET
 0105  89 46 32			        MOV     WORD PTR SS:[BP+BP_FL],AX ; Put them on our stack
				
 0108  8B 76 24			        MOV     SI,SS:[BP+BP_EX]        ; Get the interrupt number
 010B  C1 E6 02			        SHL     SI,2                    ; Multiply by four 'cause interrupt
				                                        ;   vectors are four bytes long
 010E  B8 0020			        MOV     AX,HUGE_PTR             ; Load DS with a selector that accesses
 0111  8E D8			        MOV     DS,AX                   ;   all of memory as data
 0113  AD			        LODSW                           ; Get the IP of the interrupt vector
				                                        ;   from the interrupt vector table
 0114  89 46 2A			        MOV     WORD PTR SS:[BP+BP_IP],AX ; Put it in the IP saved on our stack
 0117  AD			        LODSW                           ; Get the CS of the interrupt vector
				                                        ;   from the interrupt vector table
 0118  89 46 2E			        MOV     WORD PTR SS:[BP+BP_CS],AX ; Put it in the CS saved on our stack
				
 011B  E9 0000 E		        JMP     POPREGS                 ; Now when we do an IRET we will    @P2C
				                                        ;   actually be giving control to the
				                                        ;   real INT 15H vector.
 011E				INT15   ENDP
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-11
                                                            

				PAGE
				;   Macros used to define data areas
				
				; DDL - Define a label and make it public
				
				DDL     MACRO   NAME,SIZE
				        PUBLIC  &NAME
				&NAME   LABEL   &SIZE
				        ENDM
				
				
				; DDW - Define a word and make it public
				
				DDW     MACRO   NAME,VALUE
				        IFNB    <&NAME>       ;; If a name was given then make it public
				        PUBLIC  &NAME
				        ENDIF
				        IFNB    <&VALUE>      ;; If a value was given then initialize the
				&NAME   DW      &VALUE        ;;    variable to that value
				        ELSE                  ;; Else initialize it to 0
				&NAME   DW      0
				        ENDIF
				        ENDM
				
				
				; Now lets define some data.  Remember, these are all PUBLIC even though they
				; are not listed at the top of the program as being such.  It's easy to lose
				; these guys.
				
				        DDW     REAL_SP,0     ; Our initial SP when we come up in real mode
 011E  0000                  1	REAL_SP   DW      0        ; 
				
				        DDW     REAL_SS,0     ; Our initial SS when we come up in real mode
 0120  0000                  1	REAL_SS   DW      0        ; 
				
				        DDW     REAL_CS,0     ; Our initial CS when we come up in real mode
 0122  0000                  1	REAL_CS   DW      0        ; 
				
				        DDW     PGTBLOFF,0    ; The offset of the normal page tables
 0124  0000                  1	PGTBLOFF   DW      0        ; 
				
				        DDW     SGTBLOFF,0    ; The offset of the page directory
 0126  0000                  1	SGTBLOFF   DW      0        ; 
				
				        DDW     NORMPAGE,0    ; The entry for the first page directory entry
 0128  0000                  1	NORMPAGE   DW      0        ; 
				        DDW     ,0            ;   which points to the first normal page table.
 012A  0000                  1	   DW      0        ; 
				                              ;   A 32 bit value
				        DDW     XMAPAGE,7     ; Page directory entry that points to the first
 012C  0007                  1	XMAPAGE   DW      7        ; 
				        DDW     ,0011H        ;   XMA page table at 11000:0.  Access and present
 012E  0011                  1	   DW      0011H        ; 
				                              ;   bits set.  It, too, is a 32 bit value.
				        DDW     BUFF_SIZE,0   ; Size of the MOVEBLOCK buffer.  Initialized to 0.
 0130  0000                  1	BUFF_SIZE   DW      0        ; 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-12
                                                            

				
				        DDW     MAXMEM,1000H  ; Total amount of K in the box. Initialized to 4M.
 0132  1000                  1	MAXMEM   DW      1000H        ; 
				
				        DDW     CRT_SELECTOR,C_BWCRT_PTR  ; Selector for the display buffer
 0134  0030                  1	CRT_SELECTOR   DW      C_BWCRT_PTR        ; 
				
				; And now, the world famous Translate Table!!   YEAAAA!!
				;
				; The first 160 entries (0 to 640K) are initialized to blocks 0 to '9F'X.    D1A
				; This is to emulate the XMA 2 device driver which uses these blocks to back D1A
				; the memory on the mother board from 0 to 640K which it disabled.  It sets  D1A
				; up the translate table for bank 0 such that it maps the XMA memory from 0  D1A
				; to 640K to conventional memory at 0 to 640K.  So we emulate that here by   D1A
				; initializing the firs 160 entries in the translate table.                  D1A
				
 0136				TTTABLE:
 = 0000				        BLOCK = 0             ; Start with block number 0                   @D1A
				        REPT    20            ; Do 20 times (20 x 8 = 160)                  @D1A
				        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7
				                              ; Define eight translate table entries        @D1A
				                              ;   initialized to the block number            D1A
				        BLOCK = BLOCK + 8     ; Increment the block number to the next set  @D1A
				        ENDM                  ;   of eight translate table entries          @D1A
 0136  0000 0001 0002 0003   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0146  0008 0009 000A 000B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0156  0010 0011 0012 0013   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0166  0018 0019 001A 001B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0176  0020 0021 0022 0023   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0186  0028 0029 002A 002B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0196  0030 0031 0032 0033   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 01A6  0038 0039 003A 003B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 01B6  0040 0041 0042 0043   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 01C6  0048 0049 004A 004B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 01D6  0050 0051 0052 0053   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 01E6  0058 0059 005A 005B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 01F6  0060 0061 0062 0063   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0206  0068 0069 006A 006B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0216  0070 0071 0072 0073   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0226  0078 0079 007A 007B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0236  0080 0081 0082 0083   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0246  0088 0089 008A 008B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0256  0090 0091 0092 0093   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
 0266  0098 0099 009A 009B   1	        DW      BLOCK,BLOCK+1,BLOCK+2,BLOCK+3,BLOCK+4,BLOCK+5,BLOCK+6,BLOCK+7 
				
 0276  0F60[			        DW      96 + 256*15 DUP(0FFFH) ; The rest of the translate table    @D1C
	   0FFF			
			 ]	
				
				
 2136				TTTABLE_END:                  ; Label to mark the end of the translate table
				
				
				; Define our stack for when we're in protect mode
				
				        DDW     MON_STACK_BASE,<500 DUP(0)>
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Page     1-13
                                                            

 2136  01F4[                 1	MON_STACK_BASE   DW      500 DUP(0)        ; 
				        DDL     SP_INIT,WORD  ; Top of the stack.  The initial SP points here.
 251E                        1	SP_INIT   LABEL   WORD 
				
 251E				PROG    ENDS
				
				        END

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Symbols-1


Macros:

		N a m e			Lines

ADDROV . . . . . . . . . . . . .  	   1
DATAOV . . . . . . . . . . . . .  	   1
DDL  . . . . . . . . . . . . . .  	   2
DDW  . . . . . . . . . . . . . .  	   8
SEGOV  . . . . . . . . . . . . .  	  48

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

BPSTACK  . . . . . . . . . . . .  	0050	0028
  BP_ES  . . . . . . . . . . . .  	0000
  BP_DI  . . . . . . . . . . . .  	0002
  BP_SI  . . . . . . . . . . . .  	0006
  BP_BP  . . . . . . . . . . . .  	000A
  BP_PASP  . . . . . . . . . . .  	000E
  BP_PSP2  . . . . . . . . . . .  	0010
  BP_BX  . . . . . . . . . . . .  	0012
  BP_DX  . . . . . . . . . . . .  	0016
  BP_CX  . . . . . . . . . . . .  	001A
  BP_AX  . . . . . . . . . . . .  	001E
  BP_DS  . . . . . . . . . . . .  	0022
  BP_EX  . . . . . . . . . . . .  	0024
  BP_EC  . . . . . . . . . . . .  	0026
  BP_IP  . . . . . . . . . . . .  	002A
  BP_IP2 . . . . . . . . . . . .  	002C
  BP_CS  . . . . . . . . . . . .  	002E
  BP_CS2 . . . . . . . . . . . .  	0030
  BP_FL  . . . . . . . . . . . .  	0032
  BP_FL2 . . . . . . . . . . . .  	0034
  BP_SP  . . . . . . . . . . . .  	0036
  BP_SP2 . . . . . . . . . . . .  	0038
  BP_SS  . . . . . . . . . . . .  	003A
  BP_SS2 . . . . . . . . . . . .  	003C
  BP_VMES  . . . . . . . . . . .  	003E
  BP_VME2  . . . . . . . . . . .  	0040
  BP_VMDS  . . . . . . . . . . .  	0042
  BP_VMFS  . . . . . . . . . . .  	0046
  BP_VMGS  . . . . . . . . . . .  	004A
  BP_STK . . . . . . . . . . . .  	004E
DATA_DESC  . . . . . . . . . . .  	0008	0005
  SEG_LIMIT  . . . . . . . . . .  	0000
  BASE_LO_WORD . . . . . . . . .  	0002
  BASE_HI_BYTE . . . . . . . . .  	0004
  DATA_ACC_RIGHTS  . . . . . . .  	0005
  DATA_RESERVED  . . . . . . . .  	0006
GATE_DESC  . . . . . . . . . . .  	0008	0005
  ENTRY_POINT  . . . . . . . . .  	0000
  CS_SELECTOR  . . . . . . . . .  	0002
  WORD_COUNT . . . . . . . . . .  	0004
  GATE_ACC_RIGHTS  . . . . . . .  	0005
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Symbols-2


  GATE_RESERVED  . . . . . . . .  	0006
GDT_DEF  . . . . . . . . . . . .  	1001	0036
  UNUSED_ENTRY . . . . . . . . .  	0000
  GDT_PTR  . . . . . . . . . . .  	0008
  MON_IDT_PTR  . . . . . . . . .  	0010
  RSDA_PTR . . . . . . . . . . .  	0018
  HUGE_PTR . . . . . . . . . . .  	0020
  LA_PTR . . . . . . . . . . . .  	0028
  C_BWCRT_PTR  . . . . . . . . .  	0030
  C_CCRT_PTR . . . . . . . . . .  	0038
  E_CCRT_PTR . . . . . . . . . .  	0040
  E_CCRT_PTR2  . . . . . . . . .  	0048
  SYS_ROM_CS . . . . . . . . . .  	0050
  SYS_ROM_DS . . . . . . . . . .  	0058
  SYS_PATCH_CS . . . . . . . . .  	0060
  SYS_PATCH_DS . . . . . . . . .  	0068
  V_ROM_CS . . . . . . . . . . .  	0070
  V_ROM_DS . . . . . . . . . . .  	0078
  V_PATCH_CS . . . . . . . . . .  	0080
  V_PATCH_DS . . . . . . . . . .  	0088
  ES_TEMP  . . . . . . . . . . .  	0090
  CS_TEMP  . . . . . . . . . . .  	0098
  SS_TEMP  . . . . . . . . . . .  	00A0
  DS_TEMP  . . . . . . . . . . .  	00A8
  MON_LDTR . . . . . . . . . . .  	00B0
  MON_DS . . . . . . . . . . . .  	00B8
  MON_ES . . . . . . . . . . . .  	00C0
  MON_SS . . . . . . . . . . . .  	00C8
  MON_CS . . . . . . . . . . . .  	00D0
  MON_TR_SS  . . . . . . . . . .  	00D8
  MON_TR_BP  . . . . . . . . . .  	00E0
  MON_TR_HWI . . . . . . . . . .  	00E8
  MON_TR_OI  . . . . . . . . . .  	00F0
  KBD_OWNER_SDA  . . . . . . . .  	00F8
  VTIMER_VECTOR  . . . . . . . .  	0100
  SEX_TSS  . . . . . . . . . . .  	0180
  HWI_TSS  . . . . . . . . . . .  	0280
  DISPATCH_TASK  . . . . . . . .  	0380
  HWI_LDT  . . . . . . . . . . .  	0390
  BASICS_SEG . . . . . . . . . .  	0398
  BIOSS_SEG  . . . . . . . . . .  	03A0
  RSVD_GDT . . . . . . . . . . .  	03A8
  PM_VM  . . . . . . . . . . . .  	0DC0
  USER_CS  . . . . . . . . . . .  	0DE0
  USER_SS  . . . . . . . . . . .  	0DE8
  USER_DS  . . . . . . . . . . .  	0DF0
  USER_ES  . . . . . . . . . . .  	0DF8
  USER_TSS . . . . . . . . . . .  	0E00
  USER_TSS_DAT . . . . . . . . .  	0E08
  USER_LDT . . . . . . . . . . .  	0E10
  USER_LDT_DAT . . . . . . . . .  	0E18
  USER_VMS . . . . . . . . . . .  	0E20
  SCRUBBER . . . . . . . . . . .  	0FE0
  LAST_GDT_BYTE  . . . . . . . .  	1000
SELECTOR . . . . . . . . . . . .  	0010	0003
  INDEX  . . . . . . . . . . . .  	0003	000D	FFF8	0000
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Symbols-3


  TI . . . . . . . . . . . . . .  	0002	0001	0004	0000
  RPL  . . . . . . . . . . . . .  	0000	0002	0003	0000
TASK_STATE_286 . . . . . . . . .  	002C	0016
  BACK_LINK  . . . . . . . . . .  	0000
  VM_SP0 . . . . . . . . . . . .  	0002
  VM_SS0 . . . . . . . . . . . .  	0004
  VM_SP1 . . . . . . . . . . . .  	0006
  VM_SS1 . . . . . . . . . . . .  	0008
  VM_SP2 . . . . . . . . . . . .  	000A
  VM_SS2 . . . . . . . . . . . .  	000C
  VM_IP  . . . . . . . . . . . .  	000E
  VM_FL  . . . . . . . . . . . .  	0010
  VM_AX  . . . . . . . . . . . .  	0012
  VM_CX  . . . . . . . . . . . .  	0014
  VM_DX  . . . . . . . . . . . .  	0016
  VM_BX  . . . . . . . . . . . .  	0018
  VM_SP  . . . . . . . . . . . .  	001A
  VM_BP  . . . . . . . . . . . .  	001C
  VM_SI  . . . . . . . . . . . .  	001E
  VM_DI  . . . . . . . . . . . .  	0020
  VM_ES  . . . . . . . . . . . .  	0022
  VM_CS  . . . . . . . . . . . .  	0024
  VM_SS  . . . . . . . . . . . .  	0026
  VM_DS  . . . . . . . . . . . .  	0028
  VM_LDT . . . . . . . . . . . .  	002A
TSS386 . . . . . . . . . . . . .  	006C	002B
  ETSS_BACK_LINK . . . . . . . .  	0002
  ETSS_SP0 . . . . . . . . . . .  	0004
  ETSS_SS0 . . . . . . . . . . .  	0008
  ETSS_SP1 . . . . . . . . . . .  	000C
  ETSS_SS1 . . . . . . . . . . .  	0010
  ETSS_SP2 . . . . . . . . . . .  	0014
  ETSS_SS2 . . . . . . . . . . .  	0018
  ETSS_CR3 . . . . . . . . . . .  	001C
  ETSS_IP  . . . . . . . . . . .  	0020
  ETSS_FL  . . . . . . . . . . .  	0024
  ETSS_FL2 . . . . . . . . . . .  	0026
  ETSS_AX  . . . . . . . . . . .  	0028
  ETSS_CX  . . . . . . . . . . .  	002C
  ETSS_DX  . . . . . . . . . . .  	0030
  ETSS_BX  . . . . . . . . . . .  	0034
  ETSS_SP  . . . . . . . . . . .  	0038
  ETSS_BP  . . . . . . . . . . .  	003C
  ETSS_SI  . . . . . . . . . . .  	0040
  ETSS_DI  . . . . . . . . . . .  	0044
  ETSS_ES  . . . . . . . . . . .  	0048
  ETSS_CS  . . . . . . . . . . .  	004C
  ETSS_SS  . . . . . . . . . . .  	0050
  ETSS_DS  . . . . . . . . . . .  	0054
  ETSS_FS  . . . . . . . . . . .  	0058
  ETSS_GS  . . . . . . . . . . .  	005C
  ETSS_LDT . . . . . . . . . . .  	0060
  ETSS_TRAP  . . . . . . . . . .  	0064
  ETSS_BM_OFFSET . . . . . . . .  	0066
  ETSS_AVL . . . . . . . . . . .  	0068
VM_GDT_ENTRY . . . . . . . . . .  	0020	0004
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Symbols-4


  VM_TR  . . . . . . . . . . . .  	0000
  TSS_PTR  . . . . . . . . . . .  	0008
  VM_LDTR  . . . . . . . . . . .  	0010
  LDT_PTR  . . . . . . . . . . .  	0018

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

PROG . . . . . . . . . . . . . .  	251E	PARA	PUBLIC	'PROG'

Symbols:            

                N a m e         	Type	 Value	 Attr

BLOCK  . . . . . . . . . . . . .  	NUMBER	00A0	
BOOT_CS  . . . . . . . . . . . .  	NUMBER	0000	
BOOT_FL  . . . . . . . . . . . .  	NUMBER	0200	
BOOT_IP  . . . . . . . . . . . .  	NUMBER	7C00	
BOOT_SP  . . . . . . . . . . . .  	NUMBER	07FF	
BOOT_SS  . . . . . . . . . . . .  	NUMBER	0030	
BP_START . . . . . . . . . . . .  	NUMBER	0000	
BUFF_SIZE  . . . . . . . . . . .  	L WORD	0130	PROG	Global

CARD_ENABL . . . . . . . . . . .  	NUMBER	0004	
CCRT@_HI . . . . . . . . . . . .  	NUMBER	000B	
CCRT@_LO . . . . . . . . . . . .  	NUMBER	8000	
CCRT_SIZE  . . . . . . . . . . .  	NUMBER	4000	
CRT_SELECTOR . . . . . . . . . .  	L WORD	0134	PROG	Global
CSEG@_HI . . . . . . . . . . . .  	NUMBER	000E	
CSEG@_LO . . . . . . . . . . . .  	NUMBER	0000	
CS_HI_CACHE  . . . . . . . . . .  	NUMBER	0000	
CS_LO_CACHE  . . . . . . . . . .  	NUMBER	0000	

DESC_LEN . . . . . . . . . . . .  	NUMBER	0008	
DESC_WIDTH . . . . . . . . . . .  	NUMBER	0003	
DISPATCH_LOC . . . . . . . . . .  	NUMBER	D900	
DOINT  . . . . . . . . . . . . .  	L NEAR	00D0	PROG

ECCRT@_HI_HI . . . . . . . . . .  	NUMBER	000C	
ECCRT@_HI_LO . . . . . . . . . .  	NUMBER	0000	
ECCRT@_LO_HI . . . . . . . . . .  	NUMBER	000A	
ECCRT@_LO_LO . . . . . . . . . .  	NUMBER	0000	
ECCRT_SIZE . . . . . . . . . . .  	NUMBER	FFFF	
EMULATE  . . . . . . . . . . . .  	L NEAR	0000	PROG	External

GDT_LEN  . . . . . . . . . . . .  	NUMBER	1000	
GDT_LOC  . . . . . . . . . . . .  	NUMBER	C100	
GO_MODE  . . . . . . . . . . . .  	NUMBER	0001	

INDEI15  . . . . . . . . . . . .  	L NEAR	0000	PROG	Global
INDEX  . . . . . . . . . . . . .  		0003	
INT15  . . . . . . . . . . . . .  	N PROC	0000	PROG	Global	Length = 011E

LA_LEN . . . . . . . . . . . . .  	ALIAS	 GDT_LEN		
LDT_LEN  . . . . . . . . . . . .  	NUMBER	0800	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Symbols-5



MAXMEM . . . . . . . . . . . . .  	L WORD	0132	PROG	Global
MAX_SEG_LEN  . . . . . . . . . .  	NUMBER	FFFF	
MCRT@_HI . . . . . . . . . . . .  	NUMBER	000B	
MCRT@_LO . . . . . . . . . . . .  	NUMBER	0000	
MCRT_SIZE  . . . . . . . . . . .  	NUMBER	1000	
MEMX . . . . . . . . . . . . . .  	NUMBER	0002	
MON_STACK_BASE . . . . . . . . .  	L WORD	2136	PROG	Global	Length = 01F4
MOV4 . . . . . . . . . . . . . .  	L NEAR	00B9	PROG
MOVCOM . . . . . . . . . . . . .  	L NEAR	00C1	PROG
MOVEBLK  . . . . . . . . . . . .  	L NEAR	001D	PROG

NEXT_DESC  . . . . . . . . . . .  	NUMBER	0008	
NORMPAGE . . . . . . . . . . . .  	L WORD	0128	PROG	Global
NOTMINE  . . . . . . . . . . . .  	L NEAR	001A	PROG
NSEG@_HI . . . . . . . . . . . .  	NUMBER	0000	
NSEG@_LO . . . . . . . . . . . .  	NUMBER	0000	
NULL_SEG_LEN . . . . . . . . . .  	NUMBER	0000	

OK1  . . . . . . . . . . . . . .  	L NEAR	0075	PROG
OK2  . . . . . . . . . . . . . .  	L NEAR	00A9	PROG
OTHER_CACHE  . . . . . . . . . .  	NUMBER	0000	

PGTBLOFF . . . . . . . . . . . .  	L WORD	0124	PROG	Global
PM_VM_SIZE . . . . . . . . . . .  	NUMBER	1000	
POPIO  . . . . . . . . . . . . .  	L NEAR	0000	PROG	External
POPREGS  . . . . . . . . . . . .  	L NEAR	0000	PROG	External

REAL_CS  . . . . . . . . . . . .  	L WORD	0122	PROG	Global
REAL_SP  . . . . . . . . . . . .  	L WORD	011E	PROG	Global
REAL_SS  . . . . . . . . . . . .  	L WORD	0120	PROG	Global
RPL  . . . . . . . . . . . . . .  		0000	

SGTBLOFF . . . . . . . . . . . .  	L WORD	0126	PROG	Global
SHADOW_ID  . . . . . . . . . . .  	ALIAS	 DATA_RESERVED		
SIDT_LEN . . . . . . . . . . . .  	NUMBER	0800	
SIDT_LOC . . . . . . . . . . . .  	NUMBER	D100	
SP_INIT  . . . . . . . . . . . .  	L WORD	251E	PROG	Global
SS_HI_CACHE  . . . . . . . . . .  	NUMBER	0000	
SS_LO_CACHE  . . . . . . . . . .  	NUMBER	0300	
S_MODE . . . . . . . . . . . . .  	NUMBER	2000	

THIRTY_TWO_K . . . . . . . . . .  	NUMBER	8000	
TI . . . . . . . . . . . . . . .  		0002	
TSS_386_LEN  . . . . . . . . . .  	NUMBER	0068	
TSS_BM_LEN . . . . . . . . . . .  	NUMBER	0F97	
TSS_LEN  . . . . . . . . . . . .  	NUMBER	2068	
TTTABLE  . . . . . . . . . . . .  	L NEAR	0136	PROG	Global
TTTABLE_END  . . . . . . . . . .  	L NEAR	2136	PROG

VIRTUAL_ENABLE . . . . . . . . .  	NUMBER	0001	
VM_ENTRY_LENGTH  . . . . . . . .  	NUMBER	0020	
VM_ENTRY_WIDTH . . . . . . . . .  	NUMBER	0005	

XMAPAGE  . . . . . . . . . . . .  	L WORD	012C	PROG	Global

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:12
INDEI15 - 386 XMA Emulator - Interrupt 15 handler           Symbols-6


@CPU . . . . . . . . . . . . . .  	TEXT  1415		
@FILENAME  . . . . . . . . . . .  	TEXT  INDEI15		
@VERSION . . . . . . . . . . . .  	TEXT  510		


   1038 Source  Lines
   1267 Total   Lines
    246 Symbols

  46178 + 181152 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
