119 lines
3 KiB
NASM
119 lines
3 KiB
NASM
TITLE KERNSTUB - Assembly stub program for KERNEL.EXE
|
|
|
|
.xlist
|
|
?DF = 1
|
|
SWAPPRO = 0
|
|
|
|
include cmacros.inc
|
|
|
|
; NOTE: This code is always assembled in real mode, so it'll run on any machine.
|
|
;
|
|
PMODE32=0
|
|
|
|
include newexe.inc
|
|
include protect.inc
|
|
ifdef WOW
|
|
include vint.inc
|
|
endif
|
|
.list
|
|
|
|
createSeg _TEXT,CODE,PARA,PUBLIC,CODE
|
|
createSeg STACK,STACK,PARA,STACK,STACK
|
|
|
|
sBegin STACK
|
|
DB 128 DUP (?)
|
|
stacktop LABEL BYTE
|
|
sEnd STACK
|
|
|
|
sBegin CODE
|
|
assumes CS,CODE
|
|
assumes DS,CODE
|
|
|
|
|
|
KERNSTUB PROC FAR
|
|
push cs
|
|
pop ds
|
|
mov si,codeOFFSET stacktop
|
|
add si,1FFh
|
|
and si,not 1FFh
|
|
cmp cs:[si].ne_magic,NEMAGIC
|
|
je @F
|
|
jmp ksfail
|
|
@@:
|
|
|
|
mov ax,ds
|
|
|
|
cli
|
|
mov ss,ax
|
|
mov sp,si
|
|
sti
|
|
|
|
mov bx,ds:[si].ne_autodata ; Get number of automatic DS
|
|
dec bx
|
|
jl ksg11 ; Continue if no DS
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
.errnz 8 - SIZE new_seg
|
|
add bx,ds:[si].ne_segtab ; DS:BX -> seg. tab. entry for DS
|
|
mov ax,ds:[si+bx].ns_sector ; Compute paragraph address of DS
|
|
cmp ds:[si].ne_align,0
|
|
jne ksg10
|
|
mov ds:[si].ne_align,NSALIGN ; in DI
|
|
ksg10:
|
|
mov cx,ds:[si].ne_align ; Convert sectors to paragraphs
|
|
sub cx,4
|
|
shl ax,cl
|
|
mov di,cs ; Add to paragraph address of old
|
|
sub di,20h ; exe header
|
|
add di,ax
|
|
ksg11:
|
|
push cx
|
|
mov bx,word ptr cs:[si].ne_csip+2 ; Get number of CS
|
|
dec bx
|
|
jl ksfail ; Error if no CS
|
|
shl bx,1
|
|
shl bx,1
|
|
shl bx,1
|
|
.errnz 8 - SIZE new_seg
|
|
add bx,cs:[si].ne_segtab ; DS:BX -> seg. tab. entry for CS
|
|
mov ax,cs:[si+bx].ns_sector ; Compute paragraph address of CS
|
|
mov cx,cs:[si].ne_align ; Convert sectors to paragraphs
|
|
sub cx,4
|
|
shl ax,cl
|
|
pop bx
|
|
|
|
mov dx,cs ; Add to paragraph address of old
|
|
sub dx,20h ; exe header
|
|
add dx,ax
|
|
push dx ; Push far address of start proc
|
|
push word ptr cs:[si].ne_csip
|
|
mov ds,di ; DS:0 points to automatic DS
|
|
mov cx,si ; CX = file offset of new header
|
|
add cx,200h
|
|
jmp short ksgo
|
|
org 0A0h
|
|
ksgo:
|
|
|
|
;!!! The old CS selector should be freed up at some point!
|
|
|
|
mov ax, "KO"
|
|
ret ; FAR return to start proc
|
|
|
|
ksfail:
|
|
call ks1
|
|
DB 'KERNSTUB: Error during boot',13,10,'$'
|
|
ks1: pop dx
|
|
push cs
|
|
pop ds ; DS:DX -> error message
|
|
mov ah,9 ; Print error message
|
|
int 21h
|
|
mov ax,4C01h ; Terminate program, exit code = 1
|
|
int 21h
|
|
|
|
KERNSTUB ENDP
|
|
|
|
sEnd CODE
|
|
|
|
END KERNSTUB
|