Skip to content

Latest commit

 

History

History
987 lines (861 loc) · 56.3 KB

README.md

File metadata and controls

987 lines (861 loc) · 56.3 KB

Loader Dumps Arcade Emulator (wip)

All this is a homebrew development with reverse engineering, non official technical documentation and a lot of personal time.

Twitter - Youtube - Instagram

Table of Contents (wip)

Injections

  • CreateProcess and OpenProcess
  • CreateRemoteThread and LoadLibrary
  • Portable Execute
  • Hook Injection

Techniques

  • Virtual Method Table
  • Vectored Exception Handling
  • Trampoline/Columpio
  • DetourFunction
  • Addressing

Systems

Taito Type x

   Year : 2005
   CPU : Celeron - Pentium 4
   Chipset: Intel 865G
   GPU: ATI Radeon 9600SE/9600XT(128 MB) / X700PRO (256 MB), Bahia AGP 2.0/3.0 Soporte 1x/4x/8x
   SO: Windows XP Embedded

Taito Type x2

  Year : 2005
  CPU : Intel Core 2 Duo E6400/Pentium 4 651/Celeron D 352
  Chipset: Intel Q965 + ICH8
  GPU: ATI RADEON X1600Pro/X1300LE o nVIDIA GeForce 7900GS/7600GS/7300GS
  SO: Microsoft Windows XP Embedded SP2

NESiCAxLive

  Arcade System Board
  Run w/ Taito Type X, X2, X Zero, X3 and X4
Boolean isLoaded { get; }
Boolean isActive();
int Open(String name);
Task OpenAsync(String name);
Kernel32Native.PROCESS_INFORMATION Create(String name, uint securityAttr);
Boolean Attach(String name);
Boolean InjectDLL(String name);
List<IntPtr> SuspendAllThreads();
Boolean ReadMemory(IntPtr processID, IntPtr address, int numOfBytes, byte[] buffer, out int bytesRead);
Boolean WriteMemory(IntPtr hProc, IntPtr address, byte [] buffer, out int bytesWrited);
List<IntPtr> ResumeAllThreads();
Boolean Terminate();

Inputs

  • Keyboard Windows Native (GetAsyncKeyState)
  • Direct Input
    • Keyboard
    • GamePad + Keyboard

Example | File.properties

  • Player 1
P1_SERVICE = 3
P1_START = 1
P1_COIN = 5
P1_UP = UP
P1_DOWN = DOWN
P1_LEFT = LEFT
P1_RIGHT = ALT
P1_BUTTON_1 = SPACE
P1_BUTTON_2 = CTRL
P1_BUTTON_3 = C
P1_BUTTON_4 = A
P1_BUTTON_5 = V
P1_BUTTON_6 = B
  • Player 2
P2_SERVICE = 4
P2_START = 2
P2_COIN = 6
P2_UP = R
P2_DOWN = F
P2_LEFT = G
P2_RIGHT = D
P2_BUTTON_1 = A
P2_BUTTON_2 = S
P2_BUTTON_3 = E
P2_BUTTON_4 = Q
P2_BUTTON_5 = W
P2_BUTTON_6 = E	
  • Board
TEST_TILT1 = 3
TEST_TILT2 = 7 
TEST_TILT3 = 8
TEST_MODE = T
EXIT_CODE = ESC

Direct Input | Based on Hook's | DIKCodes

