Compare commits

...

7 Commits

Author SHA1 Message Date
deadwood ad52601697 ZuneARC now lists and extracts archive
Tested with ZIP. Needs 64-bit UnZip in EXTRAS:Misc/aminet/C
2024-04-07 18:39:34 +02:00
deadwood ded83d698e Add "names" to exec and dos to allow easier debugging 2024-04-07 18:38:31 +02:00
deadwood c0d544ae7a Support clicking on entry in ASL File Requester 2024-04-07 17:27:48 +02:00
deadwood 528b0f83b4 Fix listing files in ASL File Requester 2024-04-07 17:26:43 +02:00
deadwood 502ce2c5e5 Volume and Parent buttons of ASL File Requester work 2024-04-07 17:05:24 +02:00
deadwood 753b0d36da Support passing more than 6 arguments to 64-bit implementation
This reworks how arguments are fetched to use r12 which is set in
ALIGN_STACK64. This way the fetch offsets remain stable even when
64-bit stack is being pushed onto (for arguments 7 and above)

RESTORE_STACK64 resets rsp thus "freeing" arguments
2024-04-07 16:17:27 +02:00
deadwood 5f6fc3c84c Don't create objects of class pointerclass
This class requires HIDD internals to be somewhat working, so for now
disable creation of objects of this class.

This fixes creation of broken objects and crash at exit in ZuneARC
2024-04-07 14:50:52 +02:00
7 changed files with 425 additions and 79 deletions

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);

View File

@ -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

View File

@ -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 \

View File

@ -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>. */

View File

@ -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();
}