Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-1


				PAGE    60,132
				TITLE   INDEEXC - 386 XMA EMULATOR - System Exception Handler
				
				COMMENT #
				* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
				*                                                                             *
				* MODULE NAME     : INDEEXC                                                   *
				*                                                                             *
				*                                                                             *
				*                    5669-196 (C) COPYRIGHT 1988 Microsoft Corp.              *
				*                                                                             *
				* DESCRIPTIVE NAME: 80386 XMA Emulator System Exception Handler               *
				*                                                                             *
				* STATUS (LEVEL)  : VERSION (0) LEVEL (1.0)                                   *
				*                                                                             *
				* FUNCTION        : This module gets control whenever an interrupt 00 - 07,   *
				*                   09 - 0E or 15 occurs.  This is because this module's      *
				*                   entry point was placed in the IDT entries for these       *
				*                   interrupts.  It determines what course of action to take  *
				*                   on the interrupt/exception.                               *
				*                                                                             *
				*                   First thing it does is is to check to see who caused the  *
				*                   exception.  If the exception came from the virtual 8086   *
				*                   (V86) task then it will try to emulate the interrupt if   *
				*                   necessary.  If the exception came from the emulator it-   *
				*                   self then we may have problems.  If it was a general      *
				*                   protection exception (INT 0D) then it just ignores it and *
				*                   passes control back to the V86 task.  If it was a page    *
				*                   fault (INT 14) then it assumes that whatever is running in*
				*                   the V86 task came up with a bad address so it terminates  *
				*                   the application since it is obviously bad.  If it is      *
				*                   neither of these two errors then something has gone bad   *
				*                   in the emulator.  When this happens it signals the error  *
				*                   handler to prompt the user to take a dump or reIPL the    *
				*                   system.                                                   *
				*                                                                             *
				*                   The old error routine used to display a panel with the    *
				*                   contents of the registers and the stack.  The new error   *
				*                   routine just forces the V86 task to run the NMI code.     *
				*                   The old routine was left in place for debugging purposes. *
				*                                                                             *
				* MODULE TYPE     : ASM                                                       *
				*                                                                             *
				* REGISTER USAGE  : 80386 Standard                                            *
				*                                                                             *
				* RESTRICTIONS    : None                                                      *
				*                                                                             *
				* DEPENDENCIES    : None                                                      *
				*                                                                             *
				* ENTRY POINT     : VEXCPT13                                                  *
				*                                                                             *
				* LINKAGE         : This entry point is placed in the IDT for each interrupt  *
				*                   we want to handle.  Whenever one of those interrupts is   *
				*                   execupted, control comes here.                            *
				*                                                                             *
				* INPUT PARMS     : None                                                      *
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-2


				*                                                                             *
				* RETURN PARMS    : None                                                      *
				*                                                                             *
				* OTHER EFFECTS   : None                                                      *
				*                                                                             *
				* EXIT NORMAL     : IRET to the virtual 8086 task                             *
				*                                                                             *
				* EXIT ERROR      : Force the V86 task to execute an NMI                      *
				*                                                                             *
				* EXTERNAL                                                                    *
				* REFERENCES      : EMULATE - Entry point for INDEEMU                         *
				*                   INT15   - Entry point for INDEI15                         *
				*                                                                             *
				* SUB-ROUTINES    : HEXD - Display the double word in EAX                     *
				*                   HEXW - Display the word in AX                             *
				*                   HEXB - Display the byte in AL                             *
				*                                                                             *
				* MACROS          : DATAOV - Create a prefix for the following instruction    *
				*                            so that it accesses data 32 bits wide            *
				*                   ADDROV - Create a prefix for the following instruction    *
				*                            so that it uses addresses that are 32 bits wide  *
				*                                                                             *
				* CONTROL BLOCKS  : INDEDAT.INC                                               *
				*                                                                             *
				* CHANGE ACTIVITY :                                                           *
				*                                                                             *
				* $MOD(INDEEXC) COMP(LOAD) PROD(3270PC) :                                     *
				*                                                                             *
				* $D0=D0004700 410 870523 D : NEW FOR RELEASE 1.1                             *
				* $P1=P0000312 410 870804 D : CLEAN UP WARNING MESSAGES                       *
				*                                                                             *
				* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
				#
				
				        .286P                 ; Enable recognition of 286 privileged instructs.
				
				        .LIST                 ; Turn on the listing
				
 = 4B00				SEX_ATTR        EQU     04B00H
 = 0700				STACK_ATTR      EQU     00700H
 = 0020				BLANK           EQU     00020H
 = 0000				BP_START EQU    0
				
				        PUBLIC  INDEEXC
				
 0000				PROG    SEGMENT PARA PUBLIC 'PROG'
				
				        ASSUME  CS:PROG
				        ASSUME  DS:NOTHING
				        ASSUME  ES:NOTHING
				        ASSUME  SS:NOTHING
				
 0000				INDEEXC LABEL   NEAR
				
				        ; External entry points
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-3
                                                            

				        EXTRN   EMULATE:NEAR       ; Entry point to INDEEMU
				        EXTRN   INT15:NEAR         ; Entry point to INDEI15
				
				        ; External variables
				
				        EXTRN   CRT_SELECTOR:WORD  ; Selector for the display buffer (INDEI15)
				        EXTRN   XMATID:BYTE        ; Current bank ID                 (INDEXMA)
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-4
                                                            

				PAGE
				
 0000				VEXCPT13        LABEL NEAR
				
				        PUBLIC  SEX
				        PUBLIC  POPREGS       ;                                              P1C
				        PUBLIC  HEXD
				        PUBLIC  HEXW
				        PUBLIC  HEXB
				        PUBLIC  VEXCPT13
				        PUBLIC  DISPLAY
				
 0000				SEX     PROC    NEAR
				
 0000  FC			        CLD                   ; All moves go forward
				
				; Save the registers on the stack.  These are the registers of the task that
				; got interrupted.
				
 0001				SAVE_REGS:
 0001  1E			        PUSH    DS            ; Save DS
				
				        DATAOV                ; Save all the registers (32 bits wide).  They are
 0002  66                    1	         DB      066H 
 0003  60			        PUSHA                 ;   pushed in the order: AX, CX, DX, BX, original
				                              ;   SP (before the PUSHA), BP, SI, DI.
				
 0004  06			        PUSH    ES            ; Save ES
 0005  8B EC			        MOV     BP,SP         ; Point BP to the start of the register save area
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-5
                                                            

				PAGE
				; First let's check to see who caused the exception, the V86 task or us.  This
				; is done by checking the flags of the routine that was interrupted.  The VM
				; flag is set for every routine that is running in V86 mode.  There are really
				; only two entities in the system, the emulator and the V86 task.  The V86 task
				; has the VM bit set when it is running, the emulator does not.  So we can read
				; this bit to determine who was interrupted.
				
 0007  8B 46 34			        MOV     AX,SS:WORD PTR [BP+BP_FL2]    ; Get hi-order word of the flags
 000A  A8 02			        TEST    AL,02H                        ; Check the VM bit
 000C  74 03			        JZ      DISPLAY                       ; Uh oh!  It's us.
 000E  E9 0194 R		        JMP     LONGWAY                       ; It's the V86 task
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-6
                                                            

				PAGE
				; The following entry point, DISPLAY, is know to other modules.  They jump here
				; when they encounter a severe error and want to call the error handler.
				
 0011				DISPLAY:
				;       JMP     DODISP                        ; Just display the registers.
				                                              ; Comment out for final product.
				
				; Check if it was a general protection exception.  If so, then we'll just pass
				; control back to the V86 task and let it worry about it.
				
 0011  8B EC			        MOV     BP,SP                         ; Point BP to the saved registers
 0013  83 7E 24 0D		        CMP     SS:WORD PTR [BP+BP_EX],0DH    ; Was it a general protection
				                                              ;   exception
 0017  75 03			        JNE     DISPCONT                      ; If not, the continue
 0019  E9 0210 R		        JMP     POPREGS                       ; Else just return to the V86 @P1C
				                                              ;   task
				
				; Check if it was a page fault.  Page faults only occur when the page that is
				; addressed is marked not present.  When the emulator sets up memory it marks
				; all pages as present.  And this is true because the emulator does no page
				; swapping.  It messes with the page tables but it doesn't remove pages from
				; memory.  Therefore, if the page is not present then whatever is running in
				; the V86 task came up with some wierd non-existant address.  This guy obviously
				; has gone west or doesn't know what he's doing.  So we forcr the application
				; to be terminated.
				
 001C				DISPCONT:
 001C  83 7E 24 0E		        CMP     SS:WORD PTR [BP+BP_EX],0EH    ; Was it a page fault?
 0020  75 03			        JNE     CHKVM                         ; Nope.  Continue checking.
 0022  E9 0136 R		        JMP     PAGE_FAULT                    ; Yup.  Assume application had bad
				                                              ;   addresses.  Therefore, termin-
				                                              ;   ate the application.
				
				; Lastly we'll check who had the error, them or us.  We need to check again
				; because anybody can jump to the DISPLAY label above.  If the V86 task had
				; the exception then we will just terminate whatever was running in the V86
				; task.  If the emulator had the exception, then obviously WE don't know
				; what WE'RE doing.  Oops!  In this case we will force an NMI and bring down
				; the whole system.  If the emulator isn't healthy then nothing else should
				; run either.  It may sould selfish, but if the emulator is damaged then the
				; rest of the system will die soon anyway.
				
 0025				CHKVM:
 0025  8B 46 34			        MOV     AX,SS:WORD PTR [BP+BP_FL2]    ; Check the VM bit in the flags
 0028  A8 02			        TEST    AL,02H                        ;   to see who was running
 002A  74 03			        JZ      ERROR                         ; It was us.  Better Force an NMI.
 002C  E9 0129 R		        JMP     TERM_APP                      ; It was them.  Terminate whatever
				                                              ;   is running.
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-7
                                                            

				PAGE
 002F				ERROR:
				
				;----------------------------------------------------------------------------D1A
				; We're in big trouble now.  Something has gone west and there's no way to   D1A
				; get back home.  At this point we give up and send up a flare.  We signal   D1A
				; the error handler by forcing the V86 task to execute the NMI interrupt.    D1A
				; We put a marker of 0DEADH at the fixed location 0:4F2.  This is in the     D1A
				; BIOS communication area.  The error handler will look here for our marker  D1A
				; to determine if the NMI came from the emulator.  If it finds it, it will   D1A
				; put up a severe error with our return code and ask the user to take a dump D1A
				; or reIPL.  The code following this new code is old code to display a debug D1A
				; panel with the contents of the registers and stack.  It is left here for   D1A
				; debugging but will not be executed when the new code is in place.          D1A
				;----------------------------------------------------------------------------D1A
				                                        ;                                    D1A
 002F  B8 0020			        MOV     AX,HUGE_PTR             ; Load ES with a selector that      @D1A
 0032  8E C0			        MOV     ES,AX                   ;   accesses all of memory as data  @D1A
				                                        ;                                    D1A
 0034  BF 04F2			        MOV     DI,4F2H                 ; Put our 0DEADH marker at the      @D1A
 0037  26: C7 05 DEAD		        MOV     WORD PTR ES:[DI],0DEADH ;   fixed location 0:4F2.            D1A
 003C  C7 46 24 0002		        MOV     WORD PTR SS:[BP+BP_EX],2; Put a 2, the NMI interrupt number,@D1A
				                                        ;   in the exception field.  The     D1A
				                                        ;   code after LONGWAY4 will use     D1A
				                                        ;   this number to get the interrupt D1A
				                                        ;   vector.                          D1A
 0041  E9 01C4 R		        JMP     LONGWAY4                ; Go do the NMI                     @D1A
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-8
                                                            

				PAGE
				; The following code will not be executed.  It is left as a debugging tool.
				
 0044				DODISP:
				; Blank the display screen
 0044  2E: 8B 3E 0000 E		        MOV     DI,CRT_SELECTOR         ; Load ES with the selector for the
 0049  8E C7			        MOV     ES,DI                   ;   display buffer
 004B  33 FF			        XOR     DI,DI                   ; DI points to the start of the buffer
 004D  B9 04B0			        MOV     CX,80*15                ; Only clear 15 lines
 0050  B8 0720			        MOV     AX,STACK_ATTR+BLANK     ; AH = white on black attribute
				                                        ; AL = ASCII for a blank
 0053  F3/ AB			        REP     STOSW                   ; Write 15 rows of while blanks on black
				
				; Highlite the display area
				
 0055  33 FF			        XOR     DI,DI                   ; DI points to the start of the buffer
 0057  B9 01E0			        MOV     CX,80*6                 ; Highlite 6 lines
 005A  B8 4B20			        MOV     AX,SEX_ATTR+BLANK       ; AH = white on red attribute
				                                        ; AL = ASCII for a blank
 005D  F3/ AB			        REP     STOSW                   ; Highlight the 6 lines
				
				; Display the registers one at at time
				
 005F  B9 0015			        MOV     CX,21             ; 18 regs + excpt id + task id + error code
 0062  BE 0068			        MOV     SI,SYS_PATCH_DS   ; Load DS with the selector for our data
 0065  8E DE			        MOV     DS,SI             ;   area
 0067  BE 0268 R		        MOV     SI,OFFSET REG_TABLE ; DS:SI now points to the reg table
 006A  2B C0			        SUB     AX,AX             ; Clear AH
 006C  2E: A0 0000 E		        MOV     AL,XMATID         ; Load AL with the current XMA bank ID
 0070  89 46 10			        MOV     WORD PTR SS:[BP+BP_PSP2],AX  ; The bank ID gets displayed as
				                                             ;   the task ID
				
				; Display one register
				
 0073				DO_REG:
				
				; Calculate the offset into the display buffer
				
 0073  AC			        LODSB                           ; Get the row coordinate
 0074  B4 A0			        MOV     AH,160                  ; Multiply by 160 byte to a row
 0076  F6 E4			        MUL     AH                      ;   (80 bytes of character, attribute)
 0078  02 04			        ADD     AL,DS:BYTE PTR [SI]     ; Add on the number of columns
 007A  80 D4 00			        ADC     AH,0                    ; Don't forget the carry
 007D  02 04			        ADD     AL,DS:BYTE PTR [SI]     ; Add the columns again (remember -
 007F  80 D4 00			        ADC     AH,0                    ;   character, attribute)
 0082  46			        INC     SI                      ; Point to next entry in the reg table
 0083  8B F8			        MOV     DI,AX                   ; Load DI with the offset into the
				                                        ;   display buffer
				
 0085				DO_ID:
				
				; Put the register name on the screen.
				
 0085  BB 4B00			        MOV     BX,SEX_ATTR             ; Load the attribute byte into AH
 0088  8A E7			        MOV     AH,BH
 008A  AC			        LODSB                           ; Get the character to display
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-9
                                                            

 008B  3C 00			        CMP     AL,0                    ; Are we at the end of the string yet?
 008D  74 03			        JZ      DID_ID                  ; Yup.  Then go display the register
				                                        ;   value.
 008F  AB			        STOSW                           ; Else put the next character of the
				                                        ;   register name on the screen
 0090  EB F3			        JMP     DO_ID                   ; Go get the next character
				
 0092				DID_ID:
				
				; Put the register value on the screen.
				
 0092  8B EC			        MOV     BP,SP                   ; BP points the start of the register
				                                        ;   save area
 0094  AD			        LODSW                           ; Get the offset of this register's
				                                        ;   save area
 0095  03 E8			        ADD     BP,AX                   ; Add to BP.  BP ponts to the register
				                                        ;   value.
 0097  AD			        LODSW                           ; Get the length of this register's
 0098  8B D0			        MOV     DX,AX                   ;   save area
 009A  83 FA 02			        CMP     DX,2                    ; If the length is not two words
 009D  75 0D			        JNE     MORE                    ; Then go to the one word code
				
				        DATAOV                          ; Grab all 32 bits of the register
 009F  66                    1	         DB      066H 
 00A0  8B 46 00			        MOV     AX,SS:WORD PTR [BP]
 00A3  83 C5 04			        ADD     BP,4                    ; Point BP past the register value
 00A6  E8 0219 R		        CALL    HEXD                    ; Display the 32 bit value
 00A9  EB 0A 90			        JMP     LOOPREG                 ; Jump over the one word code
				
 00AC				MORE:
 00AC  8B 46 00			        MOV     AX,SS:WORD PTR [BP]     ; Get the word value into AX
 00AF  83 C5 02			        ADD     BP,2                    ; Step BP past the register value
 00B2  E8 0238 R		        CALL    HEXW                    ; Display the 16 bit value
				
 00B5				LOOPREG:
 00B5  E2 BC			        LOOP    DO_REG                  ; Go do another register
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-10
                                                            

				PAGE
				;
				;       Let's go put up the stack for everyone to see !!!
				;
 00B7  8B EC			        MOV     BP,SP                   ; Reset BP to point to the beginning
				                                        ;   of the register save area
				
				; If the V86 task faulted, display its stack.  Else display our stack.
				
 00B9  8B 46 34			        MOV     AX,SS:WORD PTR [BP+BP_FL2] ; Alright, whose fault was it?
 00BC  A8 02			        TEST    AL,02H                     ; Check the VM flag
 00BE  74 22			        JZ      NOTVM86                    ; Gulp!  It's us.
				
				; It was the V86 task that faulted.  Set DS:SI to point to their stack.
				
 00C0  B8 0020			        MOV     AX,HUGE_PTR             ; Load DS with a slector that accesses
 00C3  8E D8			        MOV     DS,AX                   ;   all of memory as data
				        DATAOV
 00C5  66                    1	         DB      066H 
 00C6  2B F6			        SUB     SI,SI                   ; Clear all 32 bits of ESI
 00C8  8B 76 36			        MOV     SI,SS:[BP+BP_SP]        ; Load SI wiht the V86 task's SP
				        DATAOV
 00CB  66                    1	         DB      066H 
 00CC  2B C0			        SUB     AX,AX                   ; Clear all 32 bits of EAX
 00CE  8B 46 3A			        MOV     AX,SS:[BP+BP_SS]        ; Get the V86 task's SS
				        DATAOV                          ; Shift it left 4 bits to convert it
 00D1  66                    1	         DB      066H 
 00D2  C1 E0 04			        SHL     AX,4                    ;   to an offset
				        DATAOV                          ; Add it on to SP.  Now SI contains
 00D5  66                    1	         DB      066H 
 00D6  03 F0			        ADD     SI,AX                   ;   the offest of the stack from 0
				
 00D8  BD FFFF			        MOV     BP,0FFFFH               ; I don't know what this code does but
				        DATAOV                          ;   I left it anyway.  The following
 00DB  66                    1	         DB      066H 
				                                        ;   comment is the only clue.
 00DC  C1 E5 10			        SHL     BP,16                   ; Make stack seg limit very large
 00DF  EB 0A 90			        JMP     COMSTACK
				
				; It was us that faulted.  Set DS:SI to point to our stack.
				
 00E2				NOTVM86:
 00E2  8C D0			        MOV     AX,SS                   ; Load DS with our own SS
 00E4  8E D8			        MOV     DS,AX
				        DATAOV
 00E6  66                    1	         DB      066H 
 00E7  2B F6			        SUB     SI,SI                   ; Clear all 32 bits of ESI
 00E9  8B F4			        MOV     SI,SP                   ; Now DS:SI points to our stack
				
				; DS:SI points to the beginning of a stack.  Now display it.
				
 00EB				COMSTACK:
 00EB  BF 0460			        MOV     DI,1120                 ; Load DI with the offset into the
				                                        ;   display buffer of where we want
				                                        ;   to display the stack
 00EE  B9 0070			        MOV     CX,70H                  ; Display 70H words of the stack
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-11
                                                            

 00F1  BB 0700			        MOV     BX,STACK_ATTR           ; Load BH with the attribute byte
				
 00F4				DISP_STACK:
				
				        ADDROV                          ; Get a word off of the stack
 00F4  67                    1	         DB      067H 
 00F5  AD			        LODSW
				        ADDROV                          ; Intel bug # A0-119
 00F6  67                    1	         DB      067H 
 00F7  90			        NOP                             ; Intel bug # A0-119
 00F8  E8 0238 R		        CALL    HEXW                    ; Display the word
 00FB  B8 0720			        MOV     AX,STACK_ATTR+BLANK     ; Put a blank after each word
 00FE  AB			        STOSW                           ; Put that on the screen
 00FF  E2 F3			        LOOP    DISP_STACK              ; Do the rest of the stack
				
				; Wait for the operator to press the system request key to go to
				;  the monitor, or the escape key to perform the reset operation
				
 0101				WAIT_HERE:
				
 0101  E4 64			        IN      AL,064H                 ; Poll the keystroke port
 0103  A8 01			        TEST    AL,000000001B           ; Did the user hit a key?
 0105  74 FA			        JZ      WAIT_HERE               ; Nope.  Go check again.
				
 0107  E4 60			        IN      AL,060H                 ; Get the keystroke
 0109  3C 54			        CMP     AL,054H                 ; System request key?
 010B  75 09			        JNE     CHK_ESC                 ; No.  Check for Esc key.
				
 010D  83 7E 24 0E		        CMP     SS:WORD PTR [BP+BP_EX],0EH ; It was system request key.  Now
				                                           ;   check for a page fault.
 0111  74 23			        JE      PAGE_FAULT              ; If so, go remove the extra return code
				                                        ;   from the stack and terminate the
				                                        ;   application running in the V86 task.
 0113  E9 0210 R		        JMP     POPREGS                 ; Else just return to the V86 task  @P1C
				
 0116				CHK_ESC:
 0116  3C 01			        CMP     AL,001H                 ; Was the Esc key hit?
 0118  75 3C			        JNE     CHKPRT                  ; Nope.  Go check for Print Screen and
				                                        ;   Ctrl-Alt-Del.
 011A  8B EC			        MOV     BP,SP                   ; Point BP to the register save area
 011C  83 7E 24 0E		        CMP     SS:WORD PTR [BP+BP_EX],0EH ; Check for a page fault
 0120  74 14			        JE      PAGE_FAULT                 ; If so, go remove the extra return
				                                           ;   code from the stack and terminate
				                                           ;   the application running in the
				                                           ;   V86 task.
 0122  8B 46 34			        MOV     AX,SS:WORD PTR [BP+BP_FL2] ; Else, Esc key hit and no page fault
 0125  A8 02			        TEST    AL,02H                     ; Check who faulted, them or us
 0127  74 46			        JZ      DO_RESET                   ; If it's us, then reIPL.
				
 0129				TERM_APP:
 0129  C7 46 24 0021		        MOV     SS:WORD PTR [BP+BP_EX],21H   ; If it's them, termintate whatever
 012E  C7 46 1E 4CFF		        MOV     SS:WORD PTR [BP+BP_AX],4CFFH ;   is running by forcing a DOS
				                                             ;   termintate.  Return code is FF.
 0133  EB 53 90			        JMP     DO_MONITOR                   ; Go pass the interrupt to the V86
				                                             ;   task
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-12
                                                            

 0136				PAGE_FAULT:
				;
				; On a page fault the 80386 processor puts an extra error code on our stack.
				; (How handy!)  We now need to remove the extra error code so that when we pop
				; the registers off our stack at the end we end up with our stack possitioned
				; correctly for the IRET.  To do this, we move everything on the stack that is
				; below the extra error code up four bytes.  The error code takes up four bytes.
				;
				
 0136  FD			        STD                             ; Shift into reverse, 'cause stacks
				                                        ;   grow down
 0137  B9 0013			        MOV     CX,(BP_EC-BP_START)/2   ; Load CX with the number of words
 013A  BF 0028			        MOV     DI,(BP_EC+2-BP_START)   ; Point DI to the last word of the
 013D  03 FD			        ADD     DI,BP                   ;   extra error code
 013F  BE 0024			        MOV     SI,(BP_EC-2-BP_START)   ; Point SI to the last word of the
 0142  03 F5			        ADD     SI,BP                   ;   exception code
 0144  8C D0			        MOV     AX,SS                   ; Set up the selectors
 0146  8E C0			        MOV     ES,AX
 0148  8E D8			        MOV     DS,AX
 014A				STACK_LOOP:
 014A  AD			        LODSW                           ; Get a word off the stack
 014B  AB			        STOSW                           ; And move it up four bytes
 014C  E2 FC			        LOOP    STACK_LOOP              ; Do that trick again
				
 014E  FC			        CLD                             ; Shift back into forward
 014F  83 C5 04			        ADD     BP,4                    ; Scoot BP up four bytes to point to
				                                        ;   pur new register save area
 0152  8B E5			        MOV     SP,BP                   ; Adjust SP, too
 0154  EB D3			        JMP     TERM_APP                ; Go kill whatever is running in the V86
				                                        ;   task
 0156				CHKPRT:
 0156  3C 53			        CMP     AL,053H                 ; Was the Del (as in Ctrl-Alt-Del) key
				                                        ;   pressed?
 0158  74 15			        JE      DO_RESET                ; If so, then reIPL
				
 015A  3C 37			        CMP     AL,037H                 ; Was the print screen key pressed?
 015C  75 A3			        JNE     WAIT_HERE               ; Nope.  Must be an invalid key.  Go get
				                                        ;   another keystroke.
				
 015E  8B EC			        MOV     BP,SP                   ; It was a print screen.  Reset BP to
				                                        ;   point to our register save area.
 0160  8B 46 34			        MOV     AX,SS:WORD PTR [BP+BP_FL2] ; If is was us that had the problem
 0163  A8 02			        TEST    AL,02H                     ;   then we don't allow print screen
				                                           ;   because the system is not healthy
 0165  74 9A			        JZ      WAIT_HERE                  ; Go get another key
				
 0167  C7 46 24 0005		        MOV     SS:WORD PTR [BP+BP_EX],05H ; If it was them then we can do a
 016C  EB 1A 90			        JMP     DO_MONITOR                 ;   print screen.  Force the V86
				                                           ;   task to do an INT 5 (Prt Sc).
				
				;
				; Reset the system, i.e. reIPL.  Put a 1234 in the BIOS reset flag at 472H.
				; This will keep BIOS from running through the whole POST upon reIPL.
				;
				
 016F				DO_RESET:
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-13
                                                            

 016F  B8 0020			        MOV     AX,HUGE_PTR     ; Load ES with a selector that accesses all
 0172  8E C0			        MOV     ES,AX           ;   of memory as data
				        DATAOV
 0174  66                    1	         DB      066H 
 0175  2B FF			        SUB     DI,DI           ; Clear EDI (32 bit DI)
 0177  BF 0472			        MOV     DI,472H         ; Load the offset of the BIOS reset flag
 017A  B8 1234			        MOV     AX,1234H
				        ADDROV
 017D  67                    1	         DB      067H 
 017E  AB			        STOSW                   ; Put 1234 in the BIOS reset flag
				
				        ADDROV                  ; Intel bug # A0-119
 017F  67                    1	         DB      067H 
 0180  90			        NOP                     ; Intel bug # A0-119
				
 0181  B0 FE			        MOV     AL,0FEH         ; Now OUT a FE to port 64H.  This will cause
 0183  E6 64			        OUT     064H,AL         ;   the machine to reIPL.
				
 0185  F4			HALT:   HLT                     ; Just in case we don't reIPL, this halt    @P1C
 0186  EB FD			        JMP     HALT            ;   loop will keep the processor from doing @P1C
				                                ;   anything else
				
 0188				DO_MONITOR:
				
				; If the exception camefrom the V86 task then pass the interrupt to the
				; real mode interrupt vector.
				
 0188  8B EC			         MOV     BP,SP          ; Reset BP to point to our register save area
				                                ;   on the stack
 018A  8B 46 34			         MOV     AX,SS:WORD PTR [BP+BP_FL2] ; Check if it was the V86 task that
 018D  A8 02			         TEST    AL,02H                     ;   faulted
 018F  75 03			         JNZ     LONGWAY        ; If so, pass the interrupt on
 0191  EB 7D 90			         JMP     POPREGS        ; Otherwise just return                     @P1C
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-14
                                                            

				PAGE
				
				; We come here if the check up front said it was the V86 task that faulted.
				
 0194				LONGWAY:
 0194  C7 46 38 0000		        MOV     SS:WORD PTR [BP+BP_SP2],0 ;Purify high-order words of SP, SS
 0199  C7 46 3C 0000		        MOV     SS:WORD PTR [BP+BP_SS2],0 ;   and IP
 019E  C7 46 2C 0000		        MOV     SS:WORD PTR [BP+BP_IP2],0
				
				; Test for interrupt versus exception.
				
 01A3  83 7E 24 0D		        CMP     SS:WORD PTR [BP+BP_EX],13     ; Check if it was a general
				                                              ;   protection exception
 01A7  75 03			        JNE     LONGWAY2                      ; If not, continue checking
 01A9  E9 0000 E		        JMP     EMULATE                       ; If so, then go to INDEEMU to
				                                              ;   emulate the instruction
 01AC				LONGWAY2:
 01AC  83 7E 24 06		        CMP     SS:WORD PTR [BP+BP_EX],6      ; Was it an invalid op-code
				                                              ;   exception?
 01B0  72 12			        JB      LONGWAY4                      ; If lower, then pass the
				                                              ;   interrupt back to the V86 task
 01B2  83 7E 24 07		        CMP     SS:WORD PTR [BP+BP_EX],7      ; Was it a coprocessor not avail-
				                                              ;   able exception?
 01B6  77 03			        JA      LONGWAY3                      ; If greater then do more checking
 01B8  E9 0000 E		        JMP     EMULATE                       ; Emulation needed for interrupts
				                                              ;   6 and 7
 01BB				LONGWAY3:
 01BB  83 7E 24 15		        CMP     SS:WORD PTR [BP+BP_EX],15H    ; Check if it was INT 15
 01BF  75 03			        JNE     LONGWAY4                      ; Nope, pass interrupt back to
				                                              ;   the V86 task
 01C1  E9 0000 E		        JMP     INT15                         ; Emulation needed for INT 15
				
 01C4				LONGWAY4:
				
				; Pass the interrupt back to the V86 task.
				
 01C4  B8 0020			        MOV     AX,HUGE_PTR             ; Load ES with a selector that accesses
 01C7  8E C0			        MOV     ES,AX                   ;   all of memory as data
				        DATAOV
 01C9  66                    1	         DB      066H 
 01CA  2B FF			        SUB     DI,DI                   ; Clear all 32 bits of EDI
 01CC  8B 7E 36			        MOV     DI,SS:[BP+BP_SP]        ; Load DI with the V86 task's SP
 01CF  83 EF 06			        SUB     DI,6                    ; Decrement "SP" to make room for the
				                                        ;   push of IP, CS and the flags.
				                                        ; Note that this assumes there are at
				                                        ;   least 6 bytes keft on the stack.
 01D2  89 7E 36			        MOV     SS:WORD PTR [BP+BP_SP],DI ; Put the new SP into the V86 register
				                                          ;   save area
				        DATAOV
 01D5  66                    1	         DB      066H 
 01D6  2B C0			        SUB     AX,AX                   ; Clear all 32 bits of EAX
 01D8  8B 46 3A			        MOV     AX,SS:[BP+BP_SS]        ; Load AX with the V86 task's SS
				        DATAOV                          ; Shift it left four bits to convert
 01DB  66                    1	         DB      066H 
 01DC  C1 E0 04			        SHL     AX,4                    ;   it to an offset
				        DATAOV                          ; Add it on to SP.  Now DI contains
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-15
                                                            

 01DF  66                    1	         DB      066H 
 01E0  03 F8			        ADD     DI,AX                   ;   the offest of the stack from 0
				
				; Now put the V86 task's IP, CS and flags on the stack.  They are put on in
				; reverse order because the stack grows down, but we are going up as we put
				; the stuff on the stack.
				
 01E2  8B 46 2A			        MOV     AX,SS:[BP+BP_IP]        ; Get the V86 task's IP
				        ADDROV
 01E5  67                    1	         DB      067H 
 01E6  AB			        STOSW                           ; Put it on his stack
				        ADDROV                          ; Intel bug # A0-119
 01E7  67                    1	         DB      067H 
 01E8  90			        NOP                             ; Intel bug # A0-119
				
 01E9  8B 46 2E			        MOV     AX,SS:[BP+BP_CS]        ; Get the V86 task's CS
				        ADDROV
 01EC  67                    1	         DB      067H 
 01ED  AB			        STOSW                           ; Put it on his stack
				        ADDROV                          ; Intel bug # A0-119
 01EE  67                    1	         DB      067H 
 01EF  90			        NOP                             ; Intel bug # A0-119
				
 01F0  8B 46 32			        MOV     AX,SS:[BP+BP_FL]        ; Get the V86 task's flags
				        ADDROV
 01F3  67                    1	         DB      067H 
 01F4  AB			        STOSW                           ; Put them on his stack
				        ADDROV                          ; Intel bug # A0-119
 01F5  67                    1	         DB      067H 
 01F6  90			        NOP                             ; Intel bug # A0-119
 01F7  25 3CFF			        AND     AX,3CFFH                ; Clean up the flags for our IRET
 01FA  89 46 32			        MOV     WORD PTR SS:[BP+BP_FL],AX
				
 01FD  8B 76 24			        MOV     SI,SS:[BP+BP_EX]        ; Get the interrupt vector
 0200  C1 E6 02			        SHL     SI,2                    ; Multiply by four because interrupt
				                                        ;   vectorsare four bytes long
 0203  B8 0020			        MOV     AX,HUGE_PTR             ; Load DS with a selector that accesses
 0206  8E D8			        MOV     DS,AX                   ;   all of memory as data
 0208  AD			        LODSW                           ; Get the IP for the interrupt
 0209  89 46 2A			        MOV     WORD PTR SS:[BP+BP_IP],AX ; Store it in the V86 task's IP
 020C  AD			        LODSW                           ; Get the CS for the interrupt
 020D  89 46 2E			        MOV     WORD PTR SS:[BP+BP_CS],AX ; Store it in the V86 task's CS
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-16
                                                            

				PAGE
 0210				POPREGS:                                ;                                   @P1C
				
				; Pop the saved registers off of our stack and IRET to the V86 task.
				
 0210  07			        POP     ES                      ; Restore ES
				        DATAOV                          ; Restore all the registers
 0211  66                    1	         DB      066H 
 0212  61			        POPA                            ;   (32 bit registers)
 0213  1F			        POP     DS                      ; Restore DS
 0214  83 C4 06			        ADD     SP,(BP_IP-BP_EX)        ; Step SP past the error code placed
				                                        ;   on our stack by the 80386
				        DATAOV
 0217  66                    1	         DB      066H 
 0218  CF			        IRET                            ; IRET to the V86 task
				
 0219				SEX     ENDP
				
				SUBTTL  HEXD - Convert DWORD in EAX to ASCII string at ES:DI
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-17
HEXD - Convert DWORD in EAX to ASCII string at ES:DI        

				PAGE
				;
				;       INPUT:   EAX   = hex double word to display
				;                BH    = attribute byte
				;                ES:DI = location in the display buffer where the characters are
				;                        to be placed
				;
				;       OUTPUT:  DI is incremented past last character displayed
				;                Characters are placed on the screen
				;
				
 0219				HEXD    PROC    NEAR
				        DATAOV
 0219  66                    1	         DB      066H 
 021A  50			        PUSH    AX            ; Save EAX on the stack
				        DATAOV
 021B  66                    1	         DB      066H 
 021C  C1 E8 18			        SHR     AX,24         ; Shift the high order byte into AL
 021F  E8 0243 R		        CALL    HEXB          ; Convert the byte in AL to ASCII at ES:DI
				        DATAOV
 0222  66                    1	         DB      066H 
 0223  58			        POP     AX            ; Restore the original EAX
 0224  50			        PUSH    AX            ; Save the low word of EAX (i.e. AX)
				        DATAOV
 0225  66                    1	         DB      066H 
 0226  C1 E8 10			        SHR     AX,16         ; Shift the second highest byte into AL
 0229  E8 0243 R		        CALL    HEXB          ; Convert the byte in AL to ASCII at ES:DI
 022C  58			        POP     AX            ; Restore the low word of EAX (i.e. AX)
 022D  50			        PUSH    AX            ; And save it again
 022E  86 E0			        XCHG    AH,AL         ; Move the thrid highest byte into AL
 0230  E8 0243 R		        CALL    HEXB          ; Convert the byte in AL to an ASCII string
 0233  58			        POP     AX            ; Restore AX
 0234  E8 0243 R		        CALL    HEXB          ; And conver the last byte to ASCII at ES:DI
 0237  C3			        RET
				
 0238				HEXD    ENDP
				
				SUBTTL  HEXW - Convert WORD in AX to ASCII string at ES:DI
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-18
HEXW - Convert WORD in AX to ASCII string at ES:DI          

				PAGE
				;
				;       INPUT:   AX    = hex word to display
				;                BH    = attribute byte
				;                ES:DI = location in the display buffer where the characters are
				;                        to be placed
				;
				;       OUTPUT:  DI is incremented past last character
				;                Characters are placed on the screen
				;
				
 0238				HEXW    PROC    NEAR
				
 0238  50			        PUSH    AX            ; Save the value in AX on the stack
 0239  86 E0			        XCHG    AH,AL         ; Move the high byte into AL
 023B  E8 0243 R		        CALL    HEXB          ; Convert the byte in AL to a string at ES:DI
 023E  58			        POP     AX            ; Restore AX
 023F  E8 0243 R		        CALL    HEXB          ; Convert the low byte to ASCII at ES:DI
 0242  C3			        RET
				
 0243				HEXW    ENDP
				
				SUBTTL  HEXD - Convert BYTE in AL to ASCII string at ES:DI
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-19
HEXD - Convert BYTE in AL to ASCII string at ES:DI          

				PAGE
				;
				;       INPUT:   AL    = hex byte to display
				;                BH    = attribute byte
				;                ES:DI = location in the display buffer where the characters are
				;                        to be placed
				;
				;       OUTPUT:  DI is incremented past last character
				;                Characters are placed on the screen
				;
				
 0243				HEXB    PROC    NEAR
				
 0243  50			        PUSH    AX            ; Save the value in AX
 0244  24 F0			        AND     AL,0F0H       ; Clear the low nibble of AL
 0246  D0 E8			        SHR     AL,1          ; Shift the high nibble into the low nibble
 0248  D0 E8			        SHR     AL,1
 024A  D0 E8			        SHR     AL,1
 024C  D0 E8			        SHR     AL,1
 024E  04 30			        ADD     AL,030H       ; Add '0' to convert to ASCII
 0250  3C 3A			        CMP     AL,03AH       ; Was this hex digit greater than 9?
 0252  72 02			        JC      OK1           ; Nope.  It's OK, so go display it.
 0254  04 07			        ADD     AL,7          ; Yup.  Then convert to 'A' to 'F'.
 0256  8A E7			OK1:    MOV     AH,BH         ; Move the attribute into AH
 0258  AB			        STOSW                 ; Put the character & attribute into the display
				                              ;   buffer at ES:DI
 0259  58			        POP     AX            ; Restore AX
 025A  24 0F			        AND     AL,00FH       ; Clear the high nibble of AL
 025C  04 30			        ADD     AL,030H       ; Convert the low nibble to ASCII as before
 025E  3C 3A			        CMP     AL,03AH       ; Hex digit greater than 9?
 0260  72 02			        JC      OK2           ; Nope.  It's OK, so go display it.
 0262  04 07			        ADD     AL,7          ; Yup.  Then convert to 'A' to 'F'.
 0264  8A E7			OK2:    MOV     AH,BH
 0266  AB			        STOSW
 0267  C3			        RET
				
 0268				HEXB    ENDP
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-20
HEXD - Convert BYTE in AL to ASCII string at ES:DI          

				        PAGE
				
				REG     MACRO   NAME,ROW,COL,L
				        DB      &ROW                    ; Display of register &NAME starts in
				        DB      &COL                    ;   row &ROW and column &COL
				        DB      '&NAME:'                ; Name to display for register &NAME
				        DB      0                       ; End of string marker
				        DW      BP_&NAME                ; Offset of value of register &NAME
				                                        ;   that we saved on our stack
				        DW      &L                      ; Number of words in the register
				        ENDM
				
				SUBTTL  Register table
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-21
Register table                                              

				PAGE
 0268				REG_TABLE LABEL NEAR
				;
				; Declare data used for displaying the registers on the screen.  For each
				; register there is a structure that contains the row and column of where the
				; display of the register starts, the text or register name ended with a 0, the
				; offset into the stack where the value in the register was saved, and the
				; number of words in the register.
				;
				
				; First, lets fake a register to put the exception message on the screen.
				
 0268  01			        DB      1                       ; Row 1
 0269  0A			        DB      10                      ; Column 10
 026A  53 79 73 74 65 6D	        DB      'System Exception - '   ; Text
       20 45 78 63 65 70	
       74 69 6F 6E 20 2D	
       20			
 027D  00			        DB      0                       ; End of text
 027E  0024			        DW      BP_EX                   ; Offset to hex value on the stack
 0280  0001			        DW      1                       ; Number of words of data
				
				; Now, fake one to put the task id (bank ID) on the screen.
				
 0282  01			        DB      1                       ; Row 1
 0283  32			        DB      50                      ; Column 50
 0284  54 61 73 6B 20 49	        DB      'Task ID - '            ; Text
       44 20 2D 20		
 028E  00			        DB      0                       ; End of text
 028F  0010			        DW      BP_PSP2                 ; Offset to hex value on the stack
 0291  0001			        DW      1                       ; Number of words of data
				
				; Now, lets do the registers
				
				        REG     CS,3,1,1
 0293  03                    1	        DB      3                    ; Display of register &NAME starts in 
 0294  01                    1	        DB      1                    ;   row &ROW and column &COL 
 0295  43 53 3A              1	        DB      'CS:'                ; Name to display for register &NAME 
 0298  00                    1	        DB      0                       ; End of string marker 
 0299  002E                  1	        DW      BP_CS                ; Offset of value of register &NAME 
 029B  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     IP,3,9,2
 029D  03                    1	        DB      3                    ; Display of register &NAME starts in 
 029E  09                    1	        DB      9                    ;   row &ROW and column &COL 
 029F  49 50 3A              1	        DB      'IP:'                ; Name to display for register &NAME 
 02A2  00                    1	        DB      0                       ; End of string marker 
 02A3  002A                  1	        DW      BP_IP                ; Offset of value of register &NAME 
 02A5  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     SS,3,21,1
 02A7  03                    1	        DB      3                    ; Display of register &NAME starts in 
 02A8  15                    1	        DB      21                    ;   row &ROW and column &COL 
 02A9  53 53 3A              1	        DB      'SS:'                ; Name to display for register &NAME 
 02AC  00                    1	        DB      0                       ; End of string marker 
 02AD  003A                  1	        DW      BP_SS                ; Offset of value of register &NAME 
 02AF  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     SP,3,29,2
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-22
Register table                                              

 02B1  03                    1	        DB      3                    ; Display of register &NAME starts in 
 02B2  1D                    1	        DB      29                    ;   row &ROW and column &COL 
 02B3  53 50 3A              1	        DB      'SP:'                ; Name to display for register &NAME 
 02B6  00                    1	        DB      0                       ; End of string marker 
 02B7  0036                  1	        DW      BP_SP                ; Offset of value of register &NAME 
 02B9  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     DS,3,41,1
 02BB  03                    1	        DB      3                    ; Display of register &NAME starts in 
 02BC  29                    1	        DB      41                    ;   row &ROW and column &COL 
 02BD  44 53 3A              1	        DB      'DS:'                ; Name to display for register &NAME 
 02C0  00                    1	        DB      0                       ; End of string marker 
 02C1  0022                  1	        DW      BP_DS                ; Offset of value of register &NAME 
 02C3  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     SI,3,49,2
 02C5  03                    1	        DB      3                    ; Display of register &NAME starts in 
 02C6  31                    1	        DB      49                    ;   row &ROW and column &COL 
 02C7  53 49 3A              1	        DB      'SI:'                ; Name to display for register &NAME 
 02CA  00                    1	        DB      0                       ; End of string marker 
 02CB  0006                  1	        DW      BP_SI                ; Offset of value of register &NAME 
 02CD  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     ES,3,61,1
 02CF  03                    1	        DB      3                    ; Display of register &NAME starts in 
 02D0  3D                    1	        DB      61                    ;   row &ROW and column &COL 
 02D1  45 53 3A              1	        DB      'ES:'                ; Name to display for register &NAME 
 02D4  00                    1	        DB      0                       ; End of string marker 
 02D5  0000                  1	        DW      BP_ES                ; Offset of value of register &NAME 
 02D7  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     DI,3,69,2
 02D9  03                    1	        DB      3                    ; Display of register &NAME starts in 
 02DA  45                    1	        DB      69                    ;   row &ROW and column &COL 
 02DB  44 49 3A              1	        DB      'DI:'                ; Name to display for register &NAME 
 02DE  00                    1	        DB      0                       ; End of string marker 
 02DF  0002                  1	        DW      BP_DI                ; Offset of value of register &NAME 
 02E1  0002                  1	        DW      2                      ; Number of words in the register 
				
				        REG     AX,4,1,2
 02E3  04                    1	        DB      4                    ; Display of register &NAME starts in 
 02E4  01                    1	        DB      1                    ;   row &ROW and column &COL 
 02E5  41 58 3A              1	        DB      'AX:'                ; Name to display for register &NAME 
 02E8  00                    1	        DB      0                       ; End of string marker 
 02E9  001E                  1	        DW      BP_AX                ; Offset of value of register &NAME 
 02EB  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     BX,4,13,2
 02ED  04                    1	        DB      4                    ; Display of register &NAME starts in 
 02EE  0D                    1	        DB      13                    ;   row &ROW and column &COL 
 02EF  42 58 3A              1	        DB      'BX:'                ; Name to display for register &NAME 
 02F2  00                    1	        DB      0                       ; End of string marker 
 02F3  0012                  1	        DW      BP_BX                ; Offset of value of register &NAME 
 02F5  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     CX,4,25,2
 02F7  04                    1	        DB      4                    ; Display of register &NAME starts in 
 02F8  19                    1	        DB      25                    ;   row &ROW and column &COL 
 02F9  43 58 3A              1	        DB      'CX:'                ; Name to display for register &NAME 
 02FC  00                    1	        DB      0                       ; End of string marker 
 02FD  001A                  1	        DW      BP_CX                ; Offset of value of register &NAME 
 02FF  0002                  1	        DW      2                      ; Number of words in the register 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-23
