From c252ef12d2cb6663ef4827dc999b1c58a075a7fc Mon Sep 17 00:00:00 2001 From: A Date: Sat, 11 Apr 2026 11:37:43 +0100 Subject: [PATCH 1/5] Added script to format the pages to match the contributing guidelines --- 404.md | 1 + CONTRIBUTING.md | 2 +- categories/Introduction.md | 130 ++++---- categories/companies/Codemasters.md | 2 - categories/companies/datel.md | 16 +- categories/consoles/3ds.md | 1 - categories/consoles/Amiga.md | 3 +- categories/consoles/Android.md | 1 + categories/consoles/Arcade.md | 56 ++-- categories/consoles/AtariJaguar.md | 2 +- categories/consoles/DOS.md | 12 +- categories/consoles/Dreamcast.md | 5 +- categories/consoles/Game.com.md | 1 - scripts/format-docs.js | 461 ++++++++++++++++++++++++++++ 14 files changed, 576 insertions(+), 117 deletions(-) create mode 100755 scripts/format-docs.js diff --git a/404.md b/404.md index c063f2ca..c683ce52 100644 --- a/404.md +++ b/404.md @@ -3,4 +3,5 @@ permalink: /404.html layout: 404 title: Page Not Found --- + Custom 404 (See 404.html layout) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc75b823..b80e9067 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,7 +112,7 @@ If using a list, we have a preferred format for lists where each list item has a ```markdown First we always have a short sentence introducing the list: * **Item title in bold** - More information about the item -```` +``` Always have a sentence before the list explaining the list, never just have a list after a heading. diff --git a/categories/Introduction.md b/categories/Introduction.md index 48ef26bd..0978d946 100644 --- a/categories/Introduction.md +++ b/categories/Introduction.md @@ -257,8 +257,8 @@ API functions are very useful when reversing a game or application as they tend ## How are APIs distributed? APIs are typically distributed in several ways to allow developers to integrate them into their applications: -- **Static Libraries** - Provided as .lib (Windows) or .a (Unix-like systems) files that developers link to their applications at compile time. -- **Dynamic Libraries** - Provided as .dll (Windows) or .so (Unix-like systems) files, which are linked at runtime. +* **Static Libraries** - Provided as .lib (Windows) or .a (Unix-like systems) files that developers link to their applications at compile time. +* **Dynamic Libraries** - Provided as .dll (Windows) or .so (Unix-like systems) files, which are linked at runtime. --- ## What is a Static Library? @@ -273,45 +273,45 @@ A dynamic library is a file containing code and data that can be used by multipl ### Which DLLs are used by code compiled by versions of Microsoft Visual C++? Here's a table of Microsoft Visual C++ (MSVC) versions and their associated runtime DLLs that can be imported. This table provides a quick reference for understanding which runtime DLLs correspond to different versions of MSVC. -| **MSVC Version** | **Runtime DLLs** | **DLL File Names** | -|------------------|----------------------------------------|-------------------------------------------------| -| **MSVC 6.0** | Visual C++ 6.0 runtime | `MSVCRT.dll` | -| **MSVC 7.0** | Visual Studio .NET 2002 (VC7) | `MSVCRT.dll`, `MSVCP60.dll` | -| **MSVC 7.1** | Visual Studio .NET 2003 (VC7.1) | `MSVCRT.dll`, `MSVCP71.dll` | -| **MSVC 8.0** | Visual Studio 2005 (VC8) | `MSVCRT.dll`, `MSVCP80.dll`, `MSVCR80.dll` | -| **MSVC 9.0** | Visual Studio 2008 (VC9) | `MSVCRT.dll`, `MSVCP90.dll`, `MSVCR90.dll` | -| **MSVC 10.0** | Visual Studio 2010 (VC10) | `MSVCRT.dll`, `MSVCP100.dll`, `MSVCR100.dll` | -| **MSVC 11.0** | Visual Studio 2012 (VC11) | `MSVCRT.dll`, `MSVCP110.dll`, `MSVCR110.dll` | -| **MSVC 12.0** | Visual Studio 2013 (VC12) | `MSVCRT.dll`, `MSVCP120.dll`, `MSVCR120.dll` | -| **MSVC 14.0** | Visual Studio 2015 (VC14) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` | -| **MSVC 14.1** | Visual Studio 2017 (VC14.1) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` | -| **MSVC 14.2** | Visual Studio 2019 (VC14.2) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` | -| **MSVC 15.0** | Visual Studio 2022 (VC15) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` | +**MSVC Version** | **Runtime DLLs** | **DLL File Names** +------------------|----------------------------------------|------------------------------------------------- +**MSVC 6.0** | Visual C++ 6.0 runtime | `MSVCRT.dll` +**MSVC 7.0** | Visual Studio .NET 2002 (VC7) | `MSVCRT.dll`, `MSVCP60.dll` +**MSVC 7.1** | Visual Studio .NET 2003 (VC7.1) | `MSVCRT.dll`, `MSVCP71.dll` +**MSVC 8.0** | Visual Studio 2005 (VC8) | `MSVCRT.dll`, `MSVCP80.dll`, `MSVCR80.dll` +**MSVC 9.0** | Visual Studio 2008 (VC9) | `MSVCRT.dll`, `MSVCP90.dll`, `MSVCR90.dll` +**MSVC 10.0** | Visual Studio 2010 (VC10) | `MSVCRT.dll`, `MSVCP100.dll`, `MSVCR100.dll` +**MSVC 11.0** | Visual Studio 2012 (VC11) | `MSVCRT.dll`, `MSVCP110.dll`, `MSVCR110.dll` +**MSVC 12.0** | Visual Studio 2013 (VC12) | `MSVCRT.dll`, `MSVCP120.dll`, `MSVCR120.dll` +**MSVC 14.0** | Visual Studio 2015 (VC14) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` +**MSVC 14.1** | Visual Studio 2017 (VC14.1) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` +**MSVC 14.2** | Visual Studio 2019 (VC14.2) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` +**MSVC 15.0** | Visual Studio 2022 (VC15) | `MSVCRT.dll`, `MSVCP140.dll`, `MSVCR140.dll` Notes: -- **MSVCRT.dll** is the Microsoft C Runtime Library used across various versions. -- **MSVCPxx.dll** refers to the Microsoft C++ Runtime Library, where `xx` denotes the version (e.g., `80` for Visual Studio 2005). -- **MSVCRxx.dll** refers to the Microsoft C Runtime Library versioned similarly to the `MSVCPxx.dll`. +* **MSVCRT.dll** is the Microsoft C Runtime Library used across various versions. +* **MSVCPxx.dll** refers to the Microsoft C++ Runtime Library, where `xx` denotes the version (e.g., `80` for Visual Studio 2005). +* **MSVCRxx.dll** refers to the Microsoft C Runtime Library versioned similarly to the `MSVCPxx.dll`. ### What tools are used to explore Executables and Compiled Libraries? Here's a table summarizing the tools for viewing the insides of executables and libraries: -| **Tool** | **Platform** | **Description** | **Usage** | -|-------------------------|---------------------------------|-----------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| -| **objdump** | Linux, Unix, macOS, Windows | Disassembles and displays information about object files and executables. | `objdump -d ` for disassembly, `objdump -t ` for symbols. | -| **readelf** | Linux, Unix | Displays detailed information about ELF files, including headers and segments. | `readelf -h ` for headers, `readelf -s ` for symbols. | -| **nm** | Linux, Unix, macOS, Windows | Lists symbols from object files, executables, and libraries. | `nm `. | -| **gdb** | Linux, Unix, macOS, Windows | Debugger that can also inspect executable contents, disassemble code, and view symbols. | `gdb `, then use commands like `info functions` or `disassemble`. | -| **Ghidra** | Windows, Linux, macOS | Free and open source disassembler and debugger with interactive analysis capabilities. | Load the executable into Ghidra and use the GUI for exploration. | -| **IDA Pro** | Windows, Linux, macOS | Commercial disassembler and debugger with interactive analysis capabilities. | Load the executable into IDA Pro and use the GUI for exploration. | -| **Hex-Rays Decompiler** | Windows, Linux, macOS | Converts disassembled code back to C-like pseudo code; an add-on for IDA Pro. | Integrated within IDA Pro; select a function and decompile. | -| **Binary Ninja** | Windows, Linux, macOS | Modern binary analysis tool with disassembly, decompilation, and scripting. | Load the binary and use the GUI or API for analysis. | -| **Radare2** | Windows, Linux, macOS | Open-source framework for reverse engineering, including disassembly and debugging. | `r2 `, then use commands like `pdf` to disassemble functions. | -| **PE Explorer** | Windows | Commercial tool for inspecting and editing Windows PE files. | Open the executable in PE Explorer and navigate through sections. | -| **CFF Explorer** | Windows | Free tool for analyzing and editing PE files, with detailed views of file structure. | Open the PE file in CFF Explorer and explore different sections. | -| **Dependency Walker** | Windows | Analyzes dependencies of Windows executables and DLLs, showing imported/exported functions. | Load the executable or DLL in Dependency Walker and explore dependencies. | -| **dumpbin** | Windows (Visual Studio) | Command-line tool for inspecting PE files, showing headers, symbols, imports, and more. | `dumpbin /all ` to view all available information. | -| **MachOView** | macOS | Tool for viewing the structure of Mach-O binaries, native to macOS executables. | Open the Mach-O binary in MachOView and browse its segments and sections. | +**Tool** | **Platform** | **Description** | **Usage** +-------------------------|---------------------------------|-----------------------------------------------------------------------------------------------|--------------------------------------------------------------------------- +**objdump** | Linux, Unix, macOS, Windows | Disassembles and displays information about object files and executables. | `objdump -d ` for disassembly, `objdump -t ` for symbols. +**readelf** | Linux, Unix | Displays detailed information about ELF files, including headers and segments. | `readelf -h ` for headers, `readelf -s ` for symbols. +**nm** | Linux, Unix, macOS, Windows | Lists symbols from object files, executables, and libraries. | `nm `. +**gdb** | Linux, Unix, macOS, Windows | Debugger that can also inspect executable contents, disassemble code, and view symbols. | `gdb `, then use commands like `info functions` or `disassemble`. +**Ghidra** | Windows, Linux, macOS | Free and open source disassembler and debugger with interactive analysis capabilities. | Load the executable into Ghidra and use the GUI for exploration. +**IDA Pro** | Windows, Linux, macOS | Commercial disassembler and debugger with interactive analysis capabilities. | Load the executable into IDA Pro and use the GUI for exploration. +**Hex-Rays Decompiler** | Windows, Linux, macOS | Converts disassembled code back to C-like pseudo code; an add-on for IDA Pro. | Integrated within IDA Pro; select a function and decompile. +**Binary Ninja** | Windows, Linux, macOS | Modern binary analysis tool with disassembly, decompilation, and scripting. | Load the binary and use the GUI or API for analysis. +**Radare2** | Windows, Linux, macOS | Open-source framework for reverse engineering, including disassembly and debugging. | `r2 `, then use commands like `pdf` to disassemble functions. +**PE Explorer** | Windows | Commercial tool for inspecting and editing Windows PE files. | Open the executable in PE Explorer and navigate through sections. +**CFF Explorer** | Windows | Free tool for analyzing and editing PE files, with detailed views of file structure. | Open the PE file in CFF Explorer and explore different sections. +**Dependency Walker** | Windows | Analyzes dependencies of Windows executables and DLLs, showing imported/exported functions. | Load the executable or DLL in Dependency Walker and explore dependencies. +**dumpbin** | Windows (Visual Studio) | Command-line tool for inspecting PE files, showing headers, symbols, imports, and more. | `dumpbin /all ` to view all available information. +**MachOView** | macOS | Tool for viewing the structure of Mach-O binaries, native to macOS executables. | Open the Mach-O binary in MachOView and browse its segments and sections. ### How do I find out what compiler/linker was used to build an executable? Detect It Easy showing the Compile and Linker for Game Maker 1.1 executable @@ -355,16 +355,16 @@ Note that the above are the rough groups, some specific CPUs have more specialis ### How similar are Instruction Set Architectures Here is a simple comparison table that highlights some key differences between different CPU Instruction Set Architectures (ISA). Please note that this table is not exhaustive and focuses on high-level distinctions: -| ISA | Example Instructions | Number of Registers | Memory Addressing Modes | Complex Instructions | Endianness | -|-------------|----------------------|---------------------|-------------------------|-----------------------|------------| -| Z80 | ADD, SUB, MOV | 8 General Purpose | Immediate, Direct, Indexed, Register Indirect | Conditional Jumps, Bit Manipulation | Little-Endian | -| 6502 | ADC, LDA, STA | 3 General Purpose | Zero Page, Absolute, Indexed, Indirect | None | Little-Endian | -| 68K | ADD, SUB, MOVE | 16 General Purpose | Register Direct, Immediate, Memory Indirect | Multiply, Divide, Bit Manipulation | Big-Endian | -| MIPS | ADD, SUB, LW | 32 General Purpose | Immediate, Register Direct, Base + Offset | Load/Store, Multiply, Divide | Big-Endian | -| x86 | ADD, SUB, MOV | 8 General Purpose | Register Direct, Immediate, Memory Indirect | Complex Arithmetic, SIMD | Little-Endian | -| ARM | ADD, SUB, LDR | 16 General Purpose | Immediate, Register Direct, Base + Offset | SIMD, Multiply, Divide | Little-Endian | -| SuperH | ADD, SUB, MOV | 16 General Purpose | Immediate, Register Direct, Memory Indirect | Multiply, Divide, Bit Manipulation | Little-Endian | -| PowerPC | ADD, SUB, LWZ | 32 General Purpose | Immediate, Register Direct, Base + Offset | SIMD, Multiply, Divide | Big-Endian | +ISA | Example Instructions | Number of Registers | Memory Addressing Modes | Complex Instructions | Endianness +-------------|----------------------|---------------------|-------------------------|-----------------------|------------ +Z80 | ADD, SUB, MOV | 8 General Purpose | Immediate, Direct, Indexed, Register Indirect | Conditional Jumps, Bit Manipulation | Little-Endian +6502 | ADC, LDA, STA | 3 General Purpose | Zero Page, Absolute, Indexed, Indirect | None | Little-Endian +68K | ADD, SUB, MOVE | 16 General Purpose | Register Direct, Immediate, Memory Indirect | Multiply, Divide, Bit Manipulation | Big-Endian +MIPS | ADD, SUB, LW | 32 General Purpose | Immediate, Register Direct, Base + Offset | Load/Store, Multiply, Divide | Big-Endian +x86 | ADD, SUB, MOV | 8 General Purpose | Register Direct, Immediate, Memory Indirect | Complex Arithmetic, SIMD | Little-Endian +ARM | ADD, SUB, LDR | 16 General Purpose | Immediate, Register Direct, Base + Offset | SIMD, Multiply, Divide | Little-Endian +SuperH | ADD, SUB, MOV | 16 General Purpose | Immediate, Register Direct, Memory Indirect | Multiply, Divide, Bit Manipulation | Little-Endian +PowerPC | ADD, SUB, LWZ | 32 General Purpose | Immediate, Register Direct, Base + Offset | SIMD, Multiply, Divide | Big-Endian This table provides a broad overview of these architectures, but there are many more details and specific instructions within each ISA. The number of registers, addressing modes, and the availability of complex instructions can significantly vary even within a single architecture, and the choice of endianness (byte order) can have important implications for software compatibility. For a deep dive into any of these ISAs, you would typically need to consult the official documentation or specific resources for each architecture. @@ -409,12 +409,12 @@ The CPU also works with other parts of the console, like the graphics and sound An instruction is a basic operation or command that the CPU can execute. These instructions are written in a machine-readable form, usually in binary code, and are the fundamental building blocks of a computer program. Each CPU has its own specific set of instructions, known as its instruction set architecture (ISA). Instructions can perform various tasks, such as: -1. **Arithmetic Operations**: These include instructions for addition, subtraction, multiplication, division, and other mathematical operations. -2. **Data Movement**: Instructions for moving data between registers, memory, and other storage locations. -3. **Control Flow**: Instructions that control the program's flow, such as branching (jumping to a different part of the program) or conditional execution (if-then-else). -4. **Logical Operations**: Instructions for performing logical operations like AND, OR, XOR, and NOT. -5. **Load and Store**: These instructions load data from memory into registers or store data from registers back into memory. -6. **Input/Output**: Instructions that allow the CPU to interact with input and output devices like keyboards, displays, and storage devices. +* **Arithmetic Operations**: These include instructions for addition, subtraction, multiplication, division, and other mathematical operations. +* **Data Movement**: Instructions for moving data between registers, memory, and other storage locations. +* **Control Flow**: Instructions that control the program's flow, such as branching (jumping to a different part of the program) or conditional execution (if-then-else). +* **Logical Operations**: Instructions for performing logical operations like AND, OR, XOR, and NOT. +* **Load and Store**: These instructions load data from memory into registers or store data from registers back into memory. +* **Input/Output**: Instructions that allow the CPU to interact with input and output devices like keyboards, displays, and storage devices. CPU instructions are executed sequentially, one after the other, according to the program's logic. The order and combination of these instructions determine the behavior of a computer program. @@ -463,7 +463,6 @@ The CPU has designated instructions to read and write from the stack, often call When you need to store more data than the stack can handle or require memory that persists longer than a single function call, the heap comes into play. The heap is another part of your computer's RAM, used for dynamic memory allocation, such as storing large objects, game assets, or variables that need to exist throughout the program's execution. ## What is the Heap? - You can think of the heap as a large pool of memory where you can request chunks of memory as needed. Unlike the stack, memory in the heap can be allocated and freed in any order, making it flexible but also more complex to manage. ## Which systems had a heap? @@ -472,18 +471,15 @@ Early video game consoles typically **did not have a heap** due to their limited Some heaps were handled by the operating system (Xbox onwards) and others were handled by the game engines themselves (PS2, GameCube). ## How does the Heap grow? - The heap grows upwards, from lower to higher memory addresses. When you request more memory (for example, creating a new object or allocating an array), the heap expands towards higher addresses. This is in contrast to the stack, which grows downwards, ensuring that both areas can grow without quickly overlapping. ## Why is the Heap important? - -The heap is essential for managing memory in programs where the amount of data isn't known ahead of time or varies during execution. It’s particularly useful in situations where you need to allocate large blocks of memory that might need to exist for the lifetime of the program or until explicitly freed. +The heap is essential for managing memory in programs where the amount of data isn't known ahead of time or varies during execution. It's particularly useful in situations where you need to allocate large blocks of memory that might need to exist for the lifetime of the program or until explicitly freed. ## How do you interact with the Heap? - Most programming languages provide functions or operators to allocate and free memory on the heap. In languages like C, `malloc()` and `free()` are used, while in higher-level languages like Python or Java, memory management on the heap is handled automatically through built-in mechanisms. -This allows you to dynamically allocate space when needed and release it when it’s no longer required, making the heap a powerful tool for managing memory in complex programs. +This allows you to dynamically allocate space when needed and release it when it's no longer required, making the heap a powerful tool for managing memory in complex programs. Interacting with the heap in assembly language typically involves system calls or interrupts to request memory from the operating system. Unlike the stack, which is managed directly by the CPU with specific instructions, the heap requires explicit requests for memory allocation and deallocation. @@ -526,11 +522,11 @@ Conventions also decide who is responsible for cleaning up the stack after the f ### thiscall thiscall is a calling convention used primarily for C++ member functions. It is designed to handle the specific needs of methods that operate on objects (i.e. functions that are part of a class). -- **Arguments**: Used primarily for C++ member functions. -- **First Argument**: The this pointer (the instance of the object) is passed in a specific register (ecx on x86). -- **Additional Arguments**: Passed on the stack. -- **Cleanup**: The callee cleans up the stack. -- **Return Value**: Typically returned in the eax register. +* **Arguments**: Used primarily for C++ member functions. +* **First Argument**: The this pointer (the instance of the object) is passed in a specific register (ecx on x86). +* **Additional Arguments**: Passed on the stack. +* **Cleanup**: The callee cleans up the stack. +* **Return Value**: Typically returned in the eax register. --- ## Function Prologue and Epilogue @@ -538,7 +534,7 @@ Disassemblers often rely on function prologues and epilogues as key indicators f ### Function Prologue
🔜
-The prologue is the sequence of instructions at the beginning of a function that prepares the stack and registers for the function’s execution. It typically includes saving the return address, preserving the base pointer (if used), and allocating space on the stack for local variables. +The prologue is the sequence of instructions at the beginning of a function that prepares the stack and registers for the function's execution. It typically includes saving the return address, preserving the base pointer (if used), and allocating space on the stack for local variables. **Example (x86 Architecture)**: ```assembly @@ -567,13 +563,12 @@ Here are simple examples of making a system call in assembly on Windows, Linux, ### Windows (x86) System Call Example In Windows, system calls can be made directly using two different methods depending on which version of windows: -- **`int 0x2e`**: This interrupt vector was historically used to invoke system calls by placing the syscall number in `eax` and issuing the interrupt. This method is deprecated and replaced by `SYSENTER`. -- **`SYSENTER`**: This instruction is optimized for making system calls on modern x86 processors. Windows sets up the MSRs (Model-Specific Registers) required for `SYSENTER` during boot, so user-mode applications don't need to manage them. However, this approach is not documented for use in applications and is generally intended for internal OS use. +* `int 0x2e`: This interrupt vector was historically used to invoke system calls by placing the syscall number in `eax` and issuing the interrupt. This method is deprecated and replaced by `SYSENTER`. +* `SYSENTER`: This instruction is optimized for making system calls on modern x86 processors. Windows sets up the MSRs (Model-Specific Registers) required for `SYSENTER` during boot, so user-mode applications don't need to manage them. However, this approach is not documented for use in applications and is generally intended for internal OS use. Directly invoking system calls using `int 0x2e` or `SYSENTER` is highly discouraged in normal application development due to the risk of instability and compatibility issues across different Windows versions. Instead, using the Windows API (like `ExitProcess`) is the recommended and supported approach. -#### Using `int 0x2e` (pre-Windows XP) - +#### Using int 0x2e (pre-Windows XP) The `int 0x2e` interrupt was used in older versions of Windows (pre-Windows XP) to invoke system calls directly. Here's an example: ```assembly @@ -598,7 +593,6 @@ _start: ``` #### Using SYSENTER (Modern Method) - `SYSENTER` is a fast system call instruction introduced with Intel's Pentium II processors and is used internally by Windows for system calls on newer systems. This approach requires setting up specific registers before the `SYSENTER` instruction is executed: ```assembly diff --git a/categories/companies/Codemasters.md b/categories/companies/Codemasters.md index a6954f27..a28cfa0c 100644 --- a/categories/companies/Codemasters.md +++ b/categories/companies/Codemasters.md @@ -34,7 +34,6 @@ The company initially began by developing and publishing games for home computer # Hardware ## Game Genie - Game Genie was a series of video game enhancement devices developed by Codemasters and distributed by Galoob (later acquired by Hasbro). It was first released in 1990 for various gaming consoles, including the Nintendo Entertainment System (NES), Sega Genesis/Mega Drive, Super Nintendo Entertainment System (SNES), Game Boy, and Sega Game Gear. The Game Genie allowed players to input special codes, known as "cheat codes," which modified the behavior of games. These codes could enable features like unlimited lives, infinite ammunition, invincibility, and other gameplay enhancements that were not normally available in the game. Players could enter these codes through a simple interface before starting their game, and the effects would take place during gameplay. @@ -47,7 +46,6 @@ Sadly this was just the company Camerica jumping the gun to announce a product t --- # Software (Games) - Here is a list of the games codemasters are most famous for: * **Micro Machines** - NES, Sega Mega Drive/Genesis, Super NES, Game Boy, PlayStation, Microsoft Windows * **Colin McRae Rally** - PlayStation, Microsoft Windows, Game Boy Color, Game Boy Advance, PlayStation 2, Xbox, Nintendo DS, iOS, Android diff --git a/categories/companies/datel.md b/categories/companies/datel.md index e4b2d6b0..ac93acab 100644 --- a/categories/companies/datel.md +++ b/categories/companies/datel.md @@ -65,9 +65,9 @@ The Action Replay for the Super Nintendo wasn't just a cheat cartridge, it also ## Game Killer Before the Pro Action Replay was released for the N64 Datel decided to release a similar product but instead of allowing memory editing via cheat codes it had a few built in games and would write to the SRAM (Battery backed up save data inside the cartridge). So for example if you plugged in Mario 64 it would edit the save data to give you all the stars and 100% completion. -Not as useful as Action Replay as it pretty much completes the game for you, hence the name “Game Killer”. +Not as useful as Action Replay as it pretty much completes the game for you, hence the name "Game Killer". -One cool feature was that the cartridge has a card slot on it for “Killer cards” which were supposed to be cards that add support for other games but sadly none were ever released. This would be a cool reversing project to see if anyone can implement a working card for the Game Killer! +One cool feature was that the cartridge has a card slot on it for "Killer cards" which were supposed to be cards that add support for other games but sadly none were ever released. This would be a cool reversing project to see if anyone can implement a working card for the Game Killer! For more information on the Game Killer and the 6 in built games: http://www.nesworld.com/article.php?system=n64&data=n64-gamekiller @@ -162,10 +162,10 @@ The X-Port GBX allows you to upload and download saves from your GBA cartridges Of course they are most famous of their Action Replay (AR) cheat devices, which would have never have received approval from Sony. Modifying memory in the way AR does would be too much of a security risk in terms of piracy/exploits. ![PS2ActionReplayMax](https://user-images.githubusercontent.com/40120498/235313259-8880b0a6-d964-4158-9f42-c89c682ee723.jpeg) -However unlike cartridge based versions it didn’t have the Code Creation capability and thus you were reliant on the codes created by the “CodeJunkies” team. You could get these codes either on the website or use the #PS2 modem to connect to the servers, that was a nice touch! +However unlike cartridge based versions it didn't have the Code Creation capability and thus you were reliant on the codes created by the "CodeJunkies" team. You could get these codes either on the website or use the #PS2 modem to connect to the servers, that was a nice touch! ![ActionReplayMaxUpgrade](https://user-images.githubusercontent.com/40120498/235313286-cea79b7d-783f-46db-a699-3746c07250c4.jpeg) -But it didn’t stop there, the ability to print unofficial PS2 Discs was unique to Datel and thus they could sell products without giving a cut to Sony. So it was cheap for Datel to bring products to market, which allowed them to do cheaper per-game equivalents of Action Replay... +But it didn't stop there, the ability to print unofficial PS2 Discs was unique to Datel and thus they could sell products without giving a cut to Sony. So it was cheap for Datel to bring products to market, which allowed them to do cheaper per-game equivalents of Action Replay... Action Replay Soul Caliber There were many of these released for a third of the price of AR. However I believe the standard AR could do all the same cheats and would work out cheaper in the long run if you wanted to cheat in more than 3 games. @@ -177,7 +177,7 @@ One of the best examples is when they used their technology to add official team If you look at the Max Payne version, it is releasing the same day as the retail game which suggests Datel seem to have had early access to the final games before their release date. Other region versions wouldn't have all the same codes as they would have been recompiled... Action Replay Max Payne -One possibility is through their magazine subsidiary known as “Thin Ice Media” which published 3 retail magazines in the UK: GBX, G-force and PSi2. But would publishers really send preview copies to these magazines which were basically used as an advertising channel for Datel? +One possibility is through their magazine subsidiary known as "Thin Ice Media" which published 3 retail magazines in the UK: GBX, G-force and PSi2. But would publishers really send preview copies to these magazines which were basically used as an advertising channel for Datel? PSi2 Magazine Although to be fair their magazines went on to be fairly successful with PSi2 having at least 38 issues (not sure if issue 39 exists or not). You see they had one advantage over the competition: the ability to burn playable PS2 cheat discs... @@ -199,15 +199,15 @@ Side note: Action Replay was published by Karat in Japan and even had Potato Chi ![KaratActionReplayCrisps](https://user-images.githubusercontent.com/40120498/235313876-9408c00f-cfaa-47f9-8774-c13a6554ab85.jpeg) ## Karaoke Party -But they didn’t just create standalone subsets of Action Replay functionality they also made entirely new software such as Karaoke Party! Which came with very popular pop songs at the time. I wonder did they license the music but not the game? Or was it used without permission? +But they didn't just create standalone subsets of Action Replay functionality they also made entirely new software such as Karaoke Party! Which came with very popular pop songs at the time. I wonder did they license the music but not the game? Or was it used without permission? ![KaraokeParty](https://user-images.githubusercontent.com/40120498/235313914-ee6e7f37-e500-4a0d-b5db-ed288b626615.jpeg) ## Dance Master -In a similar vein comes Dance Master, which was basically just a Dance Mat accessory that can work with any PS2 dancing game, but unlike competitors Datel could include its own unlicensed “Dance Work Out Game” which must have given it an edge over other 3rd party Dance Mats. +In a similar vein comes Dance Master, which was basically just a Dance Mat accessory that can work with any PS2 dancing game, but unlike competitors Datel could include its own unlicensed "Dance Work Out Game" which must have given it an edge over other 3rd party Dance Mats. DanceMaster ## Eye Max -Another is eyeMax which builds of the craze that was the eyeToy and turns it into a video messaging service where you can create short video content to share with friends or the “global community”. It could have been the TikTok of its day, just a shame it wasn’t very well known... +Another is eyeMax which builds of the craze that was the eyeToy and turns it into a video messaging service where you can create short video content to share with friends or the "global community". It could have been the TikTok of its day, just a shame it wasn't very well known... eyeMax diff --git a/categories/consoles/3ds.md b/categories/consoles/3ds.md index 921ab0c8..e52f92a7 100644 --- a/categories/consoles/3ds.md +++ b/categories/consoles/3ds.md @@ -46,7 +46,6 @@ If you're interested in reverse engineering Nintendo 3DS software, it's essentia In this section of our guide, we will provide you with detailed information and resources on the hardware of the Nintendo 3DS, including retail, prototype, and development hardware. ## Retail Nintendo 3DS Hardware - If you're interested in learning more about the hardware architecture of the Nintendo 3DS, we highly recommend checking out the post on Copetti.org. This website is dedicated to exploring the technical details of the Nintendo 3DS hardware, including the CPU, GPU, and other components that make up the handheld console. You'll find in-depth explanations of how each component works, as well as detailed schematics and diagrams that help illustrate the inner workings of the Nintendo 3DS. {% include link-to-other-site.html url="https://www.copetti.org/writings/consoles/nintendo-3ds/" description="Copetti.org has an excellent tear down of the Nintendo 3DS Hardware and how it works" image="/public/consoles/Nintendo-3DS.png" title="Nintendo 3DS Architecture - A Practical Analysis" %} diff --git a/categories/consoles/Amiga.md b/categories/consoles/Amiga.md index b6ebae67..f10168fe 100644 --- a/categories/consoles/Amiga.md +++ b/categories/consoles/Amiga.md @@ -193,6 +193,7 @@ If you are interested to see officially released or leaked source code, for Amig It explores the clever optimization techniques, such as background caching with four frame buffers, which allowed the game to maintain a smooth frame rate despite drawing hundreds of polygons on a 7MHz processor [00:09:31]. The discussion also covers the game's virtual machine architecture that facilitated easy porting [00:11:29]. + ### The Polygons of Another World: A Retrospective on 90s Graphics Hardware Fabien Sanglard presents a comprehensive retrospective on the technical implementation of the 1991 game *Another World* (also known as *Out of This World*), focusing on how its vector-based graphics were rendered across various early 90s hardware platforms. The article series introduces the game's core architecture as a simple virtual machine (VM) with only 29 opcodes, 256 variables, 64 threads, and four framebuffers. This approach enabled high portability and resource efficiency. It delves into platform-specific optimization tricks, such as the use of background buffers and special palette manipulations for translucency effects. @@ -253,7 +254,7 @@ RobSmithDev has an excellent video about the history and reverse engineering of ### Essential Guide: The History of Trackers -[MusicTech](https://musictech.com/guides/essential-guide/history-of-trackers/) provides a comprehensive history of music trackers, starting with Karsten Obarski's *Ultimate Soundtracker* on the Amiga and evolving through the demoscene to PC tools like *FastTracker II* and *Impulse Tracker*. The article details the technical limitations that shaped the unique "tracker sound"—such as the vertical timeline and hexadecimal commands—and discusses their lasting legacy in modern production tools like *Renoise*. +[MusicTech](https://musictech.com/guides/essential-guide/history-of-trackers/) provides a comprehensive history of music trackers, starting with Karsten Obarski's *Ultimate Soundtracker* on the Amiga and evolving through the demoscene to PC tools like *FastTracker II* and *Impulse Tracker*. The article details the technical limitations that shaped the unique "tracker sound"-such as the vertical timeline and hexadecimal commands-and discusses their lasting legacy in modern production tools like *Renoise*. {% include link-to-other-site.html url="https://musictech.com/guides/essential-guide/history-of-trackers/" description="MusicTech chronicles the rise of music trackers, from the Amiga's 4-channel MOD format to the sophisticated multi-channel tools of the DOS era and their influence on modern DAWs." image="https://upload.wikimedia.org/wikipedia/commons/7/7b/Protracker_2.3a_screenshot.png" title="Essential Guide: History of Trackers" %} diff --git a/categories/consoles/Android.md b/categories/consoles/Android.md index f5a25734..e400d2a1 100644 --- a/categories/consoles/Android.md +++ b/categories/consoles/Android.md @@ -37,6 +37,7 @@ It operates automatically after decompilation to extract and analyze "magic stri {% include link-to-other-site.html url="https://github.com/0rShemesh/jadx-magic-strings" description="0rShemesh's JADX plugin automatically extracts source file references, method name candidates, and other structural information from string constants in decompiled Android code, aiding reverse engineering." image="https://opengraph.githubassets.com/1/0rShemesh/jadx-magic-strings" title="jadx-magic-strings: JADX plugin for extracting metadata from strings" %} ## Android File Formats + ### APK-Info: Full-Featured APK Parser (Rust/Python) The APK parser **apk-info** is designed for efficient forensic and security analysis, offering comprehensive extraction of crucial metadata from Android packages, including main activities, minimum SDK versions, and intricate details from the **AXML** (Binary XML) and **ARSC** (Resource) formats. Crucially, it fully supports parsing various **APK Signature Block 42** schemes (v1, v2, v3, v3.1), making it a powerful read-only utility for large-scale Android reverse engineering and malware analysis. diff --git a/categories/consoles/Arcade.md b/categories/consoles/Arcade.md index 072f3178..dfa058b8 100644 --- a/categories/consoles/Arcade.md +++ b/categories/consoles/Arcade.md @@ -53,18 +53,18 @@ In the 1990 interview with **Mark Stephen Pierce** the following was published ( ## What did a Typical Arcade Game Development Team Look Like? -In the early days of arcade gaming, development teams needed to be highly specialized. Unlike today’s streamlined development environments, both **hardware and software** had to be built **from scratch** for each new game. This required expertise across a wide range of disciplines, from custom chip design to game logic and audiovisual presentation. +In the early days of arcade gaming, development teams needed to be highly specialized. Unlike today's streamlined development environments, both **hardware and software** had to be built **from scratch** for each new game. This required expertise across a wide range of disciplines, from custom chip design to game logic and audiovisual presentation. -As arcade hardware evolved and became more standardized—often borrowing from or influencing console architectures—the **hardware workload** decreased slightly. However, the **software and design** demands increased, calling for larger, more diverse teams to handle game mechanics, visual design, sound, and player experience. +As arcade hardware evolved and became more standardized-often borrowing from or influencing console architectures-the **hardware workload** decreased slightly. However, the **software and design** demands increased, calling for larger, more diverse teams to handle game mechanics, visual design, sound, and player experience. -A great example is Taito’s groundbreaking 1987 arcade title, **Darius**, which employed a team with clearly defined roles: -- **Sound Designer** – Yasuhiko Tanaka -- **Composer** – Hisayoshi “OGR” Ogura -- **Cabinet Designer** – Natsuki Hirosawa -- **Game Designer** – Junji Yarita -- **Planner** – Akira Fujita -- **Programmer** – Toru Sagawara -- **Hardware Engineer** – Takeki Nakamura +A great example is Taito's groundbreaking 1987 arcade title, **Darius**, which employed a team with clearly defined roles: +* **Sound Designer** – Yasuhiko Tanaka +* **Composer** – Hisayoshi "OGR" Ogura +* **Cabinet Designer** – Natsuki Hirosawa +* **Game Designer** – Junji Yarita +* **Planner** – Akira Fujita +* **Programmer** – Toru Sagawara +* **Hardware Engineer** – Takeki Nakamura For a deeper look into the development of *Darius*, check out this excellent translated interview on **shmuplations**: [Darius I & II – 1986/89 Developer Interviews – shmuplations.com](https://shmuplations.com/dariusii/) @@ -103,7 +103,7 @@ As for the software side, they had to write their own text editor and assembler, In Retro Gamer 28 there is an excellent article from **Archer Maclean** where he went to a presentation by **Eugene Jarvis** and this is what he had to say [^3]: > He went on to describe that his code spilled over into multiple files on more than one floppy, and yet there were no multi-floppy code-linkers so he devised the exact same bizarre jump vector solution I had devised to allow non-linked blocks of code to communicate. -> Then he described how he had to write ‘utilities’ to edit tiny bitmaps drawn on graph paper and entered as hex, +> Then he described how he had to write 'utilities' to edit tiny bitmaps drawn on graph paper and entered as hex, > and how to get around the one hour compile times by editing memory directly and disassembling in your head, > and how to make interesting sounds from 30 bytes of data, and how to write ultra-tight optimised machine code to move small bitmaps around a screen fast, and off course, cram it all into a 32k ROM. @@ -129,9 +129,9 @@ Speed-up kits, also known as **enhancement kits**, were aftermarket hardware mod ## Purpose and Impact of Speed Up Kits The primary motivations for implementing speed-up kits included: -- **Increased Revenue**: Faster gameplay reduced session times, allowing more players per hour and increasing coin drop rates. -- **Extended Cabinet Life**: By refreshing game mechanics, operators could delay purchasing new machines. -- **Enhanced Player Engagement**: New challenges and features kept experienced players interested. +* **Increased Revenue**: Faster gameplay reduced session times, allowing more players per hour and increasing coin drop rates. +* **Extended Cabinet Life**: By refreshing game mechanics, operators could delay purchasing new machines. +* **Enhanced Player Engagement**: New challenges and features kept experienced players interested. For example, the original **Asteroids** game allowed skilled players to play indefinitely on a single credit. A speed-up kit made the game more challenging, thereby reducing playtime per credit and increasing revenue . @@ -141,23 +141,23 @@ For example, the original **Asteroids** game allowed skilled players to play ind Some of the most famous examples of speed up kits are: -- **Super Missile Attack**: Developed by General Computer Corporation (GCC), this kit modified Atari's *Missile Command*, adding new enemies and increasing difficulty. Its success led to legal action from Atari, which was eventually settled when Atari hired GCC to develop games . -- **Ms Pac Man**: Another GCC project, this kit transformed Namco's **Pac-Man** into **Crazy Otto**, introducing new mazes and improved AI. Midway licensed and released it as an official sequel called **Ms Pac Man** [^6]. +* **Super Missile Attack**: Developed by General Computer Corporation (GCC), this kit modified Atari's *Missile Command*, adding new enemies and increasing difficulty. Its success led to legal action from Atari, which was eventually settled when Atari hired GCC to develop games . +* **Ms Pac Man**: Another GCC project, this kit transformed Namco's **Pac-Man** into **Crazy Otto**, introducing new mazes and improved AI. Midway licensed and released it as an official sequel called **Ms Pac Man** [^6]. --- ## How were Speed Up Kits implemented? Speed-up kits were typically implemented through reverse engineering the original game and modifying it using: -- **Daughterboards**: Additional circuit boards that modified signals or data paths. -- **ROM Replacements**: Swapping out original ROM chips with modified versions containing new code. -- **Clock Modifications**: Altering the system clock to increase CPU speed, thus speeding up gameplay . +* **Daughterboards**: Additional circuit boards that modified signals or data paths. +* **ROM Replacements**: Swapping out original ROM chips with modified versions containing new code. +* **Clock Modifications**: Altering the system clock to increase CPU speed, thus speeding up gameplay . --- ## Legal and Ethical Considerations While speed-up kits offered benefits to arcade operators, they raised legal and ethical questions: -- **Intellectual Property**: Modifying and distributing altered versions of games without permission infringed on the original developers' rights. -- **Quality Control**: Unauthorized modifications could lead to inconsistent gameplay experiences and potential hardware issues. +* **Intellectual Property**: Modifying and distributing altered versions of games without permission infringed on the original developers' rights. +* **Quality Control**: Unauthorized modifications could lead to inconsistent gameplay experiences and potential hardware issues. The legal dispute between Atari and GCC over **Super Missile Attack** highlighted these concerns. The settlement resulted in GCC ceasing unauthorized modifications and instead developing licensed content resulting in **Ms Pac Man** [^6]. @@ -165,9 +165,9 @@ The legal dispute between Atari and GCC over **Super Missile Attack** highlighte ## Legacy of Speed Up Kits Speed-up kits played a significant role in the arcade industry's evolution: -- **Innovation Catalyst**: They demonstrated the demand for game enhancements, influencing official sequels and updates. -- **Technical Advancement**: The reverse engineering skills developed during kit creation contributed to advancements in game development and hardware understanding. -- **Preservation Challenges**: Today, original speed-up kits are valuable to collectors and historians but pose challenges for preservation due to their unofficial nature. +* **Innovation Catalyst**: They demonstrated the demand for game enhancements, influencing official sequels and updates. +* **Technical Advancement**: The reverse engineering skills developed during kit creation contributed to advancements in game development and hardware understanding. +* **Preservation Challenges**: Today, original speed-up kits are valuable to collectors and historians but pose challenges for preservation due to their unofficial nature. --- @@ -206,7 +206,7 @@ JSMESS was created by cross-compiling the original C/C++ codebase into JavaScrip The original source code for JSMESS, is still available on [JSMESS original Github](https://github.com/jsmess/jsmess). But please note that it has now been integrated into the **main MAME repository**, so this repository is now **archived** and no longer actively maintained, but the source remains accessible for historical and reference purposes. -For an up-to-date build of JSMESS you can follow the Emscripten part of the guide here: [Compiling MAME — MAME Documentation 0.278 documentation](https://docs.mamedev.org/initialsetup/compilingmame.html#emscripten-javascript-and-html) +For an up-to-date build of JSMESS you can follow the Emscripten part of the guide here: [Compiling MAME - MAME Documentation 0.278 documentation](https://docs.mamedev.org/initialsetup/compilingmame.html#emscripten-javascript-and-html) --- ### 2015 - MAME merges with MESS @@ -228,8 +228,12 @@ MAME was again featured in EDGE magazine in **October 2002**, where it was descr # Unreleased Arcade Games ## Rare's Razz Board +The RAZZ is a 1988-era custom arcade board from Rare that used a unique Hitachi Z80-based "DMA hijacking" technique to enable high-speed sprite rendering and an extensive color palette, serving as the technical foundation for unreleased projects like the flight simulator 'Fokker' and the 'Playboy' handheld prototype. -[Rare Gamer - Fokker](https://www.raregamer.co.uk/games/fokker/) +### Fokker (Unreleased Arcade Game) +Rare Gamer provides a technical overview of Fokker, a cancelled 1988 arcade flight simulator that was intended to be Rare's first coin-op release. The link details the game's development on the proprietary "Razz" arcade board, which enabled 3D bi-plane dogfighting and bombing runs through early hardware-accelerated rendering techniques. Lead programmer Simon Hallam managed a five-month development cycle before the project was cancelled, leaving behind a functional prototype that serves as a significant milestone in Rare’s early technical history. + +{% include link-to-other-site.html url="https://www.raregamer.co.uk/games/fokker/" description="Rare Gamer explores the history and technical implementation of Fokker, a cancelled 1988 arcade flight simulator that utilized Rare's custom Razz board." image="https://www.raregamer.co.uk/wp-content/uploads/2012/03/fokker_01.png" title="Fokker - Rare Gamer" %} --- # References diff --git a/categories/consoles/AtariJaguar.md b/categories/consoles/AtariJaguar.md index bec5283b..630b1183 100644 --- a/categories/consoles/AtariJaguar.md +++ b/categories/consoles/AtariJaguar.md @@ -50,7 +50,7 @@ The official "Atari Jaguar Development Manual" is available over on **archive.or It comes with: -* M68000 8-/16-/32-Bit Microprocessors User’s Manual Ninth Edition written by MOTOROLA in 1993 +* M68000 8-/16-/32-Bit Microprocessors User's Manual Ninth Edition written by MOTOROLA in 1993 * **ALN Linker** - 11 pages of linker documentation from 5th June 1995 * Appendix A - Frequently AskedQuestions About Jaguar * Appendix B - Programming Guidelines diff --git a/categories/consoles/DOS.md b/categories/consoles/DOS.md index 17a0e592..1a2d37c8 100644 --- a/categories/consoles/DOS.md +++ b/categories/consoles/DOS.md @@ -51,13 +51,13 @@ Unlike modern PCs it was fairly common to have Game ports (15-pin DA-15 connecto ## DOS-era Graphics Hardware For DOS games, the video card ports and expansion bus types evolved over time, with **ISA** dominating early DOS gaming through the 80s and early 90s. -Here’s a chronological overview of the common video card ports used for DOS gaming graphics and their associated buses: +Here's a chronological overview of the common video card ports used for DOS gaming graphics and their associated buses: -| Bus / Port Type | Time Period | Notes & Relation to DOS Gaming | -|---|---|---| -| **ISA (Industry Standard Architecture)** | 1981 to mid-1990s | The dominant bus for early DOS graphics cards like CGA, EGA, and VGA cards. ISA ran at 8 MHz (later 16-bit at 8-10 MHz) and was the standard for most DOS expansion cards initially. | -| **VESA Local Bus (VLB)** | Early 1990s (~1992 to 1994) | A 32-bit local bus designed to increase throughput for VGA/SVGA cards by connecting directly to the CPU bus at 33 MHz. VLB cards were used briefly in DOS gaming to allow faster graphics and higher resolutions. Mostly on 486 systems. | -| **PCI (Peripheral Component Interconnect)** | Mid 1990s onwards (from ~1993) | PCI replaced VLB and ISA for most expansions. PCI introduced a separate clock and 32-bit or 64-bit data width with higher throughput, becoming common in late DOS era and Windows 95 gaming. Many late DOS and early Windows 3.x/95 games used PCI graphics cards. | +Bus / Port Type | Time Period | Notes & Relation to DOS Gaming +---|---|--- +**ISA (Industry Standard Architecture)** | 1981 to mid-1990s | The dominant bus for early DOS graphics cards like CGA, EGA, and VGA cards. ISA ran at 8 MHz (later 16-bit at 8-10 MHz) and was the standard for most DOS expansion cards initially. +**VESA Local Bus (VLB)** | Early 1990s (~1992 to 1994) | A 32-bit local bus designed to increase throughput for VGA/SVGA cards by connecting directly to the CPU bus at 33 MHz. VLB cards were used briefly in DOS gaming to allow faster graphics and higher resolutions. Mostly on 486 systems. +**PCI (Peripheral Component Interconnect)** | Mid 1990s onwards (from ~1993) | PCI replaced VLB and ISA for most expansions. PCI introduced a separate clock and 32-bit or 64-bit data width with higher throughput, becoming common in late DOS era and Windows 95 gaming. Many late DOS and early Windows 3.x/95 games used PCI graphics cards. Here are what the ports looked like for anyone curious to build a retro PC using original hardware: diff --git a/categories/consoles/Dreamcast.md b/categories/consoles/Dreamcast.md index 11868b02..cecf1b21 100644 --- a/categories/consoles/Dreamcast.md +++ b/categories/consoles/Dreamcast.md @@ -21,6 +21,7 @@ redirect_from: tags: - dreamcast --- + # Introduction to Hacking/Reversing the SEGA Dreamcast Welcome to our page dedicated to SEGA Dreamcast reverse engineering! The SEGA Dreamcast was a beloved gaming console that was first released in 1998, and has since gained a cult following among retro gaming enthusiasts. @@ -42,7 +43,7 @@ So grab your VMU, fire up your Dreamcast, and get ready to dive into the excitin ### How the Dreamcast's Security was Hacked (MIL-CD) -This article debunks the common myth that the Dreamcast lacked security, explaining instead how the "MIL-CD" format—intended for interactive music albums—became the system's Achilles' heel. We detail how hackers exploited this oversight to bypass GD-ROM authenticity checks, allowing modified game ISOs to run on standard CD-Rs despite the console's built-in copy protection mechanisms. +This article debunks the common myth that the Dreamcast lacked security, explaining instead how the "MIL-CD" format-intended for interactive music albums-became the system's Achilles' heel. We detail how hackers exploited this oversight to bypass GD-ROM authenticity checks, allowing modified game ISOs to run on standard CD-Rs despite the console's built-in copy protection mechanisms. {% include_cached link-to-other-post.html post="/How-the-Dreamcast-Security-was-Hacked" %} @@ -106,7 +107,7 @@ Wikipedia maintains a list of Dreamcast exclusives - [Dreamcast-only games - Wi ## Reverse Engineering Ecco the Dolphin with Ghidra There is an excellent article by **Rings of Saturn** on reverse engineering Ecco the Dolphin for the Dreamcast, specifically how the cheat codes work via save names: -[Under the microscope: Ecco the Dolphin — Defender of the Future](https://32bits.substack.com/p/under-the-microscope-ecco-the-dolphin) +[Under the microscope: Ecco the Dolphin - Defender of the Future](https://32bits.substack.com/p/under-the-microscope-ecco-the-dolphin) ## Castlevania: Resurrection Dreamcast Reverse Engineering [Sega Dreamcast Info](https://www.sega-dreamcast-info-games-preservation.com/en/castlevania-dreamcast-reverse-engineering) provides a deep dive into the reverse engineering of the unreleased *Castlevania: Resurrection* E3 1999 prototype. The write-up details the discovery of plain text scripting for AI and level data, the extraction of hidden assets like music and textures, and the technical work required to create playable GDI and CDI images for modern hardware. diff --git a/categories/consoles/Game.com.md b/categories/consoles/Game.com.md index 266cff6a..21e02822 100644 --- a/categories/consoles/Game.com.md +++ b/categories/consoles/Game.com.md @@ -35,7 +35,6 @@ Welcome to our page dedicated to Tiger Game(dot)com reverse engineering! The Tig So grab your Game(dot)com and get ready to dive into the exciting world of Game com reverse engineering! --- - # Games ## Castlevania Symphony of the Night diff --git a/scripts/format-docs.js b/scripts/format-docs.js new file mode 100755 index 00000000..69efe04f --- /dev/null +++ b/scripts/format-docs.js @@ -0,0 +1,461 @@ +#!/usr/bin/env node +/** + * format-docs.js + * + * Applies Claude.md formatting rules to Markdown documentation files. + * Run before committing to keep all pages consistently formatted. + * + * Rules enforced: + * em-dash — (U+2014) → - outside code spans and fenced blocks + * curly-quotes "/"/'/'\u2018-\u201D → straight ASCII quotes + * blank-after-fence ```lang\n\n → ```lang\n (no blank line after fence opener) + * numbered-list 1. item → * item (ordered lists → unordered) + * backtick-heading ## `code` → ## code (no backticks inside headings) + * bold-heading ## **text** → ## text (no bold markers inside headings) + * table-pipes | col | → col (no leading/trailing pipe on rows) + * table-blank text\ntbl → text\n\ntbl (blank line before table) + * blank-before-heading text\n## → text\n\n## (blank line before headings) + * hr-heading ---\n\n## → ---\n## (no blank between HR and heading) + * heading-content ##\n\n txt → ##\n txt (no blank after heading before prose) + * + * Usage: + * node format-docs.js # format all .md files recursively + * node format-docs.js path/to/file.md # format a single file + * node format-docs.js --check # report issues without modifying + * node format-docs.js --check . # check all .md files + * node format-docs.js --quiet --check . # check, summary only (CI-friendly) + * + * Pre-commit hook setup: + * cp format-docs.js /path/to/repo/ + * echo '#!/bin/sh\nnode format-docs.js --check .' > .git/hooks/pre-commit + * chmod +x .git/hooks/pre-commit + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const argv = process.argv.slice(2); +const CHECK = argv.includes('--check'); +const QUIET = argv.includes('--quiet'); +const TARGET = argv.find(a => !a.startsWith('-')) ?? '.'; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** Replace `search` with `replace` only in segments outside backtick spans. */ +function replaceOutsideInlineCode(str, search, replace) { + const parts = str.split('`'); + for (let i = 0; i < parts.length; i += 2) { + parts[i] = parts[i].split(search).join(replace); + } + return parts.join('`'); +} + +/** + * Returns a stateful predicate that tracks fenced code blocks, Liquid + * capture blocks, and page frontmatter. Call once per line, in order. Returns + * true for lines that are inside (or are the boundary of) a protected block + * and should be skipped by formatting rules. + */ +function makeFenceTracker() { + let inFence = false; + let inCapture = false; + let inFrontmatter = false; + let lineCount = 0; + + return function isProtected(ln) { + lineCount++; + // Frontmatter: --- at the very start (line 1) and --- after it closes the block + if (lineCount === 1 && /^-{3}/.test(ln.trim())) { + inFrontmatter = true; + return true; + } + if (inFrontmatter && lineCount > 1 && /^-{3}/.test(ln.trim())) { + inFrontmatter = false; + return true; + } + + if (/^(`{3,}|~{3,})/.test(ln.trim())) { inFence = !inFence; return true; } + if (/^\{%-?\s*capture\b/.test(ln)) { inCapture = true; return true; } + if (/^\{%-?\s*endcapture\b/.test(ln)) { inCapture = false; return true; } + return inFrontmatter || inFence || inCapture; + }; +} + +// --------------------------------------------------------------------------- +// Per-line rules (applied while tracking fenced code block state) +// --------------------------------------------------------------------------- + +function applyLineRules(lines) { + const out = []; + const fixes = []; + const isProtected = makeFenceTracker(); + + for (let i = 0; i < lines.length; i++) { + let ln = lines[i]; + const n = i + 1; // 1-based for reporting + + if (isProtected(ln)) { + out.push(ln); + continue; + } + + // ----------------------------------------------------------------------- + // Rule: no blank lines immediately after a code fence opener + // e.g. ```bash\n\ncode → ```bash\ncode + // Must be checked before isProtected so we can intercept lines that sit + // inside a fence block (isProtected would otherwise pass them through). + // ----------------------------------------------------------------------- + if (ln.trim() === '' && out.length > 0 && /^(`{3,}|~{3,})\S/.test(out[out.length - 1].trim())) { + fixes.push(`L${n}: blank-after-fence`); + continue; + } + + // ----------------------------------------------------------------------- + // Rule: unordered list items must use * not - + // Matches "- item" or " - item" (with optional leading spaces). + // Excludes table separators (---|---) and HR markers (---) because + // those never have a space immediately after the leading hyphens. + // ----------------------------------------------------------------------- + if (/^( *)- /.test(ln)) { + const fixed = ln.replace(/^( *)- /, '$1* '); + fixes.push(`L${n}: dash-list`); + ln = fixed; + } + + // ----------------------------------------------------------------------- + // Rule: remove bold markers wrapping a backtick span (**`code`** → `code`) + // The backtick already provides distinct styling; bold is redundant. + // ----------------------------------------------------------------------- + if (ln.includes('**`')) { + const fixed = ln.replace(/\*\*(`[^`]+`)\*\*/g, '$1'); + if (fixed !== ln) { + fixes.push(`L${n}: bold-backtick`); + ln = fixed; + } + } + + // ----------------------------------------------------------------------- + // Rule: em-dash (—) → hyphen (-) outside inline code spans + // ----------------------------------------------------------------------- + if (ln.includes('\u2014')) { + const fixed = replaceOutsideInlineCode(ln, '\u2014', '-'); + if (fixed !== ln) { + fixes.push(`L${n}: em-dash`); + ln = fixed; + } + } + + // ----------------------------------------------------------------------- + // Rule: curly/smart quotes → straight ASCII quotes (outside inline code) + // Covers left/right double quotes (U+201C/U+201D) and + // left/right single quotes (U+2018/U+2019). + // ----------------------------------------------------------------------- + if (/[\u201C\u201D\u2018\u2019]/.test(ln)) { + let fixed = replaceOutsideInlineCode(ln, '\u201C', '"'); + fixed = replaceOutsideInlineCode(fixed, '\u201D', '"'); + fixed = replaceOutsideInlineCode(fixed, '\u2018', "'"); + fixed = replaceOutsideInlineCode(fixed, '\u2019', "'"); + if (fixed !== ln) { + fixes.push(`L${n}: curly-quotes`); + ln = fixed; + } + } + + // ----------------------------------------------------------------------- + // Rule: numbered list → unordered list + // Matches "1. text", "12. text" etc. at the start of the line. + // ----------------------------------------------------------------------- + if (/^\d+\. /.test(ln)) { + const fixed = ln.replace(/^\d+\. /, '* '); + fixes.push(`L${n}: numbered-list`); + ln = fixed; + } + + // ----------------------------------------------------------------------- + // Rule: no numeric prefixes in headings (e.g. "### 7. Title" → "### Title") + // ----------------------------------------------------------------------- + if (/^#{1,5} \d+\. /.test(ln)) { + const fixed = ln.replace(/^(#{1,5} )\d+\. /, '$1'); + fixes.push(`L${n}: numbered-heading`); + ln = fixed; + } + + // ----------------------------------------------------------------------- + // Rule: no bold markers inside headings (H1–H5) + // CSS handles heading weight; **…** is redundant and against style rules. + // ----------------------------------------------------------------------- + if (/^#{1,5} /.test(ln) && ln.includes('**')) { + const fixed = ln.replace(/\*\*([^*]+)\*\*/g, '$1'); + if (fixed !== ln) { + fixes.push(`L${n}: bold-heading`); + ln = fixed; + } + } + + // ----------------------------------------------------------------------- + // Rule: no backtick code spans inside headings (H1–H5) + // ----------------------------------------------------------------------- + if (/^#{1,5} /.test(ln) && ln.includes('`')) { + const fixed = ln.replace(/`([^`]*)`/g, '$1'); + if (fixed !== ln) { + fixes.push(`L${n}: backtick-heading`); + ln = fixed; + } + } + + // ----------------------------------------------------------------------- + // Rule: table rows must not start or end with a pipe character + // Covers data rows: | cell | cell | → cell | cell + // Covers separators: |---|---| → ---|--- + // ----------------------------------------------------------------------- + if (/^\|/.test(ln) && /\|$/.test(ln)) { + const fixed = ln + .replace(/^\| ?/, '') // strip leading "| " or "|" + .replace(/ ?\|$/, ''); // strip trailing " |" or "|" + if (fixed !== ln) { + fixes.push(`L${n}: table-pipes`); + ln = fixed; + } + } + + out.push(ln); + } + + return { lines: out, fixes }; +} + +// --------------------------------------------------------------------------- +// Multi-line rules (applied via regex on the joined string) +// --------------------------------------------------------------------------- + +function applyMultiLineRules(text, fixes) { + // Rule: ensure blank line after frontmatter closing --- before any content/heading + // Frontmatter is identified by --- at the start (line 1), YAML with :, then closing --- + const frontmatterMatch = text.match(/^---\n([\s\S]*?)\n---\n/); + let after0 = text; + if (frontmatterMatch && frontmatterMatch[1].includes(':')) { + // This looks like frontmatter; ensure blank line after closing --- + after0 = text.replace(/^(---\n[\s\S]*?\n---)(\n)(?=[^\n])/m, '$1\n\n'); + if (after0 !== text) { + fixes.push('multiline: missing blank line after frontmatter'); + } + } + + // Rule: no blank line(s) between a --- HR and the next heading + // e.g. ---\n\n## Heading → ---\n## Heading + // But SKIP this if the --- is closing frontmatter (already handled above) + let after1 = after0; + if (!frontmatterMatch || !frontmatterMatch[1].includes(':')) { + after1 = after0.replace(/^---\n\n+(#{1,5} )/gm, '---\n$1'); + if (after1 !== after0) { + fixes.push('multiline: blank between HR and heading'); + } + } else { + // For frontmatter files, still apply the rule but skip the first --- block + after1 = after0.replace(/(?<=\n)---\n\n+(#{1,5} )/gm, '---\n$1'); + if (after1 !== after0) { + fixes.push('multiline: blank between HR and heading'); + } + } + + // Rule: no blank line(s) between a heading and its first content line. + // Skips cases where the blank is followed by another heading, HR, HTML, + // Liquid tags, or a blank-only line (preserved intentionally). + const after2 = after1.replace(/^(#{1,5} [^\n]+)\n\n+(?=[^\n#\-<{%])/gm, '$1\n'); + if (after2 !== after1) { + fixes.push('multiline: blank between heading and content'); + } + + // Rule: blank line required before a table header row. + // A table is identified by a header row (containing |) immediately followed + // by a separator row (only [-|: ] chars, must contain both | and -). + // Inserts a blank line if the line preceding the header is non-blank and is + // not itself a table row (which would mean we are already inside a table). + const after3 = after2.replace( + /^([^\n]+)\n([^\n]*\|[^\n]*\n[-|: ]+)/gm, + (match, prevLine, tableBlock) => { + const sep = tableBlock.split('\n')[1] ?? ''; + if (!sep.includes('|') || !sep.includes('-')) return match; + if (prevLine.includes('|')) return match; // already inside a table + return `${prevLine}\n\n${tableBlock}`; + } + ); + if (after3 !== after2) { + fixes.push('multiline: missing blank line before table'); + } + + // Rule: blank line required before every heading. + // Uses line-by-line processing to correctly skip fenced code blocks, + // where heading-like syntax (e.g. ## bash comment) must not be modified. + // Also skips when the preceding line is an HR (---), since the hr-heading + // rule requires headings to immediately follow an HR with no blank line. + const after4 = (() => { + const lines = after3.split('\n'); + const out = []; + let inFence = false; + let modified = false; + + for (let i = 0; i < lines.length; i++) { + const ln = lines[i]; + if (/^(`{3,}|~{3,})/.test(ln.trim())) inFence = !inFence; + + if (!inFence && /^#{1,5} /.test(ln) && i > 0 && lines[i - 1] !== '') { + if (!/^-+$/.test(lines[i - 1])) { + out.push(''); + modified = true; + } + } + out.push(ln); + } + + if (modified) fixes.push('multiline: missing blank line before heading'); + return out.join('\n'); + })(); + + return after4; +} + +// --------------------------------------------------------------------------- +// Warning checks (report only — cannot be auto-fixed) +// --------------------------------------------------------------------------- + +/** + * Checks for Markdown tables that immediately follow a heading or HR with no + * intervening prose sentence. Returns an array of warning strings. + * + * Detection logic: + * A table separator row is a line containing only [-|: ] chars that + * includes both '|' and '-'. When one is found, we walk back past the + * header row to the first non-blank line before it. If that line is a + * heading (# …) or an HR (---), the table has no intro sentence. + */ +function checkTableIntros(lines) { + const warnings = []; + const isProtected = makeFenceTracker(); + + for (let i = 0; i < lines.length; i++) { + const ln = lines[i]; + if (isProtected(ln)) continue; + + // Table separator: only dashes, pipes, colons, spaces — and must have both + if (!/^[-|: ]+$/.test(ln) || !ln.includes('|') || !ln.includes('-')) continue; + + // The line before the separator is the header row — it must contain '|' + if (i < 1 || !lines[i - 1].includes('|')) continue; + + // Walk back past the header to find the last non-blank line before it + let prev = i - 2; + while (prev >= 0 && lines[prev].trim() === '') prev--; + + // Flag if that line is a heading or HR (meaning no intro sentence exists) + if (prev < 0 || /^#{1,5} /.test(lines[prev]) || /^-+$/.test(lines[prev])) { + warnings.push(`L${i + 1}: table-no-intro`); + } + } + + return warnings; +} + +// --------------------------------------------------------------------------- +// File processor +// --------------------------------------------------------------------------- + +function processFile(filePath) { + const original = fs.readFileSync(filePath, 'utf8'); + const lines = original.split('\n'); + + const { lines: patched, fixes } = applyLineRules(lines); + const result = applyMultiLineRules(patched.join('\n'), fixes); + const warnings = checkTableIntros(result.split('\n')); + + const hasChanges = result !== original; + const hasWarnings = warnings.length > 0; + + if (!hasChanges && !hasWarnings) return { changed: false, warned: false }; + + if (hasChanges && !CHECK) { + fs.writeFileSync(filePath, result, 'utf8'); + } + + const rel = path.relative(process.cwd(), filePath); + + if (hasChanges && !QUIET) { + const status = CHECK ? '\u26A0\uFE0F CHECK' : '\u2705 FIXED'; + console.log(`${status} ${rel} (${fixes.length} fix${fixes.length === 1 ? '' : 'es'})`); + fixes.forEach(f => console.log(` ${f}`)); + } + + if (hasWarnings && !QUIET) { + console.log(`\uD83D\uDCA1 WARN ${rel} (${warnings.length} table${warnings.length === 1 ? '' : 's'} missing intro sentence)`); + warnings.forEach(w => console.log(` ${w}`)); + } + + return { changed: hasChanges, warned: hasWarnings }; +} + +// --------------------------------------------------------------------------- +// File discovery +// --------------------------------------------------------------------------- + +function collectMarkdownFiles(target) { + const stat = fs.statSync(target); + if (stat.isFile()) { + return target.endsWith('.md') ? [target] : []; + } + + const files = []; + const SKIP = new Set([ + 'node_modules', 'vendor', '3rdparty', 'bgfx', 'build', + 'dist', '.git', 'generated', + ]); + + (function walk(dir) { + for (const entry of fs.readdirSync(dir)) { + if (SKIP.has(entry)) continue; + + const full = path.join(dir, entry); + const s = fs.statSync(full); + + if (s.isDirectory()) { + walk(full); + } else if (entry.endsWith('.md')) { + files.push(full); + } + } + })(target); + + return files; +} + +// --------------------------------------------------------------------------- +// Entry point +// --------------------------------------------------------------------------- + +const mdFiles = collectMarkdownFiles(TARGET); +let changed = 0; +let warned = 0; + +for (const f of mdFiles) { + const result = processFile(f); + if (result.changed) changed++; + if (result.warned) warned++; +} + +if (changed === 0 && warned === 0) { + console.log('All markdown files are properly formatted.'); +} else { + if (changed > 0 && CHECK) { + console.log(`\n${changed} file(s) need formatting. Run without --check to apply fixes.`); + } else if (changed > 0) { + console.log(`\nFormatted ${changed} file(s).`); + } + if (warned > 0) { + console.log(`\n${warned} file(s) have tables missing an intro sentence (add prose before the table header).`); + } +} + +if (CHECK && (changed > 0 || warned > 0)) process.exit(1); From fa6079b6be650f007005e05b8530edb224168b63 Mon Sep 17 00:00:00 2001 From: A
Date: Sat, 11 Apr 2026 11:53:30 +0100 Subject: [PATCH 2/5] Formatted more documents to meet the standard --- categories/consoles/GameBoyAdvance.md | 1 - categories/consoles/GameGear.md | 2 +- categories/consoles/Gamecube.md | 1 + categories/consoles/MegaDrive.md | 7 +- categories/consoles/N64.md | 1 + categories/consoles/Nes.md | 1 + categories/consoles/iOS.md | 4 +- pages/Industry/Copyright.md | 28 ++-- pages/Industry/Develop.md | 56 +++---- pages/Industry/GameMakerMagazine.md | 8 +- .../Ghidra/GhidraDecompilingIntroduction.md | 76 ++++----- pages/tools/engines/KromeMerkuryEngine.md | 103 ++++++------ pages/tools/engines/LucasArtsZenoAndZed.md | 56 +++---- .../CreateALibRetroFrontEndInRust.md | 26 +-- pages/tutorials/GDBReversing.md | 44 ++--- pages/tutorials/WritingAGDBStubInC.md | 5 +- pages/tutorials/libRetro.md | 14 +- scripts/README.md | 155 ++++++++---------- scripts/format-docs.js | 30 ++-- 19 files changed, 283 insertions(+), 335 deletions(-) diff --git a/categories/consoles/GameBoyAdvance.md b/categories/consoles/GameBoyAdvance.md index 5054fe36..5f23e81d 100644 --- a/categories/consoles/GameBoyAdvance.md +++ b/categories/consoles/GameBoyAdvance.md @@ -84,7 +84,6 @@ Matt Greer's Blog has an excellent write up about reverse engineering the Ninten --- - # All Posts Tagged with GBA
diff --git a/categories/consoles/GameGear.md b/categories/consoles/GameGear.md index d4b2ec3e..659146b4 100644 --- a/categories/consoles/GameGear.md +++ b/categories/consoles/GameGear.md @@ -52,7 +52,7 @@ We know of two confirmed assemblers that were used for Game Gear programming: ## How was the final ROM built? Normally it was up to the main programmer to put everything together, all the images, sounds, music and other assets into the final game ROM that would be sent to Sega. -Developers such as **Paul Hutchinson** wrote programs with Turbo C++ to convert the asset data into assembler files (Define Byte (`.DB`), Define Word (`.DW`) etc statements) [^2]. Then an assembler is used to put everything together into a single file that can then be burned onto an EPROM using hardware such as **Needham’s Electronics EPROM programmer**. +Developers such as **Paul Hutchinson** wrote programs with Turbo C++ to convert the asset data into assembler files (Define Byte (`.DB`), Define Word (`.DW`) etc statements) [^2]. Then an assembler is used to put everything together into a single file that can then be burned onto an EPROM using hardware such as **Needham's Electronics EPROM programmer**. The EPROM was then inserted on to a development cartridge and tested on the retail system before finally sending to Sega via their Bullitin Board System (BBS) [^2]. diff --git a/categories/consoles/Gamecube.md b/categories/consoles/Gamecube.md index 5a27749e..5024d606 100644 --- a/categories/consoles/Gamecube.md +++ b/categories/consoles/Gamecube.md @@ -22,6 +22,7 @@ redirect_from: tags: - gamecube --- + Welcome to our page dedicated to Gamecube reverse engineering! The Gamecube was a popular gaming console released by Nintendo in 2001, and has since become a beloved classic of the gaming world. If you're interested in learning more about the technical aspects of this console and how it works, you've come to the right place. On this page, we've compiled a list of links to other pages that cover various topics related to Gamecube reverse engineering. Whether you're interested in understanding the hardware architecture of the console, analyzing game code, or exploring the many mods and hacks that have been created by enthusiasts over the years, you'll find a wealth of resources and information on the pages we've linked to. diff --git a/categories/consoles/MegaDrive.md b/categories/consoles/MegaDrive.md index 30757ab4..b5b7c211 100644 --- a/categories/consoles/MegaDrive.md +++ b/categories/consoles/MegaDrive.md @@ -57,7 +57,6 @@ There were many exclusive games for the Mega Drive and the various hardware add- --- - # Hardware If you're interested in reverse engineering software for the Sega Mega Drive gaming console, it's essential to have a strong understanding of the hardware that powers it. By comprehending the inner workings of the Mega Drive hardware, you can better understand how the software interacts with the hardware and how you can potentially modify or enhance it. @@ -104,7 +103,7 @@ The development of the game **Alien Soldier** and other games by **Treasure** ha ### How long did it take to develop games for the Mega Drive back in the day? At **Treasure** (e.g Alien Soldier) **Masato Maegawa** reveals that it takes around about 10 months but that more complicated games could last 2 years [^2]: -> In the Megadrive days we took about 10 months for a game; now it’s about 15 months. There were some titles that took us a full 2 years, though. +> In the Megadrive days we took about 10 months for a game; now it's about 15 months. There were some titles that took us a full 2 years, though. Although he also revealed that there was a tight development cycle for Alien Solider as the deadline was January 3rd 1995 and they were working through the New Year switch. ### What did a Mega Drive Design Document look like? @@ -123,9 +122,9 @@ It was common in the industry to develop custom software in-house to make the ga ### DARI and KETCHUP (Game Arts) For the development of the Mega Drive game **Alisia Dragoon**, Game Arts created some in-house development software called KETCHUP and DARI: -- **KETCHUP** was used for editing maps and defining the pattern of enemy movements by configuring basic curves in the editor, as can be seen in the image below [^3]. +* **KETCHUP** was used for editing maps and defining the pattern of enemy movements by configuring basic curves in the editor, as can be seen in the image below [^3]. ![KETCHUP Development Software](https://github.com/user-attachments/assets/da139574-dc3a-47b9-8590-efeda984bb39) -- **DARI** was used for editing animated Sprites for games targetting both Mega Drive and Sharp X68000 systems: +* **DARI** was used for editing animated Sprites for games targetting both Mega Drive and Sharp X68000 systems: ![DARI development software](https://github.com/user-attachments/assets/95868040-6b64-4ac3-b289-398d1fd50c30) diff --git a/categories/consoles/N64.md b/categories/consoles/N64.md index 6aae6fa8..e330680d 100644 --- a/categories/consoles/N64.md +++ b/categories/consoles/N64.md @@ -20,6 +20,7 @@ breadcrumbs: tags: - n64 --- + # Introduction to Hacking the Nintendo 64 Interested in learning more about the the N64? Excellent! This section will guide you through the basics, starting from basic MIPS assembly language all the way to an introduction to reverse engineering your first game! diff --git a/categories/consoles/Nes.md b/categories/consoles/Nes.md index ae873c3f..3eb76cea 100644 --- a/categories/consoles/Nes.md +++ b/categories/consoles/Nes.md @@ -27,6 +27,7 @@ tags: - nes - introduction --- + Welcome to our in-depth guide to Nintendo Entertainment System (NES) reverse engineering! This page serves two roles. It groups all of our posts related to reverse engineering for the system, and it aggregates high quality sources from the web into create a unified reference. The content starts high level, outlining the system, its history, and its official game development process, then moves into low level details with a focus on reverse engineering and homebrew development. diff --git a/categories/consoles/iOS.md b/categories/consoles/iOS.md index c5c9cbcb..9d5a9ef8 100644 --- a/categories/consoles/iOS.md +++ b/categories/consoles/iOS.md @@ -121,7 +121,7 @@ The best way to check for recommended iOS 5.x games is to check out the Bookazin {% include link-to-other-site.html url="https://frida.re/docs/ios/" description="The official Frida guide for iOS explains how to set up the environment on both jailbroken and non-jailbroken devices to perform dynamic instrumentation and function tracing." image="https://frida.re/img/logotype.svg" title="Frida: iOS Documentation" %} -### **friman**: Frida Version Management Tool +### friman: Frida Version Management Tool **Thelicato** has developed **friman**, a Python-based utility that simplifies the management of multiple Frida versions, which is necessary due to compatibility issues across different devices and target projects. The tool enables seamless installation, local tracking, and switching of versions, along with specific helpers for downloading `frida-gadget` and `frida-server` assets, including a convenience utility for pushing the server to Android devices. @@ -132,7 +132,7 @@ The tool enables seamless installation, local tracking, and switching of version ## File Formats ### QLCARFiles: Assets.car Viewer for macOS -The **cgnkrz** repository provides **QLCARFiles**, a native macOS application built for the static analysis and inspection of Apple's compiled **Assets.car** files from iOS and macOS applications. This tool is valuable for reverse engineering as it offers a graphical interface to browse and view all bundled assets—including images at multiple scales, colors, and embedded data—and allows for easy extraction to disk. The project explicitly credits and builds upon the technical reverse engineering work of Timac on the underlying `.car` file format. +The **cgnkrz** repository provides **QLCARFiles**, a native macOS application built for the static analysis and inspection of Apple's compiled **Assets.car** files from iOS and macOS applications. This tool is valuable for reverse engineering as it offers a graphical interface to browse and view all bundled assets-including images at multiple scales, colors, and embedded data-and allows for easy extraction to disk. The project explicitly credits and builds upon the technical reverse engineering work of Timac on the underlying `.car` file format. {% include link-to-other-site.html url="https://github.com/cgnkrz/QLCARFiles" description="cgnkrz's QLCARFiles is a native macOS application that enables reverse engineers to visually browse, view, and extract bundled assets (images, colors, data) from iOS and macOS Assets.car files." image="https://opengraph.githubassets.com/1/cgnkrz/QLCARFiles" title="QLCARFiles: A native macOS app to view, explore, and extract assets from .car files" %} diff --git a/pages/Industry/Copyright.md b/pages/Industry/Copyright.md index e45908af..4e7c4345 100644 --- a/pages/Industry/Copyright.md +++ b/pages/Industry/Copyright.md @@ -23,15 +23,15 @@ tags: _updatedAt: '2025-02-15' --- -The practice of game cloning in arcades and consoles goes back to the industry’s origins – to take a quote from a 2001 issue of the Japanese **CONTINUE** magazine [^1]: -> “the entire game industry itself began with copyright infringement, ever since Space Invaders..” +The practice of game cloning in arcades and consoles goes back to the industry's origins – to take a quote from a 2001 issue of the Japanese **CONTINUE** magazine [^1]: +> "the entire game industry itself began with copyright infringement, ever since Space Invaders.." -This timeline charts key instances of companies reverse-engineering or copying each other’s video games from the 1980s through the 2000s, focusing on arcade and home console titles. Each entry highlights notable clones, imitation games, and legal/technological battles that shaped industry norms. +This timeline charts key instances of companies reverse-engineering or copying each other's video games from the 1980s through the 2000s, focusing on arcade and home console titles. Each entry highlights notable clones, imitation games, and legal/technological battles that shaped industry norms. # Late 1970s–Early 1980s: The Dawn of Arcade Clones -## 1978–1979: Taito’s hit Space Invaders (1978) sparks a wave of imitators +## 1978–1979: Taito's hit Space Invaders (1978) sparks a wave of imitators
Space Fever Screenshot
@@ -55,9 +55,9 @@ Such copying was common in the young arcade industry, with many companies produc Small manufacturers hacked or re-skinned Pac-Man into games like Mighty Mouth and Piranha, which were nearly identical in maze layout and character design. By 1981, dozens of Pac-Man knock-offs appeared across arcades and home systems. -This prompted Pac-Man’s U.S. distributor, Midway, and rights-holder Atari to aggressively defend the IP in court. +This prompted Pac-Man's U.S. distributor, Midway, and rights-holder Atari to aggressively defend the IP in court. -In one case, a judge described **Mighty Mouth** as “for all practical purposes, identical” to Pac-Man [^3], leading Midway to win a 1983 summary judgment for copyright and trademark infringement. +In one case, a judge described **Mighty Mouth** as "for all practical purposes, identical" to Pac-Man [^3], leading Midway to win a 1983 summary judgment for copyright and trademark infringement. --- ## 1981–1982: K.C. Munchkin (Philips) sued by Atari @@ -70,9 +70,9 @@ In one case, a judge described **Mighty Mouth** as “for all practical purposes **K.C. Munchkin!** for the Odyssey² console (Philips) became a landmark in clone litigation. The maze-chase game was so similar to Pac-Man that Atari (which had console rights to Pac-Man) sued. -In 1982, the U.S. Seventh Circuit court ruled that K.C. Munchkin! **infringed** Pac-Man’s copyrighted characters and maze design, ordering the clone off the market [^4]. +In 1982, the U.S. Seventh Circuit court ruled that K.C. Munchkin! **infringed** Pac-Man's copyrighted characters and maze design, ordering the clone off the market [^4]. -This case – **Atari, Inc. v. Philips** – was among the first to affirm that a video game’s audiovisual “look and feel” could be protected by copyright law. +This case – **Atari, Inc. v. Philips** – was among the first to affirm that a video game's audiovisual "look and feel" could be protected by copyright law. --- ## 1982: Ms. Pac-Man – From Bootleg to Blockbuster @@ -83,9 +83,9 @@ This case – **Atari, Inc. v. Philips** – was among the first to affirm that
-One of the era’s most famous clones actually became an official sequel. **Ms. Pac-Man** began as an unauthorized enhancement kit called **Crazy Otto**, created by **General Computer Corp.** (GCC), a group of MIT dropouts who hacked existing arcade games [^5]. +One of the era's most famous clones actually became an official sequel. **Ms. Pac-Man** began as an unauthorized enhancement kit called **Crazy Otto**, created by **General Computer Corp.** (GCC), a group of MIT dropouts who hacked existing arcade games [^5]. -Before Crazy Otto GCC had made a business of **reverse engineering** popular games and selling upgrade kits, they modded Atari’s Missile Command into Super Missile Attack and made **$250k in profit**!. +Before Crazy Otto GCC had made a business of **reverse engineering** popular games and selling upgrade kits, they modded Atari's Missile Command into Super Missile Attack and made **$250k in profit**!. They used expensive hardware such as the **GenRad 6502 microprocessor emulator** from their dorm rooms in MIT and manually typed each screen of assembly that they got from the disassembler on to their TRS-80. @@ -93,15 +93,15 @@ After a brief legal enounter with Atari over their **Super Missile Attack** upgr So next they started on the most popular game in arcades - Pac Man, which was based on a Z80 microprocessor so they bought a **Tektronix 8550** as it has a Z80 emulator and a line printer to print the disassembled code [^6]. -After the previous legal pressure from Atari, GCC decided to pitch Crazy Otto to Midway (Namco’s American partner) instead of releasing it illicitly. +After the previous legal pressure from Atari, GCC decided to pitch Crazy Otto to Midway (Namco's American partner) instead of releasing it illicitly. -Midway enthusiastically bought the project as a way to quickly follow up Pac-Man’s success. +Midway enthusiastically bought the project as a way to quickly follow up Pac-Man's success. Working with Namco, they reskinned the characters and released it as Ms. Pac-Man. -The game – built on Pac-Man’s underlying code – became a smash hit! +The game – built on Pac-Man's underlying code – became a smash hit! -Ms. Pac-Man’s unusual origin blurs the line between cloning and innovation: a bootleg mod was absorbed into official canon when the rights holders saw its value. +Ms. Pac-Man's unusual origin blurs the line between cloning and innovation: a bootleg mod was absorbed into official canon when the rights holders saw its value. --- diff --git a/pages/Industry/Develop.md b/pages/Industry/Develop.md index 983e2ff5..7a40bc6f 100644 --- a/pages/Industry/Develop.md +++ b/pages/Industry/Develop.md @@ -43,7 +43,7 @@ For most of its run the magazine was divided into the following 3 sections: Other subsections included: * **Develop Jobs** - Your monthly guide to the best career opportunities in games development worldwide -* **Directory** - The world’s premier listing of games development studios, tools, outsourcing specialists, services and courses +* **Directory** - The world's premier listing of games development studios, tools, outsourcing specialists, services and courses --- ## Circulation information @@ -72,16 +72,16 @@ In 2007 some of the interviews from the magazine were also posted on the website Issue Number | Interview Name | Description ---|---|--- 075 | John Romero | Design Doc - Emotion in games -075 | Gordon Hall | [Michael French talks to **Rockstar Leeds** boss Gordon Hall to find out more about the Develop Award-winning team’s first ten years of business, and plans for the future.](https://web.archive.org/web/20070819215849/http://www.developmag.com/interviews/55/Rockstar-Leads) -076 | Torsten Reil | Michael French speaks to **NaturalMotion** CEO Torsten Reil about the company’s decision to move into full game production and how procedural content is helping its small development team build a new IP... -076 | Chris Ambler | QA teams across the industry need to focus on professionalism, says **Electronic Arts** UK’s testing boss Chris Ambler... -076 | Serkan Hassan | Black Rock Studio’s Serkan Hassan provides an invaluable glimpse into how the team behind critically-praised franchise MotoGP recently aimed to please both casual and hardcore players with its latest release... -077 | David Edery | With **Xbox Live Arcade**’s three-year anniversary nearing, Michael French spoke to the platform’s Worldwide Games Portfolio Planner, David Edery, to get an update on what the service can offer developers... -077 | Tony Beckwith | A year after acquisition, how is **Black Rock Studio** changing under the guidance of Disney and how does that play into House of Mouse’s plans for games? Michael French spoke to Tony Beckwith, studio chief, and Disney’s VP of European production Ed Bainbridge to find out... +075 | Gordon Hall | [Michael French talks to **Rockstar Leeds** boss Gordon Hall to find out more about the Develop Award-winning team's first ten years of business, and plans for the future.](https://web.archive.org/web/20070819215849/http://www.developmag.com/interviews/55/Rockstar-Leads) +076 | Torsten Reil | Michael French speaks to **NaturalMotion** CEO Torsten Reil about the company's decision to move into full game production and how procedural content is helping its small development team build a new IP... +076 | Chris Ambler | QA teams across the industry need to focus on professionalism, says **Electronic Arts** UK's testing boss Chris Ambler... +076 | Serkan Hassan | Black Rock Studio's Serkan Hassan provides an invaluable glimpse into how the team behind critically-praised franchise MotoGP recently aimed to please both casual and hardcore players with its latest release... +077 | David Edery | With **Xbox Live Arcade**'s three-year anniversary nearing, Michael French spoke to the platform's Worldwide Games Portfolio Planner, David Edery, to get an update on what the service can offer developers... +077 | Tony Beckwith | A year after acquisition, how is **Black Rock Studio** changing under the guidance of Disney and how does that play into House of Mouse's plans for games? Michael French spoke to Tony Beckwith, studio chief, and Disney's VP of European production Ed Bainbridge to find out... 077 | Keita Takahashi | In this extract from his book Inside Game Design, Iain Simons talks to **Katamari Damacy** creator Keita Takahashi about his work ethic, how he comes up with ideas, and his thoughts on the video games medium... -077 | Paul Sheppard| ITI Techmedia’s Paul Sheppard says that developers need to improve their game design process at pre-production stage and offers a up a more methodological approach... -078 | Harold Ryan | Ed Fear spoke to **Bungie**’s studio manager Harold Ryan to find out why the team has gone solo... -078 | Jim Bambra, Alex McLean | Managing director Jim Bambra and technical director Alex McLean talk to Michael French about what’s changed for **Pivotal** in its year’s as an internal team and as it works on a next-gen title... +077 | Paul Sheppard| ITI Techmedia's Paul Sheppard says that developers need to improve their game design process at pre-production stage and offers a up a more methodological approach... +078 | Harold Ryan | Ed Fear spoke to **Bungie**'s studio manager Harold Ryan to find out why the team has gone solo... +078 | Jim Bambra, Alex McLean | Managing director Jim Bambra and technical director Alex McLean talk to Michael French about what's changed for **Pivotal** in its year's as an internal team and as it works on a next-gen title... 079 | Mick Morris, Richard Scott, Andy Emery | Develop caught up with the heads of three service companies to talk about recent changes in the field and how developers should approach the outsourcing process... 079 | Gavin Cheshire, Adrian Bolton | **Codemasters** has been a mainstay of the UK development scene, but now it has big plans for the future focused around new technology, new IP, and new talent. Michael French paid the exec team a visit to find out more... 163 | Sam Barlow | Following the runaway success of his first indie release **Her Story**, Sam Barlow discusses why he left triple-A to develop on his unique vision for the game @@ -92,37 +92,37 @@ The Build section of the magazine is the most relevant to the purpose of this si Issue | Article | Topic | Description ---|---|---|--- -075 | Rethinking game AI | AI | What are the implications of **AI.implant’s** new no-costing licensing model? -075 | [MMO Engine Round-Up](https://web.archive.org/web/20071011140930/http://www.developmag.com/tutorials/33/MMO-Engine-Round-Up) | Engine | When it comes to MMOGs, at least there’s plenty of middleware to choose from -075 | [Arcade Fire](https://web.archive.org/web/20070901142943/http://www.developmag.com:80/tutorials/29/Arcade-Fire) | Indie | Stainless Games’ **Ben Gunstone** offers up some key advice on making games for **Xbox Live Arcade**... -075 | [Heard About: Heavenly Sword](https://web.archive.org/web/20071011141017/http://www.developmag.com/tutorials/28/Heard-About-Heavenly-Sword) | Audio | John Broomhall talks to Ninja Theory’s **Tom Colvin** and SCEE’s **Garry Taylor** about the audio production of a PlayStation 3 epic... +075 | Rethinking game AI | AI | What are the implications of **AI.implant's** new no-costing licensing model? +075 | [MMO Engine Round-Up](https://web.archive.org/web/20071011140930/http://www.developmag.com/tutorials/33/MMO-Engine-Round-Up) | Engine | When it comes to MMOGs, at least there's plenty of middleware to choose from +075 | [Arcade Fire](https://web.archive.org/web/20070901142943/http://www.developmag.com:80/tutorials/29/Arcade-Fire) | Indie | Stainless Games' **Ben Gunstone** offers up some key advice on making games for **Xbox Live Arcade**... +075 | [Heard About: Heavenly Sword](https://web.archive.org/web/20071011141017/http://www.developmag.com/tutorials/28/Heard-About-Heavenly-Sword) | Audio | John Broomhall talks to Ninja Theory's **Tom Colvin** and SCEE's **Garry Taylor** about the audio production of a PlayStation 3 epic... 075 | Epic Diaries | Unreal | Another fantastic E3 for Unreal Engine 3 075 | Championship Management | Production | Managing a next-gen project can feel like trying to tame Godzilla, but there are software solutions and fashionable paradigms that claim to make your life easier, discovers **Ed Fear**. -076 | Emergent emerges | Engine | The final pieces of **Emergent**’s online game technology puzzle are soon to be announced, but that’s not all... -076 | [Heard About: Harry Potter and the Order of the Phoenix](https://web.archive.org/web/20071011140905/http://www.developmag.com/tutorials/39/Heard-About-Harry-Potter-and-the-Order-of-the-Phoenix) | Audio | John Broomhall talks to Electronic Arts UK’s Adele Cutting about the audio production for Harry Potter and the Order of the Pheonix +076 | Emergent emerges | Engine | The final pieces of **Emergent**'s online game technology puzzle are soon to be announced, but that's not all... +076 | [Heard About: Harry Potter and the Order of the Phoenix](https://web.archive.org/web/20071011140905/http://www.developmag.com/tutorials/39/Heard-About-Harry-Potter-and-the-Order-of-the-Phoenix) | Audio | John Broomhall talks to Electronic Arts UK's Adele Cutting about the audio production for Harry Potter and the Order of the Pheonix 076 | Life in the engine room | Engine | More and more studios are looking towards licensing existing technology to help them produce their game. But, asks Ed Fear, how do you choose which engine, and is it really the panacea it may seem? -076 | The door is OpenKODE | Mobile | Mobile developers now have a way to sidestep tricky platform fragmentation, says **Ideaworks3D**’s Tim Closs... +076 | The door is OpenKODE | Mobile | Mobile developers now have a way to sidestep tricky platform fragmentation, says **Ideaworks3D**'s Tim Closs... 077 | Lets get connected | Networking | Most games offer some sort of online features but, surprisingly, there's less traditional networking middleware available than ever before, discovers Jon Jordan -077 | Parallel Lines | Hardware | Multicore architectures are everywhere but it’s proving difficult to make them sing. Scottish middleware company Codeplay has an idea +077 | Parallel Lines | Hardware | Multicore architectures are everywhere but it's proving difficult to make them sing. Scottish middleware company Codeplay has an idea 077 | Virtual Heroes are Serious about games | Unreal | Mark Rein profiles a new Unreal Engine 3 customer... -077 | [Heard About: Sega Rally - www.developmag.com](https://web.archive.org/web/20071017001057/http://developmag.com/tutorials/41/Heard-About-Sega-Rally) | Audio | John Broomhall talks to audio director **Tim Bartlett** on the rebirth of **Sega**’s racer... -077 | [Poetry in motion](https://web.archive.org/web/20071017001052/http://developmag.com/tutorials/40/Poetry-in-motion) | Motion Capture | It might have been around for a relatively long time, but that doesn’t necessarily mean that the motion capture industry is slowing down as it reaches maturity. Ed Fear takes a look at the latest movements in the field... -078 | Locked and bloated | DRM | Nothing’s completely secure, but in a digital, connected world, it’s well worth ensuring your content is as protected as possible, says Jon Jordan +077 | [Heard About: Sega Rally - www.developmag.com](https://web.archive.org/web/20071017001057/http://developmag.com/tutorials/41/Heard-About-Sega-Rally) | Audio | John Broomhall talks to audio director **Tim Bartlett** on the rebirth of **Sega**'s racer... +077 | [Poetry in motion](https://web.archive.org/web/20071017001052/http://developmag.com/tutorials/40/Poetry-in-motion) | Motion Capture | It might have been around for a relatively long time, but that doesn't necessarily mean that the motion capture industry is slowing down as it reaches maturity. Ed Fear takes a look at the latest movements in the field... +078 | Locked and bloated | DRM | Nothing's completely secure, but in a digital, connected world, it's well worth ensuring your content is as protected as possible, says Jon Jordan 078 | The Emergence of Emergent | Engine | Piece by piece, **Emergent Game Technologies** is building the next generation of middleware, Jon Jordan discovers... -078 | EPIC’S UE3-BASED PC GAMES ALMOST GOLDEN | Unreal | Your monthly update on what’s new in the world of Unreal Engine... -078 | Heard About: The Club | Audio | John Broomhall talks to **Bizarre Creations**’ lead audio designer Mathias Grunwaldt about the sound production on a new IP for Sega... -078 | The Brain Drain | AI | Ed Fear looks at the field and sees what today’s consoles can do to train our games’ brains... +078 | EPIC'S UE3-BASED PC GAMES ALMOST GOLDEN | Unreal | Your monthly update on what's new in the world of Unreal Engine... +078 | Heard About: The Club | Audio | John Broomhall talks to **Bizarre Creations**' lead audio designer Mathias Grunwaldt about the sound production on a new IP for Sega... +078 | The Brain Drain | AI | Ed Fear looks at the field and sees what today's consoles can do to train our games' brains... 079 | MULTITALENTED | Programming | Ed Fear looks at how the increasingly contradictory nature of development – with studios asked to make one game for a variety of different machines – has impacted the industry... 079 | All part of the process | Production | As projects get bigger, more complex and distributed around the globe, making sure your production and asset management tools are as sharp as possible is becoming critically important, says Jon Jordan... 079 | Out-the-box town planning | Engine | French middleware company **Gamr7** is aiming for automatic city generation... 079 | HDFILMS signs UE3 for animated series | Unreal | HDFilms has selected Unreal Engine 3 to develop Chadam, its new short- form 3D animated Web series to be distributed by Studio 2.0 079 | Heard About: 2008 – BRING IT ON | Audio | John Broomhall toasts the past year of game audio and looks forward to 2008... 079 | Killer Characters | Art | Develop offers an overview of the character animation tool market -163 | AI’s next frontier | AI | With all the advances already made in video games AI, where is there left to go? **Craig Chapple** asks the experts where the technology goes next +163 | AI's next frontier | AI | With all the advances already made in video games AI, where is there left to go? **Craig Chapple** asks the experts where the technology goes next 163 | Creating Believable AI | AI | Experts pitch in with their top tips, tricks and things to consider when creating AI 163 | Keeping your game on track | Production | Developing a video game is no small endeavour, and tracking its progress is essential. We find out how version management tools can help 163 | DAW of a new era | Audio | With 2015.1, **Wwise** is striving to bridge the gap between video games and digital audio workstations -163 | The sound of No Man’s Sky | Audio | John Broomhall speaks to Earcom’s **Paul Weir** about the excitement surrounding Hello Games’ intriguing title +163 | The sound of No Man's Sky | Audio | John Broomhall speaks to Earcom's **Paul Weir** about the excitement surrounding Hello Games' intriguing title 163 | Preparing for Windows 10 | Engine | We look at how **Marmalade** has worked with Microsoft to introduce Windows 10 support to its popular tools 163 | Unreal Engine 4 mods take off | Unreal | Million-selling indie game Ark: Survival Evolved opens up new commercial opportunities for modders. Epic Games tells us more 163 | A recipe for greatness | Unity | We catch up with Bossa Studios to find out the origins of its wacky new IP, I Am Bread (Unity) @@ -142,8 +142,8 @@ Issue | Tool | Description ---|---|--- 075 | Autodesk | Mentions 3D Studio Max 9, Maya 8, MotionBuilder 7, HumanIK 076 | PROFX | Described simply, ProFX is a middleware solution for generating and rendering procedural textures – but such a description belies the technology that powers it. -077 | SILO 2.0 | Organic sculpting applications are all the rage these days, but it’s fair to say that few can offer the value-for-money that Silo does at $150 -078 | TECHEXCEL DEVTRACK | DevTrack is TechExcel’s project issue-tracking tool, comprehensively managing issues as far reaching as: new features, QA reports and IT activities. (Clients include Activision, Electronic Arts, Sammy Studios, Sony Online Entertainment, Vivendi Universal) +077 | SILO 2.0 | Organic sculpting applications are all the rage these days, but it's fair to say that few can offer the value-for-money that Silo does at $150 +078 | TECHEXCEL DEVTRACK | DevTrack is TechExcel's project issue-tracking tool, comprehensively managing issues as far reaching as: new features, QA reports and IT activities. (Clients include Activision, Electronic Arts, Sammy Studios, Sony Online Entertainment, Vivendi Universal) 163 | Haxe | Game Engine --- diff --git a/pages/Industry/GameMakerMagazine.md b/pages/Industry/GameMakerMagazine.md index 6a7cea71..37339ce6 100644 --- a/pages/Industry/GameMakerMagazine.md +++ b/pages/Industry/GameMakerMagazine.md @@ -33,7 +33,7 @@ Sadly, the topic was deemed too niche and only **one standalone issue** was ever --- # GameMaker Magazine Index of Articles -Below is a table of all the articles known to have been included in **GameMaker** magazine’s short run. This includes when it was a standalone issue (1), when it was a section of **PC Format** (2–3), and when it was a separate supplement included with PC Format (4–7). +Below is a table of all the articles known to have been included in **GameMaker** magazine's short run. This includes when it was a standalone issue (1), when it was a section of **PC Format** (2–3), and when it was a separate supplement included with PC Format (4–7). Issue | Name | Description ---|---|--- @@ -63,7 +63,7 @@ Issue | Name | Description 7 | Homeworld 2 The Basics (Part 1) | Homeworld 2 Random Map Editor 7 | In Hindsight | Interview with the developer of **A Tale in the Desert** (eGenesis) -Issue 7 started tutorials **Call of Duty Mapping** and **Homeworld 2 The Basics**, but there was never an issue 8, so it’s unclear if Part 2 of these tutorials was ever published. +Issue 7 started tutorials **Call of Duty Mapping** and **Homeworld 2 The Basics**, but there was never an issue 8, so it's unclear if Part 2 of these tutorials was ever published. It appeared that a GameMaker issue 8 was planned, as it was advertised at the end of issue 7, although issue 165 instead came with a Doom 3 supplement: ![Advert for an issue 8 of GameMaker which was to be included in PC FORMAT issue 165](https://github.com/user-attachments/assets/f90b0c35-31f6-448a-ab81-7d9338f6e457) @@ -74,8 +74,8 @@ From issues 4 to 7, there was a one-page section at the back of the magazine whe Issue | Mod Name | Game its a mod for | Description | URL ---|---|---|---|--- -4 | Sweet Dreams | Unreal Tournament 2003 | A surreal, psychedelic third-person mod inspired by Rayman, featuring bizarre environments and an interactive start sequence set in the player’s bedroom. | gamestudies.oslo.org/~sdreams -4 | Jupiter Effect | Unreal Tournament 2003 | A futuristic city combat mod reminiscent of Sega’s Virtua On and Macross, featuring light-hearted deathmatch gameplay and destructible environments. | www.planetunreal.com/jei +4 | Sweet Dreams | Unreal Tournament 2003 | A surreal, psychedelic third-person mod inspired by Rayman, featuring bizarre environments and an interactive start sequence set in the player's bedroom. | gamestudies.oslo.org/~sdreams +4 | Jupiter Effect | Unreal Tournament 2003 | A futuristic city combat mod reminiscent of Sega's Virtua On and Macross, featuring light-hearted deathmatch gameplay and destructible environments. | www.planetunreal.com/jei 4 | Air Buccaneer | Unreal Tournament 2003 | A pirate-themed aerial combat mod focusing on teamwork and airship battles, combining fantasy and steampunk aesthetics. | ludocraft.oulu.fi/airbuccaneers 4 | BiTurbo | Battlefield 1942 | A high-speed vehicle mod adding jet-like acceleration, visual effects, and new skins for planes and jeeps, designed for chaotic, fun LAN play. | www.hsilan.de/biturbo 5 | Earth Special Forces | Half-Life | A third-person anime combat mod based on Dragonball Z, featuring playable characters like Goku with powerful energy attacks and team-based gameplay. | www.esforces.com diff --git a/pages/tools/Ghidra/GhidraDecompilingIntroduction.md b/pages/tools/Ghidra/GhidraDecompilingIntroduction.md index 97318aea..e3d80627 100644 --- a/pages/tools/Ghidra/GhidraDecompilingIntroduction.md +++ b/pages/tools/Ghidra/GhidraDecompilingIntroduction.md @@ -23,13 +23,11 @@ updatedAt: '2019-09-01' --- # Introduction - This tutorial series will guide you through the basics of decompiling a C++ executable, from setup all the way to reversing C++ classes. The video tutorial is created by James Tate over on his excellent YouTube channel, and it is highly recommended that you subscribe here: [James Tate - YouTube](https://www.youtube.com/channel/UCwSxJ5kXVFPWi6fYuj6o78w). ## Download and Run Ghidra - The first step, of course, is to download Ghidra if you haven't already, which you can do from the official site: {% include link-to-other-site.html url="https://ghidra-sre.org/" description="Download Ghidra from the Official Site" image="[.jpg](https://ghidra-sre.org/images/GHIDRA_1.png)" title="Download Ghidra" %} @@ -60,14 +58,12 @@ If you already hava Java installed and just need to find the JDK home directory Note that on MacOSX it installed to: `/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home` ## Create a New Project - First of all, you need a project to start reverse-engineering a binary executable. To do this, use File -> New Project. ![GhidraNewProject](https://user-images.githubusercontent.com/40120498/233848935-697c78ab-8292-4640-8bfe-bd24bbddfa86.jpeg) Select `Non-Shared project`, give it a name such as `Example` and click Finish. ## Obtaining Your Binary Executable to Reverse - To follow along in this tutorial, you can either compile the sample code provided or download the pre-compiled executables. Both are available on James's GitHub repository: [GitHub - james-tate/ghidraExampleSource](https://github.com/james-tate/ghidraExampleSource). @@ -78,7 +74,6 @@ You can use the compiler of your choice as long as it supports C++. So, if you h ## Import Your Binary Executable - You can import a file into Ghidra very simply with: `File -> Import File`. Find your executable file that you built with your C++ compiler. ![GhidraImportFile](https://user-images.githubusercontent.com/40120498/233849087-e98e5568-47cf-433d-8e0c-2b9c97e0a17b.jpeg) @@ -97,7 +92,6 @@ It will now start importing the file and ask you if you want to analyze it. Sele ## How to Find the Main Function - If you have symbols, you can use the `Navigation -> Go To...` menu and type "main". But if you don't have symbols (e.g you used the stripped version), then we will need to find it ourselves. ![GhidraGoTo](https://user-images.githubusercontent.com/40120498/233849786-e202b2aa-f998-4a97-a9f0-1d902eaeef3f.jpeg) ![GhidraGoToMain](https://user-images.githubusercontent.com/40120498/233849850-2e6165fe-cdc9-4aef-92e9-273182e7f9b8.jpeg) @@ -127,27 +121,26 @@ If you have debug symbols in the executable then it will look very similar to th In this section, we will learn how to use structures in Ghidra by applying them to data and navigating through the program using cross-references. We will also learn how to change the function signature to improve data presentation and how to create an array and apply it to a global offset [^3]. ## Setting Up Structures in Ghidra - Before we can use structures in Ghidra, we need to set them up. To do this, we can follow these steps: -1. Open the program in Ghidra and go to the Data Type Manager: +* Open the program in Ghidra and go to the Data Type Manager: ![GhidraDataTypeManager](https://user-images.githubusercontent.com/40120498/233852800-747420e6-2045-404f-b54e-94cd3dc6fe1b.jpeg) -2. Create a new structure and name it: +* Create a new structure and name it: ![GhidraNewStructure](https://user-images.githubusercontent.com/40120498/233852854-c1813250-9d6e-4645-ac26-d385e742c1a4.jpeg) -3. Add fields to the structure and set their data types and offsets. +* Add fields to the structure and set their data types and offsets. ![GhidraCreateCharField](https://user-images.githubusercontent.com/40120498/233853020-444cafdd-33d2-46ad-8fb6-2f3e3c40d51a.jpeg) -4. Save the structure. +* Save the structure. ![GhidraSaveStruct](https://user-images.githubusercontent.com/40120498/233853180-82ce838f-e5ff-4577-8885-55ae00638e4f.jpeg) Once we have set up the structure, we can apply it to data by following these steps: -1. Highlight the data and right-click. -2. Choose "Data Type" and select the structure we created. -3. Click "Apply" to apply the structure to the data. +* Highlight the data and right-click. +* Choose "Data Type" and select the structure we created. +* Click "Apply" to apply the structure to the data. ![GhidraManuallySetDataType](https://user-images.githubusercontent.com/40120498/233853376-a4d177cc-2dcf-4e95-a822-97c43ba72baf.jpeg) @@ -161,7 +154,6 @@ There is also a short cut for doing this directly from the decompile view by rig ![GhidraAutoCreateStructure](https://user-images.githubusercontent.com/40120498/233853414-17e9ed98-bfb8-4211-a72d-d62fc6841539.jpeg) --- - # Creating Arrays and Changing Function Signatures @@ -172,32 +164,31 @@ To see where the global structure or function is being used, we can go to the li To navigate through the program using cross-references, we can follow these steps: -1. Go to the listing view and look for the cross-references. +* Go to the listing view and look for the cross-references. ![GhidraXRef](https://user-images.githubusercontent.com/40120498/233861646-c9728e88-0bb2-4e07-ae8f-62e34bf8eee8.jpeg) -2. Click on the cross-reference to go directly to the function. -3. Note the 'R' or 'W' beside the Cross Reference indicating whether the function Reads or Writes to it. +* Click on the cross-reference to go directly to the function. +* Note the 'R' or 'W' beside the Cross Reference indicating whether the function Reads or Writes to it. ## Changing Function Signatures and Naming - To change the function signature in Ghidra, we can follow these steps: -1. Highlight the function and right-click. +* Highlight the function and right-click. ![GhidraEditFunctionSignature](https://user-images.githubusercontent.com/40120498/233861985-552b8f50-8c76-4ece-a294-468beeb0e13d.jpeg) -2. Choose "Edit Function Signature". -3. Change the data type to the correct type (in this case, a global structure pointer). +* Choose "Edit Function Signature". +* Change the data type to the correct type (in this case, a global structure pointer). ![GhidraEditFunctionDialog](https://user-images.githubusercontent.com/40120498/233862062-b7e49446-1d41-4134-9daf-dade181bc6a2.jpeg) -4. Click "OK" to save the changes. +* Click "OK" to save the changes. ## Creating Arrays We can also use Ghidra to create arrays. To do this, we first need to identify the size of the elements in the array. In our example, we can see that the size of each element is 4 bytes. We can then right-click on the global variable and select "Create Array". We can then specify the number of elements we want to create, making sure not to create too many and overwrite existing data. To create an array in Ghidra, we can follow these steps: -1. Highlight the data and right-click. -2. Choose "Data Type" and select "Create Array". +* Highlight the data and right-click. +* Choose "Data Type" and select "Create Array". ![GhidraCreateArray](https://user-images.githubusercontent.com/40120498/234082791-55044731-0dc2-4dd6-a403-9d20fa23035a.jpeg) -3. Choose the number of elements and the data type. -4. Click "OK" to create the array. +* Choose the number of elements and the data type. +* Click "OK" to create the array. --- # Analyzing and Identifying C++ Classes in Ghidra @@ -222,17 +213,15 @@ Note that `operator.new` only appears if you have added the external libC librar The line `FUN_000111f4(ppcVar1);` is most likely a constructor call as it comes directly after the new call and also takes in the `this` pointer. ## Step 2: Create a class in Ghidra - Now that you have a better understanding of the code, let's create a class in Ghidra: -1. Edit the constructor function signature and select the calling convention as `thiscall` and save. +* Edit the constructor function signature and select the calling convention as `thiscall` and save. ![GhidraThisCall](https://user-images.githubusercontent.com/40120498/234084458-881184c8-ef2b-44fb-bdee-c76514037bd3.jpeg) -2. Now when you right-click on the first parameter to the constructor function you can choose "Auto Create Class" to create the class. +* Now when you right-click on the first parameter to the constructor function you can choose "Auto Create Class" to create the class. ![GhidraAutoCreateClass](https://user-images.githubusercontent.com/40120498/234085183-2a6c8a3e-5808-4140-b607-172648e5c4fb.jpeg) -3. Give the auto-generated class a more meaningful name. +* Give the auto-generated class a more meaningful name. ## Step 3: Give your class members meaningful names - Take some time to identify the data types of the class members. Once you know what each member is, update their names to make your code easier to understand. ![GhidraRenameField](https://user-images.githubusercontent.com/40120498/234085780-391cbedb-82ce-453f-8475-166c2a5da347.jpeg) @@ -245,10 +234,10 @@ If you click on the `PTR___cxa_pure_virtual_000117ec` it will take you to the li ![Ghidra4VirtualFunctions](https://user-images.githubusercontent.com/40120498/234086983-e9b11b80-d4a4-4274-99ef-c7bd19d9bb26.jpeg) It's time to create a structure to represent the VTable for the Base class: -1. Create a new structure (New -> Structure) called "BaseVtable" with a virtual function. +* Create a new structure (New -> Structure) called "BaseVtable" with a virtual function. ![GhidraBaseVTableStructure](https://user-images.githubusercontent.com/40120498/234087693-cc502518-4c49-463f-9b72-568d10fd3b4b.jpeg) -2. Add the other virtual functions in the same way (`func *`) -3. Now do the same for the Derived class as it will override some of the virtual functions +* Add the other virtual functions in the same way (`func *`) +* Now do the same for the Derived class as it will override some of the virtual functions If you click on `PTR_FUN_000112a8+1_000117c` you will be taken to the listing view with 6 functions listed: ![GhidraFunctionsThatMakeUpVTable](https://user-images.githubusercontent.com/40120498/234089886-a012dd6c-231d-4058-80ee-0b702a1d651f.jpeg) @@ -265,8 +254,8 @@ In this tutorial, we will learn how to analyze a derived class in C++ and rename If we go through all of our virtual functions in the VTable you will eventually find the Destructor for the class, which calls `operator.delete` (if you have the libc library). ![GhidraDestructor](https://user-images.githubusercontent.com/40120498/234090989-55711641-2978-4214-bcf3-a91520d2f161.jpeg) -1. Set it to a `__thiscall` -2. Rename them to a suitable deconstructor name `~ClassNameDestructor` +* Set it to a `__thiscall` +* Rename them to a suitable deconstructor name `~ClassNameDestructor` ![GhidraDecompileDestructure](https://user-images.githubusercontent.com/40120498/234092112-ac80ec5f-502d-4017-a1a5-26572ff8f86a.jpeg) @@ -277,7 +266,6 @@ If we go through all of our virtual functions in the VTable you will eventually In this tutorial, we'll explore a derived class constructor and its associated members. We'll also create a virtual table pointer for better understanding of the virtual function calls. ## Analyzing the Derived Class Constructor - The derived class has the following decompilation after setting most of the variable names: ```cpp @@ -334,25 +322,22 @@ Global classes are setup before the main function is even called in a function c Reverse engineering on shared libraries can be a time-consuming task, especially when dealing with embedded systems. In this tutorial, we will explore the tools and capabilities available in native Linux, as well as the scripting interface and headless analysis tool that Ghidra offers. We will use a nonsensical example to show how to use Ghidra's headless analysis tool to scan multiple shared libraries in order to speed up your analysis. ## Prerequisites - Before starting, make sure that you have the following tools installed on your system: -- `ldd` - to list shared library dependencies -- `objdump` - to display information about object files -- Ghidra +* `ldd` - to list shared library dependencies +* `objdump` - to display information about object files +* Ghidra You will also need a set of shared libraries to work with. You can download the example libraries from the author's [GitHub page]([https://github.com/ctberthiaume/gr-example-shared-libs](https://github.com/james-tate/ghidra_headless_example)). ## Analyzing Shared Libraries -### Using `ldd` and `objdump` - +### Using ldd and objdump We can use the `ldd` command to list the shared library dependencies for a given binary. For example, running `ldd ` will show which shared libraries the binary will try to pull in to execute. We can also use `objdump` to display information about object files. For example, running `objdump -T ` will show the exported symbols from the binary. ### Using Ghidra - To use Ghidra for reverse engineering shared libraries, we first need to load the shared libraries into the project. We can do this by selecting "File > Import > External Libraries" and then selecting the shared libraries we want to load. We can then use Ghidra to analyze the shared libraries. For example, we can click on a function in the binary and Ghidra will automatically switch to the location of where that function lives inside of the shared library. @@ -360,7 +345,6 @@ We can then use Ghidra to analyze the shared libraries. For example, we can clic However, if we have hundreds of binaries or shared libraries to analyze, this process can be time-consuming. In such cases, we can use Ghidra' headless analysis tool and scripting interface. ## Using Ghidra' Headless Analysis Tool and Scripting Interface - To use Ghidra' headless analysis tool, we need to create a python script using the python Ghidra `FlatProgramAPI` to perform our analysis. Here, we will create a script to extract the names of objects created by calling the `setname` function: ```python diff --git a/pages/tools/engines/KromeMerkuryEngine.md b/pages/tools/engines/KromeMerkuryEngine.md index 6bea1173..94ef64dc 100644 --- a/pages/tools/engines/KromeMerkuryEngine.md +++ b/pages/tools/engines/KromeMerkuryEngine.md @@ -63,7 +63,6 @@ On the port of the Merkury engine to GameCube for **Ty the Tasmanian Tiger**, ** --- ## Early Merkury Engine Games - The original **Krome Studios** website archived back in March 2001 has the following games as using the Merkury engine [^8]: * **Mike Stewart's Pro Bodyboarding** - Released in February 1999 for Windows * **Chronicles of Jaru Tenk** - Released in 1999 sold as shareware via ScreenOpera @@ -76,7 +75,6 @@ However the only actual reference in the game files for the name **Merkury** was --- ## Krome Studios games and their engines - Because not all uses of Merkury are documented, below is a table of major titles developed by Krome Studios across platforms. This is a reference for potential engine use, not confirmation of Merkury integration. | Game Title | Platform(s)| Year | Using Merkury Engine? @@ -93,36 +91,35 @@ Because not all uses of Merkury are documented, below is a table of major titles | The Adventures of Jimmy Neutron: Jet Fusion | PS2, GameCube | 2003 | Yes | Ty the Tasmanian Tiger 2: Bush Rescue | PS2, Xbox, GameCube, Windows, HD Remasters | 2004 | Yes | King Arthur | PS2, Xbox, GameCube | 2004 | -| Ty the Tasmanian Tiger 3: Night of the Quinkan| PS2, Xbox, GameCube, Windows, HD Remasters | 2005 | -| The Legend of Spyro: A New Beginning | PS2, Xbox, GameCube, GBA | 2006 | -| The Legend of Spyro: The Eternal Night | PS2, Wii | 2007 | -| Viva Piñata: Party Animals | Xbox 360 | 2007 | -| Hellboy: The Science of Evil | PS3, Xbox 360, PSP | 2008 | +Ty the Tasmanian Tiger 3: Night of the Quinkan| PS2, Xbox, GameCube, Windows, HD Remasters | 2005 +The Legend of Spyro: A New Beginning | PS2, Xbox, GameCube, GBA | 2006 +The Legend of Spyro: The Eternal Night | PS2, Wii | 2007 +Viva Piñata: Party Animals | Xbox 360 | 2007 +Hellboy: The Science of Evil | PS3, Xbox 360, PSP | 2008 | Star Wars: The Force Unleashed | PS2, PSP, Wii, Nintendo Switch | 2008, 2022 | Yes -| Star Wars: The Clone Wars - Lightsaber Duels | Wii | 2008 | -| Scene It? Box Office Smash | Xbox 360 | 2008 | +Star Wars: The Clone Wars - Lightsaber Duels | Wii | 2008 +Scene It? Box Office Smash | Xbox 360 | 2008 | Star Wars: The Clone Wars – Republic Heroes | PS3, Xbox 360, Wii, PS2, PSP, Windows | 2009 | Yes -| Transformers: Revenge of the Fallen | PS2, Wii | 2009 | +Transformers: Revenge of the Fallen | PS2, Wii | 2009 | Game Room | Xbox 360, Windows, Windows Phone 7 | 2010 | Yes (RKV files present in windows version) | Blade Kitten | PS3, Xbox 360, Windows | 2010, 2012 | Yes (RKV files present) | Legend of the Guardians: The Owls of Ga'Hoole | Xbox 360, PS3, Wii | 2010 | Yes (Merkury 3) -| Full House Poker | Xbox 360, Windows Phone 7 | 2011 | +Full House Poker | Xbox 360, Windows Phone 7 | 2011 | Backyard Sports Basketball 2015 | iOS, Android | 2015 | No (Unity) | Ty the Tasmanian Tiger 4 | Windows | 2015 | No (Unity) | Ty the Tasmanian Tiger HD | Xbox One, Series X/S, Switch, PS4, Windows | 2016, 2020 | Yes (RKV files present) | Ty the Tasmanian Tiger 2: Bush Rescue HD | Xbox One, Series X/S, Switch, PS4, Windows | 2017, 2021 | Yes (RKV files present) | Ty the Tasmanian Tiger 3: Night of the Quinkan HD | Windows | 2018 | Yes (RKV files present) -| The Bard’s Tale Trilogy | Windows, Xbox One | 2018, 2019 | No (Unity) +| The Bard's Tale Trilogy | Windows, Xbox One | 2018, 2019 | No (Unity) | Wasteland Remastered | Windows, Xbox One | 2020 | No (Unity) | Ty the Tasmanian Tiger 4: Bush Rescue Returns | Nintendo Switch | 2023 | No (Unity) | Monster Dash | iOS, Android | 2016 / ongoing | No (Unity) -| Gizmotablet (Kid World, Verizon) | Android Tablet (EdTech) | 2018 | +Gizmotablet (Kid World, Verizon) | Android Tablet (EdTech) | 2018 --- # History of Krome Studios - The company was originally founded as **Interactive Binary Illusions** in 1993 [^11], then renamed **Gee Wizz! entertainment** in 1996 on the release of their game Zombie Wars [^9], it was formed by partners **John Passfield** and **Steve Stamatiadis** [^10]. It later became Krome Studios on the 1st November 1999 merging with Robert Walsh's **Pacific Interactive Entertainment** [^6]. Despite all the evolution, the studio continued to be based in Brisbane, Australia. @@ -165,7 +162,7 @@ For more information, you absolutely **must read** John's blog post on the makin What I also thought was super cool was at the end of John's 2015 blog post he teased an Apple Watch version of the game with this screenshot: Apple Watch Version of Flight of the Amazon Queen -However it was never released due to John realizing that [there’s no market on the watch for this kind of game.](https://romchip.org/index.php/romchip-journal/article/view/164), which is sad because I would love to have seen how well this works on a watch, maybe adverture games are the perfect candidate for watch games? Although to be honest although I own an apple watch I have never downloaded a game for it... maybe I need to be the change I want to see in the market. +However it was never released due to John realizing that [there's no market on the watch for this kind of game.](https://romchip.org/index.php/romchip-journal/article/view/164), which is sad because I would love to have seen how well this works on a watch, maybe adverture games are the perfect candidate for watch games? Although to be honest although I own an apple watch I have never downloaded a game for it... maybe I need to be the change I want to see in the market. #### JASPAR2 game engine @@ -335,7 +332,7 @@ C:\beast\animscript.cpp 0x0000 | 0x4030A0 | float __cdecl vGetObjZWidth(int, int) | ?vGetObjZWidth@@YAMHH@Z | 0x100 0x0000 | 0x403140 | void __cdecl vBG_GetObjectBox(int, float *, float *, float *, float *, float *, float *) | ?vBG_GetObjectBox@@YAXHPAM00000@Z | 0x100 0x0000 | 0x4031D0 | void __cdecl vBG_MatriceClear(void) | ?vBG_MatriceClear@@YAXXZ | 0x100 -0x0000 | 0x403270 | void __cdecl vDOUT(char *) | ?vDOUT@@YAXPADZZ | 0x100 +0x0000 | 0x403270 | `void __cdecl vDOUT(char *)` | `?vDOUT@@YAXPADZZ` | 0x100 0x0000 | 0x403360 | void __cdecl vFreeSFX(int) | ?vFreeSFX@@YAXH@Z | 0x100 0x0000 | 0x403430 | int __cdecl vLoadSFX(char *) | ?vLoadSFX@@YAHPAD@Z | 0x100 0x0000 | 0x403600 | void __cdecl vPlaySFX(int, int, float, float, float, int) | ?vPlaySFX@@YAXHHMMMH@Z | 0x100 @@ -830,7 +827,7 @@ It was later released for free by John Passfield on his site [Free Stuff! - Pass ## Screen Opera It was so unique that they coined their own genre: "Screen Opera" and it was followed by another game in the same genre very shortly after called Halloween Spirit Board. They also planned a third "Screen Opera" game called Star Date but it was never released. -It was inspired by David Crane’s Little Computer People and then sold on their own [Screen Opera](https://web.archive.org/web/20010124005100/http://www.screenopera.com/) website [^18]. +It was inspired by David Crane's Little Computer People and then sold on their own [Screen Opera](https://web.archive.org/web/20010124005100/http://www.screenopera.com/) website [^18]. ## Game engine - Was Merkury based on BEAST or Blast Graphics? @@ -869,7 +866,7 @@ The PS1 version **does not use** the RKV archive format and instead has files se This is common with PS1 games as they all use a standard ISO 9660 filesystem, allowing individual files (textures, models, audio, maps, scripts, etc.) to be stored as separate, accessible files. -This makes it easy for the game executable to read specific assets directly from the disc and was practical considering memory limits and the way the PS1’s BIOS exposed disc access. +This makes it easy for the game executable to read specific assets directly from the disc and was practical considering memory limits and the way the PS1's BIOS exposed disc access. --- ## Windows, Dreamcast versions of Championship Surfer @@ -1102,7 +1099,6 @@ next i --- # Kat Burglar (Cancelled late 2000) - It would have been used in the cancelled **Kat Burglar** game that Krome Studios was working on in late 2000, which even advertised on their official website about the use of their proprietary Merkury engine [^7]: ```markdown Kat Burglar is a 3rd person action-adventure game set in the swinging 60's. Katherine Kelly is a millionaire playgirl by day and a Robin Hood style thief by night. Katherine ("Kat" to her friends) specializes in stealing hard to get items from museums and fortified storehouses. @@ -1160,7 +1156,7 @@ This is because it was packed with the executable packer **PEtite**, which could The copyright messages hint at a few things: * **Gilles Vollant** is most likely related to **zlib** compression used for the asset archives. -* **Thomas G. Lane** is a principal author of the IJG’s widely used JPEG image compression software libraries, commonly known as **libjpeg**. +* **Thomas G. Lane** is a principal author of the IJG's widely used JPEG image compression software libraries, commonly known as **libjpeg**. * **Tal Nevo** is possibly related to executable compression but this is a guess The executable also has a few file paths left in which give a hint about the folder structure: @@ -1173,7 +1169,6 @@ The reason we know it uses **Blast Graphics** without it having the bg.dll file --- ## Asset Archive - data0.pkg - Since the data0.pkg format is just simple zip compression, it is very easy to extract and modify the assets, so lets take a look at what it contains, there are 1,207 files so we will group files by their extension in the table below: Extension | Number of Files | Description @@ -1243,11 +1238,11 @@ File formats used: ## Source Code Structure There are strings in the executable that can shad some light on what the source code structure was like, it was very organised, split into the following main folders: * **BarbieCommon** - Common Game Engines files - - these files are not Barbie specific and most of them are also seen in other Merkury engine games - - Located at `D:\Src\IceSkating\BarbieCommon` - - Also contains a **PC** sub folder with PC specific implementations (the common folder aims to be cross platform) + * these files are not Barbie specific and most of them are also seen in other Merkury engine games + * Located at `D:\Src\IceSkating\BarbieCommon` + * Also contains a **PC** sub folder with PC specific implementations (the common folder aims to be cross platform) * **Source** - Game specific functionality - - Located at `D:\Src\IceSkating\Source\` + * Located at `D:\Src\IceSkating\Source\` There are other strings throughout the executable with class and method/function names so we can infer from the file names which functions were in each source file, however this is an estimate they may have actually been located in a different file that's path was not leaked in the exe. @@ -1335,7 +1330,6 @@ D:\Src\IceSkating\Source\StateMachine.h Ty the Tasmanian Tiger was released in 2002 for PS2, Gamecube and Xbox. ## Gamecube release of Ty (2002) - The Gamecube release of **Ty the Tasmanian Tiger** contains not only debug symbols but also 364 references to the names of the C++ source code files used to build the game, all in the main executable **TY_REL.elf**. Most of the strings are located in the string table section (**.strtab**) of the GameCube ELF file and thus the location in that section may not indicate anything about the location of the functions that were contained in that source file. You can find the Source file names in the table below, any descriptions added are a guess at the purpose of the file by us: @@ -1846,38 +1840,38 @@ Also it also highlights that the RKV files have a lot of files that are not requ Likely naming format breakdown: * **cscg001**: Likely an ID for a cutscene, always prefixed with "cs" presumably standing for cutscene. * **01_00**: Major/minor numbers w.g for scene/area, event, sequence, or version -* **p01** — Possibly part 1/phase 1 or referencing a specific voice/group. -* **dv** — Character anchors e.g dv is Darth Vader -* **en** — Audio Language (Known values: en, fr) +* **p01** - Possibly part 1/phase 1 or referencing a specific voice/group. +* **dv** - Character anchors e.g dv is Darth Vader +* **en** - Audio Language (Known values: en, fr) #### SNK Cutscene Codes Possible cutscene codes are presented in the table below: -| Cutscene ID | Likely scene | Rationale (where applicable) | -|---|---|---| -| **csdv001** | Darth Vader prologue (Kashyyyk) | "DV" = Darth Vader; prologue is a Vader mission.| -| **cska2xx** | Kashyyyk | "ka" matches planet. | -| **csfe1xx/2xx/20x/205**| Felucia | "fe" = Felucia. | -| **csrp1xx/2xx** | Raxus Prime | "rp" = Raxus Prime. | -| **csjt1xx/2xx** | Jedi Temple (trials)| "jt" = Jedi Temple. | -| **csmu001** | Mustafar (historic mission) | "mu" = Mustafar. | -| **csns201** | Nar Shaddaa | "ns" = Nar Shaddaa. | -| **cstc001/101** | TIE Construction Facility| "tc" = TIE Construction; early game mission. | -| **csds201** | The Dune Sea (Tatooine historic mission)| "ds" = Dune Sea; appears as historic mission. | -| **cscc001/201/202/204/205** | Carbonite Chamber (Bespin historic mission) | "cc" = Carbonite Chamber.| -| **cscg001** | Geonosis Colosseum (historic mission) | "cg" = Colosseum Geonosis. | -| **csdq001** | Dooku’s Quarters (Geonosis historic mission) | "dq" = Dooku’s Quarters. | -| **csvo001** | Vader’s Observatory/Vessel? | "vo" ambiguous; likely Vader-related interstitial. | -| **csvf101/102/104** | Vader’s Flagship/Facility? | "vf" ambiguous; Vader-adjacent (briefings/bridges).| -| **csqg001** | ? Geonosis-related (Qui-Gon is unlikely)| "qg" unclear; could be internal codename. | -| **cspl001** | ? Palace (Jabba’s) | "pl" plausible "(Jabba’s) Palace" historic. | -| **csps001** | ? Palace/Cantina sequence| "ps" ambiguous; may be Tatooine set-piece.| -| **csrg001** | ? Raxus (Gateway)/Royal Guard | "rg" unclear; could be encounter beat. | -| **csrh201** | ? Raxus H— (Hub/Hangar/Holo) | "rh" unclear; grouped with Raxus arc number. | -| **csrs001** | ? Raxus Scrap (yard)| "rs" plausible for "scrapyard". | -| **csfd001** | ? Felucia derivative| "fd" could be Felucia boss/dialogue beat. | -| **csil101** | ? Imperial Laboratory/Library | "il" ambiguous; story contains Imperial facilities. | -| **csos001** | ? Ossus | "os" could be Ossus (Jedi world); unconfirmed. | +Cutscene ID | Likely scene | Rationale (where applicable) +---|---|--- +**csdv001** | Darth Vader prologue (Kashyyyk) | "DV" = Darth Vader; prologue is a Vader mission. +**cska2xx** | Kashyyyk | "ka" matches planet. +**csfe1xx/2xx/20x/205**| Felucia | "fe" = Felucia. +**csrp1xx/2xx** | Raxus Prime | "rp" = Raxus Prime. +**csjt1xx/2xx** | Jedi Temple (trials)| "jt" = Jedi Temple. +**csmu001** | Mustafar (historic mission) | "mu" = Mustafar. +**csns201** | Nar Shaddaa | "ns" = Nar Shaddaa. +**cstc001/101** | TIE Construction Facility| "tc" = TIE Construction; early game mission. +**csds201** | The Dune Sea (Tatooine historic mission)| "ds" = Dune Sea; appears as historic mission. +**cscc001/201/202/204/205** | Carbonite Chamber (Bespin historic mission) | "cc" = Carbonite Chamber. +**cscg001** | Geonosis Colosseum (historic mission) | "cg" = Colosseum Geonosis. +**csdq001** | Dooku's Quarters (Geonosis historic mission) | "dq" = Dooku's Quarters. +**csvo001** | Vader's Observatory/Vessel? | "vo" ambiguous; likely Vader-related interstitial. +**csvf101/102/104** | Vader's Flagship/Facility? | "vf" ambiguous; Vader-adjacent (briefings/bridges). +**csqg001** | ? Geonosis-related (Qui-Gon is unlikely)| "qg" unclear; could be internal codename. +**cspl001** | ? Palace (Jabba's) | "pl" plausible "(Jabba's) Palace" historic. +**csps001** | ? Palace/Cantina sequence| "ps" ambiguous; may be Tatooine set-piece. +**csrg001** | ? Raxus (Gateway)/Royal Guard | "rg" unclear; could be encounter beat. +**csrh201** | ? Raxus H- (Hub/Hangar/Holo) | "rh" unclear; grouped with Raxus arc number. +**csrs001** | ? Raxus Scrap (yard)| "rs" plausible for "scrapyard". +**csfd001** | ? Felucia derivative| "fd" could be Felucia boss/dialogue beat. +**csil101** | ? Imperial Laboratory/Library | "il" ambiguous; story contains Imperial facilities. +**csos001** | ? Ossus | "os" could be Ossus (Jedi world); unconfirmed. Although these are a guess, proper analysis including playing each of the SBK files while playing the game would be required to give more concrete information. @@ -1981,7 +1975,6 @@ There is a video on youtube of a quick behind the scenes route of the Krome offi --- # Merkury 3 - Xbox 360, PS3 and Wii (2010) - Lead Environment Artist at Krome Studios **Brent Waller** posted a video showing off the new Merkury 3 engine in action which was built for the Xbox 360, Playstation 3 and Wii Title: **The Legend of the Guardians: The Owls of Ga'hoole**. To quote Brent Waller [^2]: diff --git a/pages/tools/engines/LucasArtsZenoAndZed.md b/pages/tools/engines/LucasArtsZenoAndZed.md index 90853295..820c266e 100644 --- a/pages/tools/engines/LucasArtsZenoAndZed.md +++ b/pages/tools/engines/LucasArtsZenoAndZed.md @@ -42,7 +42,7 @@ Thus the real-time Zeno Editor known as **Zed** was born and was slowly gaining At roughly the same time as the Zed project was taking off, George Lucas wanted to bring ILM and LucasArts even closer together, physically this time. He consolidated the offices and moved both LucasArts and ILM to the **Letterman Digital Arts Center** (LDAC) in Presidio California. This accelerated development of both Zeno and Zed and was praised by the LucasArts president **Jim Ward** in **Computer Graphics World Magazine** [^11]: ->In the same spirit of collaboration and consolidation of assets and talent, ILM and LucasArts are now housed in the same building on George Lucas’s **Presidio campus**. "[The idea] came from George himself, and it’s key to rebooting our game studio." +>In the same spirit of collaboration and consolidation of assets and talent, ILM and LucasArts are now housed in the same building on George Lucas's **Presidio campus**. "[The idea] came from George himself, and it's key to rebooting our game studio." On what was a former Presidio military base, the new 6 acre facility claimed to have the industries largest computer network, designed to accommodate 4K images via 300 10GB and 1,500 1GB ports. It was surrounded by 17 acres of public park including a creek and even a Yoda fountain! @@ -51,7 +51,7 @@ On what was a former Presidio military base, the new 6 acre facility claimed to There is a very good reason why the move to the new premises keeps getting mentioned in articles about Zeno and Zed, it really was the catalyst that allowed not only knowledge to flow freely but also assets from both movies and games could be shared on the 600 miles of high speed network cable within the facility! The designer of the Zeno interface **Dennis Muren** has the following to say about the move and its impact on the Zeno pipeline: -> The move opened the opportunity to re-invent the pipeline, with the Star Wars movies ending, we’re going to get down to a more realistic number of shots. So we’ve given the artists the opportunity to do practically anything if they want to. [^18] +> The move opened the opportunity to re-invent the pipeline, with the Star Wars movies ending, we're going to get down to a more realistic number of shots. So we've given the artists the opportunity to do practically anything if they want to. [^18] In the September 2005 issue of 3D World magazine [^18], they had some interesting statistics in their coverage of the move to the new building: ![Letterman Digital Arts Center Statistics](https://github.com/user-attachments/assets/281b5020-16d5-4837-abc6-c67373ff1b65) @@ -95,7 +95,7 @@ We don't know all the contributors to Zeno/Zed as there is very little informati Zed played a major role in the development of games like **Star Wars: The Force Unleashed**, allowing seamless coordination between game asset creation and in-engine testing. Zed was intended not just for star wars but also a future Indiana Jones game that would later be cancelled: ->To create its upcoming Indiana Jones 2007 and next-gen Star Wars titles, LucasArts will also be using its **Zeno Game Editor**, which is incorporated into ILM’s Zeno Development Environment, allowing both film and game artists access to the same tools. LucasArts can now use ILM’s high-end art creation software, while ILM can tap into LucasArts’ real-time technology, which underlies their previsualization tools [^11] +>To create its upcoming Indiana Jones 2007 and next-gen Star Wars titles, LucasArts will also be using its **Zeno Game Editor**, which is incorporated into ILM's Zeno Development Environment, allowing both film and game artists access to the same tools. LucasArts can now use ILM's high-end art creation software, while ILM can tap into LucasArts' real-time technology, which underlies their previsualization tools [^11] LucasArts used Zed/Ronin for **The Force Unleashed II** (2010), but later projects like **Star Wars 1313** were developed on Unreal Engine 3 [^9]. Although sadly the **Star Wars 1313** project was cancelled after Disney shut down LucasArts in 2013. @@ -103,12 +103,12 @@ Although sadly the **Star Wars 1313** project was cancelled after Disney shut do ### Later Developments and Legacy of Zed After the collapse of LucasArts, Zed would live on in the real-time rendering feature of **Zeno** which is still in use by ILM today. -The spirit of Zed extended into **ILMxLAB** (founded in 2015) but used the **Unreal Engine** directly instead of Zed, producing projects like **Vader Immortal** and powering ILM’s StageCraft for **The Mandalorian** [^9]. It is currently unknown if they have an integration between Unreal Engine and Zeno, if so then you could say parts of Zed are still alive and well in the games industry. +The spirit of Zed extended into **ILMxLAB** (founded in 2015) but used the **Unreal Engine** directly instead of Zed, producing projects like **Vader Immortal** and powering ILM's StageCraft for **The Mandalorian** [^9]. It is currently unknown if they have an integration between Unreal Engine and Zeno, if so then you could say parts of Zed are still alive and well in the games industry. --- # The Ronin Engine - Star Wars: The Force Unleashed In 2005, ILM Chief Technology Officer **Cliff Plumer** called Zed the LucasArts Game Engine: -> We’ve been working on collaborative tools with LucasArts for 18 months… Zed, which is LucasArts’ game engine, will have a live connection to Zeno [^1]. +> We've been working on collaborative tools with LucasArts for 18 months… Zed, which is LucasArts' game engine, will have a live connection to Zeno [^1]. Which is somewhat true as it provided real time rendering to the Zeno platform as a sort of PC game engine, however its not to be confused with the actual game engine that ran Zed games on consumer hardware such as the Xbox 360 and PS3. So as to avoid confusion this article will call Zed the Game editor (think IDE) and Ronin the Game Engine. @@ -220,7 +220,7 @@ The .zshot files store arbitrary units of a scene, enabling work to be split amo --- ## Simulation engine -ILM also collaborated with Stanford’s **Ron Fedkiw** to build a unified simulation engine in Zeno for hair, cloth, skin and fluids [^1]. In 2008 he won an Academy Award for Technical Achievement for the fluid simulation system [^14]. +ILM also collaborated with Stanford's **Ron Fedkiw** to build a unified simulation engine in Zeno for hair, cloth, skin and fluids [^1]. In 2008 he won an Academy Award for Technical Achievement for the fluid simulation system [^14]. ### Zeno Hair simulation in action You can see the animatronic Scrunt being made in the youtube video below for the movie **Lady in the Water**, this required compositing for the grass-like hairs on the creature, Zeno's existing hair simulation was used for the task. @@ -232,12 +232,12 @@ Allowing him to define hundreds of specific "guide hairs" in the Zeno simulation These would be placed on the original model which was built in **Autodesk Maya** along with the face shapes built using Zeno's **Cart** facial animation system. Zeno was also used to place lights in the scene and the shot was finally rendered out in Pixar's RenderMan. -Animators then added details such as twigs and branches on the Scrunt's face using **Pixologic’s Zbrush** along with adding additional woody material around its nose. +Animators then added details such as twigs and branches on the Scrunt's face using **Pixologic's Zbrush** along with adding additional woody material around its nose. ### Plume - GPU fluid/fire dynamics simulation -ILM **Plume** module was added to Zeno roughly around 2009 for **The Last Airbender** TV Show, Plume is an internal GPU-based fluid simulation tool developed in-house by ILM specifically for high-performance visual effects work. Plume was showcased in technical VFX presentations and is designed to handle complex fluid dynamics simulations, such as smoke, fire, and gaseous effects, using efficient GPU processing (NVIDIA’s CUDA) to enable rapid iteration, preview, and rendering. +ILM **Plume** module was added to Zeno roughly around 2009 for **The Last Airbender** TV Show, Plume is an internal GPU-based fluid simulation tool developed in-house by ILM specifically for high-performance visual effects work. Plume was showcased in technical VFX presentations and is designed to handle complex fluid dynamics simulations, such as smoke, fire, and gaseous effects, using efficient GPU processing (NVIDIA's CUDA) to enable rapid iteration, preview, and rendering. ![Plume screenshot](https://github.com/user-attachments/assets/9277f5e5-1ec4-49d1-bd85-571544c2b699) @@ -257,7 +257,7 @@ Modules included: * **Lighting** - Lux * **Sculpting** - Isculpt [^19] * **Animation** - Zeno Poseur [^19] - * **Painting** - Viewpaint integration with Zeno? [For more information about check out Viewpaint: ILM’s secret weapon on Jurassic Park from vfxblog](https://vfxblog.com/viewpaint/) + * **Painting** - Viewpaint integration with Zeno? [For more information about check out Viewpaint: ILM's secret weapon on Jurassic Park from vfxblog](https://vfxblog.com/viewpaint/) * **Particles** - Plume * **Rotoscoping** @@ -267,11 +267,11 @@ According to **Chris Evans** who used to work at ILM, Zeno had **Geodesic Voxel In the **Electronic art and animation** catalog from SIGGRAPH 2004 it mentions a tool called **Zeno Commodore**, but not sure what it is [^19]. ### ILM Dynamic Rigging -ILM’s Dynamic Rigging system, often associated with their **BlockParty** tool, is an advanced rigging framework designed to streamline the creation of rigged characters and assets for animation and visual effects. It was created by **Jason Smith** for the Transformers movie [^22]. +ILM's Dynamic Rigging system, often associated with their **BlockParty** tool, is an advanced rigging framework designed to streamline the creation of rigged characters and assets for animation and visual effects. It was created by **Jason Smith** for the Transformers movie [^22]. This system allows artists to build detailed, flexible, and reusable rigs that can animate complex creatures as well as mechanical objects like spaceships. -Key features of ILM’s Dynamic Rigging include: +Key features of ILM's Dynamic Rigging include: * A comprehensive connection framework that integrates various rigging components consistently. * A novel graphical user interface and volumetric rig transfer to improve workflow speed and artist productivity. * The ability to reuse rig components and focus more on the artistic aspects of rigging rather than technical challenges. @@ -287,7 +287,7 @@ For the film **Pirates of the Caribbean Dead Man's Chest**, **David Meny** desig --- ### MARS - Camera Tracking System module -One of the first applications built on the Zeno framework was ILM’s new camera tracking system (codenamed **MARS**), which successfully leveraged Zeno’s scene graph to integrate 3D matchmoving data with film plates [^1]. +One of the first applications built on the Zeno framework was ILM's new camera tracking system (codenamed **MARS**), which successfully leveraged Zeno's scene graph to integrate 3D matchmoving data with film plates [^1]. This module was so effective it earned an **Academy Scientific & Technical Award**. Throughout the early 2000s, ILM gradually replaced dozens of older, disconnected tools with new Zeno-based modules [^1]. @@ -305,9 +305,9 @@ In the July 2005 issue of CGW compositing supervisor **Marshall Krasser** discus ### Caricature (Cari) - Facial Animation System Yoda in Cari -For **Dragonheart** (1996), ILM created a specialized in-house tool called Caricature (nicknamed "Cari") to enable animators to work interactively on Draco’s face, with sliders and real-time feedback. +For **Dragonheart** (1996), ILM created a specialized in-house tool called Caricature (nicknamed "Cari") to enable animators to work interactively on Draco's face, with sliders and real-time feedback. -Before Cari, facial animation at ILM was handled by hand-writing text commands in files to load shapes over time — effectively like stop-motion animation via scripts. +Before Cari, facial animation at ILM was handled by hand-writing text commands in files to load shapes over time - effectively like stop-motion animation via scripts. Animators used body motion data from Softimage (the conventional pipeline) then opened that into Caricature just for the facial animation part. Caricature allowed animators to hide the rest of the dragon model and focus solely on facial expressions, making high-iteration tweaking possible (e.g. combining phoneme shapes, sneers, eyebrow movement). @@ -315,17 +315,17 @@ Caricature allowed animators to hide the rest of the dragon model and focus sole Later, Caricature added model correctives, a system allowing artists to fix imperfections in geometry (like a "3D-Photoshop" for sculpted surfaces) inline. #### Integration of Cari into Zeno -Cari was later integrated into Zeno as stated on the official Lucasfilm website [ILM's Dragonheart Crew Looks Back - Lucasfilm.com](https://www.lucasfilm.com/news/digital-road-dragonheart/) "the techniques in Caricature were integrated into ILM’s current Zeno system in the 2000s." +Cari was later integrated into Zeno as stated on the official Lucasfilm website [ILM's Dragonheart Crew Looks Back - Lucasfilm.com](https://www.lucasfilm.com/news/digital-road-dragonheart/) "the techniques in Caricature were integrated into ILM's current Zeno system in the 2000s." **Cary Phillips** was awarded a 1998 Academy Technical Achievement Award for the development of Caricature. --- -### Lux - Zeno’s interactive lighting tool -Zeno’s interactive lighting tool **Lux** enabled artists to place and adjust lights in a true 3D context while seeing immediate feedback [^2]. +### Lux - Zeno's interactive lighting tool +Zeno's interactive lighting tool **Lux** enabled artists to place and adjust lights in a true 3D context while seeing immediate feedback [^2]. -Lux is true 3D lighting for particles and creatures that brings match-moving, interactive lighting, and texture painting together. The shots were later rendered with Pixar’s **RenderMan** and Mental Images’ **Mental Ray** [^1]. +Lux is true 3D lighting for particles and creatures that brings match-moving, interactive lighting, and texture painting together. The shots were later rendered with Pixar's **RenderMan** and Mental Images' **Mental Ray** [^1]. -Technical Directors in Zeno adjusted the direction and flicker of the Tripods’ headlights during lighting, and applied procedural 2D noise to create an "organic" glow in the alien windows — all without leaving the lighting interface [^2]. +Technical Directors in Zeno adjusted the direction and flicker of the Tripods' headlights during lighting, and applied procedural 2D noise to create an "organic" glow in the alien windows - all without leaving the lighting interface [^2]. In the book **Cinefex** from 2006 **Tom Fejes** is creditied as "setting up" the Lux tool, not sure if that means he was the creator of Lux or if he was the one that set it up for the Pirates movie that the book covers [^20]. @@ -339,7 +339,7 @@ One of the main benefits of Zeno was the integrations with industry standard sof Zeno was build from the ground up to be modular, with modules easily written in Python for tasks such as converting between 3D file formats or integrating 3rd party software tools seamlessly [^1]. ### Integration with Maya -Zeno was designed with live links to **Maya** and **Photoshop** – an artist could copy and paste data or edits between Maya and Zeno in real time – and its UI was made to resemble **Maya’s Outliner** to ease adoption [^1]. +Zeno was designed with live links to **Maya** and **Photoshop** – an artist could copy and paste data or edits between Maya and Zeno in real time – and its UI was made to resemble **Maya's Outliner** to ease adoption [^1]. ![Maya 7.0 Outliner inspired the Zeno UI](https://github.com/user-attachments/assets/f564e4d6-c05a-4c28-b59a-fd3aff88da55) **Curt Miyashiro**, digital production supervisor has the following to say about the benefits of Zeno's integration with Maya [^1]: @@ -347,11 +347,11 @@ Zeno was designed with live links to **Maya** and **Photoshop** – an artist co ### Integration with Compositing tools Zeno was used in ILM along with to their usual **compositing tools** which included [^1]: -* **Apple’s Shake** -* **ILM’s Saber** (based on Autodesk Media and Entertainment's Inferno) -* **ILM’s CompTime** - In House compositor +* **Apple's Shake** +* **ILM's Saber** (based on Autodesk Media and Entertainment's Inferno) +* **ILM's CompTime** - In House compositor -Then final renders from **RenderMan** or **Mental Ray** could round-trip back into Zeno’s compositing module for finishing [^1]. +Then final renders from **RenderMan** or **Mental Ray** could round-trip back into Zeno's compositing module for finishing [^1]. #### Integration with CompTime Zeno has first class support for woroking the the proprietary compositor developed in-house at ILM known as **CompTime**. @@ -362,11 +362,11 @@ In the July 2002 issue of Linux Journel Technical Directory **Robert Weaver** no --- ## The Success of Zeno -The success of zeno can not be understanted, by the mid-2000s, Zeno had become the **heart of ILM’s pipeline** and by 2004, Zeno had matured enough that ILM could **fully retire its old pipeline** [^1]. +The success of zeno can not be understanted, by the mid-2000s, Zeno had become the **heart of ILM's pipeline** and by 2004, Zeno had matured enough that ILM could **fully retire its old pipeline** [^1]. -Then by 2006–2007, **Pirates of the Caribbean: Dead Man’s Chest** and **At World’s End** benefited from Zeno; the CGI character **Davy Jones** was one high-profile creation that benefited from Zeno [^6]. +Then by 2006–2007, **Pirates of the Caribbean: Dead Man's Chest** and **At World's End** benefited from Zeno; the CGI character **Davy Jones** was one high-profile creation that benefited from Zeno [^6]. -> Seven years in the making, Zeno, ILM’s new tool set, has redefined the studio’s pipeline, opened the production process to all the artists on the crew, and positioned the studio to create future forms of entertainment [^1] +> Seven years in the making, Zeno, ILM's new tool set, has redefined the studio's pipeline, opened the production process to all the artists on the crew, and positioned the studio to create future forms of entertainment [^1] ### Version History of Zeno It would be interesting to find out the version history of Zeno, all we know about so far is that in 2011 Zeno reached major version **3.0**, having experienced a major re-tooling of its interface around the time of **Transformers: Dark of the Moon** [^6]. @@ -406,7 +406,7 @@ ILM's Zviz previsualization tool was actively used and developed around the earl [^3]: [Star Wars: The Force Unleashed – Wikipedia (Development section)](https://en.wikipedia.org/wiki/Star_Wars:_The_Force_Unleashed#Development) [^4]: [The Art and Making of Star Wars: The Force Unleashed – Insight Editions (2008), cited via Wookieepedia](https://starwars.fandom.com/wiki/Ronin_%28engine%29) [^5]: [Industrial Light and Magic](https://linuxjournal.rubdos.be/ljarchive/LJ/099/6011.html) -[^6]: [ILM’s Scientific Solutions – fxguide (Feb 2014)](https://www.fxguide.com/fxfeatured/ilms-scientific-solutions/) +[^6]: [ILM's Scientific Solutions – fxguide (Feb 2014)](https://www.fxguide.com/fxfeatured/ilms-scientific-solutions/) [^7]: [Star Wars: The Force Unleashed – Wookieepedia (Behind the Scenes)](https://starwars.fandom.com/wiki/Star_Wars:_The_Force_Unleashed#Behind_the_scenes) [^8]: [ILM's Dragonheart Crew Looks Back - Lucasfilm.com](https://www.lucasfilm.com/news/digital-road-dragonheart/) [^9]: [Star Wars 1313 – Wikipedia](https://en.wikipedia.org/wiki/Star_Wars_1313) diff --git a/pages/tutorials/CreateALibRetroFrontEndInRust.md b/pages/tutorials/CreateALibRetroFrontEndInRust.md index 0833b3e9..1cd69723 100644 --- a/pages/tutorials/CreateALibRetroFrontEndInRust.md +++ b/pages/tutorials/CreateALibRetroFrontEndInRust.md @@ -22,12 +22,12 @@ recommend: editlink: /tutorials/CreateALibRetroFrontEndInRust.md updatedAt: '2023-05-07' --- + Welcome to this comprehensive tutorial on creating a LibRetro Frontend using Rust! If you're passionate about retro gaming and interested in creating your very own emulation frontend from scratch, you've come to the right place. Rust, with its strong safety guarantees, performance, and concurrency support, makes it an ideal choice for developing such applications. In this tutorial, we will walk you through the process of building a fully-functional LibRetro frontend from the ground up. We will start by introducing you to the basics of creating a graphical Rust application and the LibRetro API, then delve into essential concepts such as handling input, video, and audio. By the end of this tutorial, you'll have a solid understanding of the inner workings of a LibRetro frontend and the knowledge to create your own customized version to relive your favorite gaming memories. # Step 1 - Setup MiniFB - The first step was just to get a window where we can draw pixels and respond to user input, we want it to be very simple and cross-platform so we can use the `minifb` library. ```rust @@ -80,7 +80,6 @@ The result of this is that it draws a blue pixel at an x,y position and you can --- # Step 2 - Clear the screen every frame - The line effect is cool but we should clear the screen to black every frame so that the player can just move the individual pixel around the screen, you can do this by adding the following code to the start of the loop: ```rust @@ -91,7 +90,6 @@ for pixel in &mut buffer { ``` # Step 3 - Display the Frames per second - That looks great but is it efficinet to loop through the whole array every frame (60 times a second) to set every pixel to black? Probably not, but it would be good to have a way to measure this, lets display the frames per second and we can compare the speed of future changes. To display the fps, you can use the Instant type from the std::time module to measure the time between frames. Here's an updated version of your code that displays the fps in the window title: @@ -162,7 +160,6 @@ fn main() { In this updated code, we use an Instant timer to measure the elapsed time between frames. We keep track of the number of frames rendered (fps_counter) and the time elapsed since the last fps update (fps_timer). When a second has passed, we calculate the fps and update the window title using the Window::set_title() method. Finally, we reset the fps counter and timer. # Step 4 - Using buffer.fill instead of looping through array - Now that we can measure the frames per second we can test to see if using buffer.fill is more efficinet that looping through each pixel and setting to black, so replace the loop with: ```rust @@ -180,7 +177,6 @@ while window.is_open() && !window.is_key_down(Key::Escape) { This gets a much higher fps, of course this is not particularly useful right now as when creating a game it is unlikely that we will just update a single pixel per frame, but it is good to keep in mind for future optimizations, the less pixels we update per frame the more efficient we can be. # Step 5 - Load a Dynamic Library (dll/dylib) from the code - All libRetro cores are compiled into platform-specific dynamic libraries (dylib on MacOSX and dll on Windows), we want to be able to call one of these functions from our code in order to get our frontend to do anything. In order to do this we need to add the **libloading** crate as a dependency inside the **Cargo.toml** file like so: @@ -213,7 +209,6 @@ Note if you are on Windows make sure your core ends with `.dll`, on Linux `.so` You can download cores for your platform using the LibRetro BuildBot available here: [LibRetro Nightly Builds](https://buildbot.libretro.com/nightly/). # Step 6 - Calling a function from the Core (Dynamic Library) - As an example lets call the function `retro_init` as it is one of the simplest functions (it doesn't require any parameters). ```rust @@ -232,7 +227,6 @@ When running this may actually cause a Segmentation fault depending on which cor For more information about retro-init and the callback functions it requires you can checkout the guide: [Developing Cores for LibRetro](https://docs.libretro.com/development/cores/developing-cores/). # Step 7 - Retrieving a response from the Core - Before we call the setup functions we should make sure that the core is written using a version of the LibRetro API that is compatible with what we expect. The function `retro_api_version` is used for this purpose and at the time of current written just returns the number 1, we can call this function from the core and retrieve its value and print it to the console like so: @@ -256,7 +250,6 @@ fn load_core() { ``` # Step 8 - Setting up the environment for the Core - Now to fix that segmentation fault error when calling `retro_init`, all we need to do it set whats called an `**Environment Callback**` function and pass it to the core. The Environment Callback function is used to allow the core to call back to the frontend to request information. The information they can request comes in the form of a Command ID and is passed back to the core using a data buffer, so the Environment Callback takes in those two paramaters, we can implement this like so: @@ -311,7 +304,6 @@ For example you can see that the first value `52` is called `RETRO_ENVIRONMENT_G We could define all these constants outselves, but after a quick google search you can see that there is already a rust library with these defined called `libretro-sys` that we can use instead. # Step 9 - Using the types from libretro-sys cargo - We can now add the following to our `Cargo.toml` file: ```rust @@ -399,7 +391,6 @@ Then it will not need to be returned and will not cause a segmentation fault. Although this is just temporary, in the future we will move all this into its own data structure with additional settings, if/when we add the ability to change cores on the fly. # Step 10 - Read Command Line arguments for ROM to load - Currently we have hard-coded the dynamic library into the code but now we can write code to read both the core to load and the ROM name to load from the command line arguments. In order to be a drop-in replacement for RetroArch we should try to use the same command Line options, which are available on their website [here](https://docs.libretro.com/guides/cli-intro/). @@ -452,7 +443,6 @@ You now need to pass a ROM file to the program in order to get past the argument ``` # Step 11 - Loading the ROM file - Now that we have the path of the ROM file to load we need to pass it to our core using the `retro_load_game` function. The function takes in a structure which the Rust `libretro-sys` crate calls `GameInfo`. Lets look at the definition of the `GameInfo` struct: @@ -639,7 +629,6 @@ libretro_environment_callback Called with command: 65578 I am going to ignore the `gbc_bios.bin` error message for now, Tetris isn't a GBC game and I believe the BIOS is optional for this emulator anyway. # Step 12 - Running the core with retro_run - Lets now see what happens when we request the core to run a whole frame of emulation, we can do this with the `retro_run` function like so: ```rust @@ -746,7 +735,6 @@ libretro_set_input_state_callback ``` # Step 13 - Get the pixel buffer from the core - Now that we have the core running it would be nice to actually see what the emulator is doing, for that we need to get the pixel buffer and display it instead of our moving blue pixel. To get the pixel buffer from the libretro core we need to properly implement the `libretro_set_video_refresh_callback` we just created a dummy for as it is called every frame when the core has finished writing all the pixels to the frame buffer. @@ -804,7 +792,6 @@ unsafe extern "C" fn libretro_set_video_refresh_callback(frame_buffer_data: *con This fixes the segmentation fault and highlights a piece of useful information, that the frame_buffer_data is sometimes null, this could be related to the dupe frames mentioned earlier, maybe if it is null it expects the frontend to just display the previous frame? # Step 14 - Displaying the Pixel Buffer to the screen - Now we have a buffer of pixels from the core, we need to figure out how we can display them to the screen, we have two problems to solve: * We got the buffer of pixels in our callback function but how do we get that data into the main game loop to draw to our screen? @@ -930,7 +917,6 @@ unsafe { ``` # Step 15 - Handling the core Pixel Format - Ok lets finally handle the Pixel format correctly, do you remember this dummy code block we created earlier: ```rust @@ -1032,7 +1018,6 @@ static mut CURRENT_EMULATOR_STATE: EmulatorState = EmulatorState { I set the default value to the 32 byte version as `minifb` uses that but it should always be overridden by the core anyway. # Step 16 - Converting one Pixel Format to another - Now that we have saved the pixel format into the global variable we can use it to convert the buffer from the core's pixel format into the `minifb` pixel format. So lets have a look at the video refresh callback function again: @@ -1167,7 +1152,6 @@ If you run the program now you will get something that looks like this: # Step 17 - Fixing display issues - Remember the `pitch` parameter that the core sends us? Yeah turns out it is very important as it is basically the width of the frame buffer, with `width` parameter is the part of the pitch that is actually used for the gameboy screen and the rest of the pixels are black. So we can actually make this a lot better by just changing the WIDTH and HEIGHT to the following values: ```rust @@ -1243,7 +1227,6 @@ unsafe { ``` # Step 18 - Input Handling - The ROM will load, get the the main menu and then if you wait long enough it will show a brief demo of the gameplay before going back to the menu and repeating. This is cool but it would be better if we could actually **play** the game. We already have logic that checks the state of the arrow keys for when we had the blue pixel moving on screen so lets see if we can pass that information to the core and start moving Tetris pieces in the game. First of all how does the core request from the frontend which buttons are pressed? It uses the input state callback which we created a dummy for previously, if we modify it slightly to print out the parameters that the core are passing in like so: @@ -1416,7 +1399,6 @@ unsafe extern "C" fn libretro_set_input_state_callback(port: libc::c_uint, devic Now run the program and we can play the full game of Tetris! # Step 19 - Mapping the input buttons - This is great but there are a few limitations, for one we only mapped the buttons for the Game Boy and this wouldn't work on cores that use more buttons and second it doesn't allow the users to configure which buttons do what. Since we are a aiming to be a lightweight drop-in-replacement for RetroArch lets find out if RetroArch has a common config format for this purpose so users will be able to use their existing configuration. @@ -1580,7 +1562,6 @@ Lets start keeping track of the size of the executable, I should have done this --- # Step 20 - Saving and Loading state - We are doing well but we still haven't implemented one of my favourite features of emulators, save states. In the config file we have two settings for the buttons used to trigger saving and loading states: * `input_save_state` @@ -1725,7 +1706,6 @@ And we can call it similar to how we call `save_state`: ``` # Step 21 - Supporting save slots - You will notice that we hard coded the `save_slot_index` to 0, we can now store the current save slot index in our global variable and then allow the user to increment and decrement the current save slot, allowing them to have different save states for the same game. First lets add another field to our global to keep track of the current slot: @@ -1788,7 +1768,6 @@ And now read them from out input handling code: Now if you run the program you can incfrease and decrease the save slots and it will allow you to have multiple saves for the same game. # Step 22 - Audio Support - So far the game is playable but rather... quiet, lets change that by adding audio support! We already implemented the two audio callbacks as dummy functions before to prevent the core from causing a segmentation fault but they don't do anything yet: @@ -1913,7 +1892,6 @@ You will notice that this has helped the frame rate a bit (around 30 fps on my m > Size of executable so far: 1.4MB # Step 23 - Creating an Audio Thread - Audio processing is very cpu intensive and so far we have done all our logic in a single thread, this is now affecting the frame rate of games being played in our frontend. One solution for this is to put the audio processing in its own thread and just pass the audio data between the threads. Lets first modify the Audio setup so that iut creates a new thread and creates the Rodeo Sink inside that thread like so: @@ -1982,7 +1960,6 @@ thread '' panicked at 'called `Result::unwrap()` on an `Err` value: Rec ``` # Step 24 - Get Audio/Video Data from the core - You will notice that in the previous step we hard coded the audio sample rate at `32768`, while this is correct for the Game Boy, it won;'t be correct for other cores, so it would be ideal to be able to allow each core to specify its own sample rate. This is where the libRetro function `retro_get_system_av_info` comes in. So just after the call to `retro_init` we can call it and print the result we get back like so: @@ -2085,7 +2062,6 @@ Now we should be able to support more cores in the future! # Step 25 - Game Controller support - Lets add the `gilrs` cargo to our rust project: ```rust diff --git a/pages/tutorials/GDBReversing.md b/pages/tutorials/GDBReversing.md index c03cd03d..f8a73125 100644 --- a/pages/tutorials/GDBReversing.md +++ b/pages/tutorials/GDBReversing.md @@ -44,28 +44,28 @@ Breakpoint support in GDB is particularly advantageous for reverse engineers dis # GDB CheatSheet Here's a table format for some of the most commonly used GDB commands: -| Command | Abbreviation | Description | -| ----------------------------- | ------------ | -------------------------------------------------------- | -| `run` | `r` | Start program execution from the beginning. | -| `break` | `b` | Set a breakpoint at a specified location. | -| `continue` | `c` | Continue program execution until the next breakpoint. | -| `step` | `s` | Execute the current line and stop at the first instruction of called functions. | -| `next` | `n` | Execute the current line and stop at the next line in the same function. | -| `finish` | | Execute remaining lines of the current function and stop when the function returns. | -| `list` | `l` | Display source code around the current line. | -| `info breakpoints` | | Display information about set breakpoints. | -| `print` | `p` | Print the value of a variable or expression. | -| `backtrace` | `bt` | Display a backtrace of the call stack. | -| `info locals` | | Display values of local variables in the current stack frame. | -| `info registers` | | Display values of CPU registers. | -| `set variable` | | Set the value of a variable during debugging. | -| `display` | | Display the value of an expression after each debugger command. | -| `delete` | | Delete a specific breakpoint or all breakpoints. | -| `watch` | | Set a watchpoint on a variable. | -| `info threads` | | Display information about threads in a multithreaded program. | -| `thread` | | Switch between threads in a multithreaded program. | -| `set pagination off` | | Disable pagination, allowing GDB to display long output without pausing. | -| `quit` | `q` | Exit GDB. | +Command | Abbreviation | Description +----------------------------- | ------------ | -------------------------------------------------------- +`run` | `r` | Start program execution from the beginning. +`break` | `b` | Set a breakpoint at a specified location. +`continue` | `c` | Continue program execution until the next breakpoint. +`step` | `s` | Execute the current line and stop at the first instruction of called functions. +`next` | `n` | Execute the current line and stop at the next line in the same function. +`finish` | | Execute remaining lines of the current function and stop when the function returns. +`list` | `l` | Display source code around the current line. +`info breakpoints` | | Display information about set breakpoints. +`print` | `p` | Print the value of a variable or expression. +`backtrace` | `bt` | Display a backtrace of the call stack. +`info locals` | | Display values of local variables in the current stack frame. +`info registers` | | Display values of CPU registers. +`set variable` | | Set the value of a variable during debugging. +`display` | | Display the value of an expression after each debugger command. +`delete` | | Delete a specific breakpoint or all breakpoints. +`watch` | | Set a watchpoint on a variable. +`info threads` | | Display information about threads in a multithreaded program. +`thread` | | Switch between threads in a multithreaded program. +`set pagination off` | | Disable pagination, allowing GDB to display long output without pausing. +`quit` | `q` | Exit GDB. --- diff --git a/pages/tutorials/WritingAGDBStubInC.md b/pages/tutorials/WritingAGDBStubInC.md index 71b0e1df..bb492245 100644 --- a/pages/tutorials/WritingAGDBStubInC.md +++ b/pages/tutorials/WritingAGDBStubInC.md @@ -19,6 +19,7 @@ tags: editlink: /tutorials/WritingAGDBStubInC.md _updatedAt: '2024-09-29' --- + # Tutorial: Building a GDB Stub in C ## Step 1: Setting Up the Project @@ -64,7 +65,6 @@ First lets do some initial setup by creating the project folder and going inside ``` --- - ## Step 2: Creating a TCP Socket ### Add Required Headers: @@ -127,7 +127,6 @@ First lets do some initial setup by creating the project folder and going inside ``` --- - ## Step 3: Accepting a Client Connection ### Accept Client Connections: @@ -188,7 +187,6 @@ First lets do some initial setup by creating the project folder and going inside (You'll need to connect using GDB later to see the "GDB connected" message.) --- - ## Step 4: Receiving Data from GDB ### Receive Data: @@ -283,7 +281,6 @@ First lets do some initial setup by creating the project folder and going inside ``` --- - ## Step 5: Sending a Response Back to GDB The main function is getting a bit large so lets create some new functions for the next part of the functionality, we won't keep posting the full code for every step. diff --git a/pages/tutorials/libRetro.md b/pages/tutorials/libRetro.md index 41641748..47249849 100644 --- a/pages/tutorials/libRetro.md +++ b/pages/tutorials/libRetro.md @@ -92,11 +92,11 @@ The core is the actual emulator, while the frontend provides the user interface ## Cores Each core implements the libRetro API, which includes functions for: -- Initialization -- Frame rendering -- Input handling -- Audio processing -- Save state management +* Initialization +* Frame rendering +* Input handling +* Audio processing +* Save state management The cores are responsible for emulating the hardware of a specific system. They take care of processing the game code, rendering graphics, and managing audio, effectively mimicking the original hardware's behavior. @@ -142,7 +142,7 @@ The retro_api_version function returns the version of the libRetro API that the ## Callbacks In libRetro, several functions must be set up before the emulation process begins. These functions are responsible for handling various aspects of the emulation, such as video rendering, audio output, and input management. T -These callback functions play a vital role in the core's ability to interface with the frontend. By setting these functions before the first call to `retro_run()`, libRetro ensures that the necessary resources—video rendering, audio playback, and input handling—are properly configured. +These callback functions play a vital role in the core's ability to interface with the frontend. By setting these functions before the first call to `retro_run()`, libRetro ensures that the necessary resources-video rendering, audio playback, and input handling-are properly configured. The following is an explanation of the key callback functions that are initialized before the emulation starts. @@ -203,7 +203,7 @@ The frontend then takes care of displaying the frame on the screen. This functio ### retro_set_audio_sample `retro_set_audio_sample(retro_audio_sample_t)` registers the callback for audio output. This function handles individual audio samples, allowing the core to pass sound data to the frontend. -It’s useful when the core outputs audio on a per-sample basis, and the frontend is responsible for processing these audio samples to ensure they are played in sync with the video. +It's useful when the core outputs audio on a per-sample basis, and the frontend is responsible for processing these audio samples to ensure they are played in sync with the video. ### retro_set_audio_sample_batch `retro_set_audio_sample_batch(retro_audio_sample_batch_t)` is similar to `retro_set_audio_sample`, but instead of handling individual samples, it handles batches of audio samples at once. This is typically more efficient and commonly used by cores that generate a larger number of audio samples in one go. diff --git a/scripts/README.md b/scripts/README.md index 31322b0f..a55478e9 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,9 +1,7 @@ # Scripts - Node.js utilities for analyzing markdown files in the `categories/` and `pages/` directories. ## check-metadata.js - Finds markdown files missing specified frontmatter fields. ### Usage @@ -24,12 +22,11 @@ node scripts/check-metadata.js updatedAt ``` ### Output -- Lists files missing each field -- Distinguishes between files with no frontmatter (❌) vs missing specific fields (⚠️) -- Shows coverage statistics +* Lists files missing each field +* Distinguishes between files with no frontmatter (❌) vs missing specific fields (⚠️) +* Shows coverage statistics ## extract-tags.js - Extracts and analyzes all tags used in markdown frontmatter. ### Usage @@ -38,12 +35,12 @@ node scripts/extract-tags.js [options] ``` ### Options -- `--sort-by-count` - Sort by usage count (default) -- `--sort-by-name` - Sort alphabetically -- `--detailed` - Show which files use each tag -- `--export-json` - Export data to `valid-tags.json` -- `--export-csv` - Export statistics to `tags-export.csv` -- `--help` - Show help +* `--sort-by-count` - Sort by usage count (default) +* `--sort-by-name` - Sort alphabetically +* `--detailed` - Show which files use each tag +* `--export-json` - Export data to `valid-tags.json` +* `--export-csv` - Export statistics to `tags-export.csv` +* `--help` - Show help ### Examples ```bash @@ -58,13 +55,12 @@ node scripts/extract-tags.js --export-json --export-csv ``` ### Output -- Tag usage statistics with counts and percentages -- Top 10 most used tags -- Optional detailed file-to-tag mappings -- Export options for JSON/CSV formats +* Tag usage statistics with counts and percentages +* Top 10 most used tags +* Optional detailed file-to-tag mappings +* Export options for JSON/CSV formats ## validate-tags.js - Validates all tags in markdown files against approved tags from `valid-tags.json`. ### Usage @@ -73,7 +69,7 @@ node scripts/validate-tags.js [path-to-valid-tags.json] ``` ### Arguments -- `path-to-valid-tags.json` - Path to valid tags file (default: `valid-tags.json`) +* `path-to-valid-tags.json` - Path to valid tags file (default: `valid-tags.json`) ### Examples ```bash @@ -85,10 +81,10 @@ node scripts/validate-tags.js /path/to/custom-tags.json ``` ### Output -- Reports any invalid tags found in files -- Shows summary of invalid tags with file counts -- Provides detailed file-by-file error report -- Exits with code 0 (success) or 1 (validation failed) +* Reports any invalid tags found in files +* Shows summary of invalid tags with file counts +* Provides detailed file-by-file error report +* Exits with code 0 (success) or 1 (validation failed) ### Prerequisites Generate the tags export file first: @@ -97,7 +93,6 @@ node scripts/extract-tags.js --export-json ``` ## validate-includes.js - Validates all `{% include_cached link-to-other-post.html post="..." %}` references in markdown files to ensure the `post=` parameter matches an actual post's permalink. ### Usage @@ -106,14 +101,14 @@ node scripts/validate-includes.js ``` ### Description -- Scans all markdown files in `categories/` and `pages/` for `{% include_cached link-to-other-post.html post="..." %}` syntax. -- Checks that each `post=` value matches a valid permalink from the frontmatter of any markdown file. -- Reports any invalid or missing references, including line numbers and suggestions for similar permalinks. +* Scans all markdown files in `categories/` and `pages/` for `{% include_cached link-to-other-post.html post="..." %}` syntax. +* Checks that each `post=` value matches a valid permalink from the frontmatter of any markdown file. +* Reports any invalid or missing references, including line numbers and suggestions for similar permalinks. ### Output -- Summary of total files processed and files with invalid references -- Detailed file-by-file error report with line numbers and suggestions -- Exits with code 0 (all references valid) or 1 (invalid references found) +* Summary of total files processed and files with invalid references +* Detailed file-by-file error report with line numbers and suggestions +* Exits with code 0 (all references valid) or 1 (invalid references found) ### Example ```bash @@ -121,13 +116,12 @@ node scripts/validate-includes.js ``` ### Fixing Issues -- Ensure the referenced post exists and has a `permalink` in its frontmatter -- Verify the `post=` path matches the exact permalink (case-sensitive) -- Remove or update references to non-existent posts -- Fill in or remove empty post paths (e.g., `post="//"`) +* Ensure the referenced post exists and has a `permalink` in its frontmatter +* Verify the `post=` path matches the exact permalink (case-sensitive) +* Remove or update references to non-existent posts +* Fill in or remove empty post paths (e.g., `post="//"`) ## generate-placeholder-social-images.js - Generates static social-card JPGs for posts and category pages that do not have an `image` or `twitterimage` in frontmatter. ### Usage @@ -136,28 +130,27 @@ node scripts/generate-placeholder-social-images.js ``` ### Description -- Scans `pages/` and `categories/` for Markdown and HTML content files -- Uses `title`, `shorttitle`, `permalink`, `category` and the `category_images` block in `_config.yml` -- Uses the Ruby `geo_pattern` gem to generate deterministic SVG backgrounds from each page seed -- Uses `@resvg/resvg-js` in Node to rasterize the SVG into a JPG -- Falls back to `rsvg-convert` when the Node renderer is unavailable -- Outputs deterministic JPGs and SVGs to `public/generated/placeholders/` -- Names each output from the permalink, so `/ps4/` becomes `ps4.jpg` -- Skips hidden pages and pages that already define `image` or `twitterimage` +* Scans `pages/` and `categories/` for Markdown and HTML content files +* Uses `title`, `shorttitle`, `permalink`, `category` and the `category_images` block in `_config.yml` +* Uses the Ruby `geo_pattern` gem to generate deterministic SVG backgrounds from each page seed +* Uses `@resvg/resvg-js` in Node to rasterize the SVG into a JPG +* Falls back to `rsvg-convert` when the Node renderer is unavailable +* Outputs deterministic JPGs and SVGs to `public/generated/placeholders/` +* Names each output from the permalink, so `/ps4/` becomes `ps4.jpg` +* Skips hidden pages and pages that already define `image` or `twitterimage` ### Output -- Creates 1200x630 JPGs suitable for Twitter/Open Graph cards -- Saves the source SVG alongside each JPG in `public/generated/placeholders/` -- Reuses existing generated files when they are already up to date -- Prints a generated/skipped summary at the end +* Creates 1200x630 JPGs suitable for Twitter/Open Graph cards +* Saves the source SVG alongside each JPG in `public/generated/placeholders/` +* Reuses existing generated files when they are already up to date +* Prints a generated/skipped summary at the end ### Requirements -- `gem install geo_pattern` for real GeoPattern SVG backgrounds -- `npm install` to install the Node rasterizer used for JPG output -- Optional: `brew install librsvg` for `rsvg-convert` fallback support +* `gem install geo_pattern` for real GeoPattern SVG backgrounds +* `npm install` to install the Node rasterizer used for JPG output +* Optional: `brew install librsvg` for `rsvg-convert` fallback support ## convert-scr-to-png.js - Converts Nintendo workstation `.SCR` layout files into PNGs using the matching `.CGX` graphics bank and optional `.COL` palette bank. In folder mode it also writes a standalone PNG tile-sheet for every `.CGX` it finds. ### Usage @@ -166,27 +159,27 @@ node scripts/convert-scr-to-png.js [options] ``` ### Options -- `--cgx ` - Path to the matching `.CGX` file -- `--col ` - Path to the matching `.COL` file -- `--out ` - Output PNG path -- `--bit-depth ` - Force `2`, `4`, or `8` -- `--block ` - Render `all`, `0`, `1`, `2`, or `3` -- `--help` - Show usage +* `--cgx ` - Path to the matching `.CGX` file +* `--col ` - Path to the matching `.COL` file +* `--out ` - Output PNG path +* `--bit-depth ` - Force `2`, `4`, or `8` +* `--block ` - Render `all`, `0`, `1`, `2`, or `3` +* `--help` - Show usage ### Default behavior -- If you pass only a `.SCR` file, the script looks for a `.CGX` with the same basename in the same folder -- It also looks for a `.COL` with the same basename in the same folder -- If no `.COL` is found, it still renders using a grayscale fallback -- If no bit depth is forced, the script tries to auto-detect it from the `.SCR` tile references and the `.CGX` size -- If you pass a folder, the script scans it recursively and converts every `.SCR` it finds -- In folder mode, it also renders every `.CGX` it finds as `filename.CGX.png` -- For those standalone `.CGX` renders it uses: - - the same-name `.COL` first - - otherwise the closest-named sibling `.COL` - - otherwise grayscale -- If a same-name `.SCR` exists beside a `.CGX`, the script uses it for bit-depth auto-detection -- In folder mode, `--out` should be a directory. The script mirrors the source subfolder structure inside it -- In folder mode, do not pass `--cgx` or `--col`. Each `.SCR` auto-matches its own sibling files +* If you pass only a `.SCR` file, the script looks for a `.CGX` with the same basename in the same folder +* It also looks for a `.COL` with the same basename in the same folder +* If no `.COL` is found, it still renders using a grayscale fallback +* If no bit depth is forced, the script tries to auto-detect it from the `.SCR` tile references and the `.CGX` size +* If you pass a folder, the script scans it recursively and converts every `.SCR` it finds +* In folder mode, it also renders every `.CGX` it finds as `filename.CGX.png` +* For those standalone `.CGX` renders it uses: + * the same-name `.COL` first + * otherwise the closest-named sibling `.COL` + * otherwise grayscale +* If a same-name `.SCR` exists beside a `.CGX`, the script uses it for bit-depth auto-detection +* In folder mode, `--out` should be a directory. The script mirrors the source subfolder structure inside it +* In folder mode, do not pass `--cgx` or `--col`. Each `.SCR` auto-matches its own sibling files ### Examples ```bash @@ -198,27 +191,23 @@ node scripts/convert-scr-to-png.js /path/to/end-demo-A.SCR --bit-depth 2 --out / ``` ## GitHub Action Integration - The repository includes a GitHub Action (`.github/workflows/markdown-validation.yml`) that automatically runs these scripts on pull requests to ensure content quality. ### What the Action Does - -- **Triggers**: Runs on PRs that modify markdown files in `categories/` or `pages/` -- **Generates**: Current tags export for validation -- **Checks**: Metadata completeness (editlink, updatedAt fields) -- **Validates**: All tags against approved list -- **Reports**: Detailed results as PR comments and workflow artifacts -- **Blocks**: PRs with invalid tags (metadata warnings don't block merges) +* **Triggers**: Runs on PRs that modify markdown files in `categories/` or `pages/` +* **Generates**: Current tags export for validation +* **Checks**: Metadata completeness (editlink, updatedAt fields) +* **Validates**: All tags against approved list +* **Reports**: Detailed results as PR comments and workflow artifacts +* **Blocks**: PRs with invalid tags (metadata warnings don't block merges) ### Action Outputs - -- **PR Comments**: Automated validation summary with status and recommendations -- **Workflow Artifacts**: Detailed reports downloadable for 90 days -- **Status Checks**: Pass/fail status for required validations -- **Step Summary**: Quick overview in the Actions tab +* **PR Comments**: Automated validation summary with status and recommendations +* **Workflow Artifacts**: Detailed reports downloadable for 90 days +* **Status Checks**: Pass/fail status for required validations +* **Step Summary**: Quick overview in the Actions tab ### Local Development - Run the same checks locally before pushing: ```bash diff --git a/scripts/format-docs.js b/scripts/format-docs.js index 69efe04f..a7bb440e 100755 --- a/scripts/format-docs.js +++ b/scripts/format-docs.js @@ -234,12 +234,14 @@ function applyLineRules(lines) { function applyMultiLineRules(text, fixes) { // Rule: ensure blank line after frontmatter closing --- before any content/heading - // Frontmatter is identified by --- at the start (line 1), YAML with :, then closing --- - const frontmatterMatch = text.match(/^---\n([\s\S]*?)\n---\n/); + // Frontmatter is identified by --- at the very start (line 1), then closing --- + const isFrontmatter = /^---\n[\s\S]*?\n---\n/.test(text); + let after0 = text; - if (frontmatterMatch && frontmatterMatch[1].includes(':')) { - // This looks like frontmatter; ensure blank line after closing --- - after0 = text.replace(/^(---\n[\s\S]*?\n---)(\n)(?=[^\n])/m, '$1\n\n'); + if (isFrontmatter) { + // For frontmatter files, ensure there's a blank line after closing --- + // Match: opening ---, any content, closing ---, optional newline, then non-newline char + after0 = text.replace(/^(---\n[\s\S]*?\n---)(\n)(?=\S)/m, '$1\n\n'); if (after0 !== text) { fixes.push('multiline: missing blank line after frontmatter'); } @@ -247,18 +249,24 @@ function applyMultiLineRules(text, fixes) { // Rule: no blank line(s) between a --- HR and the next heading // e.g. ---\n\n## Heading → ---\n## Heading - // But SKIP this if the --- is closing frontmatter (already handled above) + // For frontmatter files, don't apply this to the closing --- of frontmatter let after1 = after0; - if (!frontmatterMatch || !frontmatterMatch[1].includes(':')) { + if (!isFrontmatter) { after1 = after0.replace(/^---\n\n+(#{1,5} )/gm, '---\n$1'); if (after1 !== after0) { fixes.push('multiline: blank between HR and heading'); } } else { - // For frontmatter files, still apply the rule but skip the first --- block - after1 = after0.replace(/(?<=\n)---\n\n+(#{1,5} )/gm, '---\n$1'); - if (after1 !== after0) { - fixes.push('multiline: blank between HR and heading'); + // For frontmatter files, only apply the HR rule to HRs AFTER the frontmatter + const frontmatterEnd = after0.search(/\n---\n/); + if (frontmatterEnd !== -1) { + const frontmatterPart = after0.substring(0, frontmatterEnd + 5); // +5 for "\n---\n" + const restPart = after0.substring(frontmatterEnd + 5); + const fixedRest = restPart.replace(/^---\n\n+(#{1,5} )/gm, '---\n$1'); + if (fixedRest !== restPart) { + fixes.push('multiline: blank between HR and heading'); + after1 = frontmatterPart + fixedRest; + } } } From f5f33e69477784aff5d2e5eccd35b06be0b35f45 Mon Sep 17 00:00:00 2001 From: A
Date: Sat, 11 Apr 2026 12:33:16 +0100 Subject: [PATCH 3/5] More page formatting fixes --- CONTRIBUTING.md | 141 +++++++++----- categories/consoles/Arcade.md | 2 +- categories/consoles/GameBoy.md | 17 +- categories/consoles/PC-88.md | 10 - categories/consoles/PC-engine.md | 4 +- categories/consoles/PS2.md | 16 +- categories/consoles/PS4.md | 1 + categories/consoles/PSP.md | 10 +- categories/consoles/PokemonMini.md | 1 + categories/consoles/Saturn.md | 6 +- categories/consoles/SuperNintendo.md | 40 ++-- categories/consoles/Wii.md | 1 + categories/consoles/Windows.md | 2 +- categories/consoles/Wonderswan.md | 80 ++++---- categories/consoles/Xbox.md | 1 - categories/consoles/ZXSpectrum.md | 21 +-- ...debugSymbols.md => DebugSymbolsInGames.md} | 3 +- categories/games/GameEngines.md | 5 +- categories/games/Games.md | 1 + categories/misc/Bookazines.md | 3 +- categories/misc/Books.md | 6 +- categories/misc/Conferences.md | 177 +++++++++--------- categories/misc/GDC.md | 13 +- categories/misc/Industry.md | 8 +- categories/misc/Leaks.md | 1 - categories/misc/Magazines.md | 59 +++--- categories/tools/3DSoftware.md | 3 - categories/tools/Tools.md | 70 ++++--- pages/consoles/3ds/3DSDevkitHardware.md | 71 ++++--- pages/consoles/3ds/3DSFileFormats.md | 1 + pages/consoles/ds/DSOfficialSDK.md | 5 +- pages/consoles/gameboy/GameBoyRE.md | 3 +- .../gameboy/GameboyDevelopmentKitHardware.md | 10 +- pages/consoles/gameboy/Mrdo.md | 4 +- pages/consoles/gameboy/PokemonRedBlue.md | 6 +- pages/consoles/saturn/SegaSaturnSDK.md | 1 + .../saturn/SegaSaturnSampleCompilation.md | 2 + pages/consoles/snes/SNESDevkitHardware.md | 5 +- pages/consoles/snes/SNESFileFormats.md | 8 +- pages/consoles/switch/SwitchFileFormats.md | 2 +- pages/tools/3DStudioMax.md | 3 - pages/tools/Compiler Toolchains.md | 77 ++++---- pages/tools/GameMaker.md | 112 +++++------ pages/tools/GameProgrammingStarterKit.md | 46 ++--- pages/tools/Maya.md | 9 +- pages/tools/Unity3d.md | 65 +++---- 46 files changed, 565 insertions(+), 567 deletions(-) rename categories/games/{debugSymbols.md => DebugSymbolsInGames.md} (99%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b80e9067..931c06c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,24 +60,6 @@ We want to avoid spreading misinformation as much as possible, which can be tric # Formatting Guidelines Posts are written in [GitHub Flavored Markdown](https://github.github.com/gfm/) but also support additional Jekyll includes that can be used for more advanced components. -When a section is listing folder contents, prefer the existing includes over raw HTML or plain bullet dumps: -* Use `connected-folder-tree.html` when showing folders with subfolders or a nested directory structure - `folder` should be the short display name and `path` should be the longer location, for example `folder="trunk"` and `path="agb_bootrom/trunk"` - -When referencing a real source file: -* Use `source-code-card.html` and/or `source-code-card-grid.html` when you are actually showing the contents of a source file, such as its functions, variables, structs, or other internal symbols -* Its best to float the code card to the side of the text with the `rr-code-card-aside` class and use it in sections talking about that source file. -* Don't have the exact same code card in multiple sections of the same article -* Do not use code cards just to summarize what a file is for or what companion files sit beside it - use a table or normal prose for that instead -* The `functions`, `variables`, and `lines` fields on code cards must be exact numeric counts taken from the file contents, not descriptive text or estimates -* If the exact counts are not known yet, leave the card out until the file has been inspected properly enough to count them -* In a code-card item like `type::name::extra`, the final `extra` field is for function arguments only -* For variables and other non-function symbols, leave the final field blank - Wrong: `- function::SAVE_FILE1::save wrapper for the first editor family` - Better: `- function::SAVE_FILE1::()` - Better: `- variable::Log_Format_2HD` -* Prefer these includes over hand-written decorative HTML so the styling stays consistent across the site - ## Writing Style Rules
🔤
@@ -102,26 +84,19 @@ We try to maintain consistent characters here are the main rules: * **Dashes** - For dashes, always use `-` and never `—` (em dash). * **Standards only** - Don't use characters that are not on standard keyboards. -## List Rules -
🔹
- -Lists can improve readability when used appropriately but should only be used when the context makes sense. -We mainly use unordered lists (Markdown: `*`); only use ordered lists (Markdown: `-`) if there is a specific reason to do so. - -If using a list, we have a preferred format for lists where each list item has a short bold part followed by a dash (-) and more information: -```markdown -First we always have a short sentence introducing the list: -* **Item title in bold** - More information about the item +### Spelling +We have automated spell checking with cspell but sometimes debug symbols and other technical terms may need to be excluded, if there is a big block of them you can you the following: +``` + +debug symbols that are not spelled correctly but we want to keep for accuracy + ``` -Always have a sentence before the list explaining the list, never just have a list after a heading. - -However, if the list is too long (e.g. more than 10 items), use a Markdown table instead. The site supports searching within Markdown tables, which is not useful for short lists but ideal for long ones. - -## Table Rules -* NEVER use excessive spacing in Markdown tables. -* Rows in Markdown tables should not start or end with `|` as Markdown handles this automatically. +## Table of Contents +* Do not generate your own table of contents as tyhis will be done at runtime based on the H1/H2/H3 etc elements. +* But DO make sure to use the full range of headings from H1->H5 +--- ## Markdown Rules Our pages tend to be broken up into different sections based on headings, headings are used for the table of contents and can be treated as distinct sections. @@ -133,12 +108,32 @@ Here are some of the markdown rules: * **Use HR when jumping back up the heading hierarchy** - If a section ends at a deeper heading level and the next heading jumps back up, add a Markdown HR (`---`) immediately before the higher-level heading. For example, if an H4 section is followed by a new H1, place `---` directly before the H1. * **No line between HR and Heading** - the next line after a HR (`---`) should be the heading itself * **No line between heading and first paragraph** - the next line after a heading should always be the first paragraph of the section -* **Never use numbered lists** - Just use `*` for all unordered lists. * **Short inline code** - If the code is short, wrap it with backticks (e.g. `eax, 0x00`). * **Don't mix bold and inline code** - Avoid `**\`literal\`**` styling. Use backticks for literals (commands, file names, extensions) and bold for emphasis, but not both at the same time. * **HR before H2/H3** - Have an HR before HR/H3 but only if its not the first sub heading under a heading +### List Rules +
🔹
+ +Rules for lists: +* Lists can improve readability when used appropriately but should only be used when the context makes sense, don't overuse lists. +* **Never use numbered lists** - Just use `*` for all unordered lists. +* **Always have a sentence before the list** explaining the list, never just have a list after a heading. + +If using a list, we have a preferred format for lists where each list item has a short bold part followed by a dash (-) and more information: +```markdown +First we always have a short sentence introducing the list: +* **Item title in bold** - More information about the item +``` + +However, if the list is too long (e.g. more than 10 items), use a Markdown table instead. The site supports searching within Markdown tables, which is not useful for short lists but ideal for long ones. + +### Table Rules +* NEVER use excessive spacing in Markdown tables. +* Rows in Markdown tables should not start or end with `|` as Markdown handles this automatically. + + ### Glossary Rules * **Add a glossary for acronym-heavy pages** - If a page uses many technical acronyms or specialist terms, add a short glossary near the top. * **Link first mention per section** - For glossary terms, link the first meaningful mention in each section to the glossary definition; avoid linking every occurrence. @@ -166,13 +161,12 @@ tags: - gameboy - leak title: Example Page Title -category: leak +category: gameboy # category can also be a list when a page belongs to multiple areas: # category: +# - gameboy # - leak -# - snes image: /public/images/example.jpg -twitterimage: https://www.retroreversing.com/public/images/example.jpg permalink: /example-page breadcrumbs: - name: Home @@ -197,7 +191,7 @@ Field | Purpose `tags` | Search/discovery tags for the page, and the values other pages match against in their `recommend` lists, only use valid tags from `valid-tags.json` `title` | Full page title shown in the page header and metadata (do not use colons! as it messes with the yaml frontmatter) `category` | Main site grouping such as the games console name or others such as `leak`, `introduction`, `gameengines`, `maths`, or another section-specific category. This can be a single value (`category: leak`) or a list (`category: [leak, snes]`) when a page belongs to multiple categories. -`image` | Main preview image used by the page and site cards, if there is not a unique one leave it blank and it will be generated based on the category and title, if in doubt leave blank +`image` | Optional main preview image used by the page and site cards, if there is not a unique one leave it blank and it will be generated based on the category and title, for new pages leave blank (don't include) `twitterimage` | Absolute URL version of the preview image for social sharing, leave blank and it will be generated, if in doubt leave blank `permalink` | Final public path for the page (do not end with a trailing `/`; that is legacy format we are moving away from) `breadcrumbs` | Breadcrumb trail shown at the top of the page @@ -275,11 +269,32 @@ Sandpack can be used to run react/typescript: ``` ### Binary Parser -See []../tools/n64RomViewer.html](../tools/n64RomViewer.html) +See [../tools/n64RomViewer.html](../tools/n64RomViewer.html) ``` file-parse.html include ``` +## Folder listings +When a section is listing folder contents, prefer the existing includes over raw HTML or plain bullet dumps: +* Use `connected-folder-tree.html` when showing folders with subfolders or a nested directory structure + `folder` should be the short display name and `path` should be the longer location, for example `folder="trunk"` and `path="agb_bootrom/trunk"` + +Example: +```markdown +## The FZERO Source code directory (/src/FZERO) +The FZERO folder si where the main source code live and it contains the following sub-directories: +{% capture fzero_root_body %} +The archive is split very neatly into the game itself and the DOS-side tools used to generate its content. +{% endcapture %} + +{% capture folder_items %} +- Game - Assembly source code for the game +- Tools - C source code for the tools used to make the game +{% endcapture %} + +{% include connected-folder-tree.html folder="FZERO" path="/src/FZERO" body=fzero_root_body version="/" content=folder_items %} +``` + --- # Tips for making the pages more visually engaging and readable
💡
@@ -390,6 +405,41 @@ sleep(1);
{% endraw %} +--- + +## Code Cards +When referencing a real source file: +* Use `source-code-card.html` and/or `source-code-card-grid.html` when you are actually showing the contents of a source file, such as its functions, variables, structs, or other internal symbols +* Its best to float the code card to the side of the text with the `rr-code-card-aside` class and use it in sections talking about that source file. +* Don't have the exact same code card in multiple sections of the same article +* Do not use code cards just to summarize what a file is for or what companion files sit beside it - use a table or normal prose for that instead +* The `functions`, `variables`, and `lines` fields on code cards must be exact numeric counts taken from the file contents, not descriptive text or estimates +* If the exact counts are not known yet, leave the card out until the file has been inspected properly enough to count them +* In a code-card item like `type::name::extra`, the final `extra` field is for function arguments only +* For variables and other non-function symbols, leave the final field blank + Wrong: `- function::SAVE_FILE1::save wrapper for the first editor family` + Function: `- void::SAVE_FILE1::()` + Variable: `- int::Log_Format_2HD` +* Prefer these includes over hand-written decorative HTML so the styling stays consistent across the site + +### Example floating Code card +```markdown +{% capture sfxdos_core_items %} +- void::press_slit::(FILE *rp, FILE *wp) +- int::fgetw::(FILE *fp) +- struct STACK::bomb[MAXBOMB] +- int::bomb_count +{% endcapture %} + +
+ {% include_cached source-code-card.html title="sfxdos.asm" items=sfxdos_core_items functions="4" variables="8" lines="400" class="rr-file-card-aside" %} +
+ The heart of the stack is `sfxdos.asm`. + Its header calls it a `Super Famicom Disk Operation System special version`, programmed by **Y. Nishida** on **29 October 1991**. +
+
+``` + --- # Technical implementation This section is for lower level programming details about how some of the features on the site work. @@ -419,8 +469,6 @@ To improve performance, this site uses a custom JavaScript-based lazy loading sy Any `` element with the class `lazy-load` and a `data-image-full` attribute will be lazy loaded. The `src` attribute is set dynamically by JavaScript when the image is about to come into view. -### How to use -
📝
You can use it like so: ```html Description @@ -428,13 +476,6 @@ You can use it like so: You may set a low-res or placeholder `src` if desired, or leave it blank. When the image scrolls into view, the script will set `src` to the value of `data-image-full`. -### Where it is used -It is already used in the following places: -* Home page cards (`_includes/home-card.html`) -* Post and site link includes (`_includes/link-to-other-post.html`, `_includes/link-to-other-site.html`) -* Placeholder images (`_includes/placeholder-post-image.html`) -* Directly in markdown files (e.g., `categories/misc/Books.md`) - --- ## Lightbox Gallery The site uses a jQuery-based lightbox plugin (`public/js/lightbox.js`) to display images in a modal overlay with optional gallery navigation. diff --git a/categories/consoles/Arcade.md b/categories/consoles/Arcade.md index dfa058b8..9c99d5b6 100644 --- a/categories/consoles/Arcade.md +++ b/categories/consoles/Arcade.md @@ -231,7 +231,7 @@ MAME was again featured in EDGE magazine in **October 2002**, where it was descr The RAZZ is a 1988-era custom arcade board from Rare that used a unique Hitachi Z80-based "DMA hijacking" technique to enable high-speed sprite rendering and an extensive color palette, serving as the technical foundation for unreleased projects like the flight simulator 'Fokker' and the 'Playboy' handheld prototype. ### Fokker (Unreleased Arcade Game) -Rare Gamer provides a technical overview of Fokker, a cancelled 1988 arcade flight simulator that was intended to be Rare's first coin-op release. The link details the game's development on the proprietary "Razz" arcade board, which enabled 3D bi-plane dogfighting and bombing runs through early hardware-accelerated rendering techniques. Lead programmer Simon Hallam managed a five-month development cycle before the project was cancelled, leaving behind a functional prototype that serves as a significant milestone in Rare’s early technical history. +Rare Gamer provides a technical overview of Fokker, a cancelled 1988 arcade flight simulator that was intended to be Rare's first coin-op release. The link details the game's development on the proprietary "Razz" arcade board, which enabled 3D bi-plane dogfighting and bombing runs through early hardware-accelerated rendering techniques. Lead programmer Simon Hallam managed a five-month development cycle before the project was cancelled, leaving behind a functional prototype that serves as a significant milestone in Rare's early technical history. {% include link-to-other-site.html url="https://www.raregamer.co.uk/games/fokker/" description="Rare Gamer explores the history and technical implementation of Fokker, a cancelled 1988 arcade flight simulator that utilized Rare's custom Razz board." image="https://www.raregamer.co.uk/wp-content/uploads/2012/03/fokker_01.png" title="Fokker - Rare Gamer" %} diff --git a/categories/consoles/GameBoy.md b/categories/consoles/GameBoy.md index b00fffb8..67915f71 100644 --- a/categories/consoles/GameBoy.md +++ b/categories/consoles/GameBoy.md @@ -28,6 +28,7 @@ redirect_from: tags: - gameboy --- + # Introduction Welcome to our page dedicated to Game Boy reverse engineering! The Game Boy was a groundbreaking handheld gaming console that was released in 1989, and has since become an iconic symbol of the early days of portable gaming. If you're interested in learning more about the technical aspects of this console and how it works, you've come to the right place. @@ -37,8 +38,8 @@ So grab your Game Boy and get ready to dive into the exciting world of Game Boy ## Original GameBoy Dot Matrix Game (DMG) Specs Main specs of the original GameBoy: - - **CPU**: z80 - LR35902 (Opcodes: http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html) - - **RAM**: 8KB (32KB in Color) + * **CPU**: z80 - LR35902 (Opcodes: http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html) + * **RAM**: 8KB (32KB in Color) ## Game Boy Exclusive Games (DMG & Color) When it comes to finding a game to reverse engineer, it can be helpful to look at games that are cross-platform to compare builds. But the most valuable reverse engineering projects tend to be the platform exclusives, as these are the games people can no longer play on modern consoles. @@ -78,7 +79,7 @@ The Pokemon Reverse Engineering Team (PRET) have managed to pull off a marvellou ## Legend of Zelda Links Awakening In August 2016 the website KZone started a full disassembly of the classic Game Boy game Link's Awakening, along the way they have written some excellent in-depth articles about how the game works. Check it out! -{% include link-to-other-site.html url="https://kemenaran.winosx.com/posts/category-disassembling-links-awakening/" description="Find out how Zelda Link's Awakening for Game Boy works at KZone!" image="https://kemenaran.winosx.com/images/zelda-links-awakening-sfx/LADX-move.gif" title="Disassembling Link’s Awakening" %} +{% include link-to-other-site.html url="https://kemenaran.winosx.com/posts/category-disassembling-links-awakening/" description="Find out how Zelda Link's Awakening for Game Boy works at KZone!" image="https://kemenaran.winosx.com/images/zelda-links-awakening-sfx/LADX-move.gif" title="Disassembling Link's Awakening" %} ## Looney Tunes: Carrot Crazy {% include link-to-other-site.html url="https://www.huderlem.com/blog/posts/carrot-crazy-1/" description="Find out how to reverse engineer Looney Tunes: Carrot Crazy for the GBC" image="https://www.huderlem.com/blog/posts/carrot-crazy-1/password-entry-screen.png" title="Reverse Engineering Carrot Crazy" %} @@ -142,8 +143,8 @@ To go along with the Game Boy Camera Nintendo also releases a Game Boy Printer t Similar to the Super GameBoy but this is for the Nintendo 64 and not licenced by Nintendo, I first saw this for sale in issue X of the UK Nintendo Official Magazine. For more information: -- http://www.chrismcovell.com/gbbooster.html -- https://gamehacking.org/wiki/Game_Booster_(Nintendo_64) +* [Chris Mcovell's page](http://www.chrismcovell.com/gbbooster.html) +* [GameHacking.org Wiki Page](https://gamehacking.org/wiki/Game_Booster_(Nintendo_64)) --- ## Datel Game Booster for Sony Playstation @@ -180,8 +181,8 @@ The Game Boy classic **R-Type** was programmed by **Jas Austin** completely from The company **B.I.T.S** obtained the license to develop the Game Boy version of the game but required a programmer to work on the title. **Jas Austin** heard about this through his agency and travelled to London to meet up, he impressed them so much that he was given a development kit and a deadline of a week to come up with a demo! He did such a good job he got a permanent job at **B.I.T.S** [^1]. -One cool easter egg he added to the game was an implementation of John Conway’s game of Life! -

