; cr equ 0dh ;ASCII carriage return lf equ 0ah ;ASCII line feed ; cseg segment para public 'CODE' ; assume cs:cseg,ds:data,ss:stack ; demo proc far ;at entry DS & ES = PSP push ds ;Save address for final xor ax,ax ;FAR RET to PC-DOS on stack push ax ;save copy of SS:SP for use ;after return from overlay mov cs:STK_SEG,ss mov cs:STK_PTR,sp ; ;Reserve 1000H bytes for ;this loader and release ;the rest of memory for ;use by the overlayed program. mov bx,100h ;ES=segment of PSP of loader mov ah,4ah ;BX=paragraphs to reserve int 21h ;make the messages in data ;segment addressable mov ax,seg DATA mov ds,ax mov es,ax ;jump if memory ;de-allocation failed jc ALLOC_ERR ;print memory successfully ;released mov dx,offset MSG2 mov ah,9 int 21h ; ;now load and execute ;the overlaid program. mov dx,offset PGM_NAME mov bx,offset PAR_BLK mov al,0 mov ah,4bh int 21h ;restore stack pointers ;to state before EXEC call mov ss,cs:STK_SEG mov sp,cs:STK_PTR ;Make data segment ;addressable again mov ax,seg DATA mov ds,ax ;print message that loader ;successfully regained control mov dx,offset MSG3 mov ah,9 int 21h ;now exit to PC-DOS ret alloc_err: ;come here if memory ;cannot be released mov dx,offset MSG1 mov ah,9 int 21h ;print error message and ret ;exit to PC-DOS ; demo endp ; ;these two variables must ;reside in Code Segment so ;that they are addressable ;after return from overlay. stk_seg dw 0 ;original SS contents stk_ptr dw 0 ;original SP contents ; cseg ends ;declare a stack area ;for use by this loader stack segment para stack 'STACK' ;allow 64 bytes in this case db 64 dup (?) stack ends ;declare data segment to ;contain variables and tables data segment para public 'DATA' ; msg1 db cr,lf db 'Unable to release memory.' db cr,lf,'$' msg2 db cr,lf db 'Memory above loader released.' db cr,lf,'Now loading CHKDSK.COM.' db cr,lf,'$' msg3 db cr,lf db 'Loader regained control from CHKDSK,' db cr,lf db 'now making final exit to PC-DOS.' db cr,lf,'$' ; ;drive, path, and name of program ;to be loaded and executed. pgm_name db '\CHKDSK.COM',0 ; par_blk dw ENVIR ;segment address of ;environment descriptor ; ;full address of command line ;to be passed at offset 80H dw offset CMD_LINE ;in overlaid dw seg CMD_LINE ;program's PSP ; ;full address of default ;File Control Block to be ;passed at offset 5CH in dw offset FCB1 ;overlaid dw seg FCB1 ;program's PSP ; ;full address of default ;File Control Block to be ;passed at offset 6CH in dw offset FCB2 ;overlaid dw seg FCB2 ;program's PSP ; ;actual command line tail ;to be passed to overlay cmd_line db 4,' *.*',cr,0 ; ;first default FCB to fcb1 db 0 ;be passed to overlay db 11 dup ('?') db 25 dup (0) ;second default FCB to fcb2 db 0 ;be passed to overlay db 11 dup (' ') db 25 dup (0) ; data ends ;declare separate data ;segment to contain ;environment descriptor envir segment para 'ENVIR' ; ;Search path used by PC-DOS ;to look for commands or ;batch files not found in db 'PATH=',0 ;the current directory ; ;Search path used by PC-DOS ;to locate COMMAND.COM db 'COMSPEC=A:\COMMAND.COM',0 db 0 ;extra 0 byte designates ;end of environment envir ends end demo