275 lines
4.9 KiB
NASM
275 lines
4.9 KiB
NASM
|
TITLE LDFASTB - FastBoot procedure
|
||
|
|
||
|
.xlist
|
||
|
include kernel.inc
|
||
|
include newexe.inc
|
||
|
include pdb.inc
|
||
|
include tdb.inc
|
||
|
include eems.inc
|
||
|
.list
|
||
|
|
||
|
if PMODE32
|
||
|
.386
|
||
|
endif
|
||
|
|
||
|
externA __ahincr
|
||
|
|
||
|
externFP GlobalReAlloc
|
||
|
|
||
|
sBegin NRESCODE
|
||
|
assumes CS,NRESCODE
|
||
|
assumes DS,NOTHING
|
||
|
assumes ES,NOTHING
|
||
|
|
||
|
sEnd NRESCODE
|
||
|
|
||
|
DataBegin
|
||
|
|
||
|
externB Kernel_flags
|
||
|
externW pGlobalHeap
|
||
|
externW win_show
|
||
|
externW hLoadBlock
|
||
|
externW segLoadBlock
|
||
|
externD lpBootApp
|
||
|
|
||
|
ife ROM
|
||
|
externW cpShrink
|
||
|
externW cpShrunk
|
||
|
endif
|
||
|
|
||
|
DataEnd
|
||
|
|
||
|
sBegin INITCODE
|
||
|
assumes CS,CODE
|
||
|
assumes DS,NOTHING
|
||
|
assumes ES,NOTHING
|
||
|
|
||
|
externNP MyLock
|
||
|
|
||
|
if PMODE32
|
||
|
externNP get_arena_pointer32
|
||
|
else
|
||
|
externNP get_arena_pointer
|
||
|
endif
|
||
|
externNP get_physical_address
|
||
|
externNP set_physical_address
|
||
|
externNP get_rover_2
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; Shrink ;
|
||
|
; ;
|
||
|
; This shrinks what's left of win.bin. The part at the front of win.bin;
|
||
|
; that has been loaded already is expendable. The part of win.bin ;
|
||
|
; that has not been loaded yet is moved down over the expended part. ;
|
||
|
; This does not change the segment that win.bin starts at. The ;
|
||
|
; partition is then realloced down in size. ;
|
||
|
; ;
|
||
|
; Arguments: ;
|
||
|
; none ;
|
||
|
; ;
|
||
|
; Returns: ;
|
||
|
; ;
|
||
|
; Error Returns: ;
|
||
|
; ;
|
||
|
; Registers Preserved: ;
|
||
|
; DI,SI,DS,ES ;
|
||
|
; ;
|
||
|
; Registers Destroyed: ;
|
||
|
; AX,BX,CX,DX ;
|
||
|
; ;
|
||
|
; Calls: ;
|
||
|
; BigMove ;
|
||
|
; GlobalReAlloc ;
|
||
|
; MyLock ;
|
||
|
; ;
|
||
|
; History: ;
|
||
|
; ;
|
||
|
; Fri Feb 27, 1987 01:20:57p -by- David N. Weise [davidw] ;
|
||
|
; Documented it and added this nifty comment block. ;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
|
||
|
assumes ds, nothing
|
||
|
assumes es, nothing
|
||
|
|
||
|
cProc Shrink,<PUBLIC,NEAR>
|
||
|
cBegin nogen
|
||
|
|
||
|
ife ROM
|
||
|
CheckKernelDS
|
||
|
ReSetKernelDS
|
||
|
push es
|
||
|
push si
|
||
|
push di
|
||
|
mov ax,[segLoadBlock] ; Get current address
|
||
|
mov bx, ax
|
||
|
if PMODE32
|
||
|
mov ds, pGlobalHeap
|
||
|
UnSetKernelDS
|
||
|
cCall get_arena_pointer32,<ax>
|
||
|
mov edx, ds:[eax].pga_size
|
||
|
shr edx, 4
|
||
|
SetKernelDS
|
||
|
else
|
||
|
cCall get_arena_pointer,<ax>
|
||
|
mov es,ax
|
||
|
mov dx,es:[ga_size] ; get size of whole block
|
||
|
endif
|
||
|
mov ax,bx
|
||
|
mov es,ax ; es is destination
|
||
|
xor bx,bx
|
||
|
xchg [cpShrink],bx ; Get amount to shrink by
|
||
|
add [cpShrunk],bx ; Keep track of how much we have shrunk
|
||
|
|
||
|
sub dx,bx ; get new size
|
||
|
push dx ; save new size
|
||
|
push ds ; save kernel ds
|
||
|
|
||
|
if PMODE32
|
||
|
mov ds, ax
|
||
|
movzx esi, bx
|
||
|
shl esi, 4 ; Start of new block
|
||
|
xor edi, edi ; Where it will go
|
||
|
movzx ecx, dx
|
||
|
shl ecx, 2 ; Dwords
|
||
|
cld ; Move it down.
|
||
|
rep movs dword ptr es:[edi], dword ptr ds:[esi]
|
||
|
db 67h ; 386 BUG, DO NOT REMOVE
|
||
|
nop ; 386 BUG, DO NOT REMOVE
|
||
|
else
|
||
|
|
||
|
push dx
|
||
|
xor cx,cx
|
||
|
REPT 4
|
||
|
shl bx,1
|
||
|
rcl cx,1
|
||
|
ENDM
|
||
|
cCall get_physical_address,<es>
|
||
|
add ax,bx
|
||
|
adc dx,cx
|
||
|
push es
|
||
|
call get_rover_2
|
||
|
smov ds,es
|
||
|
assumes ds, nothing
|
||
|
pop es
|
||
|
cCall set_physical_address,<ds>
|
||
|
pop dx
|
||
|
call BigMove ; move it on down
|
||
|
|
||
|
endif ; PMODE32
|
||
|
|
||
|
pop ds
|
||
|
CheckKernelDS
|
||
|
ReSetKernelDS
|
||
|
pop ax ; get back size in paragraphs
|
||
|
mov cx,4
|
||
|
xor dx,dx ; convert to bytes
|
||
|
il3e:
|
||
|
shl ax,1
|
||
|
rcl dx,1
|
||
|
loop il3e
|
||
|
cCall GlobalReAlloc,<hLoadBlock,dxax,cx>
|
||
|
cCall MyLock,<hLoadBlock>
|
||
|
mov [segLoadBlock],ax
|
||
|
pop di
|
||
|
pop si
|
||
|
pop es
|
||
|
|
||
|
endif ;ROM
|
||
|
|
||
|
ret
|
||
|
cEnd nogen
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; BigMove ;
|
||
|
; ;
|
||
|
; Moves a large partition down in memory. ;
|
||
|
; ;
|
||
|
; Arguments: ;
|
||
|
; DX = paragraph count to move ;
|
||
|
; ES = destination segment ;
|
||
|
; DS = source segment ;
|
||
|
; ;
|
||
|
; Returns: ;
|
||
|
; ;
|
||
|
; Error Returns: ;
|
||
|
; ;
|
||
|
; Registers Preserved: ;
|
||
|
; None ;
|
||
|
; ;
|
||
|
; Registers Destroyed: ;
|
||
|
; AX,BX,CX,DX,DI,SI,DS,ES ;
|
||
|
; ;
|
||
|
; Calls: ;
|
||
|
; nothing ;
|
||
|
; ;
|
||
|
; History: ;
|
||
|
; ;
|
||
|
; Fri Feb 27, 1987 01:08:43p -by- David N. Weise [davidw] ;
|
||
|
; Documented it and added this nifty comment block. ;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
|
||
|
assumes ds, nothing
|
||
|
assumes es, nothing
|
||
|
ife ROM
|
||
|
ife PMODE32
|
||
|
|
||
|
cProc BigMove,<PUBLIC,NEAR>
|
||
|
cBegin nogen
|
||
|
if PMODE32
|
||
|
movzx ecx, dx
|
||
|
shl ecx, 2
|
||
|
xor esi, esi
|
||
|
xor edi, edi
|
||
|
cld
|
||
|
rep movsd
|
||
|
ret
|
||
|
else
|
||
|
mov bx,dx
|
||
|
mov cl,12
|
||
|
add bx,0FFFh
|
||
|
shr bx,cl ; count +1 of 10000h byte moves
|
||
|
xor si,si ; ds:0 is source
|
||
|
xor di,di ; es:0 is dest
|
||
|
cld
|
||
|
jmps BM2
|
||
|
BM1:
|
||
|
int 3 ; IF WE HIT THIS, KRNL286.EXE IS
|
||
|
int 3 ; TOO BIG, FIX THE FOLLOWING!!!
|
||
|
sub dx,1000h
|
||
|
;;;ife PMODE32
|
||
|
mov cx,8000h
|
||
|
rep movsw ; si,di are 0
|
||
|
;;;else
|
||
|
;;; mov cx, 4000h
|
||
|
;;; rep movsd
|
||
|
;;;endif
|
||
|
mov ax,ds
|
||
|
add ax,__ahincr
|
||
|
mov ds,ax
|
||
|
mov ax,es
|
||
|
add ax,__ahincr
|
||
|
mov es,ax
|
||
|
BM2: dec bx
|
||
|
jnz BM1
|
||
|
;;;ife PMODE32
|
||
|
mov cl,3 ; convert to words
|
||
|
shl dx,cl
|
||
|
mov cx,dx
|
||
|
rep movsw ; si,di are 0
|
||
|
;;;else
|
||
|
;;; shl dx, 2 ; dwords
|
||
|
;;; mov cx, dx
|
||
|
;;; rep movsd
|
||
|
;;;endif
|
||
|
endif
|
||
|
ret
|
||
|
cEnd nogen
|
||
|
|
||
|
endif ; PMODE32
|
||
|
endif ; ROM
|
||
|
|
||
|
sEnd INITCODE
|
||
|
|
||
|
end
|