Mouse & Shared folder

About Qemu-system-ppc, a PPC Mac emulator for Windows, macOS and Linux that can run Mac OS 9.0 up to Mac OS X 10.5

Moderators: Cat_7, Ronald P. Regensburg

elliotnunn
Student Driver
Posts: 17
Joined: Sun Sep 11, 2016 6:35 am

Re: Mouse & Shared folder

Post by elliotnunn »

The Classic Environment ROM contains these 68k drivers, which I have not found anywhere else:

Code: Select all

type=DRVR   id=-21691   name=.APD               src=Rsrc/DRVR_-21691_APD
type=DRVR   id=-21692   name=.Wacom             src=Rsrc/DRVR_-21692_Wacom
type=DRVR   id=-21693   name=.BlueBoxSoundIn    src=Rsrc/DRVR_-21693_BlueBoxSoundIn
type=DRVR   id=-21719   name=.ClassicMouse      src=Rsrc/DRVR_-21719_ClassicMouse
Do any of these look suitable?

Alternatively, we could prepare a code fragment with the same functionality as KanjiTalk755's excellent application above. Similarly to the VGA driver, this fragment could be loaded by adding it to the device tree as a property. To function as a standalone fragment rather than a native driver, it could be inserted as a "pef,AAPL,MacOS,PowerPC,prepare" property with an accompanying "code,AAPL,MacOS,name" property.
Snizort
Space Cadet
Posts: 1
Joined: Mon Apr 20, 2020 4:08 am

Re: Mouse & Shared folder

Post by Snizort »

@kanjitalk755 do you need both your forked version of QEMU and your MacOS 9 binary to have absolute pointer support?

I am trying to get absolute pointer support working in https://github.com/utmapp/UTM (iOS QEMU) in order to use 9.2.2 on my iPad but am having bad luck with just the USBTablet app not doing anything.

It appears to open in the Guest OS but mouse pointer never ends up working.
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

You can use regular QEMU.
I tested under macOS10.15.5 and QEMU5.0.0, USBTablet app works well.
User avatar
adespoton
Forum All-Star
Posts: 4227
Joined: Fri Nov 27, 2009 5:11 am
Location: Emaculation.com
Contact:

Re: Mouse & Shared folder

Post by adespoton »

Snizort, do you have any better luck using USB Overdrive?
User avatar
mabam
Master Emulator
Posts: 497
Joined: Wed Apr 10, 2013 9:32 am

Re: Mouse & Shared folder

Post by mabam »

kanjitalk755 wrote: Tue Apr 30, 2019 10:28 am I have developed an application for mouse integration between QEMU and Mac OS 9.

https://github.com/kanjitalk755/macos9- ... t/releases
  • Expand USBTablet.sit and move to System Folder -> Startup Items.
    Append "-device usb-tablet" instead of "-device usb-mouse" to argument of QEMU.
This is experimental, you may lost mouse control.
Working perfectly here under Mac OS 9.2.2 in QEMU. Thank you very much!

Are you still considering turning this into a system extension?
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

I’d like to try that if there is a suitable INIT sample code.
However, converting to INIT does not change the functionality.
User avatar
mabam
Master Emulator
Posts: 497
Joined: Wed Apr 10, 2013 9:32 am

Re: Mouse & Shared folder

Post by mabam »

I’m aware it wouldn’t change functionality. But that’s perfect as is, your app is doing a great job.
It just would be nice to have it load during boot.

Sample code I found (other than what adespoton already found earlier):
https://www.ccs.neu.edu/home/futrelle/t ... mpler.html
https://68kmla.org/bb/index.php?threads ... ost-259660

I don’t know whether that suits your needs, though.
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

Unfortunately the samples are not suitable.
It should continue to receive null events until the OS shuts down.
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

kanjitalk755 wrote: Mon Nov 08, 2021 5:41 am Unfortunately the samples are not suitable.
It should continue to receive null events until the OS shuts down.
Here is some old code I managed to dig up. I don't exactly understand how this all works, being that it's been twenty years since I wrote this code, but it looks like it is an INIT that can patch both "SysTask()" and "GetNextEvent()". I don't quite understand how the GNE trap works, and I suspect some code is missing, but the code for trapping "SysTask()" seems to all be here.

Code: Select all

/************************************************************

    EventTrap.c
 

        Copyright Marcio Luis Teixeira, 1992.
        All rights reserved

************************************************************/

#define _EVENT_TRAP_
#define	D0MASK	0x0000FF00L				/*	To check for a non-null event	*/

#include <Pascal.h>

#include <SystemInfo.h>
#include <FileInfo.h>
#ifndef _NO_DIALOGS_
#include <Place Dialog.h>
#endif

#ifndef _NO_ERROR_
#include <Universal Error.h>
#endif

typedef pascal Boolean (*GNEPtr)(int,EventRecord*);
typedef pascal (*STaskPtr)(void);


pascal void 		ShowINIT(short iconID, short moveX);
void 				main(void);
void 				InstallMe(void);
void 				InstallSysTaskTrap();
void 				SysTaskFilter();
void				EventFilter(void);
int					EventTrap(Boolean IsEvent, EventRecord *TheEvent);
int					EventInit(Boolean *ShowIcon);

void 				GetCurResFileName(char *TheName,int *TheVol);

void 				SetUpResFile();
void 				RestoreResFile();

Boolean				IsRegistered;

ProcPtr				OldFilter;
ProcPtr				OldSysTask;

char				*ResFileName;
int					ResFileVol;

int					SavedVolume;
int					SavedResFile;
GrafPtr				SavedGrafPort;
int					ResRefNum;
Boolean				InstallTrap;
Boolean				InstallSysTask;
THz					SavedZone;

CGrafPtr 			port;
CGrafPort 			gp;

typedef struct
{
	char		filler[76];	/* internal QD storage */
	long		randSeed;
	BitMap		screenBits;
	Cursor		arrow;
	Pattern		dkGray;
	Pattern		ltGray;
	Pattern		gray;
	Pattern		black;
	Pattern		white;
	GrafPtr		thePort;
} QDStorage;

static QDStorage QDGlobals;
	
/* Initialization_____________________________________________________________________*/

void main()
{
	Handle			MyHandle;
	int				theIcon = OkIconID;
	Boolean			ShowIcon;
				
	/* save all system registers */
	asm {
		movem.l	a0-a5/d0-d7, -(SP)

	/*	set up A4 to point to top of resource to access global	*/

		LEA	main, a4	; put top address in A4

	/*	self-preservation		*/

		LEA	main, a0	; put address of resource in parameter
		_RecoverHandle
		move.l	a0, MyHandle	; who am i?
		
	/*   set up QuickDraw       */

		/*link	a5,#(-300)		; space for QuickDraw globals
		move.l	a5,CurrentA5	; we now have our own A5 world
		pea		-4(a5)
		_InitGraf
		
		move.l	CurrentA5,d0;
		sub.l	#206,d0;
		move.l	d0,QDGlobals;*/
		}
			
	InitGraf(&QDGlobals.thePort);

#ifndef _NO_DIALOGS_

#ifdef _INIT_FONTS_AND_WINDOWS_
	InitFonts();
	InitWindows();
	fontsDefined=TRUE;
#else
	fontsDefined=FALSE;
#endif

	toolboxDefined=FALSE;
#endif
	
	/*	Get Resource File Info	*/
	ResFileName="\0                                               ";
	GetCurResFileName(ResFileName,&ResFileVol);
	
#ifndef _NO_ERROR_
	InitUnivErr(univErrID);
#endif

	InitSystemInfo();
	InitFileInfo();
	

	/* open our port */
#ifndef _ScreenChooser_
	if (hasColorQD)
		OpenCPort(&gp);
	else
		OpenPort((GrafPtr)&gp);
		
	port = &gp;
#else
	if (hasColorQD)
		GetCWMgrPort(&port);
	else
		GetWMgrPort(&port);
#endif

	ShowIcon=TRUE;
	InstallTrap=TRUE;
	InstallSysTask=FALSE;

	HLock(MyHandle);
	DetachResource(MyHandle);

	/*	check for mouse button (to disable)	*/
	if(Button())
		theIcon = BadIconID;
	else {
		OSErr		TheError;
		char		*TempChar;
		    		
		if(EventInit(&ShowIcon))
			{
			if(InstallTrap) InstallMe();
			if(InstallSysTask) InstallSysTaskTrap();
			}
		else
			theIcon=BadIconID;
	}
	
	if(ShowIcon) ShowIconFamily(theIcon);
				
Exit:

/*	Restore state & exit	*/
	asm {
		movem.l	(SP)+, a0-a5/d0-d7		; restore registers
	}
}

