Refactor: move intuition code to separate file

This commit is contained in:
deadwood 2024-03-23 19:22:50 +01:00
parent 0ce314f0ec
commit 11041d89eb
4 changed files with 157 additions and 122 deletions

View File

@ -319,11 +319,6 @@ void abiv0_CopyMem(APTR source, APTR dest, ULONG size)
}
MAKE_PROXY_ARG_4(CopyMem)
struct LibraryV0 *abiv0_Intuition_OpenLib(ULONG version, struct LibraryV0 *IntuitionBaseV0)
{
return IntuitionBaseV0;
}
MAKE_PROXY_ARG_2(Intuition_OpenLib)
struct LibraryV0 *abiv0_Layers_OpenLib(ULONG version, struct LibraryV0 *LayersBaseV0)
{
@ -586,74 +581,21 @@ bug("abiv0_IoErr: STUB\n");
}
MAKE_PROXY_ARG_1(IoErr)
struct ScreenProxy
{
struct ScreenV0 base;
struct Screen *native;
};
struct ScreenV0 *abiv0_LockPubScreen(CONST_STRPTR name, struct LibraryV0 *IntuitionBaseV0)
{
struct Screen *scr = LockPubScreen(name);
if (scr == NULL)
return NULL;
struct ScreenProxy *ret = abiv0_AllocMem(sizeof(struct ScreenProxy), MEMF_CLEAR, abiv0SysBase);
ret->base.Width = scr->Width;
ret->base.Height = scr->Height;
ret->native = scr;
struct ColorMapProxy *cmproxy = abiv0_AllocMem(sizeof(struct ColorMapProxy), MEMF_CLEAR, abiv0SysBase);
cmproxy->native = scr->ViewPort.ColorMap;
ret->base.ViewPort.ColorMap = (APTR32)(IPTR)cmproxy;
struct TextAttrV0 * v0font = abiv0_AllocMem(sizeof(struct TextAttrV0), MEMF_CLEAR, abiv0SysBase);
v0font->ta_YSize = scr->Font->ta_YSize;
v0font->ta_Flags = scr->Font->ta_Flags;
v0font->ta_Style = scr->Font->ta_Style;
STRPTR v0font_name = abiv0_AllocMem(strlen(scr->Font->ta_Name) + 1, MEMF_CLEAR, abiv0SysBase);
CopyMem(scr->Font->ta_Name, v0font_name, strlen(scr->Font->ta_Name) + 1);
v0font->ta_Name = (APTR32)(IPTR)v0font_name;
ret->base.Font = (APTR32)(IPTR)v0font;
bug("abiv0_LockPubScreen: STUB\n");
return (struct ScreenV0 *)ret;
}
MAKE_PROXY_ARG_2(LockPubScreen)
void abiv0_ScreenDepth(struct ScreenV0 *screen, ULONG flags, APTR reserved, struct LibraryV0 *IntuitionBaseV0)
{
bug("abiv0_ScreenDepth: STUB\n");
}
MAKE_PROXY_ARG_4(ScreenDepth)
struct DrawInfoV0 *abiv0_GetScreenDrawInfo(struct ScreenV0 *screen, struct LibraryV0 *IntuitionBaseV0)
{
struct ScreenProxy *proxy = (struct ScreenProxy *)screen;
struct DrawInfo *dri = GetScreenDrawInfo(proxy->native);
if (dri == NULL)
return NULL;
struct DrawInfoV0 *ret = abiv0_AllocMem(sizeof(struct DrawInfoV0), MEMF_CLEAR, abiv0SysBase);
ret->dri_Pens = (APTR32)(IPTR)abiv0_AllocMem(NUMDRIPENS * sizeof(UWORD), MEMF_CLEAR, abiv0SysBase);
CopyMem(dri->dri_Pens, (APTR)(IPTR)ret->dri_Pens, NUMDRIPENS * sizeof(UWORD));
bug("abiv0_GetScreenDrawInfo: STUB\n");
return ret;
}
MAKE_PROXY_ARG_2(GetScreenDrawInfo)
ULONG *execfunctable;
ULONG *dosfunctable;
ULONG *seginitlist;
ULONG *segclassesinitlist;
APTR32 global_SysBaseV0Ptr;
extern ULONG *seginitlist;
extern ULONG* segclassesinitlist;
void init_graphics();
void init_intuition();
LONG_FUNC run_emulation()
{
@ -785,62 +727,7 @@ LONG_FUNC run_emulation()
/* Remove all vectors for now (leave LibOpen) */
for (int i = 5; i <= 38; i++) __AROS_SETVECADDRV0(abiv0CyberGfxBase, i, 0);
BPTR intuitionseg = LoadSeg32("SYS:Libs32/partial/intuition.library", DOSBase);
struct ResidentV0 *intuitionres = findResident(intuitionseg, NULL);
struct LibraryV0 *abiv0IntuitionBase = shallow_InitResident32(intuitionres, intuitionseg, abiv0SysBase);
/* Remove all vectors for now */
const ULONG intuitionjmpsize = 165 * sizeof(APTR32);
APTR32 *intuitionjmp = AllocMem(intuitionjmpsize, MEMF_CLEAR);
CopyMem((APTR)abiv0IntuitionBase - intuitionjmpsize, intuitionjmp, intuitionjmpsize);
for (int i = 1; i <= 164; i++) __AROS_SETVECADDRV0(abiv0IntuitionBase, i, 0);
/* Call SysBase_autoinit */
__asm__ volatile (
"subq $4, %%rsp\n"
"movl %0, %%eax\n"
"movl %%eax, (%%rsp)\n"
"movl %1, %%eax\n"
ENTER32
"call *%%eax\n"
ENTER64
"addq $4, %%rsp\n"
::"m"(abiv0SysBase), "m"(seginitlist[1]) : "%rax", "%rcx");
__AROS_SETVECADDRV0(abiv0IntuitionBase, 1, (APTR32)(IPTR)proxy_Intuition_OpenLib);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 113, intuitionjmp[165 - 113]); // MakeClass
__AROS_SETVECADDRV0(abiv0IntuitionBase, 112, intuitionjmp[165 - 112]); // FindClass
__AROS_SETVECADDRV0(abiv0IntuitionBase, 114, intuitionjmp[165 - 114]); // AddClass
__AROS_SETVECADDRV0(abiv0IntuitionBase, 106, intuitionjmp[165 - 106]); // NewObjectA
__AROS_SETVECADDRV0(abiv0IntuitionBase, 108, intuitionjmp[165 - 108]); // SetAttrs
__AROS_SETVECADDRV0(abiv0IntuitionBase, 109, intuitionjmp[165 - 109]); // GetAttr
__AROS_SETVECADDRV0(abiv0IntuitionBase, 111, intuitionjmp[165 - 111]); // NextObject
__AROS_SETVECADDRV0(abiv0IntuitionBase, 85, (APTR32)(IPTR)proxy_LockPubScreen);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 42, intuitionjmp[165 - 42]); // ScreenToFront
__AROS_SETVECADDRV0(abiv0IntuitionBase, 131, (APTR32)(IPTR)proxy_ScreenDepth);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 115, (APTR32)(IPTR)proxy_GetScreenDrawInfo);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 107, intuitionjmp[165 - 107]); // DisposeObject
/* Call CLASSESINIT_LIST */
ULONG pos = 1;
APTR32 func = segclassesinitlist[pos];
while (func != 0)
{
__asm__ volatile (
"subq $4, %%rsp\n"
"movl %0, %%eax\n"
"movl %%eax, (%%rsp)\n"
"movl %1, %%eax\n"
ENTER32
"call *%%eax\n"
ENTER64
"addq $4, %%rsp\n"
::"m"(abiv0IntuitionBase), "m"(func) : "%rax", "%rcx");
pos++;
func = segclassesinitlist[pos];
}
/* Set internal Intuition pointer of utility */
*(ULONG *)((IPTR)abiv0IntuitionBase + 0x60) = (APTR32)(IPTR)abiv0_DOS_OpenLibrary("utility.library", 0L, abiv0SysBase);
init_intuition();
init_graphics();

