dos_compilers/Digital Research MT+86 Pascal v311/INIPC.I86
2024-06-30 11:44:12 -07:00

154 lines
3.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; VERSION 0002
NAME INIT3
ASSUME CS:CODE,DS:DATA
DATA SEGMENT PUBLIC
DATA ENDS
CODE SEGMENT PUBLIC
EXTRN @HLT : NEAR
PUBLIC INIPC
PUBLIC @INI3
INIPC PROC FAR
;
; this routine is adapted for PCDOS.
;
MOV AX,CS
ADD AX,CS:WORD PTR [3] ;ADD CODE SIZE
ADD AX,CS:WORD PTR [5] ;ADD DATA SIZE
ADD AX,CS:WORD PTR [7] ;ADD STACK SIZE
ADD AX,CS:WORD PTR [9] ;ADD EXTRA SIZE
CMP AX,DS:WORD PTR [2] ;COMPARE WITH MAX MEMORY
JNA MEMOK
PUSH DS ;SAVE ADDRESS OF PSP
CALL OUTOFMEM
DB 'OUT OF MEMORY'
DB 0AH
DB 0DH
DB '$'
OUTOFMEM:
MOV AX,CS ;SET OF DS:DX TO POINT TO MESSAGE
MOV DS,AX
POP DX
MOV AH,09 ;DO PRINT STRING
INT 021H
XOR AX,AX ;SEGMENT ADDRESS OF PSP IS ON STACK BECAUSE WE
;PUSHED DS ABOVE
PUSH AX ;PUSH OFFSET=0 ONTO STACK
RET ;AND TERMINATE THROUGH PSP
MEMOK:
;
; MEMORY IS AVAILABLE. SET UP BASE PAGE
;
; DETERMINE DS LOCATION
MOV AX,CS
ADD AX,CS:WORD PTR [3] ;ADD CODE SIZE TO GET BASE OF DATA
; COPY PROGRAM SEGMENT PREFIX TO BASE PAGE
MOV ES,AX
MOV DI,0
MOV SI,DI
CLD
MOV CX,100H
REP
MOVSB
; SAVE PSP ADDRESS IN BASE PAGE
MOV ES:WORD PTR [40H],DS
; SET UP DS REGISTER
MOV DS,AX
; SAVE ADDRESS OF DATA IN BASE PAGE
MOV WORD PTR [09H],DS
; COMPUTE BASE OF EXTRA SEGMENT
ADD AX,CS:WORD PTR [5] ;ADD SIZE OF DATA
MOV WORD PTR [0FH],AX
;COMPUTE BASE OF STACK
ADD AX,CS:WORD PTR [09H] ;ADD LENGTH OF EXTRA
MOV WORD PTR [15H],AX
MOV CX,4 ;CONVERT STACK SIZE FROM PARA TO BYTES
MOV BX,CS:WORD PTR [07H]
SHL BX,CL
MOV WORD PTR [12H],BX ;SAVE IN BASE PAGE
;SET UP STACK POINTERS
PUSHF
POP DX
CLI
MOV SS,AX
MOV SP,BX
STI
PUSH DX
POPF
;
;NOW CHANGE SIZES TO BYTES NOT PARAGRAPHS.
; AND SAVE IN BASE PAGE
;
MOV AX,CS:WORD PTR [5] ;GET DATA SIZE
MOV CL,04
SHL AX,CL
MOV WORD PTR [06],AX
MOV AX,CS:WORD PTR [09H] ;GET EXTRA SIZE
MOV BX,AX ;SAVE SIZE
MOV CL,04
SHL AX,CL
MOV WORD PTR [0CH],AX ;SAVE LOW ORDER BYTES
MOV AX,BX
MOV CL,12
SHR AX,CL
MOV BYTE PTR [0EH],AL ;SAVE TOP BYTE
MOV AX,CS
ADD AX,8
PUSH AX
XOR AX,AX
PUSH AX
RET ;RETURN TO MAIN PROGRAM
INIPC ENDP
@INI3 PROC NEAR
MOV AX,DS
MOV ES,AX ;NOW ES:0 IS START OF DATA AREA
MOV DI,6 ;6 IS OFFSET OF DSEG LENGTH
MOV CX,ES:WORD PTR [DI]
SUB CX,100H ;SEGMENT LENGTH IS IN BYTES
MOV DI,100H ;START ADDRESS OF FILL
XOR AX,AX ;DATA TO FILL WITH
REP
STOSB ;ZERO IT ALL
;
; NOW IF OVERLAYS ARE LINKED INTO THE ROOT ZERO THE FIRST
; BYTE OF THE OVERLAY AREAS
;
MOV AX,CS
MOV ES,AX ;NOW CS:0 IS START OF CODE
MOV DI,0CH ;0C IS OFFSET OF NAME CONTROL BLOCK
MOV AX,ES:WORD PTR [DI]
MOV BX,ES:WORD PTR 2[DI]
;
; IF AX=BX THEN OVERLAYS WERE NOT LINKED INTO THIS PROGRAM
;
CMP AX,BX
JZ XIT
MOV DI,BX ;ELSE EI:DI NOW POINTS TO OVERLAY AREA TABLE
MOV CX,16 ;NUMBER OF ENTRIES IN THE TABLE
LP: MOV SI,ES:WORD PTR [DI] ;GET OFFSET OF OVERLAY AREA
MOV ES:BYTE PTR [SI],0 ;PUT A ZERO THERE
INC DI ;AND BUMP TO NEXT OFFSET IN TABLE
INC DI
LOOP LP ;DO IT 16 TIMES
XIT: RET
@INI3 ENDP
CODE ENDS
END