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

582 lines
19 KiB
Plaintext
Raw Permalink 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.

NAME OVERLAY_MANAGER
ASSUME CS:CODE,DS:DATA
DATA SEGMENT PUBLIC
DMAPTR DW ? ;DMA ADDRESS FOR INPUT XFER
PROCNAME DB 8 DUP(?) ;NAME OF PROCEDURE WHICH WE ARE CALLI
NG
OVLGNUM DB ? ;OVERLAY NUMBER
PROCADR DW ? ;PROCEDURE ADDRESS
MYFCB DB 36 DUP(?) ;FCB FOR FILE OPENING
;
; USRRET STACK CONTAINS RETURN ADDRESS AND
; SAVED OVERLAY AREA ADDRESS
; AND OVERLAY GROUP NUMBER ;(MAX NESTING 25
DB 129 DUP(?) ;SAVED RETURN ADDRESSES
USRRET:
OVLAREA DW ? ;LOC OF MOST RECENT OVL AREA
DATA ENDS
CODE SEGMENT PUBLIC
M EQU Byte Ptr 0[BX]
;---------------------------------------------------------------;
; ;
; Overlay Management Module for Pascal/MT+ under PCDOS ;
; ;
; Created: March 18, 1981 ;
; Updated: February 24, 1983 ;
; ;
;---------------------------------------------------------------;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
; equates for pertinant information ;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
;
; THE FOLLOWING THREE EQUATES DESCRIBE DATA PLACED AT THE
; BEGINNING OF THE .CMD FILE BY LINK/MT+86 AFTER THE
; STACK POINTER INITIALIZATION CODE.
; THEY MUST BE REFERENCED WITH A CS OVERRIDE
;
NCBPTR EQU 000CH
ovlbase EQU 0001h ;base prefix for file name
namelen EQU 0000h ;length of names (6 or 7 characters)
@XXXX1 EQU 000EH ;PTR TO BASE OF OVL_AREA_TAB
TRUE EQU -1
FALSE EQU 0 ;FOR CONDITIONAL ASSEMBLY
RELOAD EQU OFF ;NON-RECURSIVE OVERLAY CALLING
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
; PUBLIC AND EXTRN SYMBOLS ;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
PUBLIC @OVL ;OVERLAY LOADER
PUBLIC @OVS ;OVERLAY DISK SET
extrn @hlt : near
;###############################################################;
; ;
; MAIN ROUTINE - @OVL ;
; PURPOSE - LOAD OVERLAY AND CALL PROCEDURE ;
;---------------------------------------------------------------;
; ON ENTRY TO @OVL, RETURN ADDRESS POINTS TO OVERLAY CALL ;
; DATA BLOCK: ;
; ;
; +0 : OVERLAY GROUP NUMBER --- 1 BYTE ;
; +1 : OVERLAY PROCEDURE NAME-- 8 BYTES ;
; ;
;###############################################################;
@OVL PROC NEAR
POP BX
MOV AL,CS:M
MOV Byte Ptr OVLGNUM,AL
INC BX
MOV CH,8
MOV DX,(Offset PROCNAME)
OVL1:
MOV AL,CS:M
INC BX
MOV SI,DX
MOV BYTE PTR [SI],AL
INC DX
DEC CH
JNZ OVL1
CALL PSHUSRRET ;SAVE USER'S RETURN ADDRESSES
CALL LOADOVLY ;GO LOAD IT (IF NECESSARY)
CALL FINDPROC ;GO SEARCH FOR AND FIND PROCNAME
;DOES NOT RETURN IF PROC NOT FOUND
MOV BX,(Offset OURRET);PUSH OUR RETURN ADDRESS ON THE STACK
PUSH BX
MOV BX,Word Ptr PROCADR ;GET ADDRESS OF PROC WITHIN OVERLAY AREA
JMP BX ;AND OFF TO USER ROUTINE
OURRET:
PUSH AX
PUSH BX ;SAVE POSSIBLE RETURN VALUES
CALL POPUSRRET ;MAY RELOAD OLD OVERLAY GROUP
POP BX
POP AX ;GET POSSIBLE RETURN VALUES BACK AGAIN
JMP CX ;AND BACK TO THE USER (SIMPLE CASE)
@OVL ENDP
;###############################################################;
; ;
; MAIN ROUTINE - @OVS ;
; PURPOSE - SET DRIVE NUMBER FOR A SPECIFIC OVERLAY ;
; INPUT - ON STACK : OVLNUM,DRIVE ;
; OVLNUM : 1..50 ;
; DRIVE : '@'..'O' ;
; ;
; PASCAL DEFINITION: ;
; ;
; EXTERNAL PROCEDURE @OVS(OVNUM:INTEGER; DRNUM:CHAR); ;
; ;
;###############################################################;
@OVS PROC NEAR
POP BX ;RET ADR
POP CX ;DRIVE NUMBER
POP DX ;OVERLAY NUMBER
PUSH BX
MOV AL,CL
SUB AL,'@' ;MAKE 0..19
DEC DX ;ADJUST OVLNUM (COUNT FROM 0)
MOV BX,(Offset DRIVETAB)
ADD BX,DX
MOV CS:M,AL
RET
@OVS ENDP
;===============================================================;
; SUBROUTINE: CALCADDR ;
; PURPOSE : CALC OVERLAY AREA ADDRESS BASED ON OVLGNUM ;
;===============================================================;
CALCADDR PROC NEAR
MOV AL,Byte Ptr OVLGNUM ;GET REQUESTED GROUP NUMBER
DEC AL
RCR AL,1
RCR AL,1
RCR AL,1 ;DIVIDE BY 8
AND AL,1EH
MOV DL,AL
MOV DH,0
MOV BX,CS:Word Ptr @XXXX1 ;GET ADDR OF OVERLAY AREA TABLE
;POINT TO TABLE ENTRY
ADD BX,DX
MOV DX,CS:WORD PTR [BX]
XCHG BX,DX ;BX NOW POINTS TO OVERLAY AREA
MOV Word Ptr OVLAREA,BX ;SAVE IT FOR LATER
RET
CALCADDR ENDP
;===============================================================;
; SUBROUTINE: PSHUSRRET ;
; PURPOSE : SAVE CONTENTS OF HL, OVERLAY AREA ADDR ;
; AND OVERLAY GROUP NUMBER ON USRRET STACK ;
;===============================================================;
; PUBLIC PSHUSRRET
PSHUSRRET PROC NEAR
PUSH BX
CALL CALCADDR
MOV CX,BX
POP DX
MOV BX,CS:Word Ptr USRSP ;GET STACK POINTER
DEC BX
MOV M,DH ;STORE RET ADDR
DEC BX
MOV M,DL
DEC BX
MOV M,CH ;STORE OVERLAY AREA ADDR
DEC BX
MOV M,CL
DEC BX
MOV SI,CX ;GET OVERLAY NUMBER
MOV AL,CS:BYTE PTR [SI]
MOV M,AL
MOV CS:Word Ptr USRSP,BX
RET
PSHUSRRET ENDP
;===============================================================;
; SUBROUTINE: POPUSRRET ;
; PURPOSE : POP RET ADDR, OVERLAY AREA ADDR AND NUMBER ;
; IF RECURSE IS SET TO TRUE THEN THIS ROUTINE ;
; WILL CALL LOADOVLY TO RE-LOAD PREVIOUS ;
; OVERLAY IF NECESSARY ;
;===============================================================;
; PUBLIC POPUSRRET
POPUSRRET PROC NEAR
MOV BX,CS:Word Ptr USRSP
MOV AL,M
MOV Byte Ptr OVLGNUM,AL ;SAVE OVERLAY GROUP NUMBER
INC BX
MOV DL,M
INC BX
MOV DH,M
INC BX ;DE NOW CONTAINS OVERLAY AREA ADDRESS
XCHG BX,DX
MOV Word Ptr OVLAREA,BX
XCHG BX,DX
MOV DL,M
INC BX
MOV DH,M ;DE NOW CONTAINS CALLERS RET ADDRESS
INC BX
MOV CS:Word Ptr USRSP,BX
XCHG BX,DX ;PUT REAL ADDR INTO HL
;----------------------------------------------------------------
IF RELOAD ; THEN RELOAD OLD OVERLAY IF NECESSARY
PUSH BX
MOV AL,Byte Ptr OVLGNUM
OR AL,AL
JZ L@1
CALL LOADOVLY ;ELSE GO LOAD IT IN AGAIN
L@1:
POP BX ;GET RET ADDR BACK AGAIN
ENDIF
;----------------------------------------------------------------
MOV CX,BX ;RETURN IT IN CX (1/17/82)
RET ;BACK TO MAIN @OVL ROUTINE
POPUSRRET ENDP
;===============================================================;
; SUBROUTINE: LOADOVLY ;
; PURPOSE : USING OVLADDR AND OVLBASE LOAD THE OVERLAY ;
;===============================================================;
LOADOVLY PROC NEAR
CALL CALCADDR ;SETS OVLAREA AND HL-REG
MOV AL,Byte Ptr OVLGNUM ;GET GROUP NUMBER BACK AGAIN
CMP AL,CS:M ;IS REQUESTED OVERLAY IN THE AREA?
JNZ L@2
RET ;RETURN IF ALREADY LOADED
L@2:
;
; IF NOT LOADED THEN CONSTRUCT NAME AND LOAD IT
;
; MOVE OVLBASE,MYFCB+1,8
MOV BX,CS:WORD PTR NCBPTR
ADD BX,OVLBASE
MOV DX,(Offset MYFCB)+1
MOV CH,8
?1: MOV AL,CS:M ;GET BYTE OF NAME FROM CODE SEG
MOV SI,DX
MOV BYTE PTR [SI],AL ;AND STORE IN DATA SEG
INC BX
INC DX
DEC CH
JNZ ?1
MOV AL,Byte Ptr OVLGNUM
DEC AL
MOV DL,AL
MOV DH,0
MOV BX,(Offset DRIVETAB)
ADD BX,DX
MOV AL,CS:M ;GET DRIVE NUMBER FROM TABLE
MOV Byte Ptr MYFCB,AL ;FOR NOW DEFAULT DRIVE ONLY
MOV AL,'0'
MOV Byte Ptr MYFCB+9,AL
MOV AL,Byte Ptr OVLGNUM
RCR AL,1
RCR AL,1
RCR AL,1
RCR AL,1
CALL CV2HX ;CONVERT HIGH NIBBLE
MOV Byte Ptr MYFCB+10,AL
MOV AL,Byte Ptr OVLGNUM
CALL CV2HX ;CONVERT LOW NIBBLE
MOV Byte Ptr MYFCB+11,AL
MOV BX,(Offset MYFCB)+12
MOV CH,23 ;NUMBER OF EXTRA BYTES
LO2:
MOV M,0
INC BX
DEC CH
JNZ LO2
MOV DX,80H ;SET DEFAULT DMA ADDRESS
call setdma
MOV DX,(Offset MYFCB)
call open
CMP AL,255
JNZ L@3
JMP NOFILE ;BR IF FILE NOT FOUND
L@3:
;
; OK, NOW LOAD IT UNTIL EOF
;
LO3:
MOV DX,Word Ptr OVLAREA ;GET OVERLAY AREA ADDRESS
mov bx,ds ;save ds
mov ax,cs
mov ds,ax
call setdma
mov ds,bx ;RESTORE DS
MOV DX,(Offset MYFCB)
mov DI,DX
mov AX,word ptr [DI+16] ;get file size in bytes
mov CL,7 ;set up to divide by 128
shr AX,CL ;do divide by shifting
mov CX,AX ;move number of records into CX
call rdran
RET
LOADOVLY ENDP
pcdos PROC NEAR ; the call to PCDOS
push es
int 21h
pop es
ret
pcdos endp
open: ; file open (#15)
mov ah,15
jmp pcdos
rdran: ;random read (#39)
mov ah,39
jmp pcdos
setdma: ;set DMA offset (#26) PCDOS style
mov ah,26 ; load function number
jmp pcdos
;
; INTERNAL ROUTINE - CV2HX
; LOW ORDER 4-BITS OF A-REG CONTAIN BINARY NUMBER
; RETURN ASCII CHAR IN A-REG
;
CV2HX PROC NEAR
AND AL,0FH
ADD AL,'0'
CMP AL,03AH
JNB L@4
RET ;RETURN IF A VAILD DIGIT
L@4:
ADD AL,7
RET
CV2HX ENDP
;===============================================================;
; SUBROUTINE: FINDPROC ;
; PURPOSE : GIVEN PROCEDURE NAME IN PROCNAME ;
; RETURN ADDRESS OF THIS PROCEDURE IN ;
; PROCADR ;
;===============================================================;
FINDPROC PROC NEAR
MOV BX,Word Ptr OVLAREA ;GET ADDR OF OVERLAY AREA
INC BX
MOV DL,CS:M
INC BX
MOV DH,CS:M ;POINT TO TABLE
XCHG BX,DX
FP1:
MOV AL,CS:M
OR AL,AL
JNZ L@5
JMP NOPROC
L@5:
MOV DX,(Offset PROCNAME)
MOV SI,CS:WORD PTR NCBPTR
MOV AL,CS:BYTE PTR [SI]
MOV CH,AL
PUSH BX ;SAVE ADDR OF TABLE ENTRY
FP2:
MOV SI,DX
MOV AL,BYTE PTR [SI]
CMP AL,CS:M
JNZ FP3 ;BR IF NO MATCH
INC BX
INC DX
DEC CH
JNZ FP2 ;BR IF MORE TO COMPARE
;
; WE FOUND IT......
;
POP BX ;GET BASE ADDR OF TABLE ENTRY
MOV DX,8 ;BYPASS NAME
ADD BX,DX
MOV DL,CS:M
INC BX
MOV DH,CS:M
XCHG BX,DX
MOV Word Ptr PROCADR,BX
RET ;AND EXIT
FP3:
POP BX
MOV DX,10
ADD BX,DX
JMP SHORT FP1
FINDPROC ENDP
;===============================================================;
; ERROR MESSAGE PRINTING ROUTINES ;
;===============================================================;
NOFILE: ;***OVERLAY FILE NOT FOUND***
; MOVE MYFCB+1,NFMSG1+2,8 ;MOVE IN NAME
MOV BX,(Offset MYFCB)+1
MOV DX,(Offset NFMSG1)+2
MOV CX,8
?2:
MOV AL,M
INC BX
MOV SI,DX
MOV CS:BYTE PTR [SI],AL
INC DX
DEC CX
MOV AL,CH
OR AL,CL
JNZ ?2
; MOVE MYFCB+9,NFMSG1+11,3 ;MOVE IN EXTENSION
MOV BX,(Offset MYFCB)+9
MOV DX,(Offset NFMSG1)+11
MOV CX,3
?3:
MOV AL,M
INC BX
MOV SI,DX
MOV CS:BYTE PTR[SI],AL
INC DX
DEC CX
MOV AL,CH
OR AL,CL
JNZ ?3
MOV AL,Byte Ptr MYFCB
ADD AL,'@'
MOV CS:Byte Ptr NFMSG1,AL
MOV DX,(Offset NFMSG)
CMP AL,'@'
JNZ WMSG
MOV BX,' '
MOV Word Ptr NFMSG1,BX ;CHANGE "@:" TO " "
WMSG:
PUSH DS
MOV AX,CS
MOV DS,AX
mov ah,9
call pcdos
POP DS
call @hlt
NFMSG:
DB 13,10,'Unable to open: '
NFMSG1 DB 40H,': . '
DB 13,10
DB '$'
NOPROC: ;***PROCEDURE NAME NOT FOUND***
; MOVE MYFCB+1,NPMSG2+2,8 ;MOVE IN NAME
MOV BX,(Offset MYFCB)+1
MOV DX,(Offset NPMSG2)+2
MOV CX,8
?4:
MOV AL,M
INC BX
MOV SI,DX
MOV CS:BYTE PTR [SI],AL
INC DX
DEC CX
MOV AL,CH
OR AL,CL
JNZ ?4
; MOVE MYFCB+9,NPMSG2+11,3 ;MOVE IN EXTENSION
MOV BX,(Offset MYFCB)+9
MOV DX,(Offset NPMSG2)+11
MOV CX,3
?5:
MOV AL,M
INC BX
MOV SI,DX
MOV CS:BYTE PTR [SI],AL
INC DX
DEC CX
MOV AL,CH
OR AL,CL
JNZ ?5
MOV AL,Byte Ptr MYFCB
ADD AL,'@'
MOV CS:Byte Ptr NPMSG2,AL
CMP AL,'@'
JNZ NP1
MOV BX,' '
MOV CS:Word Ptr NPMSG2,BX
NP1:
; MOVE PROCNAME,NPMSG1,8
MOV BX,(Offset PROCNAME)
MOV DX,(Offset NPMSG1)
MOV CX,8
?6:
MOV AL,M
INC BX
MOV SI,DX
MOV CS:BYTE PTR [SI],AL
INC DX
DEC CX
MOV AL,CH
OR AL,CL
JNZ ?6
MOV DX,(Offset NPMSG)
JMP WMSG
NPMSG DB 13,10,'Proc: "'
NPMSG1 DB ' " not found ovl:'
NPMSG2 DB 40H,': . '
DB 13,10
DB '$'
;***************************************************************;
; ;
; DATA AREA FOR OVERLAY MANAGER ;
; ;
;***************************************************************;
;
; NOTE THIS TABLE MUST BE IN THE CSEG AREA BECAUSE IS MUST
; BE INITIALIZED VIA DB AND LINKMT WILL NOT SUPPORT INITIALIZED
; DATA IN THE DSEG
;
DRIVETAB: ;DRIVE TABLES FOR 50 OVERLAYS
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
DB 0
USRSP DW (Offset USRRET) ;USRRET STACK POINTER
;THIS MUST ALSO BE IN CODE SEG
CODE ENDS
END