Example | File.bin

  • Player 1
  [Display address]  [Value]  [Byte]  [Key]
  0000000000000000     00       .     Start
  0000000000000004     00       .     Coin
  0000000000000008     00       .     Service
  000000000000000C     00       .     Up
  0000000000000010     00       .     Down
  0000000000000014     00       .     Left
  0000000000000018     00       .     Right
  000000000000001C     00       .     Btn 1
  0000000000000020     00       .     Btn 2
  0000000000000024     00       .     Btn 3
  0000000000000028     00       .     Btn 4
  000000000000002C     00       .     Btn 5 
  0000000000000030     00       .     Btn 6
  • Player 2
 [Display address]  [Value]  [Byte]  [Key] 
 0000000000000034     00       .     Start
 0000000000000038     00       .     Coin
 000000000000003C     00       .     Service
 0000000000000040     00       .     Up
 0000000000000044     00       .     Down
 0000000000000048     00       .     Left
 000000000000004C     00       .     Right
 0000000000000050     00       .     Btn 1
 0000000000000054     00       .     Btn 2
 0000000000000058     00       .     Btn 3
 000000000000005C     00       .     Btn 4
 0000000000000060     00       .     Btn 5 
 0000000000000064     00       .     Btn 6
  • Board
 [Display address]  [Value]  [Byte]  [Key]
 0000000000000068     00       .     Test Mode
 000000000000006C     00       .     Exit
  • GamePad Input (Reverse Engineering)
 Is JOY 		= (n & 0x80000000)
 Is JOY AXIS		= (n & 0x000F0000)
 
 Buttons      
 0x800000ZZ          
 
 0x80        -  JOY Enum [00 - 01 - 02 ... ]
 0x00
 0x00
 0xZZ        -  JoyButton [00 - 01 - 02 - 03 - 04 ...] 
 
 
 Example:
 	      0x80000001 (Joy 00 Button 01)
 	      0x80000002 (Joy 00 Button 02)
         ..
 
 Joystick    
 0x80PPZ8YA       
 
  0x8X        -    JOY Enum [00 - 01 - 02 ... ]
  0xPP        -    AXIS -> 01 (X+) | 11 (X-) | 02 (Y+) | 12 (Y-) | 03 (Z+) | 13 (Z-) 
  0xZ8YA      -    RANGE
  
 Example:               |  Joy00   |   -Y    |       -1000       |
 	     0x8012FC18 | 1000 0000 0001 0010 1111 1100 0001 1000 ( Joy00 Axis -Y -1000)  
        
        		|  Joy01   |   +Y    |       +1000       |
   	     0x810203E8 | 1000 0001 0000 0010 1111 1100 0011 1000 ( Joy01 Axis +Y +1000)  

Resume:

 [Display address]        [Hexa Code]             [Hexa Code]          [Ascii Code]
 0000000000000000  18 FC 12 80 06 00 00 00  06 00 00 00 C8 00 00 00  ................
 0000000000000010  D0 00 00 00 CB 00 00 00  CD 00 00 00 02 00 00 00  ................
 0000000000000020  03 00 00 00 04 00 00 00  05 00 00 00 06 00 00 00  ................
 0000000000000030  07 00 00 00 32 00 00 00  31 00 00 00 30 00 00 00  ....2...1...0...
 0000000000000040  2F 00 00 00 2E 00 00 00  01 00 00 X1 03 00 00 X1  /...............
 0000000000000050  02 00 00 X1 25 00 00 00  24 00 00 00 23 00 00 00  ........$...#...
 0000000000000060  22 00 00 00 21 00 00 00  01 00 00 08 02 00 00 08  "...!...........         
  • Input Tool to map output file *.bin

Emulators

JVS I/O

Semantic Trace for Taito Type

Inicializando
	Logger: 2019-06-07_00-48-04-LoggerJvs.log 

	Escribo  6 bytes... -> [ E0 FF 03 F0 D9 CB ] 0xE0FF03F0D9CB
	[E0] = SYNC_CODE OK
	[FF] = BROADCAST A TODOS LOS NODOS
	[03] = 
	[F0] = RESET ALL NODES
	[D9] 
	[CB] = 
	Envío    0 bytes... -> [ ]

............................

	Escribo  6 bytes... -> [ E0 FF 03 F1 01 F4 ] 0xE0FF03F101F4
	[E0] = SYNC_CODE OK
	[FF] = BROADCAST A TODOS LOS NODOS
	[03] = 
	[F1] = Set Address
	[01] 
	[F4] = 
	Envío    6 bytes... -> [ XXXXXXXXXXX ]

............................

	Escribo  5 bytes... -> [ E0 01 02 10 13 ]  0xE001021013 
	[E0] = SYNC_CODE OK
	[01] = ESCLAVO
	[02] = 
	[10] = I/O IDENTIFICADOR 
	[13] = 
	Envío    58 bytes... -> [ XXXXXXXXXXX ]

............................

	Escribo  5 bytes... -> [ E0 01 02 11 14 ] 0xE001021114 
	[E0] = SYNC_CODE OK
	[01] = ESCLAVO
	[02] = 
	[11] = COMANDO REVISION FORMATO 
	[14] = 
	Envío    7 bytes... -> [ XXXXXXXXXXX ]
	
	...
	

............................
	
	Escribo  5 bytes... -> [ E0 00 02 00 02 ]
	[E0] = SYNC_CODE OK
	[00] = MAESTRO
	[02] =
	[00] = RESETEANDO MAQUINA (Exit Game)
	[02] = 
	Envío    6 bytes... -> [ XXXXXXXXXXX ]

Semantic Trace for NESICAxLive