Register table                                              

				        REG     DX,4,37,2
 0301  04                    1	        DB      4                    ; Display of register &NAME starts in 
 0302  25                    1	        DB      37                    ;   row &ROW and column &COL 
 0303  44 58 3A              1	        DB      'DX:'                ; Name to display for register &NAME 
 0306  00                    1	        DB      0                       ; End of string marker 
 0307  0016                  1	        DW      BP_DX                ; Offset of value of register &NAME 
 0309  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     BP,4,49,2
 030B  04                    1	        DB      4                    ; Display of register &NAME starts in 
 030C  31                    1	        DB      49                    ;   row &ROW and column &COL 
 030D  42 50 3A              1	        DB      'BP:'                ; Name to display for register &NAME 
 0310  00                    1	        DB      0                       ; End of string marker 
 0311  000A                  1	        DW      BP_BP                ; Offset of value of register &NAME 
 0313  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     EC,4,61,2
 0315  04                    1	        DB      4                    ; Display of register &NAME starts in 
 0316  3D                    1	        DB      61                    ;   row &ROW and column &COL 
 0317  45 43 3A              1	        DB      'EC:'                ; Name to display for register &NAME 
 031A  00                    1	        DB      0                       ; End of string marker 
 031B  0026                  1	        DW      BP_EC                ; Offset of value of register &NAME 
 031D  0002                  1	        DW      2                      ; Number of words in the register 
				
				        REG     FL,5,1,2
 031F  05                    1	        DB      5                    ; Display of register &NAME starts in 
 0320  01                    1	        DB      1                    ;   row &ROW and column &COL 
 0321  46 4C 3A              1	        DB      'FL:'                ; Name to display for register &NAME 
 0324  00                    1	        DB      0                       ; End of string marker 
 0325  0032                  1	        DW      BP_FL                ; Offset of value of register &NAME 
 0327  0002                  1	        DW      2                      ; Number of words in the register 
				        REG     VMDS,5,18,1
 0329  05                    1	        DB      5                    ; Display of register &NAME starts in 
 032A  12                    1	        DB      18                    ;   row &ROW and column &COL 
 032B  56 4D 44 53 3A        1	        DB      'VMDS:'                ; Name to display for register &NAME 
 0330  00                    1	        DB      0                       ; End of string marker 
 0331  0042                  1	        DW      BP_VMDS                ; Offset of value of register &NAME 
 0333  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     VMES,5,33,1
 0335  05                    1	        DB      5                    ; Display of register &NAME starts in 
 0336  21                    1	        DB      33                    ;   row &ROW and column &COL 
 0337  56 4D 45 53 3A        1	        DB      'VMES:'                ; Name to display for register &NAME 
 033C  00                    1	        DB      0                       ; End of string marker 
 033D  003E                  1	        DW      BP_VMES                ; Offset of value of register &NAME 
 033F  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     VMFS,5,48,1
 0341  05                    1	        DB      5                    ; Display of register &NAME starts in 
 0342  30                    1	        DB      48                    ;   row &ROW and column &COL 
 0343  56 4D 46 53 3A        1	        DB      'VMFS:'                ; Name to display for register &NAME 
 0348  00                    1	        DB      0                       ; End of string marker 
 0349  0046                  1	        DW      BP_VMFS                ; Offset of value of register &NAME 
 034B  0001                  1	        DW      1                      ; Number of words in the register 
				        REG     VMGS,5,63,1
 034D  05                    1	        DB      5                    ; Display of register &NAME starts in 
 034E  3F                    1	        DB      63                    ;   row &ROW and column &COL 
 034F  56 4D 47 53 3A        1	        DB      'VMGS:'                ; Name to display for register &NAME 
 0354  00                    1	        DB      0                       ; End of string marker 
 0355  004A                  1	        DW      BP_VMGS                ; Offset of value of register &NAME 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Page     1-24
