Implement some 16-bit APIs that our hello16.exe needs.
This commit is contained in:
1 parent
bd2a9bf249
commit
085b1c7ec7
6 files changed
+140
-8
No files matched your search
@@ -9,6 +9,32 @@
|
||||
/* This is glue code for OS/2 binaries. Native binaries don't need this. */
|
||||
#if LX_LEGACY
|
||||
|
||||
static VOID bridge16to32_Dos16Exit(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, result);
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, action);
|
||||
Dos16Exit(action, result);
|
||||
}
|
||||
|
||||
static APIRET16 bridge16to32_Dos16GetHugeShift(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PUSHORT, pcount);
|
||||
return Dos16GetHugeShift(pcount);
|
||||
}
|
||||
|
||||
static APIRET16 bridge16to32_Dos16GetMachineMode(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PBYTE, pmode);
|
||||
return Dos16GetMachineMode(pmode);
|
||||
}
|
||||
|
||||
static APIRET16 bridge16to32_Dos16GetVersion(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PUSHORT, pver);
|
||||
return Dos16GetVersion(pver);
|
||||
}
|
||||
|
||||
static APIRET16 bridge16to32_Dos16GetPID(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PPIDINFO, ppidinfo);
|
||||
return Dos16GetPID(ppidinfo);
|
||||
}
|
||||
|
||||
static APIRET16 bridge16to32_DosSemRequest(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(LONG, ms);
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PHSEM16, sem);
|
||||
@@ -32,6 +58,11 @@ static APIRET16 bridge16to32_DosSemSet(uint8 *args) {
|
||||
}
|
||||
|
||||
LX_NATIVE_MODULE_16BIT_SUPPORT()
|
||||
LX_NATIVE_MODULE_16BIT_API(Dos16Exit)
|
||||
LX_NATIVE_MODULE_16BIT_API(Dos16GetHugeShift)
|
||||
LX_NATIVE_MODULE_16BIT_API(Dos16GetMachineMode)
|
||||
LX_NATIVE_MODULE_16BIT_API(Dos16GetVersion)
|
||||
LX_NATIVE_MODULE_16BIT_API(Dos16GetPID)
|
||||
LX_NATIVE_MODULE_16BIT_API(DosSemRequest)
|
||||
LX_NATIVE_MODULE_16BIT_API(DosSemClear)
|
||||
LX_NATIVE_MODULE_16BIT_API(DosSemWait)
|
||||
@@ -44,6 +75,11 @@ LX_NATIVE_MODULE_DEINIT({
|
||||
|
||||
static int init16_doscalls(void) {
|
||||
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT()
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16Exit, 4)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetHugeShift, 4)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetMachineMode, 4)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetVersion, 4)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetPID, 4)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemRequest, 8)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemClear, 4)
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemWait, 8)
|
||||
@@ -53,6 +89,11 @@ static int init16_doscalls(void) {
|
||||
}
|
||||
|
||||
LX_NATIVE_MODULE_INIT({ if (!init16_doscalls()) return 0; })
|
||||
LX_NATIVE_EXPORT16(Dos16Exit, 5),
|
||||
LX_NATIVE_EXPORT16(Dos16GetHugeShift, 41),
|
||||
LX_NATIVE_EXPORT16(Dos16GetMachineMode, 49),
|
||||
LX_NATIVE_EXPORT16(Dos16GetVersion, 92),
|
||||
LX_NATIVE_EXPORT16(Dos16GetPID, 94),
|
||||
LX_NATIVE_EXPORT16(DosSemRequest, 140),
|
||||
LX_NATIVE_EXPORT16(DosSemClear, 141),
|
||||
LX_NATIVE_EXPORT16(DosSemWait, 142),
|
||||
|
||||
+47
-3
@@ -295,10 +295,8 @@ static void runDosExitList(const uint32 why)
|
||||
} // for
|
||||
} // runDosExitList
|
||||
|
||||
VOID DosExit(ULONG action, ULONG exitcode)
|
||||
static VOID DosExit_implementation(ULONG action, ULONG exitcode)
|
||||
{
|
||||
TRACE_NATIVE("DosExit(%u, %u)", (uint) action, (uint) exitcode);
|
||||
|
||||
// !!! FIXME: what does a value other than 0 or 1 do here?
|
||||
if (action == EXIT_THREAD) {
|
||||
// !!! FIXME: If last thread: terminate process.
|
||||
@@ -310,6 +308,12 @@ VOID DosExit(ULONG action, ULONG exitcode)
|
||||
runDosExitList(TC_EXIT);
|
||||
|
||||
GLoaderState.terminate(exitcode);
|
||||
} // DosExit_implementation
|
||||
|
||||
VOID DosExit(ULONG action, ULONG exitcode)
|
||||
{
|
||||
TRACE_NATIVE("DosExit(%u, %u)", (uint) action, (uint) exitcode);
|
||||
DosExit_implementation(action, exitcode);
|
||||
} // DosExit
|
||||
|
||||
APIRET DosExitList(ULONG ordercode, PFNEXITLIST fn)
|
||||
@@ -2862,6 +2866,46 @@ APIRET DosSetFileSize(HFILE h, ULONG len)
|
||||
return NO_ERROR;
|
||||
} // DosSetFileSize
|
||||
|
||||
APIRET16 Dos16GetVersion(PUSHORT pver)
|
||||
{
|
||||
TRACE_NATIVE("Dos16GetVersion(%p)", pver);
|
||||
uint8 *bytes = (uint8 *) pver;
|
||||
FIXME("better version here?");
|
||||
bytes[0] = 2;
|
||||
bytes[1] = 4;
|
||||
return NO_ERROR;
|
||||
} // Dos16GetVersion
|
||||
|
||||
APIRET16 Dos16GetMachineMode(PBYTE pmode)
|
||||
{
|
||||
TRACE_NATIVE("Dos16GetMachineMode(%p)", pmode);
|
||||
*pmode = 1; // 1==OS/2 mode (as opposed to zero for DOS mode).
|
||||
return NO_ERROR;
|
||||
} // Dos16GetMachineMode
|
||||
|
||||
APIRET16 Dos16GetHugeShift(PUSHORT pcount)
|
||||
{
|
||||
TRACE_NATIVE("Dos16GetHugeShift(%p)", pcount);
|
||||
*pcount = 0; FIXME("maybe?");
|
||||
return NO_ERROR;
|
||||
} // Dos16GetHugeShift
|
||||
|
||||
APIRET16 Dos16GetPID(PPIDINFO ppidinfo)
|
||||
{
|
||||
TRACE_NATIVE("Dos16GetPID(%p)", ppidinfo);
|
||||
PTIB2 tib2 = (PTIB2) LX_GETTIB2();
|
||||
ppidinfo->pid = GLoaderState.pib.pib_ulpid;
|
||||
ppidinfo->tid = tib2->tib2_ultid;
|
||||
ppidinfo->pidParent = GLoaderState.pib.pib_ulppid;
|
||||
return NO_ERROR;
|
||||
} // Dos16GetPID
|
||||
|
||||
VOID Dos16Exit(USHORT action, USHORT exitcode)
|
||||
{
|
||||
TRACE_NATIVE("Dos16Exit(%u, %u)", (uint) action, (uint) exitcode);
|
||||
DosExit_implementation(action, exitcode);
|
||||
} // Dos16Exit
|
||||
|
||||
|
||||
LX_NATIVE_CONSTRUCTOR(doscalls)
|
||||
{
|
||||
|
||||
@@ -430,6 +430,19 @@ OS2EXPORT APIRET16 OS2API16 DosSemWait(PHSEM16 sem, LONG ms) OS2APIINFO(142);
|
||||
OS2EXPORT APIRET16 OS2API16 DosSemSet(PHSEM16 sem) OS2APIINFO(143);
|
||||
|
||||
|
||||
// These are only meant to be available to 16-bit binaries, some were removed in OS/2 2.0's SDK.
|
||||
OS2EXPORT APIRET16 OS2API16 Dos16GetVersion(PUSHORT pver) OS2APIINFO(92);
|
||||
OS2EXPORT APIRET16 OS2API16 Dos16GetMachineMode(PBYTE pmode) OS2APIINFO(49);
|
||||
OS2EXPORT APIRET16 OS2API16 Dos16GetHugeShift(PUSHORT pcount) OS2APIINFO(41);
|
||||
OS2EXPORT VOID OS2API16 Dos16Exit(USHORT action, USHORT result) OS2APIINFO(5);
|
||||
|
||||
typedef struct {
|
||||
PID pid;
|
||||
TID tid;
|
||||
PID pidParent;
|
||||
} PIDINFO, *PPIDINFO;
|
||||
OS2EXPORT APIRET16 OS2API16 Dos16GetPID(PPIDINFO ppidinfo) OS2APIINFO(94);
|
||||
|
||||
|
||||
// !!! FIXME: these should probably get sorted alphabetically and/or grouped
|
||||
// !!! FIXME: into areas of functionality, but for now, I'm just listing them
|
||||
|
||||
+24
-1
@@ -9,7 +9,30 @@
|
||||
/* This is glue code for OS/2 binaries. Native binaries don't need this. */
|
||||
#if LX_LEGACY
|
||||
|
||||
LX_NATIVE_MODULE_INIT()
|
||||
static APIRET16 bridge16to32_Dos16PutMessage(uint8 *args) {
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PCHAR, pBuf);
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, cbMsg);
|
||||
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, hfile);
|
||||
return Dos16PutMessage(hfile, cbMsg, pBuf);
|
||||
}
|
||||
|
||||
LX_NATIVE_MODULE_16BIT_SUPPORT()
|
||||
LX_NATIVE_MODULE_16BIT_API(Dos16PutMessage)
|
||||
LX_NATIVE_MODULE_16BIT_SUPPORT_END()
|
||||
|
||||
LX_NATIVE_MODULE_DEINIT({
|
||||
LX_NATIVE_MODULE_DEINIT_16BIT_SUPPORT();
|
||||
})
|
||||
|
||||
static int init16_msg(void) {
|
||||
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT()
|
||||
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16PutMessage, 8)
|
||||
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT_END()
|
||||
return 1;
|
||||
}
|
||||
|
||||
LX_NATIVE_MODULE_INIT({ if (!init16_msg()) return 0; })
|
||||
LX_NATIVE_EXPORT16(Dos16PutMessage, 1),
|
||||
LX_NATIVE_EXPORT(DosPutMessage, 5)
|
||||
LX_NATIVE_MODULE_INIT_END()
|
||||
|
||||
|
||||
+14
-4
@@ -6,18 +6,28 @@
|
||||
* This file written by Ryan C. Gordon.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "os2native.h"
|
||||
#include "os2native16.h"
|
||||
#include "msg.h"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "msg-lx.h"
|
||||
|
||||
APIRET DosPutMessage(HFILE handle, ULONG msglen, PCHAR msg)
|
||||
{
|
||||
TRACE_NATIVE("DosPutMessage(%u, %u, %p)", (uint) handle, (uint) msglen, msg);
|
||||
FIXME("really implement this");
|
||||
write(handle, msg, msglen);
|
||||
return 0;
|
||||
return NO_ERROR;
|
||||
} // DosPutMessage
|
||||
|
||||
APIRET16 Dos16PutMessage(USHORT handle, USHORT msglen, PCHAR msg)
|
||||
{
|
||||
TRACE_NATIVE("Dos16PutMessage(%u, %u, %p)", (uint) handle, (uint) msglen, msg);
|
||||
FIXME("really implement this");
|
||||
write(handle, msg, msglen);
|
||||
return NO_ERROR;
|
||||
} // Dos16PutMessage
|
||||
|
||||
// end of msg.c ...
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
OS2EXPORT APIRET16 OS2API16 Dos16PutMessage(USHORT hfile, USHORT cbMsg, PCHAR pBuf) OS2APIINFO(1);
|
||||
OS2EXPORT APIRET OS2API DosPutMessage(HFILE hfile, ULONG cbMsg, PCHAR pBuf) OS2APIINFO(5);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Reference in new issue
Block a user