Inicializando
	Logger: 2020-01-19_14-50-21-LoggerFAST-io.log 

Abriendo conexion
	Hook_iDmacDrvOpen[_in_]			(deviceId: 1 | outBuffer: 00000000 | flags: 00000000)
	Hook_iDmacDrvOpen[_out_]		(deviceId: 1 | outBuffer: 00000001 | flags: FFFFFFFF)

............................

Leyendo datos
	Hook_iDmacDrvRegisterRead
		Discovery [0x400]
		XXXXXXXXX [0x4000] ?
		XXXXXXXXX [0x4004] ?
		XXXXXXXXX [0x4000] ?
	
	
............................

** FOR:

Escribiendo datos
	Hook_iDmacDrvRegisterWrite
		XXXXXXXXX [0x4000] ?
		
............................

Leyendo datos
	Hook_iDmacDrvRegisterRead
		XXXXXXXXX [0x4004] ?
		
............................

Escribiendo datos
	Hook_iDmacDrvRegisterWrite
		XXXXXXXXX [0x4004] ?
		
............................
		
Leyendo datos
	Hook_iDmacDrvRegisterRead
		Input Key P1 - P2 [0x4120]
		XXXXXXXXX         [0x4124] ?
		XXXXXXXXX         [0x4128] ?
		XXXXXXXXX         [0x412C] ?
		XXXXXXXXX         [0x41A0] ?
		XXXXXXXXX         [0x41A4] ?
		XXXXXXXXX         [0x41A8] ?
		XXXXXXXXX         [0x41AC] ?

............................	

Escribiendo datos
	Hook_iDmacDrvRegisterWrite
		XXXXXXXX          [0x4100] ?
		XXXXXXXX          [0x4104] ?
		XXXXXXXX          [0x4108] ?
		XXXXXXXX          [0x410C] ?
		Coin Input P1 	  [0x4140]
		Coin Input P2 	  [0x4144]
		XXXXXXXX          [0x4180] ?
		XXXXXXXX          [0x4184] ?
		XXXXXXXX          [0x4188] ?
		XXXXXXXX          [0x418C] ?

............................
		
Leyendo datos
	Hook_iDmacDrvRegisterRead
		Coin Input P1 	 [0x4140]
		Coin Input P2 	 [0x4144]
		Coin Input P2 	 [0x4144]
                XXXXXXXX         [0x41C0] ?
                XXXXXXXX         [0x41C4] ?
** FOR

...

Cerrando conexion
	Hook_iDmacDrvClose			(deviceId: 1 | access: 004E4BDC) -> You can only close game with Test Mode  

Graphics

  • Color Inverting per-stage texture processing
  • No filter stretch
  • Fetch stream vertex
  • Primitives to render
  • Rendered entities without alpha
  • Filters in runtime
  • Reverse pixel mode in runtime / Nearest-Point Sampling
  • Diffuse CyberPunk Lights
  • Spot Light Type
  • Linear Filter (LF)
  • Bilinear Filter (BF)
  • Anisotropic Filter (AF)

Sound

  • Sound Create
  • Sound Capture
  • Sound Full Duplex
  • Sound Full Duplex Create
  • Sound EnumerateA
  • Sound EnumerateW
  • Sound Buffer

Virtual Storage

  • Dynamic virtual Hard Disk (VHD)
  • Substitute a drive letter for local path

Cache Storage

  • Save/Config0000.bin
  • setting.dat
  • hiscore.dat
  • game.dat

Monitor w/restoring config

  • Clone
  • Extends
  • Monitor_1
  • Monitor_2

Display

  • Windowed
  • Windowed Center
  • Fullscreen (Windowed Magnifier)
  • Fullscreen Native

Aspect Ratio

  • 1:1
  • 2:1
  • 3:2
  • 3:4 - Vertical
  • 4:1
  • 4:3
  • 5:3
  • 5:4
  • 6:5
  • 7:9 - Vertical
  • 8:3
  • 8:7
  • 9:16 - Vertical
  • 16:9
  • 16:10
  • 16:15
  • 19:12
  • 19:14
  • 30:17
  • 32:9

Rotation Display

  • 90°
  • 180°
  • 270°

TaskBar Menu

  • Show
  • Hidden
  • Animation

Tab-Menu

  • Controller
  • Menu
  • Video
  • System

Pause Mode

  • Classic
  • Blur Effect w/fullscreen

Systems/Games Loaders (wip)

Taito Type x

Taito Type x2

NesicaxLive

Compatibility

