Hi!

- changed/optimized allocmem().
- config.c: added nice macroses (later should be moved into portab.h).
- code optimized.

TGROUP reduced from 0e1c4h to 0e1a7h;
INIT_TEXT reduced from 3b64h to 3b47h.
--- Begin Message ---
diff -ruNp old/kernel/config.c new/kernel/config.c
--- old/kernel/config.c 2004-05-09 23:29:48.000000000 +0000
+++ new/kernel/config.c 2004-05-10 00:21:22.000000000 +0000
@@ -43,6 +43,18 @@ static BYTE *RcsId =
 #endif
 #define para2far(seg) ((mcb FAR *)MK_FP((seg), 0))
 
+typedef UWORD ofs_t;
+typedef UWORD seg_t;
+
+#if __TURBOC__ > 0x202
+# define FP_PTR(type,seg,ofs) ((type FAR*) MK_FP (seg, ofs))
+# define FP_SEG_PTR(type,seg) ((type _seg*) (seg))
+#else
+# define _seg FAR
+# define FP_PTR(type,seg,ofs) ((type FAR*) MK_FP (seg, ofs))
+# define FP_SEG_PTR(type,seg) ((type FAR*) MK_FP (seg, 0))
+#endif
+
 /**
   Menu selection bar struct:
   x pos, ypos, string
@@ -482,16 +494,17 @@ void PostConfig(void)
 VOID configDone(VOID)
 {
   if (UmbState == 1)
-    para2far(base_seg)->m_type = MCB_LAST;
+    FP_SEG_PTR(mcb, base_seg)->m_type = MCB_LAST;
 
   if (HMAState != HMA_DONE)
   {
-    mcb FAR *p;
-    unsigned short kernel_seg;
-    unsigned short hma_paras = (HMAFree+0xf)/16;
-
-    allocmem(hma_paras, &kernel_seg);
-    p = para2far(kernel_seg - 1);
+#ifdef DEBUG
+    unsigned short hma_paras = (HMAFree + 15) / 16;
+    unsigned short kernel_seg = allocmem(hma_paras);
+#else
+    unsigned short kernel_seg = allocmem((HMAFree + 15) / 16);
+#endif
+    mcb _seg *p = FP_SEG_PTR(mcb, kernel_seg - 1);
 
     p->m_name[0] = 'S';
     p->m_name[1] = 'C';
@@ -500,9 +513,7 @@ VOID configDone(VOID)
     DebugPrintf(("HMA not available, moving text to %x\n", kernel_seg));
     MoveKernel(kernel_seg);
 
-    kernel_seg += hma_paras + 1;
-
-    DebugPrintf(("kernel is low, start alloc at %x", kernel_seg));
+    DebugPrintf(("kernel is low, start alloc at %x", kernel_seg + hma_paras + 1));
   }
 
   /* The standard handles should be reopened here, because
@@ -2588,7 +2599,7 @@ VOID DoInstall(void)
   r.b.b.l = 0x02;                          /*low memory, last fit                     
 */
   init_call_intr(0x21, &r);
 
-  allocmem(((unsigned)_init_end + ebda_size + 15) / 16, &installMemory);
+  installMemory = allocmem(((unsigned)_init_end + ebda_size + 15) / 16);
 
   InstallPrintf(("allocated memory at %x\n",installMemory));
 
diff -ruNp old/kernel/init-mod.h new/kernel/init-mod.h
--- old/kernel/init-mod.h       2004-05-04 02:35:24.000000000 +0000
+++ new/kernel/init-mod.h       2004-05-10 00:16:56.000000000 +0000
@@ -157,10 +157,10 @@ unsigned ASMPASCAL init_call_intr(int nr
 unsigned ASMPASCAL read(int fd, void *buf, unsigned count);
 int ASMPASCAL open(const char *pathname, int flags);
 int ASMPASCAL close(int fd);
-int ASMPASCAL dup2(int oldfdk, int newfd);
-int ASMPASCAL allocmem(UWORD size, seg * segp);
+int ASMPASCAL dup2(int oldfd, int newfd);
+seg ASMPASCAL allocmem(UWORD size);
 void ASMPASCAL init_PSPSet(seg psp_seg);
-int ASMPASCAL init_DosExec(int mode, exec_blk * ep, char * lp);
+int ASMPASCAL init_DosExec(int mode, exec_blk * ep, const char * lp);
 int ASMPASCAL init_setdrive(int drive);
 int ASMPASCAL init_switchar(int chr);
 void ASMPASCAL keycheck(void);
@@ -171,7 +171,7 @@ void ASMPASCAL set_DTA(void far *dta);
 #pragma aux (pascal) init_DosOpen modify exact [ax bx dx]
 #pragma aux (pascal) close modify exact [ax bx]
 #pragma aux (pascal) dup2 modify exact [ax bx cx]
-#pragma aux (pascal) allocmem modify exact [ax bx dx]
+#pragma aux (pascal) allocmem modify exact [ax bx]
 #pragma aux (pascal) init_PSPSet modify exact [ax bx]
 #pragma aux (pascal) init_DosExec modify exact [ax bx dx es]
 #pragma aux (pascal) init_setdrive modify exact [ax bx dx]
@@ -306,4 +306,3 @@ ULONG ASMCFUNC FAR MULULUL(ULONG mul1, U
 ULONG ASMCFUNC FAR DIVULUS(ULONG mul1, UWORD mul2);     /* DIVide ULong by UShort */
 ULONG ASMCFUNC FAR DIVMODULUS(ULONG mul1, UWORD mul2, UWORD * rem);     /* DIVide 
ULong by UShort */
 #endif
-
diff -ruNp old/kernel/intr.asm new/kernel/intr.asm
--- old/kernel/intr.asm 2004-05-10 00:00:46.000000000 +0000
+++ new/kernel/intr.asm 2004-04-24 06:26:38.000000000 +0000
@@ -206,7 +206,6 @@ INIT_DOSOPEN: 
 common_int21:
         int 21h
         jnc common_ret
-common_error:
        sbb     ax,ax
 common_ret:
         ret
@@ -298,19 +297,18 @@ INIT_SWITCHAR:
        mov ax, 0x3701
        jmp short common_dl_int21
 
-;; int allocmem(UWORD size, seg *segp)
+;
+; seg ASMPASCAL allocmem(UWORD size);
+;
     global ALLOCMEM
 ALLOCMEM:
         pop ax           ; ret address
-        pop dx           ; segp
         pop bx           ; size
         push ax          ; ret address
         mov ah, 48h
         int 21h
-        jc short common_error
-        mov bx, dx       ; segp
-        mov [bx], ax
-        xor ax, ax
+       sbb     bx,bx           ; CF=1?
+       or      ax,bx           ;  then ax=-1
         ret
                         
 ;

--- End Message ---

Reply via email to