Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

GBC

A simple GameBoy and GameBoy Color emulator written in C.

This is a hobby project to try and write a simple emulator for the GameBoy, including its CPU, memory controller and display. It seems to work well enough with a number of games, but has not been extensively tested. If you want an actual practical GameBoy emulator you should use something different, there are plenty of mature emulators out there (e.g., Gambatte, BGB, VBA).

The emulator supports all opcodes of the GameBoy CPU (and passes the GameBoy tests from Blargg). It supports all areas of the GameBoy's MMU, including a number of different (on-cartridge) memory controllers (MBC-1, MBC-3 and MBC-5). It supports most of the LCD functionality (barring some sprite priority issues). A very hacky preliminary version of audio is implemented (supporting only some features of a single channel, 2). While audio is recognizable (e.g., the Tetris music), it's limited and its timing is off, making it rather unpleasant to listen to.

The emulator is relatively platform and architecture independent, and can be built using different front-ends: a standalone one using SDL2 and as a libretro core. libretro is a generic framework for emulators and runs on numerous systems. Using this frontend for this emulator allows it to even run on the SNES mini without modification (using hakchi2/Retroarch).

Building and usage

Any C compiler should work, but the emulator is currently tested with Clang and GCC. The standalone frontend depends on libreadline and libsdl2, available on Ubuntu with by installing libreadline-dev and libsdl2-dev. For the libretro core there are no dependencies for building, but using it requires a compatible frontend such as Retroarch.

Building and running the standalone frontend can be done as such:

$ make
$ ./main path/to/romfile

Running ./main -h shows all available options. Button mappings are as follows:

GameBoy buttonKeyboard
Az
Bx
DirectionsArrow keys
StartEnter
SelectBackspace
Quitq or Escape
Save states
Breakb

When the emulator detects unexpected behavior (e.g., accessing an unknown memory region), it will drop into a built-in debugger. This debugger can also be invoked manually using the b key. The debugger allows inspection of code, data and registers, can single-step the execution and set breakpoints, and can toggle debug-prints for instructions and memory accesses at run-time. For a list of commands, see the h command.

As a libretro core

To build just the libretro core, use the make libretro command, which will create koengb_libretro.so. By placing this shared library in the cores directory of a frontend such as Retroarch (~/.config/retroarch/cores) it can be selected from the interface.

Using the libretro core on the SNES mini

Note: There are much better and more mature emulators already available for the SNES mini.

Since the SNES mini (Super Nintendo Classic Mini) is simply an ARM chip running Linux, which can run Retroarch via hakchi2, we can run our libretro core on there as well simply by cross-compiling the code. This requires an ARM cross-compiler, which can be found on Ubuntu in the gcc-arm-linux-gnueabihf package. Then compiling can be done as such:

$ make clean # To clean up any .o files created for the native architecture
$ make libretro CC=arm-linux-gnueabihf-gcc

Copy koengb_libretro.so to the SNES mini with hakchi2's FTP in /var/lib/hakchi/rootfs/etc/libretro/core. Create a folder in the games directory (/var/lib/hakchi/rootfs/usr/share/games/001), and modify the .desktop file in there to invoke Retroarch with this frontend (e.g., Exec=/bin/retroarch-clover koengb path/to/rom).

Currently the libretro support is limited, so exiting out of the emulator using the reset button, and managing states does not work yet.

About

GameBoy (Color) emulator written in C

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages