mirror of https://github.com/deadw00d/AROS.git
Compare commits
7 Commits
0a9dc87c8a
...
ad52601697
Author | SHA1 | Date |
---|---|---|
deadwood | ad52601697 | |
deadwood | ded83d698e | |
deadwood | c0d544ae7a | |
deadwood | 528b0f83b4 | |
deadwood | 502ce2c5e5 | |
deadwood | 753b0d36da | |
deadwood | 5f6fc3c84c |
|
@ -137,25 +137,26 @@ ULONG abiv0_FillPixelArray(struct RastPortV0 *rp, UWORD destx, UWORD desty, UWOR
|
|||
MAKE_PROXY_ARG_6(FillPixelArray)
|
||||
|
||||
ULONG abiv0_WritePixelArrayAlpha(APTR src, UWORD srcx, UWORD srcy, UWORD srcmod, struct RastPortV0 *rp,
|
||||
UWORD destx, UWORD desty, UWORD width, UWORD height, ULONG globalalpha)
|
||||
UWORD destx, UWORD desty, UWORD width, UWORD height, ULONG globalalpha, struct LibraryV0 *CyberGfxBaseV0)
|
||||
{
|
||||
bug("abiv0_WritePixelArrayAlpha: STUB\n");
|
||||
return 1;
|
||||
struct RastPort *rpnative = (struct RastPort *)*(IPTR *)&rp->longreserved;
|
||||
return WritePixelArrayAlpha(src, srcx, srcy, srcmod, rpnative, destx, desty, width, height, globalalpha);
|
||||
}
|
||||
MAKE_PROXY_ARG_6(WritePixelArrayAlpha)
|
||||
MAKE_PROXY_ARG_12(WritePixelArrayAlpha)
|
||||
|
||||
LONG abiv0_WriteLUTPixelArray(APTR srcRect, UWORD SrcX, UWORD SrcY, UWORD SrcMod, struct RastPortV0 *rp,
|
||||
APTR CTable, UWORD DestX, UWORD DestY, UWORD SizeX, UWORD SizeY, UBYTE CTabFormat)
|
||||
APTR CTable, UWORD DestX, UWORD DestY, UWORD SizeX, UWORD SizeY, UBYTE CTabFormat, struct LibraryV0 *CyberGfxBaseV0)
|
||||
{
|
||||
bug("abiv0_WriteLUTPixelArray: STUB\n");
|
||||
struct RastPort *rpnative = (struct RastPort *)*(IPTR *)&rp->longreserved;
|
||||
return WriteLUTPixelArray(srcRect, SrcX, SrcY, SrcMod, rpnative, CTable, DestX, DestY, SizeX, SizeY, CTabFormat);
|
||||
}
|
||||
MAKE_PROXY_ARG_6(WriteLUTPixelArray)
|
||||
MAKE_PROXY_ARG_12(WriteLUTPixelArray)
|
||||
|
||||
BPTR LoadSeg32 (CONST_STRPTR name, struct DosLibrary *DOSBase);
|
||||
struct ResidentV0 * findResident(BPTR seg, CONST_STRPTR name);
|
||||
|
||||
void init_graphics(struct ExecBaseV0 *);
|
||||
void init_intuition(struct ExecBaseV0 *);
|
||||
void init_intuition(struct ExecBaseV0 *, struct LibraryV0 *);
|
||||
void init_dos(struct ExecBaseV0 *);
|
||||
struct ExecBaseV0 *init_exec();
|
||||
|
||||
|
@ -199,7 +200,7 @@ LONG_FUNC run_emulation()
|
|||
__AROS_SETVECADDRV0(abiv0CyberGfxBase, 36, (APTR32)(IPTR)proxy_WritePixelArrayAlpha);
|
||||
__AROS_SETVECADDRV0(abiv0CyberGfxBase, 33, (APTR32)(IPTR)proxy_WriteLUTPixelArray);
|
||||
|
||||
init_intuition(SysBaseV0);
|
||||
init_intuition(SysBaseV0, abiv0TimerBase);
|
||||
|
||||
|
||||
/* Start Program */
|
||||
|
|
|
@ -31,6 +31,12 @@ struct FileHandleProxy
|
|||
BPTR native;
|
||||
};
|
||||
|
||||
struct DosListProxy
|
||||
{
|
||||
struct DosListV0 base;
|
||||
struct DosList *native;
|
||||
};
|
||||
|
||||
struct FileHandleProxy *makeFileHandleProxy(BPTR native)
|
||||
{
|
||||
struct FileHandleProxy *proxy = abiv0_AllocMem(sizeof(struct FileHandleProxy), MEMF_ANY, DOS_SysBaseV0);
|
||||
|
@ -111,6 +117,13 @@ BOOL abiv0_Close(BPTR file, struct DosLibraryV0 *DOSBaseV0)
|
|||
}
|
||||
MAKE_PROXY_ARG_2(Close)
|
||||
|
||||
LONG abiv0_SetFileSize(BPTR file, LONG offset, LONG mode, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct FileHandleProxy *fhp = (struct FileHandleProxy *)file;
|
||||
return SetFileSize(fhp->native, offset, mode);
|
||||
}
|
||||
MAKE_PROXY_ARG_4(SetFileSize)
|
||||
|
||||
BOOL abiv0_IsFileSystem(CONST_STRPTR devicename, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
return IsFileSystem(devicename);
|
||||
|
@ -295,14 +308,33 @@ LONG abiv0_Examine(BPTR lock, struct FileInfoBlockV0 *fib, struct DosLibraryV0 *
|
|||
LONG res = Examine(flproxy->native, fibproxy->native);
|
||||
if (res)
|
||||
{
|
||||
fibproxy->base.fib_Date = fibproxy->native->fib_Date;
|
||||
fibproxy->base.fib_Size = fibproxy->native->fib_Size;
|
||||
fibproxy->base.fib_Date = fibproxy->native->fib_Date;
|
||||
fibproxy->base.fib_Size = fibproxy->native->fib_Size;
|
||||
fibproxy->base.fib_DirEntryType = fibproxy->native->fib_DirEntryType;
|
||||
CopyMem(fibproxy->native->fib_FileName, fibproxy->base.fib_FileName, 108);
|
||||
bug("abiv0_Examine: STUB\n");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
MAKE_PROXY_ARG_3(Examine)
|
||||
|
||||
LONG abiv0_ExNext(BPTR lock, struct FileInfoBlockV0 *fileInfoBlock, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct FileLockProxy *flproxy = (struct FileLockProxy *)lock;
|
||||
struct FileInfoBlockProxy *fibproxy = (struct FileInfoBlockProxy *)fileInfoBlock;
|
||||
LONG res = ExNext(flproxy->native, fibproxy->native);
|
||||
if (res)
|
||||
{
|
||||
fibproxy->base.fib_Date = fibproxy->native->fib_Date;
|
||||
fibproxy->base.fib_Size = fibproxy->native->fib_Size;
|
||||
fibproxy->base.fib_DirEntryType = fibproxy->native->fib_DirEntryType;
|
||||
CopyMem(fibproxy->native->fib_FileName, fibproxy->base.fib_FileName, 108);
|
||||
bug("abiv0_ExNext: STUB\n");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
MAKE_PROXY_ARG_3(ExNext)
|
||||
|
||||
BOOL abiv0_ExamineFH(BPTR fh, struct FileInfoBlockV0 *fib, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct FileHandleProxy *fhproxy = (struct FileHandleProxy *)fh;
|
||||
|
@ -388,6 +420,83 @@ bug("abiv0_ExAll: STUB\n");
|
|||
}
|
||||
MAKE_PROXY_ARG_6(ExAll)
|
||||
|
||||
struct DosListV0 *abiv0_LockDosList(ULONG flags, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct DosList *native = LockDosList(flags);
|
||||
|
||||
if (native)
|
||||
{
|
||||
struct DosListProxy *proxy = abiv0_AllocMem(sizeof(struct DosListProxy), MEMF_CLEAR, DOS_SysBaseV0);
|
||||
proxy->base.dol_Type = native->dol_Type;
|
||||
proxy->native = native;
|
||||
bug("abiv0_LockDosList: STUB\n");
|
||||
return (struct DosListV0 *)proxy;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
MAKE_PROXY_ARG_2(LockDosList)
|
||||
|
||||
struct DosListV0 *abiv0_NextDosEntry(struct DosListV0 *dlist, ULONG flags, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct DosListProxy *proxy = (struct DosListProxy *)dlist;
|
||||
struct DosList *native = NextDosEntry(proxy->native, flags);
|
||||
|
||||
if (native)
|
||||
{
|
||||
struct DosListProxy *proxy = abiv0_AllocMem(sizeof(struct DosListProxy), MEMF_CLEAR, DOS_SysBaseV0);
|
||||
proxy->base.dol_Type = native->dol_Type;
|
||||
proxy->base.dol_Task = (APTR32)(IPTR)native->dol_Task; /* treat this as just a "marker" for now */
|
||||
|
||||
LONG nlen = AROS_BSTR_strlen(native->dol_Name);
|
||||
char *v0name = abiv0_AllocMem(nlen + 1, MEMF_CLEAR, DOS_SysBaseV0);
|
||||
CopyMem(native->dol_Name, v0name, nlen + 1);
|
||||
proxy->base.dol_Name = (APTR32)(IPTR)v0name;
|
||||
|
||||
proxy->native = native;
|
||||
|
||||
bug("abiv0_NextDosEntry: STUB\n");
|
||||
|
||||
return (struct DosListV0 *)proxy;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
MAKE_PROXY_ARG_3(NextDosEntry)
|
||||
|
||||
struct DosListV0 *abiv0_FindDosEntry(struct DosListV0 *dlist, CONST_STRPTR name, ULONG flags, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct DosListProxy *proxy = (struct DosListProxy *)dlist;
|
||||
struct DosList *native = FindDosEntry(proxy->native, name, flags);
|
||||
|
||||
if (native)
|
||||
{
|
||||
struct DosListProxy *proxy = abiv0_AllocMem(sizeof(struct DosListProxy), MEMF_CLEAR, DOS_SysBaseV0);
|
||||
proxy->base.dol_Type = native->dol_Type;
|
||||
proxy->base.dol_Task = (APTR32)(IPTR)native->dol_Task; /* treat this as just a "marker" for now */
|
||||
|
||||
LONG nlen = AROS_BSTR_strlen(native->dol_Name);
|
||||
char *v0name = abiv0_AllocMem(nlen + 1, MEMF_CLEAR, DOS_SysBaseV0);
|
||||
CopyMem(native->dol_Name, v0name, nlen + 1);
|
||||
proxy->base.dol_Name = (APTR32)(IPTR)v0name;
|
||||
|
||||
proxy->native = native;
|
||||
|
||||
bug("abiv0_FindDosEntry: STUB\n");
|
||||
|
||||
return (struct DosListV0 *)proxy;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
MAKE_PROXY_ARG_4(FindDosEntry)
|
||||
|
||||
void abiv0_UnLockDosList(ULONG flags, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
UnLockDosList(flags);
|
||||
}
|
||||
MAKE_PROXY_ARG_2(UnLockDosList);
|
||||
|
||||
SIPTR abiv0_IoErr(struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
// possibly copy Result2 to task proxy as well
|
||||
|
@ -395,6 +504,109 @@ SIPTR abiv0_IoErr(struct DosLibraryV0 *DOSBaseV0)
|
|||
}
|
||||
MAKE_PROXY_ARG_1(IoErr)
|
||||
|
||||
static struct TagItemV0 *LibNextTagItemV0(struct TagItemV0 **tagListPtr)
|
||||
{
|
||||
if (!(*tagListPtr))
|
||||
return NULL;
|
||||
|
||||
while(1)
|
||||
{
|
||||
switch(((*tagListPtr)->ti_Tag))
|
||||
{
|
||||
case TAG_MORE:
|
||||
asm("int3");
|
||||
if (!((*tagListPtr) = (struct TagItemV0 *)(IPTR)(*tagListPtr)->ti_Data))
|
||||
return NULL;
|
||||
continue;
|
||||
|
||||
case TAG_IGNORE:
|
||||
break;
|
||||
|
||||
case TAG_END:
|
||||
(*tagListPtr) = 0;
|
||||
return NULL;
|
||||
|
||||
case TAG_SKIP:
|
||||
asm("int3");
|
||||
(*tagListPtr) += (*tagListPtr)->ti_Data + 1;
|
||||
continue;
|
||||
|
||||
default:
|
||||
return (*tagListPtr)++;
|
||||
|
||||
}
|
||||
|
||||
(*tagListPtr)++;
|
||||
}
|
||||
}
|
||||
|
||||
static struct TagItem *CloneTagItemsV02Native(const struct TagItemV0 *tagList)
|
||||
{
|
||||
struct TagItem *newList;
|
||||
LONG numTags = 1;
|
||||
|
||||
struct TagItemV0 *tmp;
|
||||
|
||||
tmp = (struct TagItemV0 *)tagList;
|
||||
while (LibNextTagItemV0 (&tmp) != NULL)
|
||||
numTags++;
|
||||
|
||||
newList = AllocMem(sizeof(struct TagItem) * numTags, MEMF_CLEAR);
|
||||
|
||||
LONG pos = 0;
|
||||
tmp = (struct TagItemV0 *)tagList;
|
||||
do
|
||||
{
|
||||
newList[pos].ti_Tag = tmp->ti_Tag;
|
||||
newList[pos].ti_Data = tmp->ti_Data;
|
||||
pos++;
|
||||
} while (LibNextTagItemV0 (&tmp) != NULL);
|
||||
|
||||
return newList;
|
||||
|
||||
}
|
||||
|
||||
LONG abiv0_SystemTagList(CONST_STRPTR command, const struct TagItemV0 *tags, struct DosLibraryV0 *DOSBaseV0)
|
||||
{
|
||||
struct TagItem *tagListNative = CloneTagItemsV02Native(tags);
|
||||
|
||||
struct TagItem *tagNative = tagListNative;
|
||||
|
||||
while (tagNative->ti_Tag != TAG_DONE)
|
||||
{
|
||||
if (tagNative->ti_Tag == SYS_Dummy + 10) /* ABI_V0 compatibility: SYS_Error had value SYS_Dummy + 10 */
|
||||
tagNative->ti_Tag = SYS_Error;
|
||||
|
||||
switch(tagNative->ti_Tag)
|
||||
{
|
||||
case(SYS_Input):
|
||||
case(SYS_Output):
|
||||
case(SYS_ScriptInput):
|
||||
case SYS_Error:
|
||||
{
|
||||
if (tagNative->ti_Data)
|
||||
{
|
||||
BPTR fh = (BPTR)tagNative->ti_Data;
|
||||
struct FileHandleProxy *fhproxy = (struct FileHandleProxy *)fh;
|
||||
tagNative->ti_Data = (IPTR)fhproxy->native;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case(SYS_UserShell):
|
||||
break;
|
||||
default:
|
||||
bug("%x\n", tagNative->ti_Tag);
|
||||
asm("int3");
|
||||
}
|
||||
|
||||
tagNative++;
|
||||
}
|
||||
|
||||
bug("abiv0_SystemTagList: STUB\n");
|
||||
return SystemTagList(command, tagListNative);
|
||||
}
|
||||
MAKE_PROXY_ARG_3(SystemTagList)
|
||||
|
||||
struct IntDosBaseV0
|
||||
{
|
||||
struct DosLibraryV0 pub;
|
||||
|
@ -420,6 +632,7 @@ void init_dos(struct ExecBaseV0 *SysBaseV0)
|
|||
|
||||
APTR tmp = AllocMem(2048, MEMF_31BIT | MEMF_CLEAR);
|
||||
abiv0DOSBase = (tmp + 1024);
|
||||
abiv0DOSBase->dl_lib.lib_Node.ln_Name = 0x0000D0FF;
|
||||
abiv0DOSBase->dl_lib.lib_Version = DOSBase->dl_lib.lib_Version;
|
||||
abiv0DOSBase->dl_TimeReq = (APTR32)(IPTR)AllocMem(sizeof(struct timerequestV0), MEMF_31BIT | MEMF_CLEAR);
|
||||
((struct timerequestV0 *)(IPTR)abiv0DOSBase->dl_TimeReq)->tr_node.io_Device = (APTR32)(IPTR)abiv0TimerBase;
|
||||
|
@ -489,4 +702,14 @@ void init_dos(struct ExecBaseV0 *SysBaseV0)
|
|||
__AROS_SETVECADDRV0(abiv0DOSBase, 118, (APTR32)(IPTR)proxy_IsFileSystem);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 67, (APTR32)(IPTR)proxy_NameFromLock);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 161, dosfunctable[160]); // ParsePatternNoCase
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 109, (APTR32)(IPTR)proxy_LockDosList);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 115, (APTR32)(IPTR)proxy_NextDosEntry);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 110, (APTR32)(IPTR)proxy_UnLockDosList);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 69, dosfunctable[68]); // SplitName
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 114, (APTR32)(IPTR)proxy_FindDosEntry);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 18, (APTR32)(IPTR)proxy_ExNext);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 162, dosfunctable[161]); // MatchPatternNoCase
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 147, dosfunctable[146]); // AddPart
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 76, (APTR32)(IPTR)proxy_SetFileSize);
|
||||
__AROS_SETVECADDRV0(abiv0DOSBase, 101, (APTR32)(IPTR)proxy_SystemTagList);
|
||||
}
|
||||
|
|
|
@ -227,10 +227,10 @@ void dummy_OpenLibrary()
|
|||
EXTER_PROXY(OpenLibrary)
|
||||
STORE_ESI_EDI
|
||||
ENTER64
|
||||
COPY_ARG_1
|
||||
COPY_ARG_2
|
||||
COPY_ARG_3
|
||||
ALIGN_STACK64
|
||||
SET_ARG64__3_FROM32
|
||||
SET_ARG64__2_FROM32
|
||||
SET_ARG64__1_FROM32
|
||||
CALL_IMPL64(DOS_OpenLibrary)
|
||||
RESTORE_STACK64
|
||||
ENTER32
|
||||
|
@ -496,6 +496,7 @@ struct ExecBaseV0 *init_exec()
|
|||
|
||||
NEWLISTV0(&abiv0SysBase->LibList);
|
||||
NEWLISTV0(&abiv0SysBase->ResourceList);
|
||||
abiv0SysBase->LibNode.lib_Node.ln_Name = 0x0000E0EC;
|
||||
abiv0SysBase->LibNode.lib_Version = 51;
|
||||
|
||||
__AROS_SETVECADDRV0(abiv0SysBase, 92, (APTR32)(IPTR)proxy_OpenLibrary);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef ABIV0_AROS_ASM_H
|
||||
#define ABIV0_AROS_ASM_H
|
||||
|
||||
/* To be used in 32-bit code */
|
||||
|
||||
#define ENTER64 \
|
||||
" subl $8, %%esp\n" \
|
||||
" movl $0x33, 4(%%esp)\n" \
|
||||
|
@ -10,6 +12,17 @@
|
|||
" .code64\n" \
|
||||
"1:\n"
|
||||
|
||||
#define STORE_ESI_EDI \
|
||||
" push %%edi\n" \
|
||||
" push %%esi\n" \
|
||||
|
||||
#define RESTORE_ESI_EDI \
|
||||
" pop %%esi\n" \
|
||||
" pop %%edi\n" \
|
||||
|
||||
|
||||
/* To be used in 64-bit code */
|
||||
|
||||
#define ENTER32 \
|
||||
" subq $8, %%rsp\n" \
|
||||
" movl $0x23, 4(%%rsp)\n" \
|
||||
|
@ -23,35 +36,6 @@
|
|||
" push $0x2b\n" \
|
||||
" pop %%es\n"
|
||||
|
||||
|
||||
#define STORE_ESI_EDI \
|
||||
" push %%edi\n" \
|
||||
" push %%esi\n" \
|
||||
|
||||
#define RESTORE_ESI_EDI \
|
||||
" pop %%esi\n" \
|
||||
" pop %%edi\n" \
|
||||
|
||||
/* +8 because of stored esi/edi */
|
||||
|
||||
#define COPY_ARG_1 \
|
||||
" movl 4+8(%%rsp), %%edi\n"
|
||||
|
||||
#define COPY_ARG_2 \
|
||||
" movl 8+8(%%rsp), %%esi\n"
|
||||
|
||||
#define COPY_ARG_3 \
|
||||
" movl 12+8(%%rsp), %%edx\n"
|
||||
|
||||
#define COPY_ARG_4 \
|
||||
" movl 16+8(%%rsp), %%ecx\n"
|
||||
|
||||
#define COPY_ARG_5 \
|
||||
" movl 20+8(%%rsp), %%r8d\n"
|
||||
|
||||
#define COPY_ARG_6 \
|
||||
" movl 24+8(%%rsp), %%r9d\n"
|
||||
|
||||
#define ALIGN_STACK64 \
|
||||
" push %%r12\n" \
|
||||
" movq %%rsp, %%r12\n" \
|
||||
|
@ -61,4 +45,49 @@
|
|||
" movq %%r12, %%rsp\n" \
|
||||
" popq %%r12\n" \
|
||||
|
||||
/* +8 because of stored esi/edi */
|
||||
/* +8 because of stored r12 */
|
||||
|
||||
#define SET_ARG64__1_FROM32 \
|
||||
" movl 4+8+8(%%r12), %%edi\n"
|
||||
|
||||
#define SET_ARG64__2_FROM32 \
|
||||
" movl 8+8+8(%%r12), %%esi\n"
|
||||
|
||||
#define SET_ARG64__3_FROM32 \
|
||||
" movl 12+8+8(%%r12), %%edx\n"
|
||||
|
||||
#define SET_ARG64__4_FROM32 \
|
||||
" movl 16+8+8(%%r12), %%ecx\n"
|
||||
|
||||
#define SET_ARG64__5_FROM32 \
|
||||
" movl 20+8+8(%%r12), %%r8d\n"
|
||||
|
||||
#define SET_ARG64__6_FROM32 \
|
||||
" movl 24+8+8(%%r12), %%r9d\n"
|
||||
|
||||
#define SET_ARG64__7_FROM32 \
|
||||
" movl 28+8+8(%%r12), %%eax\n" \
|
||||
" push %%rax\n"
|
||||
|
||||
#define SET_ARG64__8_FROM32 \
|
||||
" movl 32+8+8(%%r12), %%eax\n" \
|
||||
" push %%rax\n"
|
||||
|
||||
#define SET_ARG64__9_FROM32 \
|
||||
" movl 36+8+8(%%r12), %%eax\n" \
|
||||
" push %%rax\n"
|
||||
|
||||
#define SET_ARG64_10_FROM32 \
|
||||
" movl 40+8+8(%%r12), %%eax\n" \
|
||||
" push %%rax\n"
|
||||
|
||||
#define SET_ARG64_11_FROM32 \
|
||||
" movl 44+8+8(%%r12), %%eax\n" \
|
||||
" push %%rax\n"
|
||||
|
||||
#define SET_ARG64_12_FROM32 \
|
||||
" movl 48+8+8(%%r12), %%eax\n" \
|
||||
" push %%rax\n"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -23,8 +23,8 @@ void dummy_##fname() \
|
|||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
COPY_ARG_1 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
|
@ -39,9 +39,9 @@ void dummy_##fname() \
|
|||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
COPY_ARG_1 \
|
||||
COPY_ARG_2 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64__2_FROM32 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
|
@ -56,10 +56,10 @@ void dummy_##fname() \
|
|||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
COPY_ARG_1 \
|
||||
COPY_ARG_2 \
|
||||
COPY_ARG_3 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64__3_FROM32 \
|
||||
SET_ARG64__2_FROM32 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
|
@ -74,11 +74,11 @@ void dummy_##fname() \
|
|||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
COPY_ARG_1 \
|
||||
COPY_ARG_2 \
|
||||
COPY_ARG_3 \
|
||||
COPY_ARG_4 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64__4_FROM32 \
|
||||
SET_ARG64__3_FROM32 \
|
||||
SET_ARG64__2_FROM32 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
|
@ -93,12 +93,12 @@ void dummy_##fname() \
|
|||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
COPY_ARG_1 \
|
||||
COPY_ARG_2 \
|
||||
COPY_ARG_3 \
|
||||
COPY_ARG_4 \
|
||||
COPY_ARG_5 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64__5_FROM32 \
|
||||
SET_ARG64__4_FROM32 \
|
||||
SET_ARG64__3_FROM32 \
|
||||
SET_ARG64__2_FROM32 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
|
@ -113,13 +113,42 @@ void dummy_##fname() \
|
|||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
COPY_ARG_1 \
|
||||
COPY_ARG_2 \
|
||||
COPY_ARG_3 \
|
||||
COPY_ARG_4 \
|
||||
COPY_ARG_5 \
|
||||
COPY_ARG_6 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64__6_FROM32 \
|
||||
SET_ARG64__5_FROM32 \
|
||||
SET_ARG64__4_FROM32 \
|
||||
SET_ARG64__3_FROM32 \
|
||||
SET_ARG64__2_FROM32 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
RESTORE_ESI_EDI \
|
||||
LEAVE_PROXY \
|
||||
}
|
||||
|
||||
/* With arguments 7 and above, be sure to maintain 16-byte aligment of stack by always copying
|
||||
even number of arguments or pushing a dummy argument on stack */
|
||||
#define MAKE_PROXY_ARG_12(fname)\
|
||||
void proxy_##fname(); \
|
||||
void dummy_##fname() \
|
||||
{ \
|
||||
EXTER_PROXY(fname) \
|
||||
STORE_ESI_EDI \
|
||||
ENTER64 \
|
||||
ALIGN_STACK64 \
|
||||
SET_ARG64_12_FROM32 \
|
||||
SET_ARG64_11_FROM32 \
|
||||
SET_ARG64_10_FROM32 \
|
||||
SET_ARG64__9_FROM32 \
|
||||
SET_ARG64__8_FROM32 \
|
||||
SET_ARG64__7_FROM32 \
|
||||
SET_ARG64__6_FROM32 \
|
||||
SET_ARG64__5_FROM32 \
|
||||
SET_ARG64__4_FROM32 \
|
||||
SET_ARG64__3_FROM32 \
|
||||
SET_ARG64__2_FROM32 \
|
||||
SET_ARG64__1_FROM32 \
|
||||
CALL_IMPL64(fname) \
|
||||
RESTORE_STACK64 \
|
||||
ENTER32 \
|
||||
|
|
|
@ -196,6 +196,53 @@ struct ExAllDataV0
|
|||
UWORD ed_OwnerGID; /* The group-owner ID. */
|
||||
};
|
||||
|
||||
/* This structure is returned by LockDosList() and similar calls. This
|
||||
* structure is identical to the AmigaOS one, but this structure is PRIVATE
|
||||
* anyway. Use system-calls for dos list-handling.
|
||||
*/
|
||||
struct DosListV0
|
||||
{
|
||||
/* PRIVATE pointer to next entry. */
|
||||
BPTR32 dol_Next;
|
||||
/* Type of the current node (see below). */
|
||||
LONG dol_Type;
|
||||
/* Filesystem task handling this entry (for old-style filesystems) */
|
||||
APTR32 dol_Task;
|
||||
/* The lock passed to AssignLock(). Only set if the type is
|
||||
DLT_DIRECTORY. */
|
||||
BPTR32 dol_Lock;
|
||||
|
||||
/* This union combines all the different types. */
|
||||
union {
|
||||
/* See struct DevInfo below. */
|
||||
struct {
|
||||
BSTR32 dol_Handler;
|
||||
LONG dol_StackSize;
|
||||
LONG dol_Priority;
|
||||
BPTR32 dol_Startup;
|
||||
BPTR32 dol_SegList;
|
||||
BPTR32 dol_GlobVec;
|
||||
} dol_handler;
|
||||
/* See struct DeviceList below. */
|
||||
struct {
|
||||
struct DateStamp dol_VolumeDate;
|
||||
BPTR32 dol_LockList;
|
||||
LONG dol_DiskType;
|
||||
BPTR32 dol_unused;
|
||||
} dol_volume;
|
||||
/* Structure used for assigns. */
|
||||
struct {
|
||||
/* The name for the late or nonbinding assign. */
|
||||
APTR32 dol_AssignName;
|
||||
/* A list of locks, used by AssignAdd(). */
|
||||
APTR32 dol_List;
|
||||
} dol_assign;
|
||||
} dol_misc;
|
||||
|
||||
/* Name as a BCPL string */
|
||||
BSTR32 dol_Name;
|
||||
};
|
||||
|
||||
struct DosLibraryV0
|
||||
{
|
||||
/* A normal library-base as defined in <exec/libraries.h>. */
|
||||
|
|
|
@ -612,25 +612,35 @@ APTR32 *intuitionjmp;
|
|||
|
||||
APTR abiv0_NewObjectA(struct IClass *classPtr, UBYTE *classID, struct TagItemV0 * tagList, struct LibraryV0 *IntuitionBaseV0)
|
||||
{
|
||||
APTR ret = NULL;
|
||||
|
||||
/* pointerclass needs internal support, disable for now */
|
||||
if (classID && classID[0] == 'p' && classID[6] == 'r')
|
||||
{
|
||||
bug("abiv0_NewObjectA: NOT creating pointerclass object");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Call original function */
|
||||
__asm__ volatile (
|
||||
"subq $16, %%rsp\n"
|
||||
"movl %4, %%eax\n"
|
||||
"movl %5, %%eax\n"
|
||||
"movl %%eax,12(%%rsp)\n"
|
||||
"movl %3, %%eax\n"
|
||||
"movl %4, %%eax\n"
|
||||
"movl %%eax, 8(%%rsp)\n"
|
||||
"movl %2, %%eax\n"
|
||||
"movl %3, %%eax\n"
|
||||
"movl %%eax, 4(%%rsp)\n"
|
||||
"movl %1, %%eax\n"
|
||||
"movl %2, %%eax\n"
|
||||
"movl %%eax, (%%rsp)\n"
|
||||
"movl %0, %%eax\n"
|
||||
"movl %1, %%eax\n"
|
||||
ENTER32
|
||||
"call *%%eax\n"
|
||||
ENTER64
|
||||
"addq $16, %%rsp\n"
|
||||
"leave\n"
|
||||
"ret\n"
|
||||
::"m"(intuitionjmp[165 - 106]), "m"(classPtr), "m"(classID), "m"(tagList), "m"(IntuitionBaseV0) : "%rax", "%rcx");
|
||||
"movl %%eax, %0\n"
|
||||
:"=m"(ret):"m"(intuitionjmp[165 - 106]), "m"(classPtr), "m"(classID), "m"(tagList), "m"(IntuitionBaseV0) : "%rax", "%rcx");
|
||||
|
||||
return ret;
|
||||
}
|
||||
MAKE_PROXY_ARG_4(NewObjectA)
|
||||
|
||||
|
@ -744,6 +754,13 @@ static struct GadgetInfoV0 *composeGadgetInfoV0Int(struct GadgetInfo *nativegi,
|
|||
v0gi->gi_Window = (APTR32)(IPTR)wmGetByWindow(nativegi->gi_Window);
|
||||
if (nativegi->gi_RastPort)
|
||||
v0gi->gi_RastPort = (APTR32)(IPTR)makeRastPortV0(nativegi->gi_RastPort);
|
||||
if (nativegi->gi_Layer)
|
||||
{
|
||||
struct LayerProxy *lproxy = abiv0_AllocMem(sizeof(struct LayerProxy), MEMF_CLEAR, Intuition_SysBaseV0);
|
||||
lproxy->native = nativegi->gi_Layer;
|
||||
syncLayerV0(lproxy);
|
||||
v0gi->gi_Layer = (APTR32)(IPTR)lproxy;
|
||||
}
|
||||
|
||||
if (nativegi->gi_Screen && nativegi->gi_Screen == g_nativescreen)
|
||||
{
|
||||
|
@ -763,6 +780,8 @@ void freeComposedGadgetInfoV0(struct GadgetInfoV0 *v0gi)
|
|||
{
|
||||
if (v0gi->gi_RastPort)
|
||||
abiv0_FreeMem((APTR)(IPTR)v0gi->gi_RastPort, sizeof(struct RastPortV0), Intuition_SysBaseV0);
|
||||
if (v0gi->gi_Layer)
|
||||
abiv0_FreeMem((APTR)(IPTR)v0gi->gi_Layer, sizeof(struct LayerProxy), Intuition_SysBaseV0);
|
||||
|
||||
abiv0_FreeMem(v0gi, sizeof(struct GadgetInfoV0), Intuition_SysBaseV0);
|
||||
}
|
||||
|
@ -903,14 +922,10 @@ static IPTR process_message_on_31bit_stack(struct IClass *CLASS, Object *self, M
|
|||
struct gpRenderV0 *v0msg = abiv0_AllocMem(sizeof(struct gpRenderV0), MEMF_CLEAR, Intuition_SysBaseV0);
|
||||
struct GadgetInfoV0 *v0gi = composeGadgetInfoV0(nativemsg->gpr_GInfo);
|
||||
|
||||
struct LayerProxy *lproxy = abiv0_AllocMem(sizeof(struct LayerProxy), MEMF_CLEAR, Intuition_SysBaseV0);
|
||||
struct DrawInfoV0 *v0dri = abiv0_AllocMem(sizeof(struct DrawInfoV0), MEMF_CLEAR, Intuition_SysBaseV0);
|
||||
v0dri->dri_Pens = (APTR32)(IPTR)abiv0_AllocMem(NUMDRIPENS * sizeof(UWORD), MEMF_CLEAR, Intuition_SysBaseV0);
|
||||
CopyMem(nativemsg->gpr_GInfo->gi_DrInfo->dri_Pens, (APTR)(IPTR)v0dri->dri_Pens, NUMDRIPENS * sizeof(UWORD));
|
||||
|
||||
lproxy->native = nativemsg->gpr_GInfo->gi_Layer;
|
||||
syncLayerV0(lproxy);
|
||||
v0gi->gi_Layer = (APTR32)(IPTR)lproxy;
|
||||
v0gi->gi_DrInfo = (APTR32)(IPTR)v0dri;
|
||||
|
||||
v0msg->MethodID = nativemsg->MethodID;
|
||||
|
@ -923,7 +938,6 @@ static IPTR process_message_on_31bit_stack(struct IClass *CLASS, Object *self, M
|
|||
abiv0_FreeMem((APTR)(IPTR)v0msg->gpr_RPort, sizeof(struct RastPortV0), Intuition_SysBaseV0);
|
||||
abiv0_FreeMem((APTR)(IPTR)v0dri->dri_Pens, NUMDRIPENS * sizeof(UWORD), Intuition_SysBaseV0);
|
||||
abiv0_FreeMem(v0dri, sizeof(struct DrawInfoV0), Intuition_SysBaseV0);
|
||||
abiv0_FreeMem(lproxy, sizeof(struct LayerProxy), Intuition_SysBaseV0);
|
||||
freeComposedGadgetInfoV0(v0gi);
|
||||
abiv0_FreeMem(v0msg, sizeof(struct gpRenderV0), Intuition_SysBaseV0);
|
||||
|
||||
|
@ -964,7 +978,7 @@ static void init_gadget_wrapper_class()
|
|||
gadgetwrappercl->cl_Dispatcher.h_SubEntry = NULL;
|
||||
}
|
||||
|
||||
void init_intuition(struct ExecBaseV0 *SysBaseV0)
|
||||
void init_intuition(struct ExecBaseV0 *SysBaseV0, struct LibraryV0 *timerBase)
|
||||
{
|
||||
TEXT path[64];
|
||||
NewRawDoFmt("%s:Libs32/partial/intuition.library", RAWFMTFUNC_STRING, path, SYSNAME);
|
||||
|
@ -1034,6 +1048,7 @@ void init_intuition(struct ExecBaseV0 *SysBaseV0)
|
|||
__AROS_SETVECADDRV0(abiv0IntuitionBase, 74, (APTR32)(IPTR)proxy_RemoveGList);
|
||||
__AROS_SETVECADDRV0(abiv0IntuitionBase, 146, intuitionjmp[165 - 146]); // FreeICData
|
||||
__AROS_SETVECADDRV0(abiv0IntuitionBase, 41, intuitionjmp[165 - 41]); // ScreenToBack
|
||||
__AROS_SETVECADDRV0(abiv0IntuitionBase, 14, intuitionjmp[165 - 14]); // CurrentTime
|
||||
|
||||
/* Call CLASSESINIT_LIST */
|
||||
ULONG pos = 1;
|
||||
|
@ -1054,9 +1069,10 @@ void init_intuition(struct ExecBaseV0 *SysBaseV0)
|
|||
func = segclassesinitlist[pos];
|
||||
}
|
||||
|
||||
/* Set internal Intuition pointer of utility */
|
||||
/* Set internal Intuition pointer of utility, graphics and timer */
|
||||
*(ULONG *)((IPTR)abiv0IntuitionBase + 0x60) = (APTR32)(IPTR)abiv0_DOS_OpenLibrary("utility.library", 0L, SysBaseV0);
|
||||
*(ULONG *)((IPTR)abiv0IntuitionBase + 0x64) = (APTR32)(IPTR)abiv0_DOS_OpenLibrary("graphics.library", 0L, SysBaseV0);
|
||||
*(ULONG *)((IPTR)abiv0IntuitionBase + 0x74) = (APTR32)(IPTR)timerBase;
|
||||
|
||||
init_gadget_wrapper_class();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue