diff --git a/kernel/asmsupt.asm b/kernel/asmsupt.asm index d13aac9..77d304b 100644 --- a/kernel/asmsupt.asm +++ b/kernel/asmsupt.asm @@ -106,6 +106,8 @@ pascal_setup: push bp ; Standard C entry mov bp,sp %ifdef WATCOM + push bx + push cx push es %endif push si @@ -240,19 +242,24 @@ MEMSET: ;***** pascal_return: - pop ds + lds di, [bp] ; return address in es, saved bp in di + mov bh, 0 + add bp, bx ; point bp to "as if there were 0 args" + mov [bp+2], ds ; put return address at first arg + mov [bp], di ; saved bp below that one + + pop ds pop di pop si %ifdef WATCOM pop es + pop cx + pop bx %endif + mov sp,bp pop bp + ret - pop cx - sub bh,bh - add sp,bx - jmp cx - ;***************************************************************** ; fstrcpy (void FAR*dest, void FAR *src); diff --git a/kernel/init-mod.h b/kernel/init-mod.h index c1c1eb3..b9b769d 100644 --- a/kernel/init-mod.h +++ b/kernel/init-mod.h @@ -62,16 +62,16 @@ size_t ASMPASCAL fstrlen(const char FAR *s); #ifdef __WATCOMC__ /* dx and es not used or clobbered for all asmsupt.asm functions except (f)memchr/(f)strchr (which preserve es) */ -#pragma aux (pascal) pascal_abc modify exact [ax bx cx] -#pragma aux (pascal_abc) init_memset -#pragma aux (pascal_abc) init_fmemset -#pragma aux (pascal_abc) init_memcpy -#pragma aux (pascal_abc) init_fmemcpy -#pragma aux (pascal_abc) init_memcmp modify nomemory -#pragma aux (pascal_abc) init_fmemcmp modify nomemory -#pragma aux (pascal_abc) init_strcpy -#pragma aux (pascal_abc) init_strlen modify nomemory -#pragma aux (pascal_abc) init_fstrlen modify nomemory +#pragma aux (pascal) pascal_ax modify exact [ax] +#pragma aux (pascal_ax) init_memset +#pragma aux (pascal_ax) init_fmemset +#pragma aux (pascal_ax) init_memcpy +#pragma aux (pascal_ax) init_fmemcpy +#pragma aux (pascal_ax) init_memcmp modify nomemory +#pragma aux (pascal_ax) init_fmemcmp modify nomemory +#pragma aux (pascal_ax) init_strcpy +#pragma aux (pascal_ax) init_strlen modify nomemory +#pragma aux (pascal_ax) init_fstrlen modify nomemory #endif #undef LINESIZE diff --git a/kernel/proto.h b/kernel/proto.h index a60f737..44472e1 100644 --- a/kernel/proto.h +++ b/kernel/proto.h @@ -314,23 +314,23 @@ int /*ASMCFUNC*/ ASMPASCAL memcmp(const void *m1, const void *m2, size_t n); int /*ASMCFUNC*/ ASMPASCAL fmemcmp(const void FAR *m1, const void FAR *m2, size_t n); #ifdef __WATCOMC__ -/* dx and es not used or clobbered for all asmsupt.asm functions except - (f)memchr/(f)strchr (which preserve es) */ -#pragma aux (pascal) pascal_abc modify exact [ax bx cx] -#pragma aux (pascal_abc) fmemcpy -#pragma aux (pascal_abc) memcpy -#pragma aux (pascal_abc) fmemset -#pragma aux (pascal_abc) memset -#pragma aux (pascal_abc) fmemcmp modify nomemory -#pragma aux (pascal_abc) memcmp modify nomemory -#pragma aux (pascal_abc) fstrcpy -#pragma aux (pascal_abc) strcpy -#pragma aux (pascal_abc) fstrlen modify nomemory -#pragma aux (pascal_abc) strlen modify nomemory -#pragma aux (pascal) memchr modify exact [ax bx cx dx] -#pragma aux (pascal) fmemchr modify exact [ax bx cx dx] -#pragma aux (pascal) strchr modify exact [ax bx cx dx] -#pragma aux (pascal) fstrchr modify exact [ax bx cx dx] +/* bx, cx, dx and es not used or clobbered for all asmsupt.asm functions except + (f)memchr/(f)strchr (which clobber dx) */ +#pragma aux (pascal) pascal_ax modify exact [ax] +#pragma aux (pascal_ax) fmemcpy +#pragma aux (pascal_ax) memcpy +#pragma aux (pascal_ax) fmemset +#pragma aux (pascal_ax) memset +#pragma aux (pascal_ax) fmemcmp modify nomemory +#pragma aux (pascal_ax) memcmp modify nomemory +#pragma aux (pascal_ax) fstrcpy +#pragma aux (pascal_ax) strcpy +#pragma aux (pascal_ax) fstrlen modify nomemory +#pragma aux (pascal_ax) strlen modify nomemory +#pragma aux (pascal) memchr modify exact [ax dx] nomemory +#pragma aux (pascal) fmemchr modify exact [ax dx] nomemory +#pragma aux (pascal) strchr modify exact [ax dx] nomemory +#pragma aux (pascal) fstrchr modify exact [ax dx] nomemory #endif /* sysclk.c */