/* Trap Instalation___________________________________________________________________*/

void InstallMe()
{
	OldFilter = JGNEFilter;
	JGNEFilter = (ProcPtr)EventFilter;
}

void InstallSysTaskTrap()
{
	OldSysTask=(ProcPtr)GetTrapAddress(0xA9BA);
	SetTrapAddress((long)SysTaskFilter,0xA9BA);
}
	
/* Trap Filters_______________________________________________________________________*/

void SysTaskFilter()
{
	long			myD0;
	Boolean			TempBool;

	asm {	
		movem.l	a1-a4/d1-d7, -(SP)		; save all registers
		LEA		main, A4				; set up globals
		move.l	D0, myD0				; save off D0
	}

	TempBool=EventTrap(FALSE,NULL);
	
	asm {
		move.l	OldSysTask, A0;		; Get old proc address	
		move.l	myD0, D0;
		movem.l	(SP)+, a1-a4/d1-d7	; restore registers
		UNLK 	A6					; Wipe local variables
		move.l	a0,-(sp)			; Push SystemTask address
		RTS                                                                                ; Jump back to where we were
	}
}

void EventFilter()
{
	long			myD0;
	EventRecord		*TheEvent;
	Boolean			IsEvent;
	Ptr				OldFxn;

	asm {	
		movem.l	a1-a4/d1-d7, -(SP)		; save all registers
		LEA		main, A4				; set up globals
		move.l	A1, TheEvent			; TheEvent -> Event Record
		move.l	D0, myD0				; save off D0
	}
	
	IsEvent=(Boolean)((myD0 & D0MASK)?1:0);	/* is there an event?	*/
			
	if (!EventTrap(IsEvent,TheEvent))
	{	
		if (IsEvent) {						/* fake a null event	*/
			myD0 = 0L;
			asm {
				clr.b	8(A6)	; and set the pascal return value too
			}
		}
	}
	
	asm {
		move.l	OldFilter, A0;		; Get old GNE filter
		move.l	myD0, D0;
		movem.l	(SP)+, a1-a4/d1-d7	; restore registers
		UNLK 	A6				; Wipe local variables
		cmp.l	#0, a0			; Check to see if there is another filter
		beq.s	@1
		move.l	a0,-(sp)		; if so, push the next filter's address
	@1
		RTS                                                                                ; Jump back to where we were
	}
}

/* Utilities________________________________________________________________________*/

void GetCurResFileName(char *TheName,int *TheVol)
	{
	FCBPBRec		TheParam;
	OSErr			TheError;
	
	long			gestaltResult;
	int				tempInt;
			
	TheParam.ioCompletion=NULL;
	TheParam.ioNamePtr=(StringPtr)TheName;
	TheParam.ioVRefNum=0;
	TheParam.ioRefNum=CurResFile();
	TheParam.ioFCBIndx=0;
	TheError=PBGetFCBInfo(&TheParam,FALSE);
	
	TheError=GetVol(NULL,TheVol);
	}
	
void SetSysZone(Boolean SetSys)
	{
	if(SetSys)
		{
		SavedZone=GetZone();
		SetZone(SystemZone());
		}
	else
		SetZone(SavedZone);
	}

