Rust-Mooneye gb v0.1.0: Mooneye GB is a Game Boy research project and emulator written in Rust.

icon
Latest Release: v0.1.0

Please note that Mooneye GB is above all a research project, and if you want to actually play Game Boy games, Mooneye GB is probably not the emulator for you. Use Gambatte or BGB instead.

Mooneye GB does not currently have:

  • support for save games
  • audio
  • a nice user interface
  • full screen mode
  • configurable key bindings
  • configurable resolution
  • Game Boy link support
  • support for most Game Boy cartridge mappers
  • support for any extra Game Boy cartridge features (e.g. infrared, rumble)
  • support for any extra peripherals (e.g. camera, printer)

mooneye-gb-0.1.0-win32.zip

MD5: 0470d10d167b51260cec82aff910bca7 SHA-256: a8c370b887b9cb77471c7ebeddcb41c92c59827c8989c86a41e214d05b8368b2

mooneye-gb-0.1.0-win64.zip

MD5: 1d65fbea39f917d84e59cd8b234e5b2f SHA-256: cb7fbcd2dd7fb5cf886185e0ad14a81393e8f6c03123bc1c7013d552bac5b590

Source code(tar.gz)
Source code(zip)
mooneye-gb-0.1.0-md5.txt.asc(642 bytes)
mooneye-gb-0.1.0-sha256.txt.asc(706 bytes)
mooneye-gb-0.1.0-win32.zip(2.49 MB)
mooneye-gb-0.1.0-win32.zip.sig(287 bytes)
mooneye-gb-0.1.0-win64.zip(2.48 MB)
mooneye-gb-0.1.0-win64.zip.sig(287 bytes)

Mooneye GB

Mooneye GB is a Game Boy research project and emulator written in Rust.

Build Status

The main goals of this project are accuracy and documentation. Some existing emulators are very accurate (Gambatte, BGB >= 1.5) but are not documented very clearly, so they are not that good references for emulator developers. I want this project to document as clearly as possible why certain behaviour is emulated in a certain way. This also means writing a lot of test ROMs to figure out corner cases and precise behaviour on real hardware.

For documentation about known behaviour, see Game Boy: Complete Technical Reference

Binary test ROMs are available here in a zip package and also as individual .gb files. They are automatically built and deployed whenever there's new changes in the master branch.

Non-goals:

  • CGB (Game Boy Color) support. It would be nice, but I want to make the normal Game Boy support extremely robust first.
  • A debugger
  • A good user interface. Building native UIs with Rust is a bit painful at the moment.

Warning:

  • Project is WIP
  • Doesn't work properly without a boot ROM
  • The emulator is lagging behind hardware research. I don't want to spend time making short-lived and probably incorrect fixes to the emulator if I'm not sure about the hardware behaviour.

Hardware testing

There's tons of documentation and tons of emulators in the internet, but in the end I only trust real hardware. I follow a fairly "scientific" process when developing emulation for a feature:

  1. Think of different ways how it might behave on real hardware
  2. Make a hypothesis based on the most probable behaviour
  3. Write a test ROM for such behaviour
  4. Run the test ROM on real hardware. If the test ROM made an invalid hypothesis, go back to 1.
  5. Replicate the behaviour in the emulator

All test ROMs are manually run with these devices:

Device Model Mainboard CPU Detailed information
Game Boy DMG-01 DMG-CPU-01 DMG-CPU G01176542
Game Boy DMG-01 DMG-CPU-02 DMG-CPU A G02487032
Game Boy DMG-01 DMG-CPU-04 DMG-CPU B G10888299
Game Boy DMG-01  DMG-CPU-06 DMG-CPU C GM6058180
Super Game Boy SHVC-027 SGB-R-10 SGB-CPU-01 SGB Unit #2 [gekkio]
Game Boy Pocket MGB-001 MGB-CPU-01 CPU MGB   M10280516
Super Game Boy 2 SHVC-042 SHVC-SGB2-01 CPU SGB2 SGB2 Unit #1 [gekkio]
Game Boy Color CGB-001 CGB-CPU-01 CPU CGB C10203977
Game Boy Color CGB-001 CGB-CPU-01 CPU CGB A C10400331
Game Boy Color CGB-001 CGB-CPU-02 CPU CGB B C11778414
Game Boy Color CGB-001 CGB-CPU-03 CPU CGB C CGB Unit #1 [gekkio]
Game Boy Color CGB-001 CGB-CPU-05 CPU CGB D CH20983903
Game Boy Color CGB-001 CGB-CPU-06 CPU CGB E CH24224683
Game Boy Advance AGB-001 AGB-CPU-01 CPU AGB AH10045235
Game Boy Advance AGB-001 AGB-CPU-10 CPU AGB A AH12465671
Game Boy Player DOL-017 DOL-GBS-20 CPU AGB A E GBS Unit #3 [gekkio]
Game Boy Advance SP AGS-001  C/AGS-CPU-01 CPU AGB B XJH10027945
Game Boy Advance SP AGS-001  C/AGS-CPU-21 CPU AGB B E XEH17807928

