home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
sampler0
/
run.asm
< prev
next >
Wrap
Assembly Source File
|
1986-03-01
|
7KB
|
313 lines
cseg segment para public 'code'
org 100h
; This program is used to load an EXE file faster than DOS.
; To use it, enter 'RUN prog', where prog is a valid EXE program.
; The file may be any size, but for programs less than 64K,
; making a COM file using EXETOCOM.BIN as a header works faster.
recct equ 504 ; max recs per read
run proc far
assume cs:cseg,ds:cseg,ss:nothing,es:nothing
mov sp,offset estak ; point to internal stack
call p100 ; initialize
call p200 ; open file
jmp p300 ; copy this prog to hi memory
p010: call p400 ; read exe file to lo memory
jmp p600 ; relocate and execute prog
p050: mov ah,9 ; print error message
int 21h
mov ax,oseg
push ax
xor ax,ax
push ax
ret 0 ; terminate
p100 proc near ; initialize
mov dx,offset copyr
mov ah,9 ; print copyright message
int 21h
mov ax,ds
mov oseg,ax ; save original seg
add ax,10h
mov nseg,ax ; save new prog seg
mov si,2
mov bx,[si] ; get top of memory from psp
mov topmem,bx
mov ax,offset endprog
add ax,15
and ax,0fff0h
mov eprog,ax ; point to end of prog
mov cl,4
shr ax,cl
mov bx,ds
add ax,bx
mov dtads,ax ; point to start dta
mov si,5ch ; point to 1st fcb
mov di,offset fcb ; & work fcb
mov cx,37
rep movsb ; copy it
mov di,offset fcb+9 ; make sure extension is 'EXE'
mov si,offset exe
mov cx,3
repnz movsb ; copy 'EXE' to extension
; juggle fcbs in psp
mov si,81h ; point to command line in psp
mov di,5ch ; point to first fcb in psp
mov ax,2901h
int 21h ; parse first file name (prog to execute)
; rearrange command line
mov di,81h ; point to start of command line
mov bx,80h
mov ch,0
mov cl,[bx] ; get length of command line
add cx,di
sub cx,si ; new command line length
mov [bx],cl ; save it
inc cl ; copy carriage return too!
repnz movsb ; move command line down
mov si,offset fcbfill ; fill fcbs with blanks
mov di,offset 5ch
mov cx,16
rep movsb ; clear first fcb
mov si,offset fcbfill
mov di,offset 6ch
mov cx,16
rep movsb ; clear second fcb
mov si,81h ; get command line back
mov di,5ch ; point to first fcb
mov ax,2901h
mov bx,offset drives
int 21h ; parse first parm
cmp al,1 ; error?
jbe p110 ; no
mov [bx],al ; set error in lo byte
p110: mov di,6ch
mov ax,2901h
int 21h ; parse second parm
cmp al,1 ; error?
jbe p120 ; no
mov [bx+1],al ; set error in hi byte
p120: ret
p100 endp
p200 proc near ; open file
mov dx,offset fcb
mov ah,0fh
int 21h
and al,0ffh ; error?
jz p210 ; no
mov dx,offset errmsg1
jmp p050
p210: mov si,offset fcb+16 ; get file size
mov ax,[si] ; lower part
mov cl,7
shr ax,cl ; divide by 128
mov bx,ax ; hold in bx
mov ax,[si+2] ; upper part of file size
mov cl,9
sal ax,cl ; divide by 128
add ax,bx ; total file size divided by 128
mov norecs,ax ; save as norecs
mov ax,128
mov si,offset fcb+14 ; set recsize = 128
mov [si],ax
mov al,0 ; zero 5 bytes in fcb
mov di,offset fcb+32
mov cx,5
repnz stosb ; clear fcb bytes 32 - 36
mov ax,norecs
mov cl,3
sal ax,cl ; # of pghs for prog
add ax,dtads ; top of prog (pghs)
mov bx,topmem ; top of memory
cmp bx,ax ; is there room?
jae p220 ; yes
mov dx,offset errmsg4
jmp p050
p220: ret
p200 endp
p300: ; read exe header
mov cx,4
call p500 ; read 4 recs
mov si,eprog
mov ax,[si] ; get EXE signature
cmp ax,5a4dh ; valid exe file?
jz p310 ; yes
mov dx,offset errmsg2
jmp p050
p310: ; check stack placement
mov ax,[si+10h] ; get value for sp
mov cl,4
shr ax,cl ; convert to pghs
add ax,nseg ; add base seg
add ax,[si+0eh] ; and sp offset
mov bx,topmem ; get top of memory
cmp bx,ax ; is there room for the stack?
jae p315 ; yes
mov dx,offset errmsg4
jmp p050
p315: mov ax,[si+8] ; get header size (pghs)
mov cl,3
shr ax,cl ; divide by 8 to get 128-byte recs
sub ax,4 ; already read
mov cx,ax
jcxz p320 ; no more header
call p500 ; read rest of header
p320: mov ax,norecs ; recs left
mov cl,3
sal ax,cl ; convert to pghs
add ax,nseg ; plus start point gives copy destination
mov bx,dtads ; end of header
cmp ax,bx ; is start point above header?
jae p325 ; yes
mov ax,bx ; no - change copy destination
p325: mov es,ax ; copy prog here
sub bx,oseg ; minus psp gives pghs to copy
mov cl,3
sal bx,cl ; words to copy
mov cx,bx
xor di,di
xor si,si
rep movsw ; copy it
mov di,offset p330
push es
push di
ret 0 ; jump to new copy
p330: push es
pop ds ; set ds=es=new cs
mov ax,es
mov ss,ax ; set ss=es
jmp p010
p400 proc near ; read file
mov ax,nseg
mov dtads,ax
p410: mov cx,norecs ; # of recs left
sub cx,recct ; 63K worth?
ja p420 ; yes
add cx,recct ; no - read remainder
jmp p430
p420: mov cx,recct ; read 63K
p430: call p500 ; read file
p440: mov cx,norecs ; any more to read?
jcxz p450 ; no
jmp p410 ; read next block
p450: ret
p400 endp
p500 proc near ; read file - cx contains recs to read
push ds
mov bx,dtads
mov ds,bx ; new ds
mov dx,0
mov ah,1ah
int 21h ; set dta
pop ds
mov dx,offset fcb
mov ah,27h
int 21h ; random block read
and al,0ffh ; error?
jz p510 ; no
mov dx,offset errmsg3
jmp p050
p510: mov ax,cx ; adjust dta for next read
sub norecs,ax
mov cl,3
sal ax,cl ; 8 pghs/rec
add dtads,ax
ret
p500 endp
p600: mov ax,nseg ; relocate and execute it
mov si,eprog
mov bx,si
add bx,[si+18h] ; first relocation item
mov cx,[si+6] ; # of items
jcxz p620 ; none
p610: mov dx,[bx+2] ; get code seg
add dx,ax ; add start seg
mov es,dx ; in es
mov di,[bx] ; set instruction in es
add es:[di],ax ; add start seg
add bx,4 ; do another
loop p610 ; done?
p620: ; pass control to exe prog
mov ax,nseg ; new prog seg
add ax,[si+0eh] ; plus ss offset gives new ss
cli
mov ss,ax
mov sp,[si+10h]
sti
mov ax,nseg ; new prog seg
add ax,[si+16h] ; plus cs offset gives new cs
mov bx,[si+14h] ; new ip
push ax
push bx
mov bx,drives ; get drive status
mov ax,oseg ; set up ds & es
mov ds,ax
mov es,ax
mov ah,1ah ; reset dta
mov dx,80h
int 21h
mov ax,bx ; drive status in ax
ret 0 ; far return to exe prog
copyr db 'RUN - Copyright 1983 Data Base Decisions',10,13,'$'
errmsg1 db 'Program not found',7,10,13,'$'
errmsg2 db 'Header not found ',7,10,13,'$'
errmsg3 db 'Unable to load program',7,10,13,'$'
errmsg4 db 'Not enough memory',7,10,13,'$'
oseg dw 0 ; original data seg
nseg dw 0 ; start of new prog
topmem dw 0 ; top of memory
norecs dw 0 ; # of 128 byte recs in file
dtads dw 0 ; dta data seg
drives dw 0 ; drive status for fcbs
exe db 'EXE' ; file extension
fcb db 37 dup(0) ; work fcb
eprog dw 0 ; end of this prog
stak db 16 dup('stack ') ; temp stack
estak db 0
fcbfill db 0,11 dup(' '),4 dup(0) ; fcb filler
endprog equ this word
run endp
cseg ends
end run