Register table                                              

 0357  0001                  1	        DW      1                      ; Number of words in the register 
				
 0359				PROG    ENDS
				
				        END

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Symbols-1


Macros:

		N a m e			Lines

ADDROV . . . . . . . . . . . . .  	   1
DATAOV . . . . . . . . . . . . .  	   1
REG  . . . . . . . . . . . . . .  	   7
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
  GATE_RESERVED  . . . . . . . .  	0006
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Symbols-2


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
  TI . . . . . . . . . . . . . .  	0002	0001	0004	0000
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Symbols-3


  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
  VM_TR  . . . . . . . . . . . .  	0000
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Symbols-4


  TSS_PTR  . . . . . . . . . . .  	0008
  VM_LDTR  . . . . . . . . . . .  	0010
  LDT_PTR  . . . . . . . . . . .  	0018

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

PROG . . . . . . . . . . . . . .  	0359	PARA	PUBLIC	'PROG'

Symbols:            

                N a m e         	Type	 Value	 Attr

BLANK  . . . . . . . . . . . . .  	NUMBER	0020	
BOOT_CS  . . . . . . . . . . . .  	NUMBER	0000	
BOOT_FL  . . . . . . . . . . . .  	NUMBER	0200	
BOOT_IP  . . . . . . . . . . . .  	NUMBER	7C00	
BOOT_SP  . . . . . . . . . . . .  	NUMBER	07FF	
BOOT_SS  . . . . . . . . . . . .  	NUMBER	0030	
BP_START . . . . . . . . . . . .  	NUMBER	0000	

