Gameboy emulator
boy-debug | ||
boy-utils | ||
notes | ||
src | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
License | ||
readme.md | ||
rustfmt.toml |
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 atdst
to value(s) ofsrc
get addr
: Hex-dumps memory (the default behavior.)run n
: Executesn
instructions. Prints live disassembly for small values ofn
.break addr
|br
: Sets a breakpoint ataddr
.unbreak addr
|ub
: Unsets the breakpoint ataddr
.dis addr
|di
: Disassembles bytes ataddr
.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