diff --git a/hdr/pcb.h b/hdr/pcb.h index 6ac29f8..2b8394b 100644 --- a/hdr/pcb.h +++ b/hdr/pcb.h @@ -87,14 +87,6 @@ typedef struct { UWORD si, di, ds, es; } lregs; - /* Registers directly passed to syscall; - must be the same order as iregs! - Is used to define parameters. */ -#define DIRECT_IREGS \ - xreg a, xreg b, xreg c, xreg d, \ - UWORD si, UWORD di, UWORD bp, UWORD ds, UWORD es, \ - UWORD ip, UWORD cs, UWORD flags - /* Process control block for task switching */ typedef struct { UWORD pc_ss; diff --git a/kernel/int2f.asm b/kernel/int2f.asm index f6ab764..be61ccd 100644 --- a/kernel/int2f.asm +++ b/kernel/int2f.asm @@ -149,8 +149,9 @@ Int2f?14: ;; MUX-14 -- NLSFUNC API push bp ; Preserve BP later on Protect386Registers PUSH$ALL - mov ds, [cs:_DGROUP_] + SwitchToInt2fStack call _syscall_MUX14 + DoneInt2fStack pop bp ; Discard incoming AX push ax ; Correct stack for POP$ALL POP$ALL diff --git a/kernel/nls.c b/kernel/nls.c index d236402..7d6d164 100644 --- a/kernel/nls.c +++ b/kernel/nls.c @@ -667,60 +667,54 @@ VOID FAR *DosGetDBCS(void) Return value: AL register to be returned if AL == 0, Carry must be cleared, otherwise set */ -UWORD ASMCFUNC syscall_MUX14(DIRECT_IREGS) +UWORD ASMCFUNC syscall_MUX14(iregs FAR *pr) { struct nlsPackage FAR *nls; /* addressed NLS package */ - UNREFERENCED_PARAMETER(flags); - UNREFERENCED_PARAMETER(cs); - UNREFERENCED_PARAMETER(ip); - UNREFERENCED_PARAMETER(ds); - UNREFERENCED_PARAMETER(es); - UNREFERENCED_PARAMETER(si); + log(("NLS: MUX14(): subfct=%x, cp=%u, cntry=%u\n", pr->AL, pr->BX, pr->DX)); - log(("NLS: MUX14(): subfct=%x, cp=%u, cntry=%u\n", AL, BX, DX)); - - if ((nls = searchPackage(BX, DX)) == NULL) + if ((nls = searchPackage(pr->BX, pr->DX)) == NULL) return DE_INVLDFUNC; /* no such package */ log(("NLS: MUX14(): NLS pkg found\n")); - switch (AL) + switch (pr->AL) { case NLSFUNC_INSTALL_CHECK: - BX = NLS_FREEDOS_NLSFUNC_ID; + pr->BX = NLS_FREEDOS_NLSFUNC_ID; return SUCCESS; /* kernel just simulates default functions */ case NLSFUNC_DOS38: - return nlsGetData(nls, NLS_DOS_38, MK_FP(ES, DI), 34); + return nlsGetData(nls, NLS_DOS_38, MK_FP(pr->ES, pr->DI), 34); case NLSFUNC_GETDATA: - return nlsGetData(nls, BP, MK_FP(ES, DI), CX); + return nlsGetData(nls, pr->BP, MK_FP(pr->ES, pr->DI), pr->CX); case NLSFUNC_DRDOS_GETDATA: /* Does not pass buffer length */ - return nlsGetData(nls, CL, MK_FP(ES, DI), 512); + return nlsGetData(nls, pr->CL, MK_FP(pr->ES, pr->DI), 512); case NLSFUNC_LOAD_PKG: return nlsLoadPackage(nls); case NLSFUNC_LOAD_PKG2: return nlsSetPackage(nls); case NLSFUNC_YESNO: - return nlsYesNo(nls, CX); + return nlsYesNo(nls, pr->CX); case NLSFUNC_UPMEM: - nlsUpMem(nls, MK_FP(ES, DI), CX); + nlsUpMem(nls, MK_FP(pr->ES, pr->DI), pr->CX); return SUCCESS; case NLSFUNC_FILE_UPMEM: #ifdef NLS_DEBUG { unsigned j; BYTE FAR *p; - log(("NLS: MUX14(FILE_UPMEM): len=%u, %04x:%04x=\"", CX, ES, DI)); - for (j = 0, p = MK_FP(ES, DI); j < CX; ++j) + log(("NLS: MUX14(FILE_UPMEM): len=%u, %04x:%04x=\"", pr->CX, + pr->ES, pr->DI)); + for (j = 0, p = MK_FP(pr->ES, pr->DI); j < pr->CX; ++j) printf("%c", p[j] > 32 ? p[j] : '.'); printf("\"\n"); } #endif - nlsFUpMem(nls, MK_FP(ES, DI), CX); + nlsFUpMem(nls, MK_FP(pr->ES, pr->DI), pr->CX); return SUCCESS; } - log(("NLS: MUX14(): Invalid function %x\n", AL)); + log(("NLS: MUX14(): Invalid function %x\n", pr->AL)); return DE_INVLDFUNC; /* no such function */ } diff --git a/kernel/proto.h b/kernel/proto.h index 301d0ff..1646e9b 100644 --- a/kernel/proto.h +++ b/kernel/proto.h @@ -277,7 +277,7 @@ COUNT DosSetCountry(UWORD cntry); COUNT DosGetCodepage(UWORD * actCP, UWORD * sysCP); COUNT DosSetCodepage(UWORD actCP, UWORD sysCP); VOID FAR *DosGetDBCS(void); -UWORD ASMCFUNC syscall_MUX14(DIRECT_IREGS); +UWORD ASMCFUNC syscall_MUX14(iregs FAR *); /* prf.c */ #ifdef DEBUG