CARD_ENABL . . . . . . . . . . .  	NUMBER	0004	
CCRT@_HI . . . . . . . . . . . .  	NUMBER	000B	
CCRT@_LO . . . . . . . . . . . .  	NUMBER	8000	
CCRT_SIZE  . . . . . . . . . . .  	NUMBER	4000	
CHKPRT . . . . . . . . . . . . .  	L NEAR	0156	PROG
CHKVM  . . . . . . . . . . . . .  	L NEAR	0025	PROG
CHK_ESC  . . . . . . . . . . . .  	L NEAR	0116	PROG
COMSTACK . . . . . . . . . . . .  	L NEAR	00EB	PROG
CRT_SELECTOR . . . . . . . . . .  	V WORD	0000	PROG	External
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	
DID_ID . . . . . . . . . . . . .  	L NEAR	0092	PROG
DISPATCH_LOC . . . . . . . . . .  	NUMBER	D900	
DISPCONT . . . . . . . . . . . .  	L NEAR	001C	PROG
DISPLAY  . . . . . . . . . . . .  	L NEAR	0011	PROG	Global
DISP_STACK . . . . . . . . . . .  	L NEAR	00F4	PROG
DODISP . . . . . . . . . . . . .  	L NEAR	0044	PROG
DO_ID  . . . . . . . . . . . . .  	L NEAR	0085	PROG
DO_MONITOR . . . . . . . . . . .  	L NEAR	0188	PROG
DO_REG . . . . . . . . . . . . .  	L NEAR	0073	PROG
DO_RESET . . . . . . . . . . . .  	L NEAR	016F	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
ERROR  . . . . . . . . . . . . .  	L NEAR	002F	PROG
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Symbols-5



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