PLATFORM NAME MANUFACT YEAR GENRE Intel HP Graphics 4500 Intel HP Graphics 620 ATI HD 4770 ATI HD 5870 AMD RX 570 AMD RX 580
TTX Chaos Breaker Eolith 2004 Fighter 45FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Giga Wings Generations Takumi Corporation 2004 SHMUP 50FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Homura skonec 2005 SHMUP 50FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Raiden III MOSS 2005 SHMUP 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Raiden III Export MOSS 2005 SHMUP 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Raiden IV MOSS 2005 SHMUP 50FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Spica Adventure Taito 2005 Platform 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Tetris The Grand Master 3 Terror Instinct Arika 2005 Puzzle 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX Shikigami no Shiro III Alfa System, Skonec, Barnhouse Effect 2006 SHMUP 45FPS 60FPS 50FPS 60FPS 60FPS 60FPS
TTX2 Battle Fantasia Arc System Works 2007 Fighter -- 60FPS 50FPS 60FPS 60FPS 60FPS
TTX2 BlazBlue: Calamity Trigger Arc System Works 2008 Fighter -- 50FPS 45FPS 60FPS 60FPS 60FPS
TTX2 BlazBlue: Continuum Shift 1 Arc System Works 2009 Fighter -- 50FPS 40FPS 55FPS 55FPS 60FPS
TTX2 BlazBlue: Continuum Shift 2 Arc System Works 2010 Fighter -- 55FPS 50FPS 60FPS 60FPS 60FPS
TTX2 King of Fighters Maximum Impact Regulation A SNK Playmore 2007 Fighter -- 50FPS 40FPS 60FPS 60FPS 60FPS
TTX2 Power Instinct 5 Matrimelee 2: Goketsuji Ichizoku Matsuri Senzo Kuyou Atlus and Noise Factory 2009 Fighter 45FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX2 The King of Fighters XII SNK Playmore 2012 Fighter -- 55FPS 45FPS 60FPS 60FPS 60FPS
TTX2 Trouble Witches AC Taito 2008 Action 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
TTX2 Street Fighter IV Capcom 2008 Fighter -- 55FPS 40FPS 655FPS 55FPS 60FPS
TTX2 Super Street Fighter IV Arcade Edition (NESYS) Capcom 2010 Fighter -- 55FPS 40FPS 55FPS 55FPS 60FPS
NESICAxLive Raiden III MOSS 2012 SHMUP 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
NESICAxLive Daemon Bride Examu 2009 Fighter 45FPS 60FPS 60FPS 60FPS 60FPS 60FPS
NESICAxLive Elevator Action Taito 2014 Action 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
NESICAxLive Arcana Heart 2 v2.1 Examu 2012 Fighter 45FPS 60FPS 60FPS 60FPS 60FPS 60FPS
NESICAxLive Rastan Saga Taito 2012 Action 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS
NESICAxLive Space Invaders Taito 2012 Action 60FPS 60FPS 60FPS 60FPS 60FPS 60FPS

Code Ratio

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
XML                            142            173            345         286219
C/C++ Header                   795          38483          84272         147221
C++                            114           4477           4607          16206
C                               14            747            711          10235
C#                             118           1478           3894           9043
MSBuild script                  18              0             49           1653
Markdown                         3              4              0             46
DOS Batch                        8              1              0             27
XAML                             2              1              0             15
JSON                             5              0              0              5
Bourne Shell                     2              7             22              4
Assembly                         1              1              2              1
-------------------------------------------------------------------------------
SUM:                          1222          45372          93902         470675
-------------------------------------------------------------------------------

Highlights

References

Miscelanea projects

About

Loader Dump Arcade is programmed by vicboma1, all this is a homebrew development with reverse engineering, non official technical documentation and a lot of personal time.

Development environment

[2017-XXXX]
Original TTX Arcade System w/Raiden III

[2017-2019]
Macbook 2015 - CPU 2.2Ghz
Bootcamp Native - Windows 8
Intel HP Graphics 4500 | ---
8GB RAM 

[2020-XXXX]
Dell
Intel Core i5-7200U 
CPU 2.5Ghz | 2Cores - 4Nucleos
Intel HP Graphics 620 | ---
16GB RAM

Twitter : https://twitter.com/vicboma1

Youtube : https://www.youtube.com/channel/UCIyHFDfIyH2Z7FUQBiUxs4g

This software is provided as-is, and is licensed under the MIT License.

MIT License

Copyright (c) 2024 Victor Bolinches

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Software requirements

No roms, no games, no dumps!