SYS0000: MOV DX,DATA
SYS0003: MOV DS,DX
Point DS to System Library Data Segment.
SYS0005: MOV [PrefixSeg],ES
Save PSP
SYS0009: XOR BP,BP
??? Is this necessary?
SYS000B: CALL 0580
Clear input/output buffers and interrupt vectors array on call to SYS:0580 Clear Input/Output file records and Interrupt vector array.
SYS000E: CALL 00B1
Determine processor type on call to SYS:00B1 Test for 8086/80186/80286.
SYS0011: MOV AX,SP
SYS0013: ADD AX,0013
SYS0016: MOV CL,04
SYS0018: SHR AX,CL
Calculate segment address of the start of the overlay buffer. Start from SP, pad it (19 bytes), then get the size in terms of paragraphs by dividing AX by 16 by shifting it to the right via CL 4 times.
SYS001A: MOV DX,SS
SYS001C: ADD AX,DX
Set segment address at a distance of AX away from the stack segment in SS.
SYS001E: MOV [OvrHeapOrg.Segment],AX
SYS0021: MOV [OvrHeapPtr.Segment],AX
Set both segment address OvrHeapOrg (top of overlay buffer) and OvrHeapPtr (bottom of overlay buffer) to the segment address calculated in AX.
SYS0024: ADD AX,[OvrHeapSize]
SYS0028: MOV [OvrHeapEnd],AX
Calculate the segment address of the end of the overlay buffer using AX (which currently points to the start of the overlay buffer) and adding the overlay buffer size (OvrHeapSize, in paragraphs) to it.
SYS002B: MOV [HeapOrg.Segment],AX
SYS002E: MOV [HeapPtr.Segment],AX
SYS0031: MOV [FreeList.Segment],AX
Set the heap pointers (HeapOrg, HeapPtr) and the start of the free memory (FreeList) to the segment address of the end of the overlay buffer (OvrHeapEnd).
SYS0034: MOV ES,[PrefixSeg]
SYS0038: ES:
SYS0039: MOV AX,[PrefixSeg:0002]
Get length of image from PSP:[0002].
SYS003C: MOV [HeapEnd.Segment],AX
SYS003F: MOV WORD PTR [HeapError.Offset],00D6
SYS0045: MOV [HeapError.Segment],CS
Set up pointer to end of heap. Setup heap error exit routine at: SYS:00D6 Heap Error Handler
SYS0049: MOV DI,SaveInt00
SYS004C: MOV SI,0239
Read list of interrupts in SYS:0239 Interrupt number list and store them in array starting at DATA:[SaveInt00].
SYS004F: MOV CX,0013
Get interrupt vectors for 19 interrupts.
SYS0052: NOP
SYS0053: CLD
SYS0054: CS:
SYS0055: LODSB
SYS0056: MOV AH,35
SYS0058: INT 21
Use DOS service INT 21h AH = 35h to get interrupt vector. AL = interrupt number. Returns vector address in ES:BX
SYS005A: MOV [DI],BX
SYS005C: MOV [DI+02],ES
SYS005F: ADD DI,+04
SYS0062: LOOP 0053
Store interrupt vector then read the next interrupt and adjust destination address.
SYS0064: PUSH DS
Save DS
SYS0065: PUSH CS
SYS0066: POP DS
Codes for handlers are in SYS code segment, so copy CS into DS.
SYS0067: MOV DX,010C
SYS006A: MOV AX,2500
SYS006D: INT 21
Setup handler for INT 00h on SYS:010C Overflow Error Handler.
SYS006F: MOV DX,0113
SYS0072: MOV AX,2523
SYS0075: INT 21
Setup handler for INT 23h on SYS:0113 Ctrl-C Handler.
SYS0077: MOV DX,00DB
SYS007A: MOV AX,2524
SYS007D: INT 21
Setup handler for INT 24h on SYS:00DB Critical Error Handler.
SYS007F: MOV DX,0104
SYS0082: MOV AX,253F
SYS0085: INT 21
Setup handler for INT 3Fh on SYS:0104 Overlay Manager Error Handler.
SYS0087: POP DS
Restore DS to SYS DATA segment. Code now continues to 0088 Initialize Input.
See also: SYS:00B1 Test for 8086/80186/80286, SYS:0580 Clear Input/Output file records and Interrupt vector array, SYS:00D6 Heap Error Handler, SYS:0239 Interrupt number list, SYS:010C Overflow Error Handler, SYS:0113 Ctrl-C Handler, SYS:00DB Critical Error Handler, SYS:0104 Overlay Manager Error Handler, or go back