HALT . . . . . . . . . . . . . .  	L NEAR	0185	PROG
HEXB . . . . . . . . . . . . . .  	N PROC	0243	PROG	Global	Length = 0025
HEXD . . . . . . . . . . . . . .  	N PROC	0219	PROG	Global	Length = 001F
HEXW . . . . . . . . . . . . . .  	N PROC	0238	PROG	Global	Length = 000B

INDEEXC  . . . . . . . . . . . .  	L NEAR	0000	PROG	Global
INDEX  . . . . . . . . . . . . .  		0003	
INT15  . . . . . . . . . . . . .  	L NEAR	0000	PROG	External

LA_LEN . . . . . . . . . . . . .  	ALIAS	 GDT_LEN		
LDT_LEN  . . . . . . . . . . . .  	NUMBER	0800	
LONGWAY  . . . . . . . . . . . .  	L NEAR	0194	PROG
LONGWAY2 . . . . . . . . . . . .  	L NEAR	01AC	PROG
LONGWAY3 . . . . . . . . . . . .  	L NEAR	01BB	PROG
LONGWAY4 . . . . . . . . . . . .  	L NEAR	01C4	PROG
LOOPREG  . . . . . . . . . . . .  	L NEAR	00B5	PROG

MAX_SEG_LEN  . . . . . . . . . .  	NUMBER	FFFF	
MCRT@_HI . . . . . . . . . . . .  	NUMBER	000B	
MCRT@_LO . . . . . . . . . . . .  	NUMBER	0000	
MCRT_SIZE  . . . . . . . . . . .  	NUMBER	1000	
MEMX . . . . . . . . . . . . . .  	NUMBER	0002	
MORE . . . . . . . . . . . . . .  	L NEAR	00AC	PROG