Additional devices

I also have access to more devices with different mainboard revisions, but I think the CPU revision is all that matters if we study the behaviour and not analog characteristics (e.g. audio filtering). Even if audio sounded different between two units with the same CPU revision but different mainboard revisions, I'd expect the difference to be caused by individual device variation or different revisions of support chips (e.g. RAM/AMP/REG).

The main "test fleet" is already very big, so I will only use these devices if there's evidence of behaviour that depends on mainboard revision or individual units.

Device Model Mainboard CPU Detailed information
Game Boy DMG-01 DMG-CPU-01 DMG-CPU G01036814
Game Boy DMG-01 DMG-CPU-03 DMG-CPU B G06551776
Game Boy DMG-01 DMG-CPU-05 DMG-CPU B G13289095
Game Boy DMG-01 DMG-CPU-06 DMG-CPU B
Game Boy DMG-01 DMG-CPU-07 DMG-CPU B (blob) G38953646
Game Boy DMG-01 DMG-CPU-08 DMG-CPU C (blob)
Super Game Boy SNSP-027 SGB-R-10 SGB-CPU-01 SGB Unit #7 [gekkio]
Game Boy Pocket MGB-001 MGB-ECPU-01 CPU MGB   MH12573718
Game Boy Pocket MGB-001 MGB-LCPU-01 CPU MGB   M12827347
Game Boy Pocket MGB-001 MGB-LCPU-02 CPU MGB   MH20284468
Game Boy Light MGB-101 MGL-CPU-01 CPU MGB L10610653
Game Boy Color CGB-001 CGB-CPU-04 CPU CGB D C19220030
Game Boy Advance AGB-001 AGB-CPU-02 CPU AGB AJ12569062
Game Boy Advance AGB-001 AGB-CPU-03 CPU AGB A AJ14804298
Game Boy Advance AGB-001 AGB-CPU-04 CPU AGB A AJ15529163
Game Boy Player DOL-017 DOL-GBS-10 CPU AGB A GBS Unit #1 [gekkio]
Game Boy Advance SP AGS-001  C/AGS-CPU-10 CPU AGB B XEH12776954
Game Boy Advance SP AGS-001  C/AGS-CPU-11 CPU AGB B XJF10485171
Game Boy Advance SP AGS-001  C/AGS-CPU-30 CPU AGB B E XEH20137204
Game Boy Advance SP AGS-101  C/AGT-CPU-01 CPU AGB B E XU72764025-1

I'm still looking for the following mainboards, but these are probably not required for reverse engineering:

  • SGB-R-01
  • SGB-N-01
  • SGB-N-10
  • C/AGS-CPU-20
  • DOL-GBS-01

For now, the focus is on DMG/MGB/SGB/SGB2 emulation, so not all tests pass on CGB/AGB/AGS or emulators emulating those devices.

Performance

Always compile in release mode if you care about performance!

On a i7-3770K desktop machine I can usually run ROMs with 2000 - 4000% speed. Without optimizations the speed drops to 150 - 200%, which is still fine for development purposes.

Raspberry Pi with X11 desktop works but is too slow because there is no OpenGL acceleration.

The emulator is runnable on Android, but cross-compiling and packaging is a huge pain and touch controls would have to be implemented, so I'm not supporting Android at the moment.

Running the emulator

Requirements:

  • Rust 1.26
  • SDL2 development libraries for your platform must be installed

GUI

  1. cargo run --release
  2. Follow the instructions

Command-line

  1. Acquire a Game Boy bootrom, and put it to $HOME/.local/share/mooneye-gb/bootroms/dmg_boot.bin
  2. cargo build --release
  3. cargo run --release -- PATH_TO_GAMEBOY_ROM

On Windows, also download an SDL2 package containing SDL2.dll, and put it to target/debug and target/release.

Game Boy keys

Game Boy Key
Dpad Arrow keys
A Z
B X
Start Return
Select Backspace

Other keys

Function Key
Fast forward Shift
Toggle performance overlay F2

Test suite

Blargg's tests

Test mooneye-gb
cpu instrs ?
dmg sound 2
instr timing ?
mem timing 2 ?
oam bug 2
cgb sound 2

Notes:

  • cpu_instrs fails on MGB/SGB2 hardware and emulators emulating them correctly. The ROM incorrectly detects the device as CGB, and attempts to perform a CPU speed change which causes a freeze (STOP instruction with joypad disabled)
  • dmg_sound-2 test #10 can fail randomly on real hardware and seems to depend on non-deterministic behaviour.
  • oam_bug-2 fails on all CGB, AGB, and AGS devices
  • cgb_sound-2 test #03 fails on CPU CGB, CPU CGB A, and CPU CGB B

Mooneye GB acceptance tests

