From 4d03904534c627ca6129f2e5bc8db989b6db5313 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Tue, 18 Mar 2014 18:33:27 +0200 Subject: [PATCH] tablet.library emulation support files. --- include/tabletlibrary.h | 8 ++ tabletlibrary.cpp | 235 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100644 include/tabletlibrary.h create mode 100644 tabletlibrary.cpp diff --git a/include/tabletlibrary.h b/include/tabletlibrary.h new file mode 100644 index 00000000..5e0f4c95 --- /dev/null +++ b/include/tabletlibrary.h @@ -0,0 +1,8 @@ + +uaecptr tabletlib_startup (uaecptr resaddr); +void tabletlib_install (void); + +extern void tabletlib_tablet (int x, int y, int z, + int pressure, uae_u32 buttonbits, int inproximity, + int ax, int ay, int az); +extern void tabletlib_tablet_info (int maxx, int maxy, int maxz, int maxax, int maxay, int maxaz, int xres, int yres); diff --git a/tabletlibrary.cpp b/tabletlibrary.cpp new file mode 100644 index 00000000..4e507e03 --- /dev/null +++ b/tabletlibrary.cpp @@ -0,0 +1,235 @@ +/* +* UAE - The Un*x Amiga Emulator +* +* tablet.library +* +*/ + +#include "sysconfig.h" +#include "sysdeps.h" + +#include "options.h" +#include "memory.h" +#include "custom.h" +#include "newcpu.h" +#include "traps.h" +#include "autoconf.h" +#include "execlib.h" +#include "tabletlibrary.h" + +static uaecptr lib_init, lib_name, lib_id, base; +static uaecptr tablettags; +#define TAGS_SIZE (12 * 4) + +static int tablet_x, tablet_y, tablet_resx, tablet_resy; +static int tablet_pressure, tablet_buttonbits, tablet_inproximity; +static int tablet_maxx, tablet_maxy, tablet_maxz; +static int ksversion; + +void tabletlib_tablet (int x, int y, int z, int pressure, uae_u32 buttonbits, int inproximity, int ax, int ay, int az) +{ + tablet_x = x; + tablet_y = y; + tablet_pressure = pressure; + tablet_buttonbits = buttonbits; + tablet_inproximity = inproximity; +} + +void tabletlib_tablet_info (int maxx, int maxy, int maxz, int maxax, int maxay, int maxaz, int xres, int yres) +{ + tablet_maxx = maxx; + tablet_maxy = maxy; + tablet_resx = xres; + tablet_resy = yres; +} + +static void filltags (uaecptr tabletdata) +{ + uaecptr p = tablettags; + if (!p) + return; + put_word (tabletdata + 0, 0); + put_word (tabletdata + 2, 0); + put_long (tabletdata + 4, tablet_x); + put_long (tabletdata + 8, tablet_y); + put_long (tabletdata + 12, tablet_maxx); + put_long (tabletdata + 16, tablet_maxy); + + // pressure + put_long (p, 0x8003a000 + 6); + p += 4; + put_long (p, tablet_pressure); + p += 4; + // buttonbits + put_long (p, 0x8003a000 + 7); + p += 4; + put_long (p, tablet_buttonbits); + p += 4; + // resolutionx + put_long (p, 0x8003a000 + 9); + p += 4; + put_long (p, tablet_resx); + p += 4; + // resolutiony + put_long (p, 0x8003a000 + 10); + p += 4; + put_long (p, tablet_resy); + p += 4; + if (tablet_inproximity == 0) { + // inproximity + put_long (p, 0x8003a000 + 8); + p += 4; + put_long (p, 0); + p += 4; + } + put_long (p, 0); +} + +static uae_u32 REGPARAM2 lib_initcode (TrapContext *ctx) +{ + base = m68k_dreg (regs, 0); + tablettags = base + SIZEOF_LIBRARY; + tablet_inproximity = -1; + tablet_x = tablet_y = 0; + tablet_buttonbits = tablet_pressure = 0; + ksversion = get_word (m68k_areg (regs, 6) + 20); + return base; +} +static uae_u32 REGPARAM2 lib_openfunc (TrapContext *ctx) +{ + put_word (m68k_areg (regs, 6) + 32, get_word (m68k_areg (regs, 6) + 32) + 1); + return m68k_areg (regs, 6); +} +static uae_u32 REGPARAM2 lib_closefunc (TrapContext *ctx) +{ + put_word (m68k_areg (regs, 6) + 32, get_word (m68k_areg (regs, 6) + 32) - 1); + return 0; +} +static uae_u32 REGPARAM2 lib_expungefunc (TrapContext *context) +{ + return 0; +} +static uae_u32 REGPARAM2 lib_allocfunc (TrapContext *context) +{ + uae_u32 tags = m68k_areg (regs, 0); + uae_u32 mem; + m68k_dreg (regs, 0) = 24; + m68k_dreg (regs, 1) = 65536 + 1; + mem = CallLib (context, get_long (4), -0xC6); /* AllocMem */ + if (!mem) + return 0; + put_long (mem + 20, tablettags); + filltags (mem); + return mem; +} +static uae_u32 REGPARAM2 lib_freefunc (TrapContext *context) +{ + m68k_areg (regs, 1) = m68k_areg (regs, 0); + m68k_dreg (regs, 0) = 24; + CallLib(context, get_long (4), -0xD2); + return 0; +} +static uae_u32 REGPARAM2 lib_dofunc (TrapContext *context) +{ + uaecptr im = m68k_areg (regs, 0); + uaecptr td = m68k_areg (regs, 1); + filltags (td); + if (ksversion < 39) + return 1; + td = get_long (im + 52); + if (!td) + return 1; + return 1; +} +static uae_u32 REGPARAM2 lib_unkfunc (TrapContext *context) +{ + write_log (_T("tablet.library unknown function called\n")); + return 0; +} + +uaecptr tabletlib_startup (uaecptr resaddr) +{ + if (!currprefs.tablet_library) + return resaddr; + put_word (resaddr + 0x0, 0x4AFC); + put_long (resaddr + 0x2, resaddr); + put_long (resaddr + 0x6, resaddr + 0x1A); /* Continue scan here */ + put_word (resaddr + 0xA, 0x8127); /* RTF_AUTOINIT|RTF_COLDSTART; Version 1 */ + put_word (resaddr + 0xC, 0x0900); /* NT_LIBRARY; pri 00 */ + put_long (resaddr + 0xE, lib_name); + put_long (resaddr + 0x12, lib_id); + put_long (resaddr + 0x16, lib_init); + resaddr += 0x1A; + return resaddr; +} + +void tabletlib_install (void) +{ + uae_u32 functable, datatable; + uae_u32 initcode, openfunc, closefunc, expungefunc; + uae_u32 allocfunc, freefunc, dofunc, unkfunc; + TCHAR tmp[100]; + + if (!currprefs.tablet_library) + return; + + _stprintf (tmp, _T("UAE tablet.library %d.%d.%d"), UAEMAJOR, UAEMINOR, UAESUBREV); + lib_name = ds (_T("tablet.library")); + lib_id = ds (tmp); + + initcode = here (); + calltrap (deftrap (lib_initcode)); dw (RTS); + openfunc = here (); + calltrap (deftrap (lib_openfunc)); dw (RTS); + closefunc = here (); + calltrap (deftrap (lib_closefunc)); dw (RTS); + expungefunc = here (); + calltrap (deftrap (lib_expungefunc)); dw (RTS); + allocfunc = here (); + calltrap (deftrap2 (lib_allocfunc, TRAPFLAG_EXTRA_STACK, _T("tablet_alloc"))); dw (RTS); + freefunc = here (); + calltrap (deftrap2 (lib_freefunc, TRAPFLAG_EXTRA_STACK, _T("tablet_free"))); dw (RTS); + dofunc = here (); + calltrap (deftrap (lib_dofunc)); dw (RTS); + unkfunc = here (); + calltrap (deftrap (lib_unkfunc)); dw (RTS); + + /* FuncTable */ + functable = here (); + dl (openfunc); + dl (closefunc); + dl (expungefunc); + dl (EXPANSION_nullfunc); + dl (allocfunc); + dl (freefunc); + dl (dofunc); + dl (0xFFFFFFFF); /* end of table */ + + /* DataTable */ + datatable = here (); + dw (0xE000); /* INITBYTE */ + dw (0x0008); /* LN_TYPE */ + dw (0x0900); /* NT_LIBRARY */ + dw (0xC000); /* INITLONG */ + dw (0x000A); /* LN_NAME */ + dl (lib_name); + dw (0xE000); /* INITBYTE */ + dw (0x000E); /* LIB_FLAGS */ + dw (0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */ + dw (0xD000); /* INITWORD */ + dw (0x0027); /* LIB_VERSION */ + dw (UAEMAJOR); + dw (0xD000); /* INITWORD */ + dw (0x0016); /* LIB_REVISION */ + dw (UAEMINOR); + dw (0xC000); /* INITLONG */ + dw (0x0018); /* LIB_IDSTRING */ + dl (lib_id); + dw (0x0000); /* end of table */ + + lib_init = here (); + dl (SIZEOF_LIBRARY + TAGS_SIZE); /* size of lib base */ + dl (functable); + dl (datatable); + dl (initcode); +} -- 2.47.3