diff --git a/kernel/inithma.c b/kernel/inithma.c index 0a1019e..71478ab 100644 --- a/kernel/inithma.c +++ b/kernel/inithma.c @@ -330,22 +330,8 @@ void MoveKernel(unsigned NewKernelSegment) if (NewKernelSegment < CurrentKernelSegment || NewKernelSegment == 0xffff) - { - unsigned i; - UBYTE FAR *s, FAR * d; - - for (i = 0, s = HMASource, d = HMADest; i < len; i++) - d[i] = s[i]; - } - else - { - /* might overlap */ - unsigned i; - UBYTE FAR *s, FAR * d; - - for (i = len, s = HMASource, d = HMADest; i != 0; i--) - d[i] = s[i]; - } + fmemcpy(HMADest, HMASource, len); + /* else it's the very first relocation: handled by kernel.asm */ HMAFree = (FP_OFF(HMADest) + len + 0xf) & 0xfff0; /* first free byte after HMA_TEXT on 16 byte boundary */ diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 59de502..8d803d8 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -109,7 +109,6 @@ segment INIT_TEXT ; kernel_start: - push ax push bx pushf mov ax, 0e32h ; '2' Tracecode - kernel entered @@ -117,13 +116,12 @@ kernel_start: int 010h popf pop bx - pop ax mov ax,seg init_tos cli mov ss,ax mov sp,init_tos - int 12h ; move the init code to higher memory + int 12h ; move init text+data to higher memory mov cl,6 shl ax,cl mov dx,15 + init_end wrt INIT_TEXT @@ -137,13 +135,43 @@ kernel_start: mov ss,ax ; set SS to init data segment sti ; now enable them mov ax,cs + mov dx,__InitTextStart wrt HMA_TEXT +%ifdef WATCOM + mov cx,dx + shr cx,4 + add ax,cx +%endif mov ds,ax - xor si,si - xor di,di - mov cx,1 + init_end wrt INIT_TEXT + mov cx,-2 + init_end wrt INIT_TEXT + mov si,cx + mov di,cx shr cx,1 - cld + inc cx + std ; if there's overlap only std is safe rep movsw + + ; move HMA_TEXT to higher memory + mov cx,dx ; cx = __InitTextStart wrt HMA_TEXT + shr dx,4 + + sub ax,dx + mov ds,ax ; ds = HMA_TEXT + mov ax,es + sub ax,dx + mov es,ax ; es = new HMA_TEXT + + mov si,cx + dec si + dec si + mov di,si + shr cx,1 + rep movsw + + cld +%ifndef WATCOM ; for WATCOM: CS equal for HMA and INIT + add ax,dx + mov es,ax ; otherwise CS -> init_text +%endif push es mov ax,cont push ax diff --git a/kernel/main.c b/kernel/main.c index a1cd784..8b3ebd3 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -227,7 +227,11 @@ STATIC void init_kernel(void) ram_top = init_oem(); /* move kernel to high conventional RAM, just below the init code */ +#ifdef __WATCOMC__ + lpTop = MK_FP(_CS, 0); +#else lpTop = MK_FP(_CS - (FP_OFF(_HMATextEnd) + 15) / 16, 0); +#endif MoveKernel(FP_SEG(lpTop)); lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0); diff --git a/kernel/segs.inc b/kernel/segs.inc index 649ea8f..592760f 100644 --- a/kernel/segs.inc +++ b/kernel/segs.inc @@ -30,8 +30,12 @@ group PGROUP PSP group LGROUP _LOWTEXT _IO_TEXT _IO_FIXED_DATA _TEXT group DGROUP _FIXED_DATA _BSS _DATA _DATAEND CONST CONST2 DCONST DYN_DATA +%ifdef WATCOM +group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END INIT_TEXT_START INIT_TEXT INIT_TEXT_END +%else group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END +%endif group I_GROUP ID_B ID ID_E IC IDATA ICONST ICONST2 I_DATA IB_B I_BSS IB IB_E segment PSP class=PSP @@ -54,7 +58,7 @@ segment HMA_TEXT class=CODE segment HMA_TEXT_END class=CODE segment INIT_TEXT_START class=CODE align=16 segment INIT_TEXT class=CODE -segment INIT_TEXT_END class=CODE +segment INIT_TEXT_END class=CODE segment ID_B class=ID align=16 segment ID class=ID align=2 segment ID_E class=ID align=2 diff --git a/mkfiles/watcom.mak b/mkfiles/watcom.mak index 32b3d49..68283e8 100644 --- a/mkfiles/watcom.mak +++ b/mkfiles/watcom.mak @@ -62,7 +62,7 @@ MATH_INSERT=+i4m # ALLCFLAGS=-I..\hdr $(TARGETOPT) $(ALLCFLAGS)-zq-os-s-e5-j-zl-zp1-wx-we-zgf-zff-r -INITCFLAGS=$(ALLCFLAGS)-ntINIT_TEXT-ndI +INITCFLAGS=$(ALLCFLAGS)-ntINIT_TEXT-gTGROUP-ndI CFLAGS=$(ALLCFLAGS)-ntHMA_TEXT INITPATCH=..\utils\patchobj __U4D=_IU4D __U4M=_IU4M