Test mooneye-gb
add sp e timing ?
boot div dmg0
boot div dmgABCmgb
boot div S
boot div2 S
boot hwio dmg0
boot hwio dmgABCmgb
boot hwio S ?
boot regs dmg0 ?
boot regs dmgABC ?
boot regs mgb ?
boot regs sgb ?
boot regs sgb2 ?
call timing ?
call timing2 ?
call cc_timing ?
call cc_timing2 ?
di timing GS ?
div timing ?
ei sequence ?
ei timing ?
halt ime0 ei ?
halt ime0 nointr_timing ?
halt ime1 timing ?
halt ime1 timing2 GS ?
if ie registers ?
intr timing ?
jp timing ?
jp cc timing ?
ld hl sp e timing ?
oam dma_restart ?
oam dma start ?
oam dma timing ?
pop timing ?
push timing ?
rapid di ei ?
ret timing ?
ret cc timing ?
reti timing ?
reti intr timing ?
rst timing ?

Bits (unusable bits in memory and registers)

Test mooneye-gb
mem oam ?
reg f ?
unused_hwio GS ?

Instructions

Test mooneye-gb
daa ?

Interrupt handling

Test mooneye-gb
ie push ?

OAM DMA

Test mooneye-gb
basic ?
reg_read ?
sources GS ?

PPU

Test mooneye-gb
hblank ly scx timing GS ?
intr 1 2 timing GS ?
intr 2 0 timing ?
intr 2 mode0 timing ?
intr 2 mode3 timing ?
intr 2 oam ok timing ?
intr 2 mode0 timing sprites
lcdon timing GS
lcdon write timing GS
stat irq blocking
stat lyc onoff
vblank stat intr GS ?

Serial

Test mooneye-gb
boot sclk align dmgABCmgb

Timer

Test mooneye-gb
div write ?
rapid toggle ?
tim00 div trigger ?
tim00 ?
tim01 div trigger ?
tim01  ?
tim10 div trigger ?
tim10 ?
tim11 div trigger ?
tim11 ?
tima reload ?
tima write reloading ?
tma write reloading ?

Mooneye GB emulator-only tests

MBC1

Test mooneye-gb
bits bank1 ?
bits bank2 ?
bits mode ?
bits ramg ?
rom 512kb ?
rom 1Mb ?
rom 2Mb ?
rom 4Mb ?
rom 8Mb ?
rom 16Mb ?
ram 64kb ?
ram 256kb ?
multicart rom 8Mb ?

MBC2

Test mooneye-gb
bits ramg ?
bits romb ?
bits unused ?
rom 512kb ?
rom 1Mb ?
rom 2Mb ?
ram ?

MBC5

Test mooneye-gb
rom 512kb ?
rom 1Mb ?
rom 2Mb ?
rom 4Mb ?
rom 8Mb ?
rom 16Mb ?
rom 32Mb ?
rom 64Mb ?

Mooneye GB manual tests

Test mooneye-gb
sprite priority ?

Mooneye GB misc tests

Test mooneye-gb
boot div A
boot div cgb0
boot div cgbABCDE
boot hwio C
boot regs A
boot regs cgb

Bits

Test mooneye-gb
unused hwio C

PPU

Test mooneye-gb
vblank stat intr C

Test naming

Some tests are expected to pass only a single model:

  • dmg = Game Boy
  • mgb = Game Boy Pocket
  • sgb = Super Game Boy
  • sgb2 = Super Game Boy 2
  • cgb = Game Boy Color
  • agb = Game Boy Advance
  • ags = Game Boy Advance SP

In addition to model differences, CPU revisions can affect the behaviour. Revision 0 refers always to the initial version of a CPU (e.g. CPU CGB). AGB and AGS use the same CPU models. The following CPU models have several revisions:

  • DMG: 0, A, B, C
  • CGB: 0, A, B, C, D, E
  • AGB: 0, A, A E, B, B E. Revision E also exists, but only in Game Boy Micro (OXY) so it is out of this project's scope. However, A E and B E are most likely actually just E revision in A or B-compatible package.

In general, hardware can be divided to a couple of groups based on their behaviour. Some tests are expected to pass on a single or multiple groups:

  • G = dmg+mgb
  • S = sgb+sgb2
  • C = cgb+agb+ags
  • A = agb+ags

For example, a test with GS in the name is expected to pass on dmg+mgb + sgb+sgb2.

License and copyright

Mooneye GB is licensed under GPLv3+. Copyright (C) 2014-2020 Joonas Javanainen [email protected]

The test framework and hardware tests under tests/ are licensed under MIT. Copyright (C) 2014-2020 Joonas Javanainen [email protected]

