Gameboy emulator
Go to file
2024-07-09 01:45:24 -05:00
boy-debug boy-debug: Use correct bus type instead of placeholder vec 2024-07-09 01:40:26 -05:00
boy-utils boy: Initial public commit 2024-06-22 07:25:59 -05:00
notes Add audio.txt 2024-06-25 13:36:25 -05:00
src bweh: Add some cool constants 2024-07-09 01:45:24 -05:00
.gitignore notes: Add notes 2024-06-22 07:34:17 -05:00
Cargo.lock Update dependencies 2024-06-22 07:38:58 -05:00
Cargo.toml Update dependencies 2024-06-22 07:38:58 -05:00
License Add License 2024-06-22 07:43:54 -05:00
readme.md Fix typo in readme.md 2024-06-22 09:07:30 -05:00
rustfmt.toml Change small heuristics, add newlines between items 2024-07-09 01:22:32 -05:00

Bweh-mulator

A work-in-progress emulator for the venerable Game Boy.

Using the Debugger:

The debugger accepts a variety of commands, which take a number of expression arguments:

  • set dst, src: Sets memory at dst to value(s) of src
  • get addr: Hex-dumps memory (the default behavior.)
  • run n: Executes n instructions. Prints live disassembly for small values of n.
  • break addr | br: Sets a breakpoint at addr.
  • unbreak addr | ub: Unsets the breakpoint at addr.
  • dis addr | di: Disassembles bytes at addr.
  • eval expr | =: evaluates and prints an expression.
  • regs: Dumps CPU registers, including internal registers.
  • cart: Parses and prints cartridge header info.
  • trace: Toggles memory-write tracing mode.
  • reset: Resets the CPU, without clearing memory.

Operand Expressions:

The debugger supports a variety of datatypes:

  • Integers: 100, 0x100, 0d256, 0o400, 0b100000000
    • All integers are base-16 by default
  • Booleans: true, false
    • Not useful as operands, but can be negated/logically-operated
  • Registers: a, f, b, c, d, e, h, l, af, bc, de, hl, pc, sp
  • Exclusive Ranges: a..b, a.b (shorthand)
  • Arrays: [10, 20]
    • Used for multiple-assignment

The debugger supports a variety of arithmetic and logic operations:

Binary

Op Description Precedence
* Multiplication Term
/ Int Division Term
% Remainder Term
+ Addition Factor
- Subtraction Factor
>> Shift Right Shift
<< Shift Left Shift
& Bitwise And Bit
| Bitwise Or Bit
^ Bitwise Exclusive Or Bit
. Exclusive Range Range

Unary Prefix

Op Description Precedence
* "Pointer" Dereference Sign
- Signed Negation Sign
! Bitwise Not Sign
+ accepted, but useless Sign

Other operations

  • ( ): Parentheses (grouping)
  • a[0]: Array indexing
    • Works on arrays, registers, and absolute addresses

Multiple Evaluation With Arrays and Ranges

Arrays and ranges have a handful of special/unique behaviors when used as arguments to commands:

Writing Memory With Set:

The set command takes any nested tree of arrays of ranges of locations and attempts to pair them up in one of eight multiple-assignment forms.

Multiple Assignment

  • Assign arrays to arrays
gb> set [0, 2, 4, 6], [30, 32, 34, 36]
gb> 0
0000  30 00 32 00 34 00 36 00  00 00 00 00 00 00 00 00  |0.2.4.6.........|
  • Assign arrays to ranges
gb> set 0..A, [39, 38, 37, 36, 35, 34, 33, 32, 31, 30]
gb> 0
0000  39 38 37 36 35 34 33 32  31 30 00 00 00 00 00 00  |9876543210......|
  • Assign ranges to arrays
gb> set [6, 2, 5, 1, 7, 8, 3, 9, 4, 0], 30..3A
gb> 0
0000  39 33 31 36 38 32 30 34  35 37 00 00 00 00 00 00  |9316820457......|
  • Assign ranges to ranges
gb> set 0..A, 41..51
gb> 0
0000  41 42 43 44 45 46 47 48  49 4a 00 00 00 00 00 00  |ABCDEFGHIJ......|
  • Assign arrays to integers (and vice versa)
gb> set 0, [41, 41, 42, 42]
gb> 0
0000  41 41 42 42 00 00 00 00  00 00 00 00 00 00 00 00  |AABB............|
gb> set [2, 4, 6, 8], 55
gb> 0
0000  41 41 55 42 55 00 55 00  55 00 00 00 00 00 00 00  |AAUBU.U.U.......|
  • Assign ranges to integers (and vice versa)
gb> set 4, 30..38
gb> 0
0000  00 00 00 00 30 31 32 33  34 35 36 37 00 00 00 00  |....01234567....|
gb> set[A..F], 41
gb> 0
0000  00 00 00 00 30 31 32 33  34 35 41 41 41 41 41 00  |....012345AAAAA.|

Get and Dis:

Get and Dis have specialized range forms, which restrict their output to the provided ranges:

Hex-dumping With Get:

gb> get 3..3a
0003  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0013  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0023  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0033  00 00 00 00 00 00 00                              |.......|

Disassembling with Dis:

The disassembler will keep disassembling until it reaches an instruction outside the provided range

gb> pc
0100  00 c3 13 02 ce ed 66 66  cc 0d 00 0b 03 73 00 83  |.Ã..ÎíffÌ....s..|
gb> dis pc..pc+1
0100: nop
0101: jp        0213