void SetUpResFile()
	{
	OSErr	TheError;
	
	TheError=GetVol(NULL,&SavedVolume);
	SavedResFile=CurResFile();
	
	TheError=SetVol(NULL,ResFileVol);
		
	ResRefNum=OpenResFile(ResFileName);
	GetPort(&SavedGrafPort);
	}

void RestoreResFile()
	{
	OSErr	TheError;
	
	CloseResFile(ResRefNum);
	TheError=SetVol(NULL,SavedVolume);
	UseResFile(SavedResFile);
	SetPort(SavedGrafPort);
	}
	
void PutUpMessage(int ListID,int ErrorNum)
	{
	GrafPort	TempPort;
	Rect		TempRect;
	int			MessLenght;
	Str255		errorStr;
	char		*msg;	
	
	if(ErrorNum==-1)
		NumToString((long)ListID,errorStr);
	else
		GetIndString(errorStr,ListID,ErrorNum);
	
	if(errorStr[0]==0)
		msg="\pCan't find needed resource! This file is damaged!";
	else
		msg=(char *)errorStr;
	
	OpenPort(&TempPort);
	TextSize(9);
	TextFont(geneva);
	MessLenght=StringWidth(msg)+10;
	SetRect(&TempRect,42,42,42+MessLenght,59);
	PaintRect(&TempRect);
	OffsetRect(&TempRect,-2,-2);
	EraseRect(&TempRect);
	FrameRect(&TempRect);
	MoveTo(45,52);
	DrawString(msg);
	}
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

It looks like you use that code and then you declare the following two routines elsewhere to do the actual work:

Code: Select all

int EventInit(Boolean *ShowIcon) {
	// Initialize your stuff here, return TRUE if you want the system traps to be installed
	return TRUE;
}

int EventTrap(Boolean isEvent, EventRecord *TheEvent) {
	// This basically allows you to filter events
	// if you return false, it appears that the event is removed. Otherwise, it is passed on to the application
}
The stuff for showing the icon is missing but you should be able to comment it out.
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

Thank you for providing the source.
Do you have a PowerPC sample?
I need USBManagerLib and HIDLib for my purpose and can't build for 68k target with them.
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

kanjitalk755 wrote: Thu Dec 16, 2021 1:25 am Thank you for providing the source.
Do you have a PowerPC sample?
I need USBManagerLib and HIDLib for my purpose and can't build for 68k target with them.
No, sadly, I hardly have any experience with PPC development. I imagine some things are similar, like you probably still want to set a callback to JGNEFilter, which is a global variable, but obviously the assembly code would all be different. The Mixed Mode Manager might be able to help. You may want to google "JGNEFilter" and "PPC" as that might give you some example code to go on.

If you do find something, please let me know. I am starting to collect interesting Mac programming resources on this page:

https://github.com/marciot/mac68k-hacks
mcayland
Mac Mechanic
Posts: 152
Joined: Sun Nov 01, 2015 10:33 pm

Re: Mouse & Shared folder

Post by mcayland »

marciot42 wrote: Thu Dec 16, 2021 4:22 am No, sadly, I hardly have any experience with PPC development. I imagine some things are similar, like you probably still want to set a callback to JGNEFilter, which is a global variable, but obviously the assembly code would all be different. The Mixed Mode Manager might be able to help. You may want to google "JGNEFilter" and "PPC" as that might give you some example code to go on.

If you do find something, please let me know. I am starting to collect interesting Mac programming resources on this page:

https://github.com/marciot/mac68k-hacks
Well if you are interested in m68k Mac programming then I can certainly come up with some QEMU-related ideas :wink: . I'm slowly working on getting the MacOS m68k patches upstream, but if you have experience with writing device drivers then things that would be very useful:

- Implement a new Nubus graphics card which is a simple dumb framebuffer (incl. Declaration ROM) for QEMU
- Split existing VGA driver at [1] into common and PPC PCI parts, add the support for above Nubus graphics card
(This will allow support for extended resolutions)
- Add common virtio transport code to [1] using virtio-mmio
- Implement a new Nubus card and Declaration ROM for virtio-scsi for super-fast IO
- Implement a new Nubus card and Declaration ROM for virtfs-9p or virtiofsd to allow easy file sharing with the host