Comments

  • Bump bitflags from 1.2.1 to 1.3.2
    Bump bitflags from 1.2.1 to 1.3.2

    Aug 16, 2021

    Bumps bitflags from 1.2.1 to 1.3.2.

    Release notes

    Sourced from bitflags's releases.

    1.3.2

    • Allow non_snake_case in generated flags types (#256)

    #256: bitflags/bitflags#256

    1.3.1

    • Revert unconditional #[repr(transparent)] (#252)

    #252: bitflags/bitflags#252

    1.3.0 (yanked)

    • Add #[repr(transparent)] (#187)

    • End empty doc comment with full stop (#202)

    • Fix typo in crate root docs (#206)

    • Document from_bits_unchecked unsafety (#207)

    • Let is_all ignore extra bits (#211)

    • Allows empty flag definition (#225)

    • Making crate accessible from std (#227)

    • Make from_bits a const fn (#229)

    • Allow multiple bitflags structs in one macro invocation (#235)

    • Add named functions to perform set operations (#244)

    • Fix typos in method docs (#245)

    • Modernization of the bitflags macro to take advantage of newer features and 2018 idioms (#246)

    • Fix regression (in an unreleased feature) and simplify tests (#247)

    • Use Self and fix bug when overriding stringify! (#249)

    #187: bitflags/bitflags#187 #202: bitflags/bitflags#202 #206: bitflags/bitflags#206 #207: bitflags/bitflags#207 #211: bitflags/bitflags#211 #225: bitflags/bitflags#225 #227: bitflags/bitflags#227 #229: bitflags/bitflags#229 #235: bitflags/bitflags#235 #244: bitflags/bitflags#244 #245: bitflags/bitflags#245

    ... (truncated)

    Changelog

    Sourced from bitflags's changelog.

    1.3.2

    • Allow non_snake_case in generated flags types (#256)

    #256: bitflags/bitflags#256

    1.3.1

    • Revert unconditional #[repr(transparent)] (#252)

    #252: bitflags/bitflags#252

    1.3.0 (yanked)

    This release bumps the Minimum Supported Rust Version to 1.46.0

    • Add #[repr(transparent)] (#187)

    • End empty doc comment with full stop (#202)

    • Fix typo in crate root docs (#206)

    • Document from_bits_unchecked unsafety (#207)

    • Let is_all ignore extra bits (#211)

    • Allows empty flag definition (#225)

    • Making crate accessible from std (#227)

    • Make from_bits a const fn (#229)

    • Allow multiple bitflags structs in one macro invocation (#235)

    • Add named functions to perform set operations (#244)

    • Fix typos in method docs (#245)

    • Modernization of the bitflags macro to take advantage of newer features and 2018 idioms (#246)

    • Fix regression (in an unreleased feature) and simplify tests (#247)

    • Use Self and fix bug when overriding stringify! (#249)

    #187: bitflags/bitflags#187 #202: bitflags/bitflags#202 #206: bitflags/bitflags#206 #207: bitflags/bitflags#207 #211: bitflags/bitflags#211 #225: bitflags/bitflags#225

    ... (truncated)

    Commits
    • ed185cf Merge pull request #258 from KodrAus/cargo/1.3.2
    • 54e47f7 prepare for 1.3.2 release
    • ac957a5 Merge pull request #257 from KodrAus/chore/more-compile-tests
    • df838ab more work on compile tests
    • acfba7d Merge pull request #256 from saiintbrisson/issue-237
    • 93ce27c fix: allowed non_snake_case on trait impls
    • b234906 Merge pull request #254 from KodrAus/cargo/1.3.1
    • b4dbed0 don't worry about stderr for non integer base types
    • 7b722c6 prepare for 1.3.1 release
    • 186af85 Merge pull request #253 from KodrAus/chore/test-organization
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Bump glium from 0.29.0 to 0.30.2
    Bump glium from 0.29.0 to 0.30.2

    Sep 6, 2021

    Bumps glium from 0.29.0 to 0.30.2.

    Changelog

    Sourced from glium's changelog.

    Version 0.30.2 (2021-09-06)

    • Added depth and stencil buffer blitting.
    • Added dual source blending.
    • Implemented AsUniformValue for Texture2d directly.

    Version 0.30.1 (2021-07-12)

    • Added ClientFormat::U1U5U5U5Reversed.
    • Updated ouroboros to 0.10.

    Version 0.30.0 (2021-06-23)

    • Updated glutin to version 0.30.0. See the glutin release notes here.
    • Replaced unmaintained rental with ouroboros.
    • Allow instancing on GLES3 or later.
    • Support for importing and using Vulkan semaphores.
    • Made Content::read an unsafe API.
    • Modernized and fixed the third chapter of the tutorial.

    Version 0.29.1 (2021-04-22)

    • Updated rand to 0.8.
    • Updated cgmath to 0.18.
    • Made UniformsStorage implement Copy and Clone.
    • Use $crate::uniform! internally.
    • Implemented From instead of Into for some conversions.
    Commits
    • d0ae191 Merge pull request #1959 from est31/release_0_30
    • 685f1fc Release 0.30.2
    • e7300e3 Changelog for 0.30.2
    • 710dba0 Merge pull request #1956 from strohel/asuniformvalue-for-textures-directly
    • 3e3365e Also implement AsUniformValue for Texture2d and friends directly
    • 9212005 Add test showcasing lifetime issue of AsUniformValue for Texture2d
    • a4e0b55 Merge pull request #1955 from wez/master
    • aed9527 Add support for Dual Source Blending
    • 2c6caf9 Merge pull request #1952 from tobias93/master
    • 7ff5c3a code formatting
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Bump crc from 1.8.1 to 2.1.0
    Bump crc from 1.8.1 to 2.1.0

    Oct 28, 2021

    Bumps crc from 1.8.1 to 2.1.0.

    Release notes

    Sourced from crc's releases.

    2.1.0

    paunstefan (1):
          Added CRC8 support
    
    Commits
    • d97137d Prepare 2.1.0 release
    • 7ace659 Replace Travis CI with GitHub Actions
    • 747901f Merge pull request #63 from paunstefan/crc8_support
    • 53aadbf Added CRC8 support
    • 9ce15e7 (cargo-release) start next development iteration 2.0.1-alpha.0
    • 8a8d962 (cargo-release) version 2.0.0
    • 1ba2c74 correct crc-catalog version (#61)
    • 2f0eb94 Merge pull request #60 from akhilles/const-fn
    • cf87703 Remove const fn hacks
    • 2e31cdb Merge pull request #59 from akhilles/clarify-msrv
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Bump arrayvec from 0.5.2 to 0.7.2
    Bump arrayvec from 0.5.2 to 0.7.2

    Oct 28, 2021

    Bumps arrayvec from 0.5.2 to 0.7.2.

    Changelog

    Sourced from arrayvec's changelog.

    0.7.2

    0.7.1

    • Add new ArrayVec methods .take() and .into_inner_unchecked() by @​conradludgate
    • clone_from now uses truncate when needed by @​a1phyr

    0.7.0

    • fn new_const is now the way to const-construct arrayvec and arraystring, and fn new has been reverted to a regular "non-const" function. This works around performance issue #182, where the const fn version did not optimize well. Change by @​bluss with thanks to @​rodrimati1992 and @​niklasf for analyzing the problem.

    • The deprecated feature flag unstable-const-fn was removed, since it's not needed

    • Optimize .retain() by using the same algorithm as in std, change by @​niklasf, issue #174. Original optimization in Rust std by @​oxalica in rust-lang/rust/pull/81126

    0.6.1

    • The ArrayVec::new and ArrayString::new constructors are properly const fns on stable and the feature flag unstable-const-fn is now deprecated. by @​rodrimati1992

    • Small fix to the capacity check macro by @​Xaeroxe

    • Typo fix in documentation by @​cuviper

    • Small code cleanup by @​bluss

    0.6.0

    • The const generics release 🎉. Arrayvec finally implements what it wanted to implement, since its first version: a vector backed by an array, with generic parameters for the arbitrary element type and backing array capacity.

      The New type syntax is ArrayVec<T, CAP> where CAP is the arrayvec capacity.

    ... (truncated)

    Commits
    • 67ec907 0.7.2
    • a4690c9 Merge pull request #194 from bhgomes/const-fns
    • 4c8149a Merge pull request #200 from niklasf/follow-vec-retain
    • bc21f19 Follow optimization of std::Vec::retain (rust-lang/rust#88060)
    • e209a50 Merge pull request #197 from c410-f3r/str
    • 1e74077 Doc/wording edit for zero_filled
    • e98cb1c Typo
    • f5acafa Add zero_filled constructor
    • 17c5dd0 upgrade len/capacity-related functions to const-fn
    • 481f930 add remaining_capacity to ArrayString
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Draw window only when both LCDC.0 and LCDC.5 are enabled
    Draw window only when both LCDC.0 and LCDC.5 are enabled

    Dec 6, 2021

    Window should be rendered only when LCDC.0 and LCDC.5 are enabled. But mooneye-gb checks only LCDC.5. This PR fixes the point.

    PanDocs: https://gbdev.io/pandocs/LCDC.html#ff40---lcdc-lcd-control-rw

    Reply
  • Fix warning on release build with `cargo build --release`
    Fix warning on release build with `cargo build --release`

    Dec 15, 2021

    This commit fixes the following warning emit by rustc v1.57:

    > cargo build --release
    
    warning: unnecessary parentheses around assigned value
      --> core/src/hardware/ppu.rs:33:30
       |
    33 | const STAT_UNUSED_MASK: u8 = (1 << 7);
       |                              ^      ^
       |
       = note: `#[warn(unused_parens)]` on by default
    help: remove these parentheses
       |
    33 - const STAT_UNUSED_MASK: u8 = (1 << 7);
    33 + const STAT_UNUSED_MASK: u8 = 1 << 7;
       |
    
    warning: `mooneye-gb-core` (lib) generated 1 warning
    
    Reply
  • Bump gilrs from 0.8.0 to 0.8.2
    Bump gilrs from 0.8.0 to 0.8.2

    Dec 30, 2021

    Bumps gilrs from 0.8.0 to 0.8.2.

    Commits
    • 326bab8 gilrs version 0.8.2 and gilrs-core version 0.3.2
    • a16b964 Update SDL_GameControllerDB
    • e164b1b Update env_logger
    • 3e66101 Emit ButtonChanged events in axis_dpad_to_button filter
    • 51363fa Update nix to v0.23.1 to fix security vulnerability (RUSTSEC-2021-0119)
    • 60883ea Update SDL_GameControllerDB
    • 8c433ef Bump minimal rustc version to 1.47
    • 3687a66 Merge branch 'wasm' into 'master'
    • b82c6cc Fix axis range calculation on wasm target.
    • 50ca155 gilrs v0.8.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Bump snafu from 0.6.10 to 0.7.0
    Bump snafu from 0.6.10 to 0.7.0

    Jan 3, 2022

    Bumps snafu from 0.6.10 to 0.7.0.

    Changelog

    Sourced from snafu's changelog.

    [0.7.0] - XXXX-XX-XX

    Added

    • A crate prelude containing common macros and traits can be imported via use snafu::prelude::*.

    • A ready-to-use error type Whatever is available to quickly start reporting errors with little hassle.

    • "Stringly typed" error cases can be added to existing error types, allowing you to construct errors without defining them first.

    • Formatting shorthand syntax for error type data fields is now supported: #[snafu(display("Hello {name}"))].

    • [snafu(module)] can be specified on an error type. This will create a module for the error type and all associated context selectors will be placed in that module.

    • snafu::Location can be added to an error type to provide lightweight tracking of the source location where the error was created.

    • [snafu(implicit)] can be specified on context selector data fields to automatically generate it via snafu::GenerateImplicitData when the error is created.

    • ErrorCompat::iter_chain provides an iterator over the list of causal errors.

    Changed

    • Generated context selectors now have the suffix Snafu. This is a breaking change.

    • ResultExt::with_context, TryFutureExt::with_context, and TryStreamExt::with_context now pass the error into the closure. This is a breaking change.

    • The GenerateBacktrace trait has been split into GenerateImplicitData and AsBacktrace. This is a breaking change.

    • Rust 1.34 is now the minimum supported Rust version. This is a breaking change.

    Removed

    • String attribute parsing (#[snafu(foo = "...")]) is no longer

    ... (truncated)

    Commits
    • a6aff99 Release 0.7.0
    • f16bb4c Merge pull request #319 from shepmaster/trybuild
    • 1865e17 Update tests for newer version of trybuild
    • b4cdc99 Merge pull request #317 from shepmaster/docs
    • c694dfa Document that Error is removed before making selector names
    • 321d6a4 Sync up changelog and upgrading guide
    • 86fabf9 Minor doc tweaks
    • b314d3e Release 0.7.0-beta.2
    • caece50 Update the changelog
    • e846c56 Merge pull request #295 from SamWilsn/derive-with-module
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Bump nalgebra from 0.25.1 to 0.30.1
    Bump nalgebra from 0.25.1 to 0.30.1

    Jan 9, 2022

    Bumps nalgebra from 0.25.1 to 0.30.1.

    Changelog

    Sourced from nalgebra's changelog.

    [0.30.1] (09 Jan. 2022)

    Added

    • Add conversion from/to types of glam 0.19 and 0.20.

    [0.30.0] (02 Jan. 2022)

    Breaking changes

    • The Dim trait is now marked as unsafe.
    • The Matrix::pow and Matrix::pow_mut methods only allow positive integer exponents now. To compute negative exponents, the user is free to invert the matrix before calling pow with the exponent’s absolute value.
    • Remove the Bounded requirement from RealField. Replace it by methods returning Option<Self> so that they can still be implemented by unbounded types (by returning None).
    • The ComplexField trait derives from FromPrimitive again. We can actually keep this because all its methods return Option<Self>, meaning that it could be implemented by any type.

    Modified

    • Use more concise debug impls for matrices and geometric transformation types.
    • The singular values computed by the SVD are now sorted in increasing order by default. Use SVD::new_unordered instead to reproduce the older behavior without the sorting overhead.
    • The UnitDualQuaternion::sclerp method will no longer panic when given two equal rotations.
    • The Matrix::select_rows and Matrix::select_columns methods no longer require the matrix components to implement the trait Zero.
    • The Matrix::pow and Matrix::pow_mut methods will now also work with integer matrices.

    Added

    • Added the conversion trait From<Vec<T>> and method from_vec_storage for RowDVector.
    • Added implementation of From and Into for converting between nalgebra types and types from glam 0.18. These can be enabled by enabling the convert-glam018 cargo features.
    • Added the methods Matrix::product, ::row_product, ::row_product_tr, and ::column_product to compute the product of the components, rows, or columns, of a single matrix or vector.
    • The Default trait is now implemented for most geometric types: Point, Isometry, Rotation, Similarity, Transform, UnitComplex, and UnitQuaternion.
    • Added the Scale geometric type for representing non-uniform scaling.
    • Added Cholesky::new_with_substitute that will replace diagonal elements by a given constant whenever Cholesky meets a non-definite-positiveness.
    • Re-added the conversion from a vector/matrix slice to a static array.
    • Added the cuda feature that enables the support of rust-cuda for using nalgebra features with CUDA kernels written in Rust.
    • Added special-cases implementations for the 2x2 and 3x3 SVDs for better accuracy and performances.
    • Added the methods Matrix::polar, Matrix::try_polar, and SVD::to_polar to compute the polar decomposition of a matrix, based on its SVD.
    • nalgebra-sparse: provide constructors for unsorted but otherwise valid data using the CSR format.
    • nalgebra-sparse: added reading MatrixMarked data files to a sparse CooMatrix.

    Fixed

    • Fixed a potential unsoundness with matrix.get(i) and matrix.get_mut(i) where i is an usize, and matrix is a matrix slice with non-default strides.
    • Fixed potential unsoundness with vector.perp where vector isn’t actually a 2D vector as expected.
    • Fixed linkage issue with nalgebra-lapack: the user of nalgebra-lapack no longer have to add extern crate lapack-src to their main.rs.

    ... (truncated)

    Commits
    • 6b1e14c Release v0.30.1
    • 2026cb3 Merge pull request #1062 from dimforge/glam-020
    • 87a6f49 Add support for conversion with glam 0.19 and 0.20
    • e8b9c40 Release v0.30.0
    • c0f8530 Merge pull request #1055 from dimforge/fix-pow
    • 99ac8c4 Merge pull request #1050 from metric-space/polar-decomposition-take-2
    • 498d7e3 Semi-unitary test checks for if rows or cols are orthonomal
    • ae6fda7 Change svd to svd_unordered for the method output to be equal
    • d806669 Fix Matrix::pow and make it work only with positive exponents
    • fdaf8c0 Add tests for Matrix::pow
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Bump simplelog from 0.9.0 to 0.11.2
    Bump simplelog from 0.9.0 to 0.11.2

    Jan 10, 2022

    Bumps simplelog from 0.9.0 to 0.11.2.

    Changelog

    Sourced from simplelog's changelog.

    v0.11.0

    - Add colored log levels using `ansi_term` (PR [#88](https://github.com/drakulix/simplelog.rs/issues/88), credits to @manio)
    - Add target padding (PR [#85](https://github.com/drakulix/simplelog.rs/issues/85), credits to @bytebeamio)
    - Add optional color and style support using `paris` crate (PR [#84](https://github.com/drakulix/simplelog.rs/issues/84), credits to @manio)
    

    v0.10.2

    - Fix flushing with `BufferedStandardStreams` (PR [#82](https://github.com/drakulix/simplelog.rs/issues/82), credits to @mrkline)
    

    v0.10.1

    - Fix TermLogger performance using `termcolor::BufferedStandardStream` (PR [#80](https://github.com/drakulix/simplelog.rs/issues/80), credits to @mrkline)
    - Add write thread name support for `termlog` (PR [#76](https://github.com/drakulix/simplelog.rs/issues/76), credits to @zeroflaw)
    

    v0.10.0

    - Fix wrong argument naming (PR [#70](https://github.com/drakulix/simplelog.rs/issues/70), credits to @scvalex)
    - *Breaking*: More color customization options (PR [#72](https://github.com/drakulix/simplelog.rs/issues/72), credits to @mrkline)
    - Clarify docs on config levels
    
    Commits
    • 98b0ed6 Merge pull request #92 from manio/master
    • 5cc283f Update paris crate and bump version
    • 302d0a8 Merge pull request #90 from manio/master
    • d98ad32 Update paris crate and bump version
    • ddd6e69 Merge pull request #86 from manio/master
    • e058575 Update CHANGELOG.md
    • a90ab8a Bump version to v0.11.0 and adjust README
    • cc590d2 Merge pull request #88 from manio/level-colorize
    • cda7757 config: make set_write_log_enable_colors() an ansi_term feature dependant
    • 3e0b336 paris_macros: fix this URL is not a hyperlink warnings
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    Reply
  • Incorrect error message in stat_lyc_onoff test
    Incorrect error message in stat_lyc_onoff test

    Apr 22, 2019

    https://github.com/Gekkio/mooneye-gb/blob/c14d750377b1ea926c191c21ef7808f47a765efa/tests/acceptance/ppu/stat_lyc_onoff.s#L116

    I'm gonna guess that this line should be fail_intr_round3 instead of fail_intr_round2

    I'd make a PR but I'm on web and am too lazy to fork the project.

    Reply
  • Rename `lcdon_timing-dmgABCmgbS.gb` and `sources-dmgABCmgbS.gb` tests
    Rename `lcdon_timing-dmgABCmgbS.gb` and `sources-dmgABCmgbS.gb` tests

    Jul 26, 2019

    I tested these two on my DMG-CPU device and both passed successfully, so suggest to rename the tests to indicate passing on GS - unless of course we've got some non-revision specific behaviour here.

    Reply
  • Bump failure from 0.1.6 to 0.1.7
    Bump failure from 0.1.6 to 0.1.7

    Mar 5, 2020

    Bumps failure from 0.1.6 to 0.1.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    dependencies 
    Reply
  • Remove
    Remove "debug" opcode from all test roms.

    Apr 11, 2015

    Please, remove it. The real behaviour of that pseudo-opcode (which, acording to wla-dx, is 0xED) is to hang the CPU forever. Most emulators show error messages when they try to execute that instruction. You should use "ld b,b", which is kind of a standard (no$gmb, bgb) and it doesn't hang emulators or real hardware. In fact, the only reason the test roms can work in real hardware is that just after that instruction there's an infinite loop, so the CPU would be trapped there anyway.

    Reply
  • Wrong HalfCarry check on add16-instruction
    Wrong HalfCarry check on add16-instruction

    May 14, 2015

    Hey, I'm working on an GB emulator in F#.

    While studying (or peeking ;)) your implementation I noticed a bug in this line: https://github.com/Gekkio/mooneye-gb/blob/master/src/cpu/mod.rs#L902

    According to the most known Game Boy CPU Manual, as well as the official GB programming manual the half-carry flag is set when there's a carry from bit 11. This would mean a check for 0x0FFF, and not 0x07FF (bit 10).

    A test case from the official developer manual (page 97):

    When HL = 0x8A23
    ADD HL, HL ; HL <- 0x1446, H <- 1, N <- 0, CY <- 1
    
    Reply
  • In ie_push.s, cannot trigger
    In ie_push.s, cannot trigger "R3: unwanted cancel" failure ?

    Dec 29, 2019

    When I tried this test with my emulator, instead of failing or passing, the emulator just stopped after a while. As I was investigating why, it occurred to me that my implementation should have triggered the "R3: unwanted cancel" failure but that it didn't for some reason.

    My understanding of the scenario that should lead to this failure is as follows:

    • from address PC=0x0235 with SP=0x0001, we trigger INTR_SERIAL with "ldh (<IF), a"
    • while processing this interrupt, if it is cancelled, PC is set to 0
    • because at the end of ie_push.s we have ".org $0000" followed by "jp hl", when executing the instruction at PC=0, we should jump to the address contained in HL

    However, because we trigger the interrupt with SP=1, pushing PC as part of processing the interrupt not only puts 0x35 into IE but it also puts 0x02 at the address 0 which replaces the 0xE9 opcode of the jump instruction that should trigger the failure path.

    Is my interpretation correct or did I miss something ?

    Reply
  • Request for details on a test comment ( about OAM DMA )
    Request for details on a test comment ( about OAM DMA )

    Dec 8, 2016

    I'm having trouble understand something I read in one of your timing tests that deals with OAM DMA.

    https://github.com/Gekkio/mooneye-gb/blob/master/tests/acceptance/call_cc_timing.s#L83-L86

      ; the first two bytes of CALL nn will be at $FDFE, so
      ; the high byte of nn is at the first byte of OAM during testing
      ; [...]
      ; the memory read of nn is aligned to happen exactly one cycle
      ; before the OAM DMA end, so high byte of nn = $FF
      ; therefore the call becomes:
      ;   call c, $ffca
    

    From what I understand the CPU is only able to access HIRAM during OAM DMA.. so wouldn't that turn into RST $38 ($FF) instead?


    Another piece of that test that is confusing to me is the per-cycle timings of CALL.

    ; CALL cc, nn is expected to have the following timing:
    ; M = 0: instruction decoding
    ; M = 1: nn read: memory access for low byte
    ; M = 2: nn read: memory access for high byte
    ; M = 3: internal delay
    ; M = 4: PC push: memory access for high byte
    ; M = 5: PC push: memory access for low byte
    

    You state above that the low byte is read first. That seems to go against what the test expects if its expecting the low byte to be read correctly and the high byte to be read as $FF.

    Reply
  • Issue with sources-GS test
    Issue with sources-GS test

    Nov 7, 2019

    Hello,

    I'm facing a problem with this test and I need your insight! At test_fe00: , it appears that OAM is cleared with call clear_oam , then DMA runs and the test compares the result with ram_pattern_1. Since OAM was cleared prior to DMA, it will never have the correct pattern, so you even have to remove the clear or reload the pattern before triggering the DMA.

    I hope I didn't get the whole thing wrong! Keep up the great work!

    Reply
  • Added several timer tests.
    Added several timer tests.

    Apr 12, 2016

    I extracted a couple of tests from my old gb tests rom and also created a few more additional timer tests.

    I was only able to test them on MGB, CGB, and AGS units.

    Reply
  • Build Error
    Build Error

    Jun 11, 2018

    I tried to build this emulator, but I get the following build error (on MacOS):

      --> src/frontend/renderer.rs:57:7
       |
    57 |       FrameState::Even => FrameState::Odd,
       |       ^^^^^^^^^^^^^^^^ help: consider using a reference: `&FrameState::Even`
    
    error[E0658]: non-reference pattern used to match a reference (see issue #42640)
      --> src/frontend/renderer.rs:58:7
       |
    58 |       FrameState::Odd => FrameState::Even,
       |       ^^^^^^^^^^^^^^^ help: consider using a reference: `&FrameState::Odd
    error: aborting due to 2 previous errors
    
    error: Could not compile `mooneye-gb`.
    

    Any ideas what is causing this and how to fix? Thanks! Very interested in and excited about this project.

    Reply