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 atdstto value(s) ofsrcget addr: Hex-dumps memory (the default behavior.)run n: Executesninstructions. 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
Description
Languages
Rust
100%