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