View File

@ -0,0 +1,146 @@
#include <proto/exec.h>
#include <proto/dos.h>
#include <aros/debug.h>
#include <proto/intuition.h>
#include <string.h>
#include "../include/exec/structures.h"
#include "../include/exec/functions.h"
#include "../include/aros/cpu.h"
#include "../include/aros/proxy.h"
#include "../include/intuition/structures.h"
#include "../include/graphics/proxy_structures.h"
extern struct ExecBaseV0 *abiv0SysBase;
struct ScreenProxy
{
struct ScreenV0 base;
struct Screen *native;
};
struct LibraryV0 *abiv0_Intuition_OpenLib(ULONG version, struct LibraryV0 *IntuitionBaseV0)
{
return IntuitionBaseV0;
}
MAKE_PROXY_ARG_2(Intuition_OpenLib)
struct ScreenV0 *abiv0_LockPubScreen(CONST_STRPTR name, struct LibraryV0 *IntuitionBaseV0)
{
struct Screen *scr = LockPubScreen(name);
if (scr == NULL)
return NULL;
struct ScreenProxy *ret = abiv0_AllocMem(sizeof(struct ScreenProxy), MEMF_CLEAR, abiv0SysBase);
ret->base.Width = scr->Width;
ret->base.Height = scr->Height;
ret->native = scr;
struct ColorMapProxy *cmproxy = abiv0_AllocMem(sizeof(struct ColorMapProxy), MEMF_CLEAR, abiv0SysBase);
cmproxy->native = scr->ViewPort.ColorMap;
ret->base.ViewPort.ColorMap = (APTR32)(IPTR)cmproxy;
struct TextAttrV0 * v0font = abiv0_AllocMem(sizeof(struct TextAttrV0), MEMF_CLEAR, abiv0SysBase);
v0font->ta_YSize = scr->Font->ta_YSize;
v0font->ta_Flags = scr->Font->ta_Flags;
v0font->ta_Style = scr->Font->ta_Style;
STRPTR v0font_name = abiv0_AllocMem(strlen(scr->Font->ta_Name) + 1, MEMF_CLEAR, abiv0SysBase);
CopyMem(scr->Font->ta_Name, v0font_name, strlen(scr->Font->ta_Name) + 1);
v0font->ta_Name = (APTR32)(IPTR)v0font_name;
ret->base.Font = (APTR32)(IPTR)v0font;
bug("abiv0_LockPubScreen: STUB\n");
return (struct ScreenV0 *)ret;
}
MAKE_PROXY_ARG_2(LockPubScreen)
void abiv0_ScreenDepth(struct ScreenV0 *screen, ULONG flags, APTR reserved, struct LibraryV0 *IntuitionBaseV0)
{
bug("abiv0_ScreenDepth: STUB\n");
}
MAKE_PROXY_ARG_4(ScreenDepth)
struct DrawInfoV0 *abiv0_GetScreenDrawInfo(struct ScreenV0 *screen, struct LibraryV0 *IntuitionBaseV0)
{
struct ScreenProxy *proxy = (struct ScreenProxy *)screen;
struct DrawInfo *dri = GetScreenDrawInfo(proxy->native);
if (dri == NULL)
return NULL;
struct DrawInfoV0 *ret = abiv0_AllocMem(sizeof(struct DrawInfoV0), MEMF_CLEAR, abiv0SysBase);
ret->dri_Pens = (APTR32)(IPTR)abiv0_AllocMem(NUMDRIPENS * sizeof(UWORD), MEMF_CLEAR, abiv0SysBase);
CopyMem(dri->dri_Pens, (APTR)(IPTR)ret->dri_Pens, NUMDRIPENS * sizeof(UWORD));
bug("abiv0_GetScreenDrawInfo: STUB\n");
return ret;
}
MAKE_PROXY_ARG_2(GetScreenDrawInfo)
struct LibraryV0 *shallow_InitResident32(struct ResidentV0 *resident, BPTR segList, struct ExecBaseV0 *SysBaseV0);
BPTR LoadSeg32 (CONST_STRPTR name, struct DosLibrary *DOSBase);
struct ResidentV0 * findResident(BPTR seg, CONST_STRPTR name);
APTR abiv0_DOS_OpenLibrary(CONST_STRPTR name, ULONG version, struct ExecBaseV0 *SysBaseV0);
extern ULONG* segclassesinitlist;
extern ULONG *seginitlist;
void init_intuition()
{
BPTR intuitionseg = LoadSeg32("SYS:Libs32/partial/intuition.library", DOSBase);
struct ResidentV0 *intuitionres = findResident(intuitionseg, NULL);
struct LibraryV0 *abiv0IntuitionBase = shallow_InitResident32(intuitionres, intuitionseg, abiv0SysBase);
/* Remove all vectors for now */
const ULONG intuitionjmpsize = 165 * sizeof(APTR32);
APTR32 *intuitionjmp = AllocMem(intuitionjmpsize, MEMF_CLEAR);
CopyMem((APTR)abiv0IntuitionBase - intuitionjmpsize, intuitionjmp, intuitionjmpsize);
for (int i = 1; i <= 164; i++) __AROS_SETVECADDRV0(abiv0IntuitionBase, i, 0);
/* Call SysBase_autoinit */
__asm__ volatile (
"subq $4, %%rsp\n"
"movl %0, %%eax\n"
"movl %%eax, (%%rsp)\n"
"movl %1, %%eax\n"
ENTER32
"call *%%eax\n"
ENTER64
"addq $4, %%rsp\n"
::"m"(abiv0SysBase), "m"(seginitlist[1]) : "%rax", "%rcx");
__AROS_SETVECADDRV0(abiv0IntuitionBase, 1, (APTR32)(IPTR)proxy_Intuition_OpenLib);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 113, intuitionjmp[165 - 113]); // MakeClass
__AROS_SETVECADDRV0(abiv0IntuitionBase, 112, intuitionjmp[165 - 112]); // FindClass
__AROS_SETVECADDRV0(abiv0IntuitionBase, 114, intuitionjmp[165 - 114]); // AddClass
__AROS_SETVECADDRV0(abiv0IntuitionBase, 106, intuitionjmp[165 - 106]); // NewObjectA
__AROS_SETVECADDRV0(abiv0IntuitionBase, 108, intuitionjmp[165 - 108]); // SetAttrs
__AROS_SETVECADDRV0(abiv0IntuitionBase, 109, intuitionjmp[165 - 109]); // GetAttr
__AROS_SETVECADDRV0(abiv0IntuitionBase, 111, intuitionjmp[165 - 111]); // NextObject
__AROS_SETVECADDRV0(abiv0IntuitionBase, 85, (APTR32)(IPTR)proxy_LockPubScreen);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 42, intuitionjmp[165 - 42]); // ScreenToFront
__AROS_SETVECADDRV0(abiv0IntuitionBase, 131, (APTR32)(IPTR)proxy_ScreenDepth);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 115, (APTR32)(IPTR)proxy_GetScreenDrawInfo);
__AROS_SETVECADDRV0(abiv0IntuitionBase, 107, intuitionjmp[165 - 107]); // DisposeObject
/* Call CLASSESINIT_LIST */
ULONG pos = 1;
APTR32 func = segclassesinitlist[pos];
while (func != 0)
{
__asm__ volatile (
"subq $4, %%rsp\n"
"movl %0, %%eax\n"
"movl %%eax, (%%rsp)\n"
"movl %1, %%eax\n"
ENTER32
"call *%%eax\n"
ENTER64
"addq $4, %%rsp\n"
::"m"(abiv0IntuitionBase), "m"(func) : "%rax", "%rcx");
pos++;
func = segclassesinitlist[pos];
}
/* Set internal Intuition pointer of utility */
*(ULONG *)((IPTR)abiv0IntuitionBase + 0x60) = (APTR32)(IPTR)abiv0_DOS_OpenLibrary("utility.library", 0L, abiv0SysBase);
}

View File

@ -300,6 +300,9 @@ static int __attribute__ ((noinline)) load_hunk
return 0;
}
ULONG *segclassesinitlist;
ULONG *seginitlist;
static int relocate
(
struct elfheader *eh,
@ -407,13 +410,11 @@ static int relocate
if ((name[0] == '_') && (strcmp(name, "__INIT_LIST__") == 0))
{
extern ULONG* seginitlist;
seginitlist = (APTR)(IPTR)s;
}
if ((name[0] == '_') && (strcmp(name, "__CLASSESINIT_LIST__") == 0))
{
extern ULONG* segclassesinitlist;
segclassesinitlist = (APTR)(IPTR)s;
}

View File

@ -13,6 +13,7 @@ FILES := AoA loadseg32 internalloadseg32 internalloadseg_elf32 \
abiv0/exec/openlibrary \
abiv0/exec/addresource \
abiv0/graphics/graphics_init \
abiv0/intuition/intuition_init \
EXEDIR := $(AROS_C)
USER_INCLUDES := -I$(SRCDIR)/rom/dos