[1] https://github.com/qemu/QemuMacDrivers/

Let me know if any of these ideas are interesting to you :lol:
User avatar
adespoton
Forum All-Star
Posts: 4227
Joined: Fri Nov 27, 2009 5:11 am
Location: Emaculation.com
Contact:

Re: Mouse & Shared folder

Post by adespoton »

mcayland wrote: Thu Dec 16, 2021 9:39 am
marciot42 wrote: Thu Dec 16, 2021 4:22 am No, sadly, I hardly have any experience with PPC development. I imagine some things are similar, like you probably still want to set a callback to JGNEFilter, which is a global variable, but obviously the assembly code would all be different. The Mixed Mode Manager might be able to help. You may want to google "JGNEFilter" and "PPC" as that might give you some example code to go on.

If you do find something, please let me know. I am starting to collect interesting Mac programming resources on this page:

https://github.com/marciot/mac68k-hacks
Well if you are interested in m68k Mac programming then I can certainly come up with some QEMU-related ideas :wink: . I'm slowly working on getting the MacOS m68k patches upstream, but if you have experience with writing device drivers then things that would be very useful:

- Implement a new Nubus graphics card which is a simple dumb framebuffer (incl. Declaration ROM) for QEMU
- Split existing VGA driver at [1] into common and PPC PCI parts, add the support for above Nubus graphics card
(This will allow support for extended resolutions)
- Add common virtio transport code to [1] using virtio-mmio
- Implement a new Nubus card and Declaration ROM for virtio-scsi for super-fast IO
- Implement a new Nubus card and Declaration ROM for virtfs-9p or virtiofsd to allow easy file sharing with the host

[1] https://github.com/qemu/QemuMacDrivers/

Let me know if any of these ideas are interesting to you :lol:
Mark, on item two, is there any interest in adding video breakout code to qemu-m68k like Mini vMac and BII use? It allows the actual emulator to be content with shared RAM/VRAM but support a real screen of arbitrary size and depth. A bit outside what qemu usually supports though.
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

kanjitalk755 wrote: Thu Dec 16, 2021 1:25 am Thank you for providing the source.
Do you have a PowerPC sample?
I need USBManagerLib and HIDLib for my purpose and can't build for 68k target with them.
I have recently come across an INIT starter project for CW8. It appears as if it might be PPC compatible. It is called "extensionshell1.4.sit.hqx" and you can download it from here:

https://web.archive.org/web/20211216043 ... nt/source/

This is a Wayback Machine link, even though the original site still exists. If you come across broken links, please click the "Save this url in the Wayback Machine" button to force them to cache it. There is a lot of useful stuff in that UMICH archive, and I think it is helpful to make an extra copy of it on the Wayback Machine just in case it ever goes offline.
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

marciot42 wrote: Thu Dec 23, 2021 8:59 pm I have recently come across an INIT starter project for CW8. It appears as if it might be PPC compatible. It is called "extensionshell1.4.sit.hqx" and you can download it from here:
It seems to be 68k exclusive.
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

kanjitalk755 wrote: Thu Dec 30, 2021 3:32 am
marciot42 wrote: Thu Dec 23, 2021 8:59 pm I have recently come across an INIT starter project for CW8. It appears as if it might be PPC compatible. It is called "extensionshell1.4.sit.hqx" and you can download it from here:
It seems to be 68k exclusive.
Is it though? There are bits of code like:

Code: Select all

#ifndef powerc
	SetA4(oldA4);
#endif
And:

Code: Select all

SelectorFunctionUPP		theUPP;
And:

Code: Select all

pascal Boolean IsPowerMac(void)
{	long		result;
	OSErr		theErr;
	
	
	theErr = Gestalt(gestaltSysArchitecture, &result);
	if (theErr == noErr && result == gestaltPowerPC)
		return(true);
	else
		return(false);
}
This at least implies to me the code is PowerPC aware.
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

