cseg segment para public 'code' org 100h ; Copyright 1983 Data Base Decisions ; This program is used as a header for an EXE file to load it ; faster. It is copied onto the front of an EXE file as follows: ; copy exetocom.bin/b+prog.exe/b newprog.com, where prog.exe is your ; program. The resulting COM file must be less than 64K. jumploc equ 0efh ; jump to psp for copy exetocom proc far assume cs:cseg,ds:cseg,ss:nothing,es:nothing mov si,offset endprog ; end of this prog mov ax,[si] ; get EXE signature cmp ax,5a4dh ; exe file? jz p010 ; yes mov dx,offset errmsg1 p005: mov ah,9 int 21h int 20h ; terminate p010: mov ax,si mov cl,4 shr ax,cl ; # of pghs in this prog mov bx,ds add ax,bx ; seg of exe header add ax,[si+8] ; plus header size (pghs) mov oseg,ax ; gives orig exe start seg mov ax,cs ; get new exe start seg add ax,10h mov nseg,ax mov ax,[si+10h] ; check stack placement mov cl,4 ; get stack size shr ax,cl ; convert to pghs add ax,nseg ; add base seg add ax,[si+0eh] ; and sp offset mov bx,2 mov bx,[bx] ; get top of memory cmp bx,ax ; room for the stack? jae p015 ; yes mov dx,offset errmsg2 jmp p005 p015: mov ax,nseg mov bx,si add bx,[si+18h] ; first relocation item mov cx,[si+6] ; # of items jcxz p030 ; none p020: mov dx,[bx+2] ; get code seg add dx,oseg ; add old start seg mov es,dx ; in es mov di,[bx] ; set instruction in es add es:[di],ax ; add new start seg add bx,4 ; do another loop p020 ; done? p030: push si ; pass control push cs pop es ; set es = cs mov di,jumploc ; copy copycode to psp mov si,offset copycode mov cx,17 rep movsb pop si mov ax,nseg ; new prog seg add ax,[si+16h] ; plus cs offset gives new cs push ax ; save it mov ax,[si+14h] ; new ip push ax ; save it push ds ; save ds & es push ds mov ax,nseg ; new prog seg mov es,ax ; point to new seg xor di,di ; offset 0 add ax,[si+0eh] ; plus stack seg offset push ax ; save new ss mov ax,[si+10h] ; set sp push ax ; save it mov bx,[si+4] ; get exe size (pages) mov ax,[si+8] ; get header size (pghs) mov cl,5 shr ax,cl ; convert pghs to pages sub bx,ax ; prog size (pages) mov cl,8 shl bx,cl ; convert pages to words mov cx,bx ; repeat count for copy mov ax,oseg mov ds,ax ; point to old seg xor si,si ; offset 0 mov bx,jumploc jmp bx ; jump to copycode copycode equ this byte rep movsw ; copied code pop ax ; for sp pop bx ; for ss pop es ; restore es pop ds ; restore ds pop cx ; for ip pop dx ; for cs cli mov ss,bx ; set new stack mov sp,ax sti push dx ; push cs & ip push cx ret 0 ; go to the exe prog errmsg1 db 'EXE header not found',10,13,'$' errmsg2 db 'Program too large',10,13,'$' oseg dw 0 ; original exe prog seg nseg dw 0 ; new prog seg endprog equ this word ; must be on a paragraph boundary! exetocom endp cseg ends end exetocom