diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs
index f8454a0dc5..aef0012cde 100644
--- a/BizHawk.Client.Common/RomLoader.cs
+++ b/BizHawk.Client.Common/RomLoader.cs
@@ -259,7 +259,7 @@ namespace BizHawk.Client.Common
 								nextEmulator = new PSP(nextComm, file.Name);
 								break;
 							case "PSX":
-								nextEmulator = new Octoshock(nextComm, disc);
+								nextEmulator = new Octoshock(nextComm, disc, null);
 								nextEmulator.CoreComm.RomStatusDetails = "PSX etc.";
 								break;
 							case "PCE":
@@ -306,6 +306,12 @@ namespace BizHawk.Client.Common
 					{
 						rom = new RomGame(file);
 
+						//hacky for now
+						if (file.Extension.ToLower() == ".exe")
+						{
+							rom.GameInfo.System = "PSX";
+						}
+
 						if (string.IsNullOrEmpty(rom.GameInfo.System))
 						{
 							// Has the user picked a preference for this extension?
@@ -406,6 +412,10 @@ namespace BizHawk.Client.Common
 								//core = CoreInventory.Instance["GBA", "Meteor"];
 								core = CoreInventory.Instance["GBA", "VBA-Next"];
 								break;
+							case "PSX":
+								nextEmulator = new Octoshock(nextComm, null, rom.FileData);
+								nextEmulator.CoreComm.RomStatusDetails = "PSX etc.";
+								break;
 							case "DEBUG":
 								if (VersionInfo.DeveloperBuild)
 								{
diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs
index 292801aad1..4547b76cab 100644
--- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs
@@ -74,6 +74,9 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
 			disposed = true;
 		}
 
+		/// <summary>
+		/// Wraps the ShockDiscRef returned from the DLL and acts as a bridge between it and a DiscSystem disc
+		/// </summary>
 		class DiscInterface : IDisposable
 		{
 			public DiscInterface(DiscSystem.Disc disc, Action cbActivity)
@@ -164,7 +167,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
 
 		//note: its annoying that we have to have a disc before constructing this.
 		//might want to change that later. HOWEVER - we need to definitely have a region, at least
-		public Octoshock(CoreComm comm, DiscSystem.Disc disc)
+		public Octoshock(CoreComm comm, DiscSystem.Disc disc, byte[] exe)
 		{
 			ServiceProvider = new BasicServiceProvider(this);
 			CoreComm = comm;
@@ -174,27 +177,38 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
 			Attach();
 
 			this.disc = disc;
-			discInterface = new DiscInterface(disc, 
-				() =>
-				{
-					//if current disc this delegate disc, activity is happening
-					if (disc == this.disc)
-						CoreComm.DriveLED = true;
-				});
 
-			//determine region of the provided disc
-			OctoshockDll.ShockDiscInfo discInfo;
-			OctoshockDll.shock_AnalyzeDisc(discInterface.OctoshockHandle, out discInfo);
-
-			//try to acquire the appropriate firmware
 			string firmwareRegion = "U";
-			if(discInfo.region == OctoshockDll.eRegion.EU) firmwareRegion = "E";
-			if (discInfo.region == OctoshockDll.eRegion.JP) firmwareRegion = "J";
+			OctoshockDll.eRegion region = OctoshockDll.eRegion.NA;
+
+			if (disc != null)
+			{
+				discInterface = new DiscInterface(disc,
+					() =>
+					{
+						//if current disc this delegate disc, activity is happening
+						if (disc == this.disc)
+							CoreComm.DriveLED = true;
+					});
+
+				//determine region of the provided disc
+				OctoshockDll.ShockDiscInfo discInfo;
+				OctoshockDll.shock_AnalyzeDisc(discInterface.OctoshockHandle, out discInfo);
+
+				//try to acquire the appropriate firmware
+				if (discInfo.region == OctoshockDll.eRegion.EU) firmwareRegion = "E";
+				if (discInfo.region == OctoshockDll.eRegion.JP) firmwareRegion = "J";
+			}
+			else
+			{
+				//assume its NA region for test programs, for now. could it be read out of the ps-exe header?
+			}
+
 			byte[] firmware = comm.CoreFileProvider.GetFirmware("PSX", "U", true, "A PSX `" + firmwareRegion + "` region bios file is required");
 
 			//create the instance
 			fixed (byte* pFirmware = firmware)
-				OctoshockDll.shock_Create(out psx, discInfo.region, pFirmware);
+				OctoshockDll.shock_Create(out psx, region, pFirmware);
 
 			SetMemoryDomains();
 
@@ -214,10 +228,18 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
 			VirtualWidth = 800;
 			VirtualHeight = 480;
 
-
-			OctoshockDll.shock_OpenTray(psx);
-			OctoshockDll.shock_SetDisc(psx, discInterface.OctoshockHandle);
-			OctoshockDll.shock_CloseTray(psx);
+			if (disc != null)
+			{
+				OctoshockDll.shock_OpenTray(psx);
+				OctoshockDll.shock_SetDisc(psx, discInterface.OctoshockHandle);
+				OctoshockDll.shock_CloseTray(psx);
+			}
+			else
+			{
+				//must be an exe
+				fixed (byte* pExeBuffer = exe)
+					OctoshockDll.shock_MountEXE(psx, pExeBuffer, exe.Length);
+			}
 			OctoshockDll.shock_Peripheral_Connect(psx, 0x01, OctoshockDll.ePeripheralType.DualShock);
 			OctoshockDll.shock_PowerOn(psx);
 		}
diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs
index 95ee653cca..1f46c7f787 100644
--- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs
@@ -136,6 +136,9 @@ public unsafe static class OctoshockDll
 	[DllImport("octoshock.dll")]
 	public static extern int shock_Peripheral_MemcardTransact(IntPtr psx, int address, ref ShockMemcardTransaction transaction);
 
+	[DllImport("octoshock.dll")]
+	public static extern int shock_MountEXE(IntPtr psx, void* exebuf, int size);
+
 	[DllImport("octoshock.dll")]
 	public static extern int shock_PowerOn(IntPtr psx);
 
diff --git a/BizHawk.Emulation.Cores/FileID.cs b/BizHawk.Emulation.Cores/FileID.cs
index 06db1731a4..fa913d5da6 100644
--- a/BizHawk.Emulation.Cores/FileID.cs
+++ b/BizHawk.Emulation.Cores/FileID.cs
@@ -27,7 +27,8 @@ namespace BizHawk.Emulation.Cores
 		Multiple, //dont think this makes sense. shouldnt the multiple options be returned?
 
 		Disc, //an unknown disc
-		PSX, PSP, 
+		PSX, PSX_EXE,
+		PSP, 
 		Saturn, MegaCD,
 
 		PCE, SGX, TurboCD,
@@ -264,7 +265,8 @@ namespace BizHawk.Emulation.Cores
 			public static SimpleMagicRecord SEGASATURN = new SimpleMagicRecord { Offset = 0, Key = "SEGA SEGASATURN" };
 			public static SimpleMagicRecord SEGADISCSYSTEM = new SimpleMagicRecord { Offset = 0, Key = "SEGADISCSYSTEM" };
 
-			public static SimpleMagicRecord PSX = new SimpleMagicRecord { Offset = 0x24E0, Key = "  Licensed  by          Sony Computer Entertainment" };
+			public static SimpleMagicRecord PSX = new SimpleMagicRecord { Offset = 0x24E0, Key = "  Licensed  by          Sony Computer Entertainment" }; //there might be other ideas for checking in mednafen sources, if we need them
+			public static SimpleMagicRecord PSX_EXE = new SimpleMagicRecord { Key = "PS-X EXE\0" };
 			public static SimpleMagicRecord PSP = new SimpleMagicRecord { Offset = 0x8000, Key = "\x01CD001\x01\0x00PSP GAME" };
 
 			//https://sites.google.com/site/atari7800wiki/a78-header
@@ -312,6 +314,8 @@ namespace BizHawk.Emulation.Cores
 			{ "JAD", new ExtensionInfo(FileIDType.Multiple, Test_JAD_JAC ) },
 			{ "JAC", new ExtensionInfo(FileIDType.Multiple, Test_JAD_JAC ) },
 
+			{ "EXE", new ExtensionInfo(FileIDType.PSX_EXE, (j)=>Test_Simple(j,FileIDType.PSX_EXE,SimpleMagics.PSX_EXE) ) },
+
 			//royal mess
 			{ "MD", new ExtensionInfo(FileIDType.SMD, null ) },
 			{ "SMD", new ExtensionInfo(FileIDType.SMD, null ) },
diff --git a/output/dll/octoshock.dll b/output/dll/octoshock.dll
index 76ea6a2e24..20162735f3 100644
Binary files a/output/dll/octoshock.dll and b/output/dll/octoshock.dll differ
diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp
index b54bf559d6..8ca7e77ea9 100644
--- a/psx/octoshock/psx/psx.cpp
+++ b/psx/octoshock/psx/psx.cpp
@@ -1554,177 +1554,187 @@ EW_EXPORT s32 shock_GetFramebuffer(void* psx, ShockFramebufferInfo* fb)
 
 static void LoadEXE(const uint8 *data, const uint32 size, bool ignore_pcsp = false)
 {
-// uint32 PC;
-// uint32 SP;
-// uint32 TextStart;
-// uint32 TextSize;
-//
-// if(size < 0x800)
-//  throw(MDFN_Error(0, "PS-EXE is too small."));
-//
-// PC = MDFN_de32lsb(&data[0x10]);
-// SP = MDFN_de32lsb(&data[0x30]);
-// TextStart = MDFN_de32lsb(&data[0x18]);
-// TextSize = MDFN_de32lsb(&data[0x1C]);
-//
-// if(ignore_pcsp)
-//  printf("TextStart=0x%08x\nTextSize=0x%08x\n", TextStart, TextSize);
-// else
-//  printf("PC=0x%08x\nSP=0x%08x\nTextStart=0x%08x\nTextSize=0x%08x\n", PC, SP, TextStart, TextSize);
-//
-// TextStart &= 0x1FFFFF;
-//
-// if(TextSize > 2048 * 1024)
-// {
-//  throw(MDFN_Error(0, "Text section too large"));
-// }
-//
-// if(TextSize > (size - 0x800))
-//  throw(MDFN_Error(0, "Text section recorded size is larger than data available in file.  Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
-//
-// if(TextSize < (size - 0x800))
-//  throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file.  Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
-//
-// if(!TextMem.size())
-// {
-//  TextMem_Start = TextStart;
-//  TextMem.resize(TextSize);
-// }
-//
-// if(TextStart < TextMem_Start)
-// {
-//  uint32 old_size = TextMem.size();
-//
-//  //printf("RESIZE: 0x%08x\n", TextMem_Start - TextStart);
-//
-//  TextMem.resize(old_size + TextMem_Start - TextStart);
-//  memmove(&TextMem[TextMem_Start - TextStart], &TextMem[0], old_size);
-//
-//  TextMem_Start = TextStart;
-// }
-//
-// if(TextMem.size() < (TextStart - TextMem_Start + TextSize))
-//  TextMem.resize(TextStart - TextMem_Start + TextSize);
-//
-// memcpy(&TextMem[TextStart - TextMem_Start], data + 0x800, TextSize);
-//
-//
-// //
-// //
-// //
-//
-// // BIOS patch
-// BIOSROM->WriteU32(0x6990, (3 << 26) | ((0xBF001000 >> 2) & ((1 << 26) - 1)));
-//// BIOSROM->WriteU32(0x691C, (3 << 26) | ((0xBF001000 >> 2) & ((1 << 26) - 1)));
-//
-//// printf("INSN: 0x%08x\n", BIOSROM->ReadU32(0x6990));
-//// exit(1);
-// uint8 *po;
-//
-// po = &PIOMem->data8[0x0800];
-//
-// MDFN_en32lsb(po, (0x0 << 26) | (31 << 21) | (0x8 << 0));	// JR
-// po += 4;
-// MDFN_en32lsb(po, 0);	// NOP(kinda)
-// po += 4;
-//
-// po = &PIOMem->data8[0x1000];
-//
-// // Load cacheable-region target PC into r2
-// MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (0x9F001010 >> 16));      // LUI
-// po += 4;
-// MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (0x9F001010 & 0xFFFF));   // ORI
-// po += 4;
-//
-// // Jump to r2
-// MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0));	// JR
-// po += 4;
-// MDFN_en32lsb(po, 0);	// NOP(kinda)
-// po += 4;
-//
-// //
-// // 0x9F001010:
-// //
-//
-// // Load source address into r8
-// uint32 sa = 0x9F000000 + 65536;
-// MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (sa >> 16));	// LUI
-// po += 4;
-// MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (8 << 16) | (sa & 0xFFFF)); 	// ORI
-// po += 4;
-//
-// // Load dest address into r9
-// MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | (TextMem_Start >> 16));	// LUI
-// po += 4;
-// MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (9 << 16) | (TextMem_Start & 0xFFFF)); 	// ORI
-// po += 4;
-//
-// // Load size into r10
-// MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | (TextMem.size() >> 16));	// LUI
-// po += 4;
-// MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (10 << 16) | (TextMem.size() & 0xFFFF)); 	// ORI
-// po += 4;
-//
-// //
-// // Loop begin
-// //
-// 
-// MDFN_en32lsb(po, (0x24 << 26) | (8 << 21) | (1 << 16));	// LBU to r1
-// po += 4;
-//
-// MDFN_en32lsb(po, (0x08 << 26) | (10 << 21) | (10 << 16) | 0xFFFF);	// Decrement size
-// po += 4;
-//
-// MDFN_en32lsb(po, (0x28 << 26) | (9 << 21) | (1 << 16));	// SB from r1
-// po += 4;
-//
-// MDFN_en32lsb(po, (0x08 << 26) | (8 << 21) | (8 << 16) | 0x0001);	// Increment source addr
-// po += 4;
-//
-// MDFN_en32lsb(po, (0x05 << 26) | (0 << 21) | (10 << 16) | (-5 & 0xFFFF));
-// po += 4;
-// MDFN_en32lsb(po, (0x08 << 26) | (9 << 21) | (9 << 16) | 0x0001);	// Increment dest addr
-// po += 4;
-//
-// //
-// // Loop end
-// //
-//
-// // Load SP into r29
-// if(ignore_pcsp)
-// {
-//  po += 16;
-// }
-// else
-// {
-//  MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | (SP >> 16));	// LUI
-//  po += 4;
-//  MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (29 << 16) | (SP & 0xFFFF)); 	// ORI
-//  po += 4;
-//
-//  // Load PC into r2
-//  MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | ((PC >> 16) | 0x8000));      // LUI
-//  po += 4;
-//  MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (PC & 0xFFFF));   // ORI
-//  po += 4;
-// }
-//
-// // Half-assed instruction cache flush. ;)
-// for(unsigned i = 0; i < 1024; i++)
-// {
-//  MDFN_en32lsb(po, 0);
-//  po += 4;
-// }
-//
-//
-//
-// // Jump to r2
-// MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0));	// JR
-// po += 4;
-// MDFN_en32lsb(po, 0);	// NOP(kinda)
-// po += 4;
+ uint32 PC;
+ uint32 SP;
+ uint32 TextStart;
+ uint32 TextSize;
+
+ //TODO ERROR HANDLING
+ //if(size < 0x800)
+ // throw(MDFN_Error(0, "PS-EXE is too small."));
+
+ PC = MDFN_de32lsb(&data[0x10]);
+ SP = MDFN_de32lsb(&data[0x30]);
+ TextStart = MDFN_de32lsb(&data[0x18]);
+ TextSize = MDFN_de32lsb(&data[0x1C]);
+
+ if(ignore_pcsp)
+  printf("TextStart=0x%08x\nTextSize=0x%08x\n", TextStart, TextSize);
+ else
+  printf("PC=0x%08x\nSP=0x%08x\nTextStart=0x%08x\nTextSize=0x%08x\n", PC, SP, TextStart, TextSize);
+
+ TextStart &= 0x1FFFFF;
+
+ if(TextSize > 2048 * 1024)
+ {
+	 //TODO ERROR HANDLING
+  //throw(MDFN_Error(0, "Text section too large"));
+ }
+
+ //TODO ERROR HANDLING
+ /*if(TextSize > (size - 0x800))
+  throw(MDFN_Error(0, "Text section recorded size is larger than data available in file.  Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
+
+ if(TextSize < (size - 0x800))
+  throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file.  Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));*/
+
+ if(!TextMem.size())
+ {
+  TextMem_Start = TextStart;
+  TextMem.resize(TextSize);
+ }
+
+ if(TextStart < TextMem_Start)
+ {
+  uint32 old_size = TextMem.size();
+
+  //printf("RESIZE: 0x%08x\n", TextMem_Start - TextStart);
+
+  TextMem.resize(old_size + TextMem_Start - TextStart);
+  memmove(&TextMem[TextMem_Start - TextStart], &TextMem[0], old_size);
+
+  TextMem_Start = TextStart;
+ }
+
+ if(TextMem.size() < (TextStart - TextMem_Start + TextSize))
+  TextMem.resize(TextStart - TextMem_Start + TextSize);
+
+ memcpy(&TextMem[TextStart - TextMem_Start], data + 0x800, TextSize);
+
+
+ //
+ //
+ //
+
+ // BIOS patch
+ BIOSROM->WriteU32(0x6990, (3 << 26) | ((0xBF001000 >> 2) & ((1 << 26) - 1)));
+// BIOSROM->WriteU32(0x691C, (3 << 26) | ((0xBF001000 >> 2) & ((1 << 26) - 1)));
+
+// printf("INSN: 0x%08x\n", BIOSROM->ReadU32(0x6990));
+// exit(1);
+ uint8 *po;
+
+ po = &PIOMem->data8[0x0800];
+
+ MDFN_en32lsb(po, (0x0 << 26) | (31 << 21) | (0x8 << 0));	// JR
+ po += 4;
+ MDFN_en32lsb(po, 0);	// NOP(kinda)
+ po += 4;
+
+ po = &PIOMem->data8[0x1000];
+
+ // Load cacheable-region target PC into r2
+ MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (0x9F001010 >> 16));      // LUI
+ po += 4;
+ MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (0x9F001010 & 0xFFFF));   // ORI
+ po += 4;
+
+ // Jump to r2
+ MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0));	// JR
+ po += 4;
+ MDFN_en32lsb(po, 0);	// NOP(kinda)
+ po += 4;
+
+ //
+ // 0x9F001010:
+ //
+
+ // Load source address into r8
+ uint32 sa = 0x9F000000 + 65536;
+ MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (sa >> 16));	// LUI
+ po += 4;
+ MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (8 << 16) | (sa & 0xFFFF)); 	// ORI
+ po += 4;
+
+ // Load dest address into r9
+ MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | (TextMem_Start >> 16));	// LUI
+ po += 4;
+ MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (9 << 16) | (TextMem_Start & 0xFFFF)); 	// ORI
+ po += 4;
+
+ // Load size into r10
+ MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | (TextMem.size() >> 16));	// LUI
+ po += 4;
+ MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (10 << 16) | (TextMem.size() & 0xFFFF)); 	// ORI
+ po += 4;
+
+ //
+ // Loop begin
+ //
+ 
+ MDFN_en32lsb(po, (0x24 << 26) | (8 << 21) | (1 << 16));	// LBU to r1
+ po += 4;
+
+ MDFN_en32lsb(po, (0x08 << 26) | (10 << 21) | (10 << 16) | 0xFFFF);	// Decrement size
+ po += 4;
+
+ MDFN_en32lsb(po, (0x28 << 26) | (9 << 21) | (1 << 16));	// SB from r1
+ po += 4;
+
+ MDFN_en32lsb(po, (0x08 << 26) | (8 << 21) | (8 << 16) | 0x0001);	// Increment source addr
+ po += 4;
+
+ MDFN_en32lsb(po, (0x05 << 26) | (0 << 21) | (10 << 16) | (-5 & 0xFFFF));
+ po += 4;
+ MDFN_en32lsb(po, (0x08 << 26) | (9 << 21) | (9 << 16) | 0x0001);	// Increment dest addr
+ po += 4;
+
+ //
+ // Loop end
+ //
+
+ // Load SP into r29
+ if(ignore_pcsp)
+ {
+  po += 16;
+ }
+ else
+ {
+  MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | (SP >> 16));	// LUI
+  po += 4;
+  MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (29 << 16) | (SP & 0xFFFF)); 	// ORI
+  po += 4;
+
+  // Load PC into r2
+  MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16)  | ((PC >> 16) | 0x8000));      // LUI
+  po += 4;
+  MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (PC & 0xFFFF));   // ORI
+  po += 4;
+ }
+
+ // Half-assed instruction cache flush. ;)
+ for(unsigned i = 0; i < 1024; i++)
+ {
+  MDFN_en32lsb(po, 0);
+  po += 4;
+ }
+
+
+
+ // Jump to r2
+ MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0));	// JR
+ po += 4;
+ MDFN_en32lsb(po, 0);	// NOP(kinda)
+ po += 4;
 }
 
+EW_EXPORT s32 shock_MountEXE(void* psx, void* exebuf, int size)
+{
+	LoadEXE((uint8*)exebuf, (uint32)size);
+	return SHOCK_OK;
+}
+
+
 #ifdef WANT_PSF
 PSF1Loader::PSF1Loader(MDFNFILE *fp)
 {
@@ -1744,72 +1754,6 @@ void PSF1Loader::HandleEXE(const uint8 *data, uint32 size, bool ignore_pcsp)
 }
 #endif
 
-//static void Cleanup(void);
-//static int Load(MDFNFILE *fp)
-//{
-// try
-// {
-//  const bool IsPSF = PSFLoader::TestMagic(0x01, fp);
-//
-//  if(!TestMagic(fp))
-//   throw MDFN_Error(0, _("File format is unknown to module \"%s\"."), MDFNGameInfo->shortname);
-//
-//// For testing.
-//#if 0
-//  #warning "GREMLINS GREMLINS EVERYWHEREE IYEEEEEE"
-//  #warning "Seriously, GREMLINS!  Or peanut butter.  Or maybe...DINOSAURS."
-//
-//  static std::vector<CDIF *> CDInterfaces;
-//
-//  //CDInterfaces.push_back(CDIF_Open("/home/sarah-projects/psxdev/tests/cd/adpcm.cue", false, false));
-//  //CDInterfaces.push_back(CDIF_Open("/extra/games/PSX/Tony Hawk's Pro Skater 2 (USA)/Tony Hawk's Pro Skater 2 (USA).cue", false, false));
-//  //CDInterfaces.push_back(CDIF_Open("/extra/games/PSX/Jumping Flash! (USA)/Jumping Flash! (USA).cue", false, false));
-//  //CDInterfaces.push_back(CDIF_Open("/extra/games/PC-FX/Blue Breaker.cue", false, false));
-//  CDInterfaces.push_back(CDIF_Open("/dev/cdrom2", true, false));
-//  InitCommon(&CDInterfaces, !IsPSF, true);
-//#else
-//  InitCommon(NULL, !IsPSF, true);
-//#endif
-//
-//  TextMem.resize(0);
-//
-//  if(IsPSF)
-//  {
-//   psf_loader = new PSF1Loader(fp);
-//
-//   std::vector<std::string> SongNames;
-//
-//   SongNames.push_back(psf_loader->tags.GetTag("title"));
-//
-//   Player_Init(1, psf_loader->tags.GetTag("game"), psf_loader->tags.GetTag("artist"), psf_loader->tags.GetTag("copyright"), SongNames);
-//  }
-//  else
-//   LoadEXE(fp->data, fp->size);
-// }
-// catch(std::exception &e)
-// {
-//  Cleanup();
-//  throw;
-// }
-//
-// return(1);
-//}
-
-//static void LoadCD(std::vector<CDIF *> *CDInterfaces)
-//{
-// try
-// {
-//  InitCommon(CDInterfaces);
-//
-//  MDFNGameInfo->GameType = GMT_CDROM;
-// }
-// catch(std::exception &e)
-// {
-//  Cleanup();
-//  throw;
-// }
-//}
-
 static void Cleanup(void)
 {
  TextMem.resize(0);
diff --git a/psx/octoshock/psx/psx.h b/psx/octoshock/psx/psx.h
index 1764dc32b5..117fab0784 100644
--- a/psx/octoshock/psx/psx.h
+++ b/psx/octoshock/psx/psx.h
@@ -278,6 +278,9 @@ EW_EXPORT s32 shock_Peripheral_SetPadInput(void* psx, s32 address, u32 buttons,
 //Performs one of several transactions on an attached memory card.
 EW_EXPORT s32 shock_Peripheral_MemcardTransact(void* psx, s32 address, ShockMemcardTransaction* transaction);
 
+//Mounts a PS-EXE executable 
+EW_EXPORT s32 shock_MountEXE(void* psx, void* exebuf, int size);
+
 //Sets the power to ON. Returns SHOCK_NOCANDO if already on.
 EW_EXPORT s32 shock_PowerOn(void* psx);