Another piece of code which *DEFINITELY* is PowerPC compatible is ChromiVNC

https://web.archive.org/web/20070209043 ... x.net/vnc/

Inside the source directory there is an INIT, called vncPatches.c. They specifically say that INIT does not work under 68k, so it has to be PPC compatible.
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

Thanks for the great sample!
I was able to create an INIT version of USBTablet.

https://github.com/kanjitalk755/macos9- ... t/releases
User avatar
mabam
Master Emulator
Posts: 497
Joined: Wed Apr 10, 2013 9:32 am

Re: Mouse & Shared folder

Post by mabam »

Works perfect here. Thank you both!
marciot42
Inquisitive Elf
Posts: 39
Joined: Wed Feb 26, 2014 2:21 pm

Re: Mouse & Shared folder

Post by marciot42 »

kanjitalk755 wrote: Thu Dec 30, 2021 2:24 pm Thanks for the great sample!
I was able to create an INIT version of USBTablet.

https://github.com/kanjitalk755/macos9- ... t/releases
Just curious, which sample did you end up using? The ChromiVNC or the Extension Shell?
User avatar
adespoton
Forum All-Star
Posts: 4227
Joined: Fri Nov 27, 2009 5:11 am
Location: Emaculation.com
Contact:

Re: Mouse & Shared folder

Post by adespoton »

Another question: any chance of rolling this into an add-on for qemu-system-m68k as a code fragment like elliotnunn proposed? Seems like all the code already exists; we just need someone with CFM experience to extract the bit from the init that needs to be injected at QEMU BIOS load time.
User avatar
mabam
Master Emulator
Posts: 497
Joined: Wed Apr 10, 2013 9:32 am

Re: Mouse & Shared folder

Post by mabam »

kanjitalk755 wrote: Thu Dec 30, 2021 2:24 pm Thanks for the great sample!
I was able to create an INIT version of USBTablet.

https://github.com/kanjitalk755/macos9- ... t/releases

I’ve created an icon for the INIT. Find “USB Tablet INIT icon.zip” at https://c.web.de/@337526389169198226/Yi ... XaxP0sxWmw and extract it. It contains the resources icl4, icl8, ICN#, icns, ics#, ics4, and ics8.

It’s nothing special but if you like it, feel free to apply it to USB Tablet INIT.
kanjitalk755
Apple Corer
Posts: 239
Joined: Thu Nov 09, 2017 12:06 pm

Re: Mouse & Shared folder

Post by kanjitalk755 »

marciot42 wrote: Fri Dec 31, 2021 3:00 pm Just curious, which sample did you end up using? The ChromiVNC or the Extension Shell?
ChromiVNC's INIT Dispatcher.c, ResourceRunner.cp and ShowInitIcon.c were very helpful.
adespoton wrote: Sat Jan 01, 2022 9:58 pm Another question: any chance of rolling this into an add-on for qemu-system-m68k as a code fragment like elliotnunn proposed? Seems like all the code already exists; we just need someone with CFM experience to extract the bit from the init that needs to be injected at QEMU BIOS load time.
USBTabletINIT requires MacOS 9 or above, so it cannot be used with 68k.
mabam wrote: Sat Jan 01, 2022 10:52 pm I’ve created an icon for the INIT. Find “USB Tablet INIT icon.zip” at https://c.web.de/@337526389169198226/Yi ... XaxP0sxWmw and extract it. It contains the resources icl4, icl8, ICN#, icns, ics#, ics4, and ics8.

It’s nothing special but if you like it, feel free to apply it to USB Tablet INIT.
I merged your icons and released it.
User avatar
mabam
Master Emulator
Posts: 497
Joined: Wed Apr 10, 2013 9:32 am

Re: Mouse & Shared folder

Post by mabam »

kanjitalk755 wrote: Sun Jan 02, 2022 9:08 am I merged your icons and released it.

Thank you.

The icon shows when the extensions are loaded during boot. It does not appear in the System Extensions folder though, there “USB Tablet INIT” shows a blank icon as before.
Post Reply