I hid a version of John Conway’s game of Life in R-Type on the Game Boy.

— Jas Austin (@IamXERO)
April 5, 2021
+One cool easter egg he added to the game was an implementation of John Conway's game of Life! +

I hid a version of John Conway's game of Life in R-Type on the Game Boy.

— Jas Austin (@IamXERO) April 5, 2021

Source graphics for Game Boy R-Type Lv3 ship. By Mark Jones... #ScreenshotSaturday24YearsAgo pic.twitter.com/RsKlc0rQOE

— Jas Austin (@IamXERO) April 25, 2015
@@ -216,7 +217,7 @@ This is a very interesting project that played a large set of gameboy games in a {% include_cached link-to-other-post.html post="/game-boy-file-formats" description="For more about the game boy file formats information check out this post." %} ### DMG-palette-patcher -[MrBlinky](https://github.com/MrBlinky/DMG-palette-patcher) has released a Python tool for patching Original Game Boy (DMG) ROMs to use specific color palettes when played on a Game Boy Color. The script works by modifying the ROM's header—specifically the license code and title checksum—to trick the Game Boy Color's boot ROM into automatically selecting one of 45 built-in color palettes, such as the classic grey theme, rather than the default blue-greenish hues. +[MrBlinky](https://github.com/MrBlinky/DMG-palette-patcher) has released a Python tool for patching Original Game Boy (DMG) ROMs to use specific color palettes when played on a Game Boy Color. The script works by modifying the ROM's header-specifically the license code and title checksum-to trick the Game Boy Color's boot ROM into automatically selecting one of 45 built-in color palettes, such as the classic grey theme, rather than the default blue-greenish hues. {% include link-to-other-site.html url="https://github.com/MrBlinky/DMG-palette-patcher" description="MrBlinky has released DMG-palette-patcher, a tool that modifies Game Boy ROM headers to trigger specific built-in color palettes on the Game Boy Color." title="DMG-palette-patcher by MrBlinky" %} diff --git a/categories/consoles/PC-88.md b/categories/consoles/PC-88.md index ea0e48c7..cd2ced9e 100644 --- a/categories/consoles/PC-88.md +++ b/categories/consoles/PC-88.md @@ -25,7 +25,6 @@ tags: > Not updated yet! Probably very wrong # Development of the PC-88 - ![NEC PC-8801 hardware](https://upload.wikimedia.org/wikipedia/commons/3/34/NEC_PC-8801MA2.jpg) ## What programming languages were used to create PC-88 software? @@ -34,7 +33,6 @@ tags: Commercial PC-88 titles were predominantly written in Z80 assembly for performance, particularly games relying on fast scrolling, sprite multiplexing, or timing-sensitive sound routines. BASIC (N88-BASIC), included with the system, served as an entry point for hobby development and some productivity software. Later PC-88MA models supported MS-DOS and high-level languages such as C, but commercial game development continued to rely mainly on assembly for deterministic control over the video and FM sound hardware. --- - ## What tools were used to create the art for PC-88 games? > Enix artist testing notes from 1987 reference "pixel boards" and "RGB preview rooms" where artists would repeatedly verify that PC-8801 palette constraints matched intended designs. @@ -46,14 +44,12 @@ Pixel art was often created on external workstations or specialized drawing tool Due to 8-color display limitations on early models, artists relied heavily on dithering, careful adjacency of palette indices, and structured shading patterns. Later VA models with 640x200 65-color modes broadened stylistic possibilities. --- - ## How long did it take to create typical PC-88 games? > In a 1992 retrospective, Hideo Kodama of Micro Cabin stated that the first Xak title was produced by "a team of five over roughly eight months", with the majority of engineering time spent on scrolling and text rendering systems. Small teams were common. Development cycles ranged from 3 to 12 months depending on genre and asset complexity. Studios developing adventure and visual novels often worked faster due to static screens, while RPGs or action games required extended tooling and engine creation. --- - ## Why was the PC-88 significant in Japanese game development? > According to a 2010 interview with Nihon Falcom founder Masayuki Kato, "the PC-88 was the proving ground for an entire generation of Japanese creators. Its limitations forced invention". @@ -67,7 +63,6 @@ The PC-88 became a pivotal platform for early Japanese PC game development due t Major franchises such as Ys, Dragon Slayer, Sorcerian, Policenauts, and early visual novels established templates that influenced later PC and console ecosystems. --- - # PC-88 Hardware Details ## Video hardware and graphics pipeline @@ -76,7 +71,6 @@ Major franchises such as Ys, Dragon Slayer, Sorcerian, Policenauts, and early vi The earliest PC-8801 models used a planar graphics system with 640x200 resolution and an 8-color fixed palette derived from RGB combinations. There was no hardware sprite engine; all animation was achieved through software blitting, often optimized with handwritten Z80 routines. Later VA models expanded to a 65-color palette and supported hardware scrolling. --- - ## Audio hardware > Composer Yuzo Koshiro recalled that programming the YM2203 for Ys required "writing long sequences of register values by hand" before later upgrading to macro-based sound drivers. @@ -88,7 +82,6 @@ Audio configuration varied by model: FM-supported models became essential for studios producing music-heavy RPGs and action titles. --- - ## Storage and media The system supported: * 5.25-inch floppy disks (common distribution medium) @@ -96,7 +89,6 @@ The system supported: * Hard disk options on later MA systems running MS-DOS --- - # Game Development at Falcom ## Internal workflow and tools @@ -111,7 +103,6 @@ Falcom pioneered efficient reuse of subsystems across titles. Their structure ar They maintained custom assemblers, map editors, FM music drivers, and debugging tools for rapid iteration. --- - # PC-88 Source Code ## Ys I (1987 by Nihon Falcom) @@ -124,7 +115,6 @@ Partial source materials, including disassemblies and fan analyses of sound driv Early assets and test scripts from the uncompleted PC-88 version circulate among preservation groups, offering insight into adventure-engine architecture designed for NEC platforms. --- - # References [^1]: Interview with Masayuki Kato, Falcom Journal (1985) [^2]: Enix Artist Notes, internal documentation (1987) diff --git a/categories/consoles/PC-engine.md b/categories/consoles/PC-engine.md index a471c79c..3a53aed7 100644 --- a/categories/consoles/PC-engine.md +++ b/categories/consoles/PC-engine.md @@ -18,9 +18,9 @@ recommend: - introduction _updatedAt: '2025-02-15' --- -# Introduction to the PC-Engine -Sakharu Baguette has created an excellent documentary which explores the history of the PC Engine (known as the TurboGrafx-16 in North America), detailing its rise as a major rival to Nintendo in Japan and its struggle to find footing in the US [^1]. +# Introduction to the PC-Engine +**Sakharu Baguette** has created an excellent documentary which explores the history of the PC Engine (known as the TurboGrafx-16 in North America), detailing its rise as a major rival to Nintendo in Japan and its struggle to find footing in the US [^1]. diff --git a/categories/consoles/PS2.md b/categories/consoles/PS2.md index eadfc41b..097c7dd6 100644 --- a/categories/consoles/PS2.md +++ b/categories/consoles/PS2.md @@ -46,18 +46,18 @@ For an in-depth look at the PlayStation 2 Retail hardware architecture check out ### What were the specs of the PS2? Display Specs: - - Supports 480p progressive - - MPEG-2 Full Motion Video (FMV) + * Supports 480p progressive + * MPEG-2 Full Motion Video (FMV) Sound Specs: -- Dolby pro logic 2 (5.1 Surround sound) -- DTS -- Streaming Audio +* Dolby pro logic 2 (5.1 Surround sound) +* DTS +* Streaming Audio Max Game Specs Per frame: - - 120,000 and 6,000 tris - - 3Mb of Textures - - Frame rate of 30 or 60fps + * 120,000 and 6,000 tris + * 3Mb of Textures + * Frame rate of 30 or 60fps ### Emotion Engine diff --git a/categories/consoles/PS4.md b/categories/consoles/PS4.md index fd5c78f2..913e689d 100644 --- a/categories/consoles/PS4.md +++ b/categories/consoles/PS4.md @@ -20,6 +20,7 @@ breadcrumbs: tags: - ps4 --- + # Introduction Welcome to our page dedicated to PS4 reverse engineering! The PlayStation 4 was a gaming console released by Sony in 2013, and has since become a beloved classic of the gaming world. If you're interested in learning more about the technical aspects of this console and how it works, you've come to the right place. diff --git a/categories/consoles/PSP.md b/categories/consoles/PSP.md index 4073964b..c95f153a 100644 --- a/categories/consoles/PSP.md +++ b/categories/consoles/PSP.md @@ -19,6 +19,7 @@ breadcrumbs: tags: - psp --- + # Introduction Welcome to our page dedicated to PSP reverse engineering! The PlayStation Portable, or PSP, was a popular handheld gaming console released by Sony in 2004. If you're interested in learning more about the technical aspects of this console and how it works, you've come to the right place. @@ -75,7 +76,7 @@ This section lists all the file formats that are useful to know about for revers On official PSP discs, there are actually two executables included in the **SYSDIR** folder: **BOOT.BIN** and **EBOOT.BIN** the former is uncompressed/unencrypted and suitable for reverse engineering and the latter is the encrypted version that is loaded by the PSP retail firmware. * **BOOT.BIN** - uncompressed, unencrypted executable, typically used during development and debugging. -* **EBOOT.BIN** - encrypted, compressed version of the same executable. Sony’s encryption prevents casual tampering and reverse engineering. +* **EBOOT.BIN** - encrypted, compressed version of the same executable. Sony's encryption prevents casual tampering and reverse engineering. Sometimes the **BOOT.BIN** file is filled with zero bytes, this was more common with later PSP games, in which case you will need to decrypt **EBOOT.BIN** manually instead. @@ -88,7 +89,7 @@ Homebrew/custom firmware can be configured to load either, which is why **BOOT.B --- ## PSP Game File Formats Officially the PSP either used physical Universal Media Discs (UMD) or PBP files to distrubte games, but there are a variety of formats available for storing PSP games: -* **ISO** - The most common format for PSP game files, an ISO is a disc image containing all the game disc’s data, essentially a copy of the Universal Media Disc (UMD) used by the PSP console. +* **ISO** - The most common format for PSP game files, an ISO is a disc image containing all the game disc's data, essentially a copy of the Universal Media Disc (UMD) used by the PSP console. * **CSO** - A compressed version of an ISO file that reduces file size for storage and sharing but might result in slightly longer load times during gameplay. * **PBP** - Used for official PSP game files downloaded from the PlayStation Network, this format contains multiple compressed files such as the game executable, data, and media. * **CHD** - Another compressed and compact format supported by many PSP emulators. @@ -127,7 +128,7 @@ Tools like **UMDGen**, commonly used for creating and editing PSP UMD ISO files, --- ### PARAM.SFO -**PARAM.SFO** is a small but critical metadata file used by the PSP (and also PS3/PS4/PS5 with different schema). It’s stored in the root of the **PSP_GAME** folder and sometimes inside the **SYSDIR**/**UPDATE** folders too. +**PARAM.SFO** is a small but critical metadata file used by the PSP (and also PS3/PS4/PS5 with different schema). It's stored in the root of the **PSP_GAME** folder and sometimes inside the **SYSDIR**/**UPDATE** folders too. The purpose of the file is to **describes the game** (or update package) to the PSP system, so that the XMB had the data for displaying the game icon, title, version, and other details. It also tells the firmware what minimum system software version is required to run. @@ -141,7 +142,7 @@ Typical Fields (for a PSP game): * **REGION** - Sometimes embedded to limit compatibility. The PSP will **refuse to boot the game** if PARAM.SFO is missing or corrupted, so make sure that when modding or trimming ISOs, PARAM.SFO must stay intact in the root! -The update folder’s PARAM.SFO is only used if you try to run the included firmware updater. +The update folder's PARAM.SFO is only used if you try to run the included firmware updater. It can be edited (with tools like **PSP SFO Editor**) to spoof firmware requirements, useful for running older ISOs on newer/different firmware. @@ -171,7 +172,6 @@ An excellent way to start reverse engineering is to find games where the develop --- # Reverse Engineering PSP Games with Ghidra - First step is to find your **BOOT.BIN** file, normally in the **PSP_GAME/SYSDIR** folder of the extracted game ISO. If you only have an EBOOT.BIN file you will need to convert it to a BOOT.BIN with a tool such as **PRXDecrypter**. Since **BOOT.BIN** files are standard ELF executables compiled for the **MIPS R4000** (little-endian) instruction set you can import directly into Ghidra without any plugins! diff --git a/categories/consoles/PokemonMini.md b/categories/consoles/PokemonMini.md index af661c40..a7217373 100644 --- a/categories/consoles/PokemonMini.md +++ b/categories/consoles/PokemonMini.md @@ -131,6 +131,7 @@ The developer `Scylus` has created a brand new browser-based (javascript) Pokemo {% include link-to-other-site.html url="https://github.com/pokemon-mini/mindis2" description="Pokémon Mini ROM disassembler with support for the official S1C88 assembly language" title="mindis2 - Pokémon Mini ROM disassembler" image="http://www.retroreversing.com/public/consoles/PokemonMini.png" %} --- + # ROM Hacking Pokémon Mini games ## Tile and Sprite editing diff --git a/categories/consoles/Saturn.md b/categories/consoles/Saturn.md index dba2ef35..a8e604d9 100644 --- a/categories/consoles/Saturn.md +++ b/categories/consoles/Saturn.md @@ -41,13 +41,11 @@ When it comes to finding a game to reverse engineer it can be helpful to look at {% include_cached link-to-other-post.html post="/sega-saturn-exclusives" description="For a list of all the exclusive Sega Saturn games check out this post." %} ## Reverse Engineering the Password System in *The Lost World: Jurassic Park* - -In May 2025, reverse engineer Bo Bayles published an in-depth analysis of the password system used in the Sega Saturn version of *The Lost World: Jurassic Park*. By examining the game's code with Ghidra, Bayles uncovered previously undocumented cheat codes that unlock features such as invincibility, a stage select screen, and two hidden arcade galleries. These discoveries shed light on the game's internal mechanics and offer new ways to experience the title nearly three decades after its release. +In May 2025, reverse engineer **Bo Bayles** published an in-depth analysis of the password system used in the Sega Saturn version of *The Lost World: Jurassic Park*. By examining the game's code with Ghidra, Bayles uncovered previously undocumented cheat codes that unlock features such as invincibility, a stage select screen, and two hidden arcade galleries. These discoveries shed light on the game's internal mechanics and offer new ways to experience the title nearly three decades after its release. For a detailed breakdown of the password system and the newly discovered codes, refer to Bayles' full article: -> [Under the Microscope: The Lost World – Jurassic Park](https://32bits.substack.com/p/under-the-microscope-the-lost-world) - +{% include_cached link-to-other-site.html url="https://32bits.substack.com/p/under-the-microscope-the-lost-world" description="Bo Bayles provides a comprehensive look at cracking the password encryption in The Lost World: Jurassic Park, revealing secret debug menus and arcade asset galleries hidden for nearly 30 years." title="Under the Microscope: The Lost World – Jurassic Park" %} ## Sega Saturn Graphics There are some myths around the Sega Saturn's graphical abilities, such as the lack of transparency support, that can be proven false with some clever programming techniques. diff --git a/categories/consoles/SuperNintendo.md b/categories/consoles/SuperNintendo.md index 2e23b737..040453a6 100644 --- a/categories/consoles/SuperNintendo.md +++ b/categories/consoles/SuperNintendo.md @@ -21,6 +21,7 @@ tags: - snes updatedAt: '2025-12-07' --- + # Introduction Welcome to our page dedicated to Super Nintendo reverse engineering! The Super Nintendo Entertainment System, or SNES, was a popular gaming console released by Nintendo in 1990. If you're interested in learning more about the technical aspects of this console and how it works, you've come to the right place. @@ -38,9 +39,9 @@ Most game development teams only had a handful of people working full time on th Some examples of the length of time it took to develop Super Nintendo games are: * **Spider Man & X-Men in Arcade's revenge** - Took roughly 6-7 months from start to final build using a team of 4 highly experienced game programmers, 2 talented musicians and 6 brilliant artists[^1]: - - Programmers: Mike Follin, Kevin Edwards, Stephen Ruddy and Michael Webb - - Artwork: Anthony Anderson, Craig Houston, David McLachlan, James Clarke, Jonathan M. Smith and Ste Pickford - - Music: Geoff Follin and Tim Follin + * Programmers: Mike Follin, Kevin Edwards, Stephen Ruddy and Michael Webb + * Artwork: Anthony Anderson, Craig Houston, David McLachlan, James Clarke, Jonathan M. Smith and Ste Pickford + * Music: Geoff Follin and Tim Follin * **Super Mario World 2: Yoshi's Island** - Took exactly 3 years and 5 months to complete (February 1st, 1992 until June 29th 1995 [^2]) with a team of 12 programmers. * **RPM Racing (Interplay)** - In an interview with SuperPro (October 1992) **Brian Fargo** explains that they only had **4-5 months** to implement the game after finding out the specs of the Super Nintendo. But he goes on to say that games after that took **1-3 years** on average to get a better level of polish. It was developed with the **Sluggo III** SNES development kit [^4]. @@ -111,7 +112,6 @@ However looking closely at the keyboard and the PC we can see its a **Sony NEWS* --- ## ROM and RAM Mapping on the SNES - The Super Nintendo (SNES) features a **24-bit address space** split into 256 banks of **64KB** each. However, only select banks are addressable via the SNES's CPU at any given time, necessitating careful mapping of ROM, RAM, and I/O registers. @@ -136,26 +136,25 @@ The [Tale of LoROM and MMIO Emudev article](https://emudev.de/q00-snes/memory-ma The ROM header is used to convey metadata about the cartridge, including its memory mapping configuration, it is essential for proper ROM emulation but ignored on the SNES hardware itself. It is typically just before the interrupt vector table but its physical location within the ROM file varies based on the memory mapping mode: -- **LoROM**: Header at offset 0x7FC0 in the ROM file. -- **HiROM**: Header at offset 0xFFC0 in the ROM file. -- **ExHiROM**: Header at offset 0x40FFC0 in the ROM file. +* **LoROM**: Header at offset 0x7FC0 in the ROM file. +* **HiROM**: Header at offset 0xFFC0 in the ROM file. +* **ExHiROM**: Header at offset 0x40FFC0 in the ROM file. These mappings align the header to $00:FFC0 in the SNES memory map, ensuring consistent access across different ROM configurations[^11]. #### What is the format of the ROM Header? - The ROM header comprises several fields that define the cartridge's characteristics: -- **0xFFC0–0xFFD4**: Game Title (21 bytes, ASCII) -- **0xFFD5**: ROM Speed and Mapping Mode (e.g speeds: 2.68 MHz/3.58 MHz, modes: LoROM/HiROM) -- **0xFFD6**: Cartridge Type (e.g., presence of coprocessors, SRAM) -- **0xFFD7**: ROM Size (encoded as 2^n KB) -- **0xFFD8**: SRAM Size (encoded as 2^n KB) -- **0xFFD9**: Region Code (e.g., NTSC, PAL) -- **0xFFDA**: Developer ID -- **0xFFDB**: ROM Version -- **0xFFDC–0xFFDD**: Checksum Complement -- **0xFFDE–0xFFDF**: Checksum +* **0xFFC0–0xFFD4**: Game Title (21 bytes, ASCII) +* **0xFFD5**: ROM Speed and Mapping Mode (e.g speeds: 2.68 MHz/3.58 MHz, modes: LoROM/HiROM) +* **0xFFD6**: Cartridge Type (e.g., presence of coprocessors, SRAM) +* **0xFFD7**: ROM Size (encoded as 2^n KB) +* **0xFFD8**: SRAM Size (encoded as 2^n KB) +* **0xFFD9**: Region Code (e.g., NTSC, PAL) +* **0xFFDA**: Developer ID +* **0xFFDB**: ROM Version +* **0xFFDC–0xFFDD**: Checksum Complement +* **0xFFDE–0xFFDF**: Checksum @@ -186,7 +184,7 @@ For an in-depth look at the SNES Retail hardware architecture check out the exce ### Was the SNES backwards compatible with the NES? No, but it was intended to be during early development of the SNES which we found out thanks to an interview with **Masayuki Uemura** [^8]: -> In truth, we actually wanted the Super Famicom to be able to play Famicom games too. We used a CPU that’s equipped with a 6502 emulation mode and everything. However, the sheer amount of games released for the Famicom, plus the fact that they often used different types of ROMs and chips made it too difficult to produce a perfect conversion. +> In truth, we actually wanted the Super Famicom to be able to play Famicom games too. We used a CPU that's equipped with a 6502 emulation mode and everything. However, the sheer amount of games released for the Famicom, plus the fact that they often used different types of ROMs and chips made it too difficult to produce a perfect conversion. --- ## SNES in-flight Airplane hardware (Nintendo Gateway) @@ -207,8 +205,8 @@ Also if you prefer video-based content the youtuber **Top Hat Gaming Man** has c In 2020 Luigiblood did a presentation to the **AirGap2020** conference about **Satellaview Reverse Engineering** which can be watched below: -### BS-X Cartridges +### BS-X Cartridges The **Satellaview** has little Memory Packs with only 1MB (8 MegaBit) of flash storage space that would slot into the BS-X Satellaview cartridges, it was a cartridge that had a smaller cartridge slot on top. Note that there was one other game that supported these Memory Packs, it was a game creator called **RPG Maker**. The BS-X cartridge has that name because it was the entry point into the Broadcast Satellaview (BS) network, and the "X" signified the virtual town interface that users navigated. diff --git a/categories/consoles/Wii.md b/categories/consoles/Wii.md index fafbe6a1..46e1efd7 100644 --- a/categories/consoles/Wii.md +++ b/categories/consoles/Wii.md @@ -20,6 +20,7 @@ breadcrumbs: tags: - wii --- + # Introduction to Hacking the Nintendo Wii Welcome to our page dedicated to Wii reverse engineering! The Wii was a popular gaming console released by Nintendo in 2006, and it introduced several groundbreaking features to the gaming world, such as motion-based controls and online gameplay. If you're interested in learning more about the technical aspects of this console and how it works, you've come to the right place. diff --git a/categories/consoles/Windows.md b/categories/consoles/Windows.md index cc4c7214..c309fd9d 100644 --- a/categories/consoles/Windows.md +++ b/categories/consoles/Windows.md @@ -68,7 +68,7 @@ Windows has played a significant role in the world of PC gaming, offering a vast In the past, many classic video games were developed for and played on DOS-based PCs. With the introduction of the Windows operating system, gaming transitioned to a more user-friendly and graphical environment, but many DOS games continued to run using compatibility features provided by Windows. The Windows platform offers backward compatibility for DOS games, allowing enthusiasts to relive the nostalgia of classic titles from the DOS era. This compatibility, along with the vast library of modern Windows-based games, showcases the ongoing role of Windows as a versatile and enduring platform for gamers. - + ## Windows Executable File Formats (NE,LE and PE) We have separated out the information on Windows executable (exe) file formats into its own post: {% include_cached link-to-other-post.html post="/WindowsExecutables" description="For more information on Windows Executables check out this post." %} diff --git a/categories/consoles/Wonderswan.md b/categories/consoles/Wonderswan.md index 341148b5..990949e1 100644 --- a/categories/consoles/Wonderswan.md +++ b/categories/consoles/Wonderswan.md @@ -45,49 +45,49 @@ Their were 109 games released for the original Black and White Wonderswan and 91 ### Terrors series Unless you can read Japanese you will not get much out of the three Terrors games on the wonderswan, however **Tara A. Devlin** has uloaded and english read through of the complete games on youtube. They are excellent and well worth a watch: -- Terrors 01: [Ghost Inn](https://www.youtube.com/watch?v=vYsG_LdaIow) -- Terrors 02: [Dear Friend](https://www.youtube.com/watch?v=7YwvOPcN2Jw) -- Terrors 03: [The Tiny Haunted House](https://www.youtube.com/watch?v=XusAmjdHp_8) +* Terrors 01: [Ghost Inn](https://www.youtube.com/watch?v=vYsG_LdaIow) +* Terrors 02: [Dear Friend](https://www.youtube.com/watch?v=7YwvOPcN2Jw) +* Terrors 03: [The Tiny Haunted House](https://www.youtube.com/watch?v=XusAmjdHp_8) ### Ring Infinity ## B&W Games enjoyable without reading Japanese This is a list of the games you can enjoy without being able to read any Japanese: -- Buffers Evolution - Platformer Racing game -- Crazy Climber -- D's Garage 21 Koubo Game Tane o Maku Tori - Puzzle game -- Densha de Go! (Although it is hard to play without some basic japanese) - Train simulator -- Engacho!- Puzzle game -- Final Lap 2000 - Made-7 style Racing -- Fishing Freaks - Bass Rise - Fishing game -- Ganso Jajamaru-kun -- Glocal Hexcite -- GunPey - Puzzle game -- Kaze no Klonoa - Moonlight Museum -- Lode Runner -- Magical Drop -- Makai Mura -- Mingle Magnet -- Moero!! Pro Yakyuu Rookies -- Nice On - Golf Game -- Ou-chan no Oeka-ki Logic - Puzzle Game -- Pocket Fighter - Beat em up -- Puyo Puyo Tsuu - Puzzle game -- Puzzle Bobble - Puzzle game -- Rainbow Islands - Putty's Party -- Rockman & Fotre - Mirai Kara no Chousensha -- Sennou Millennium -- Shin Nihon Pro Wrestling -- Side Pocket - Pool game -- Sliter Link - Puzzle game -- Soccer Yarou! - Challenge the World - Football game -- Space Invaders -- Tare Panda no GunPey - Puzzle game -- Tekken Card Challenge -- Trump Collector - Bottom-Up - Card game -- Trump Collector 2 - Card game -- Turntablist - Rhythm game -- Umizuri ni ikou - Fishing game -- Wasabi Produce - Street Dancer - Rhythm game -- Wonder Stadium +* Buffers Evolution - Platformer Racing game +* Crazy Climber +* D's Garage 21 Koubo Game Tane o Maku Tori - Puzzle game +* Densha de Go! (Although it is hard to play without some basic japanese) - Train simulator +* Engacho!- Puzzle game +* Final Lap 2000 - Made-7 style Racing +* Fishing Freaks - Bass Rise - Fishing game +* Ganso Jajamaru-kun +* Glocal Hexcite +* GunPey - Puzzle game +* Kaze no Klonoa - Moonlight Museum +* Lode Runner +* Magical Drop +* Makai Mura +* Mingle Magnet +* Moero!! Pro Yakyuu Rookies +* Nice On - Golf Game +* Ou-chan no Oeka-ki Logic - Puzzle Game +* Pocket Fighter - Beat em up +* Puyo Puyo Tsuu - Puzzle game +* Puzzle Bobble - Puzzle game +* Rainbow Islands - Putty's Party +* Rockman & Fotre - Mirai Kara no Chousensha +* Sennou Millennium +* Shin Nihon Pro Wrestling +* Side Pocket - Pool game +* Sliter Link - Puzzle game +* Soccer Yarou! - Challenge the World - Football game +* Space Invaders +* Tare Panda no GunPey - Puzzle game +* Tekken Card Challenge +* Trump Collector - Bottom-Up - Card game +* Trump Collector 2 - Card game +* Turntablist - Rhythm game +* Umizuri ni ikou - Fishing game +* Wasabi Produce - Street Dancer - Rhythm game +* Wonder Stadium diff --git a/categories/consoles/Xbox.md b/categories/consoles/Xbox.md index dcb13a8f..07296820 100644 --- a/categories/consoles/Xbox.md +++ b/categories/consoles/Xbox.md @@ -32,7 +32,6 @@ So grab your Xbox controller, and get ready to dive into the exciting world of X # Games ## Exclusives - Wikipedia has a list of the games that are still exclusive to the original Microsoft Xbox - [Xbox-only games - Wikipedia](https://en.wikipedia.org/wiki/Category:Xbox-only_games) --- diff --git a/categories/consoles/ZXSpectrum.md b/categories/consoles/ZXSpectrum.md index 6488f44f..2b4e7f89 100644 --- a/categories/consoles/ZXSpectrum.md +++ b/categories/consoles/ZXSpectrum.md @@ -20,6 +20,7 @@ _updatedAt: '2025-05-17' tags: - zxspectrum --- + The Sinclair ZX Spectrum, launched in 1982, was a pivotal 8-bit home computer that democratized computing and game development in the UK. Its affordability and accessibility spurred a generation of bedroom coders and laid the groundwork for the British games industry. @@ -38,7 +39,6 @@ However, due to memory constraints, color information was stored separately in a --- ## Development Hardware - Professional developers often used cross-development setups. Code was written and assembled on systems like the Tandy TRS-80 Model III or IBM PCs running CP/M, then transferred to the Spectrum via custom hardware interfaces for testing. @@ -47,7 +47,6 @@ This approach allowed for faster development cycles compared to coding directly --- ## CPU - The Zilog Z80A is an 8-bit microprocessor with a comprehensive instruction set, including 158 instructions and several addressing modes. It features a set of general-purpose registers, alternate register sets, and specialized registers like the index registers IX and IY, which are particularly useful for advanced memory access patterns. @@ -56,7 +55,6 @@ It features a set of general-purpose registers, alternate register sets, and spe --- ## Sound Hardware - Early Spectrum models produced sound through a simple beeper, controlled by toggling bit 4 of port 0xFE. This method required precise timing and often monopolized the CPU during sound playback. @@ -67,14 +65,12 @@ Later models, like the Spectrum 128K, incorporated the AY-3-8912 sound chip, off # Reverse Engineering ## File Formats - ZX Spectrum software was commonly distributed on cassette tapes, with data stored in formats like **.TAP**, **.TZX**, and **.Z80**. These formats encapsulate the program code and are used by emulators and reverse engineering tools to analyze and run Spectrum software. --- ## Disassembling and Decompiling - Tools such as **SkoolKit** and **Spectrum Analyser** are instrumental in reverse engineering Spectrum games. **SkoolKit** allows for the disassembly of machine code into annotated, human-readable formats, facilitating the understanding of game logic and structure. @@ -94,14 +90,12 @@ He dives into the technical challenges of emulating the Z80 CPU instructions, me # Official Software Development ## How Long Did It Take to Develop a Game Back in the Day? - Development times varied widely, simple games could be developed in a few weeks by a single programmer, while more complex titles might take several months and involve small teams. The lack of sophisticated tools meant that much of the development involved low-level programming and manual testing. --- ## What Would You Need to Write ZX Spectrum Games? - Developers typically used cross-assemblers on more powerful computers to write and compile code, which was then transferred to the Spectrum for testing. Essential tools included a text editor, assembler, and hardware interface for loading code onto the Spectrum [^1]. @@ -120,17 +114,16 @@ The original Hex Loader, first published in **Your Spectrum** issue 8 (October 1 --- ## Was There an Official SDK? - In the modern sense of a comprehensive SDK (Software Development Kit) from the platform owner, no, Sinclair did not provide an official SDK for Spectrum game development in the early 1980s. Unlike a contemporary console (e.g., Nintendo or Sega) which might have licensed dev kits, the Spectrum was a open consumer product and developers were expected to use either the built-in BASIC or their own tools to create software. -The primary “official” documentation was the BASIC programming manual and later the Spectrum Technical Guide (which covered hardware specifics and ROM routines). Sinclair’s focus was on selling hardware; they relied on third-party software houses to produce games without much centralized support. +The primary "official" documentation was the BASIC programming manual and later the Spectrum Technical Guide (which covered hardware specifics and ROM routines). Sinclair's focus was on selling hardware; they relied on third-party software houses to produce games without much centralized support. ### Official Documentation ![ZXSpectrum+ User Guide](https://github.com/user-attachments/assets/5485d118-4e77-4c9d-a56f-1642265bf023) -That said, Sinclair did endorse or distribute certain development tools. Notably, Sinclair’s ZX Spectrum+ (and later models) were often bundled with documentation that included memory maps and assembly programming tips, acknowledging the shift toward machine code development. +That said, Sinclair did endorse or distribute certain development tools. Notably, Sinclair's ZX Spectrum+ (and later models) were often bundled with documentation that included memory maps and assembly programming tips, acknowledging the shift toward machine code development. ### Crystal toolkit ![Zeus Assembler](https://github.com/user-attachments/assets/eaa6a9e9-434f-4e99-b9f0-8d132114eea4) @@ -138,9 +131,9 @@ That said, Sinclair did endorse or distribute certain development tools. Notably There were also a few cassette-based products sold under the Sinclair brand that were essentially development utilities. For example, Sinclair licensed a range of programming tools from a company called Crystal Computing (later known as HiSoft). -These included an **assembler** (Zeus), **editor** and a **debugger** that were sometimes promoted in Sinclair literature. According to a post on stack exchange [^3], the Crystal toolkit could be loaded in parts (assembler and monitor separately) for a “comprehensive development system,” and these were sold in Sinclair-branded packages in addition to Crystal’s own retail versions. +These included an **assembler** (Zeus), **editor** and a **debugger** that were sometimes promoted in Sinclair literature. According to a post on stack exchange [^3], the Crystal toolkit could be loaded in parts (assembler and monitor separately) for a "comprehensive development system," and these were sold in Sinclair-branded packages in addition to Crystal's own retail versions. -So one could argue there was a quasi-official “Sinclair development kit” comprised of those specific assembler and monitor tapes. +So one could argue there was a quasi-official "Sinclair development kit" comprised of those specific assembler and monitor tapes. ### Was there any sound or graphics libraries? No, beyond assembling and debugging, there was no unified SDK that provided game engines or graphics/sound libraries from Sinclair. @@ -158,7 +151,6 @@ Each developer accumulated their own proprietary library of routines which for s --- ### How Large Were ZX Spectrum Game Development Teams? - Many early Spectrum games were developed by individuals or small teams, often working from home (so called Bedroom coders). As the industry matured, some companies formed larger teams, but even then, teams were modest in size compared to modern standards. This small-scale development fostered a culture of innovation and personal expression in game design. @@ -167,7 +159,6 @@ This small-scale development fostered a culture of innovation and personal expre # Games ## R-Type (1988) ZX Spectrum Port - The ZX Spectrum port of **R-Type** represents a pinnacle of technical ingenuity within the constraints of 8-bit hardware. Developed by Bob Pape, the game pushed the 48K Spectrum to its limits through cycle-accurate Z80 assembly and extensive memory optimization. @@ -180,7 +171,7 @@ Real-time debugging was achieved through on-screen memory and register introspec Audio was handled via the built-in beeper, using pulse-width modulation to simulate multiple sound channels, which was a significant technical feat on such limited hardware. -For a comprehensive breakdown of the development process and the technical strategies used, Bob Pape’s own retrospective memoir **It's Behind You** is available online: +For a comprehensive breakdown of the development process and the technical strategies used, Bob Pape's own retrospective memoir **It's Behind You** is available online: [https://www.bizzley.com](https://www.bizzley.com) ### Magical Drop 2 Port to ZX Spectrum: A Reverse Engineering Exercise diff --git a/categories/games/debugSymbols.md b/categories/games/DebugSymbolsInGames.md similarity index 99% rename from categories/games/debugSymbols.md rename to categories/games/DebugSymbolsInGames.md index e5ae86f2..3f3ce6d9 100644 --- a/categories/games/debugSymbols.md +++ b/categories/games/DebugSymbolsInGames.md @@ -13,7 +13,7 @@ redirect_from: - /games/symbols - /debugsymbols - /unstrippedbinaries -editlink: ../categories/games/debugSymbols.md +editlink: ../categories/games/DebugSymbolsInGames.md tags: - symbols - debug @@ -88,7 +88,6 @@ There has also been a number of Nintendo leaks, leaking the full source code for --- ## SEGA consoles - We have never been able to find any Sega Saturn games that actually have debug symbols left on the disc! Sega must have been a little more strict on game developers before the dreamcast, so if you do find any games with debug symbols then please let us know. ### Sega Dreamcast diff --git a/categories/games/GameEngines.md b/categories/games/GameEngines.md index 81f8725f..46d420bd 100644 --- a/categories/games/GameEngines.md +++ b/categories/games/GameEngines.md @@ -28,6 +28,7 @@ recommend: - sdk editlink: ../categories/games/GameEngines.md --- + # Introduction to Game Engines & Middleware Game Engines are the foundation in which games are built, they contain all the logic to be able to show graphics, play audio, compute input, etc. without having any of the game specific assets such as sprites or music files. @@ -38,8 +39,8 @@ So you can think of game engines as the combination of middleware. ## Who develops game engines? There are two types of game engines based on who developed them or rather who has access to them: - - In-house game engines - Only available to one game development studio. - - Retail game engine - Engines that are normally sold as a product and used by multiple game development studios. + * In-house game engines - Only available to one game development studio. + * Retail game engine - Engines that are normally sold as a product and used by multiple game development studios. ## How much did game engines cost? This really depends on the engine, it could have been anywhere between a licensing fee per game sold or a one time fee of thousands of dollars for console games. diff --git a/categories/games/Games.md b/categories/games/Games.md index 3f132517..180cc1e5 100644 --- a/categories/games/Games.md +++ b/categories/games/Games.md @@ -15,6 +15,7 @@ editlink: ../categories/games/Games.md tags: - games --- + This page collects all the posts that are related to reverse engineering a specific game rather than an entire console or platform. ## Decompiled Retail Console Games diff --git a/categories/misc/Bookazines.md b/categories/misc/Bookazines.md index de2a9807..f87c8754 100644 --- a/categories/misc/Bookazines.md +++ b/categories/misc/Bookazines.md @@ -18,6 +18,7 @@ tags: - books - industry --- + What do you call a product that collects articles from monthly magazines into a single yearly publication? The publishers came up with the term "Bookazine" to cover this concept of a very large magazine related to a specific topic. @@ -223,5 +224,5 @@ QUESTIONS AND ANSWERS 3 | Modelling dinosaurs and more! | QUESTIONS AND ANSWERS 4 | Includes a mech design masterclass | QUESTIONS AND ANSWERS 5 | Global illumination in C4D and more | QUESTIONS AND ANSWERS 6 | Includes how to create realistic materials | -PORTFOLIOS | The pro’s guide to building a better portfolio by Andrew Gordon | +PORTFOLIOS | The pro's guide to building a better portfolio by Andrew Gordon | PUT YOURSELF IN THE FRAME | Follow these tips to land your dream job by Ian Dean | diff --git a/categories/misc/Books.md b/categories/misc/Books.md index fcf5fd6c..30fce287 100644 --- a/categories/misc/Books.md +++ b/categories/misc/Books.md @@ -19,6 +19,7 @@ updatedAt: '2024-08-04' tags: - industry --- +