home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Between Heaven & Hell 2
/
BetweenHeavenHell.cdr
/
300
/
295
/
load.asm
< prev
next >
Wrap
Assembly Source File
|
1984-02-20
|
5KB
|
121 lines
name load
page 55,128
title 'LOAD -- load .COM file for MS-DOS 2.0'
;
;
; LOAD -- load .COM file bigger than 64K
; Requires MS-DOS 2.0
; Version 1.1 Dec 83 RGD
; Version 1 March 1983 RJW
; copyright (c) 1983
; Laboratory Microsystems
; 4147 Beethoven Street
; Los Angeles, CA 90066
;
cr equ 0dh ;ASCII carriage return
lf equ 0ah ;ASCII line feed
cseg segment byte
org 100h
assume cs:cseg,ds:cseg
load proc far ; sets up far return ...
push es ; save segment of PSP
mov dx,offset mes2 ; startup message
mov ah,9
int 21h
xor dx,dx ; zero DX
mov ah,25h ; set terminate address ...
mov al,22h ; ... for new program segment
int 21h
mov dx,offset endofs ; offset to end of this loader
mov cl,4 ; no of bits to shift
shr dx,cl ; convert byte addr to paragraph
inc dx ; offset of 1st available segment
mov ax,cs ; current segment to AX
add dx,ax ; actual value of 1st available segment
mov useg,dx ; save it for later ...
mov es,dx ; ... and for subsequent move
mov ah,26h ; call to DOS
int 21h ; create new program segment
mov si,6ch ; 2nd param FCB in current segment
mov di,5ch ; 1st param FCB in new segment
mov cx,0ch ; byte count for move
repz movsb ; copy the filename
mov ax,cs ; copy current code seg ...
mov ds,ax ; ... to DS
mov dx,5ch ; DS:DX points to FCB of .COM file
mov bx,dx ; make FCB addressible
mov byte ptr 9 [bx],'C' ; force COM extension
mov byte ptr 10 [bx],'O'
mov byte ptr 11 [bx],'M'
mov ah,0fh ; open the .COM file
int 21h
or al,al ; test return code
jnz load8 ; exit if non-zero
mov word ptr 33 [bx],0000 ; zero the random
mov word ptr 35 [bx],0000 ; record field in the FCB
pop es ; get loader's PSP segment
mov bx,useg ; let SS:SP = default buffer of
mov ss,bx ; new PSP
mov sp,100h
push es ; save loader's PSP again
add bx,10h ; BX = segment of current DTA
mov ds,bx ; set up DS:DX to point to the DTA
xor dx,dx
mov ah,1ah ; set up DOS call and do it
int 21h
load5: mov cx,100h ; number of records of length 80h
mov ax,cs ; copy current CS to DS
mov ds,ax
mov dx,5ch ; DS:DH points to FCB of .COM file
mov ah,27h ; do random block read
int 21h
test al,1 ; end of file?
jnz load9 ; yes, so exit
add bx,800h ; increment location of DTA
mov ds,bx ; copy to DS
xor dx,dx ; DS:DX now points to next DTA
mov ah,1ah ; set up DOS call to set DTA
int 21h
jmp load5 ; do it again
load8: mov dx,offset mes1 ; "file not found"
mov ah,9 ; write to terminal
int 21h
int 20h ; exit to DOS
load9: mov ax,useg ; set up registers for new segment
mov ds,ax
pop es ; pass loader's PSP segment to overlay
push ax ; push new CS onto stack
mov ax,100h
push ax ; push offset onto stack
ret ; FAR return causes CS:IP to be set
load endp
mes1 db cr,lf,
db '.COM file not found'
db cr,lf,'$'
mes2 db cr,lf
db 'Multi-Segment Loader version 1.1 for MS-DOS 2.0'
db cr,lf
db 'Copyright (c) 1983 Laboratory Microsystems Inc.'
db cr,lf,'$'
useg dw 0
endofs equ $
cseg ends ; end of code segment
end load