NEXT_DESC  . . . . . . . . . . .  	NUMBER	0008	
NOTVM86  . . . . . . . . . . . .  	L NEAR	00E2	PROG
NSEG@_HI . . . . . . . . . . . .  	NUMBER	0000	
NSEG@_LO . . . . . . . . . . . .  	NUMBER	0000	
NULL_SEG_LEN . . . . . . . . . .  	NUMBER	0000	

OK1  . . . . . . . . . . . . . .  	L NEAR	0256	PROG
OK2  . . . . . . . . . . . . . .  	L NEAR	0264	PROG
OTHER_CACHE  . . . . . . . . . .  	NUMBER	0000	

PAGE_FAULT . . . . . . . . . . .  	L NEAR	0136	PROG
PM_VM_SIZE . . . . . . . . . . .  	NUMBER	1000	
POPREGS  . . . . . . . . . . . .  	L NEAR	0210	PROG	Global

REG_TABLE  . . . . . . . . . . .  	L NEAR	0268	PROG
RPL  . . . . . . . . . . . . . .  		0000	

SAVE_REGS  . . . . . . . . . . .  	L NEAR	0001	PROG
SEX  . . . . . . . . . . . . . .  	N PROC	0000	PROG	Global	Length = 0219
SEX_ATTR . . . . . . . . . . . .  	NUMBER	4B00	
SHADOW_ID  . . . . . . . . . . .  	ALIAS	 DATA_RESERVED		
SIDT_LEN . . . . . . . . . . . .  	NUMBER	0800	
SIDT_LOC . . . . . . . . . . . .  	NUMBER	D100	
SS_HI_CACHE  . . . . . . . . . .  	NUMBER	0000	
SS_LO_CACHE  . . . . . . . . . .  	NUMBER	0300	
STACK_ATTR . . . . . . . . . . .  	NUMBER	0700	
STACK_LOOP . . . . . . . . . . .  	L NEAR	014A	PROG
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:11
INDEEXC - 386 XMA EMULATOR - System Exception Handler       Symbols-6


S_MODE . . . . . . . . . . . . .  	NUMBER	2000	

TERM_APP . . . . . . . . . . . .  	L NEAR	0129	PROG
THIRTY_TWO_K . . . . . . . . . .  	NUMBER	8000	
TI . . . . . . . . . . . . . . .  		0002	
TSS_386_LEN  . . . . . . . . . .  	NUMBER	0068	
TSS_BM_LEN . . . . . . . . . . .  	NUMBER	0F97	
TSS_LEN  . . . . . . . . . . . .  	NUMBER	2068	

VEXCPT13 . . . . . . . . . . . .  	L NEAR	0000	PROG	Global
VIRTUAL_ENABLE . . . . . . . . .  	NUMBER	0001	
VM_ENTRY_LENGTH  . . . . . . . .  	NUMBER	0020	
VM_ENTRY_WIDTH . . . . . . . . .  	NUMBER	0005	

WAIT_HERE  . . . . . . . . . . .  	L NEAR	0101	PROG

XMATID . . . . . . . . . . . . .  	V BYTE	0000	PROG	External

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


   1333 Source  Lines
   1495 Total   Lines
    262 Symbols

  46274 + 182079 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
