Files
gbdk-2020/docs/api/docs_supported_consoles.html
2023-02-28 12:36:34 +03:00

595 lines
43 KiB
HTML

<!-- HTML header for doxygen 1.8.14-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="cache-control" content="max-age=86400"/>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>GBDK 2020 Docs: Supported Consoles &amp; Cross Compiling</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen_extra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">GBDK 2020 Docs
&#160;<span id="projectnumber">4.1.1</span>
</div>
<div id="projectbrief">API Documentation for GBDK 2020</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('docs_supported_consoles.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">Supported Consoles &amp; Cross Compiling </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p><a class="anchor" id="docs_consoles_supported_list"></a></p>
<h1><a class="anchor" id="autotoc_md133"></a>
Consoles Supported by GBDK</h1>
<p>As of version <code>4.1.0</code> GBDK includes support for other consoles in addition to the Game Boy.</p>
<ul>
<li>Game Boy and related clones<ul>
<li>Nintendo Game Boy / Game Boy Color (GB/GBC)</li>
<li>Analogue Pocket (AP)</li>
<li>Mega Duck / Cougar Boy (DUCK)</li>
</ul>
</li>
<li>Sega Consoles<ul>
<li>Sega Master System (SMS)</li>
<li>Sega Game Gear (GG)</li>
</ul>
</li>
<li>MSX DOS (MSXDOS) (partial support)</li>
<li>NES (NES) (partial support)</li>
</ul>
<p>While the GBDK API has many convenience functions that work the same or similar across different consoles, it's important to keep their different capabilities in mind when writing code intended to run on more than one. Some (but not all) of the differences are screen sizes, color capabilities, memory layouts, processor type (z80 vs gbz80/sm83) and speed.</p>
<p><a class="anchor" id="docs_consoles_compiling"></a></p>
<h1><a class="anchor" id="autotoc_md134"></a>
Cross Compiling for Different Consoles</h1>
<h2><a class="anchor" id="autotoc_md135"></a>
lcc</h2>
<p>When compiling and building through <a class="el" href="docs_toolchain.html#lcc">lcc</a> use the <code>-m&lt;port&gt;:&lt;plat&gt;</code> flag to select the desired console via its port and platform combination.</p>
<h2><a class="anchor" id="autotoc_md136"></a>
sdcc</h2>
<p>When building directly with the sdcc toolchain, the following must be specified manually (when using <a class="el" href="docs_toolchain.html#lcc">lcc</a> it will populate these automatically based on <code>-m&lt;port&gt;:&lt;plat&gt;</code>).</p>
<p>When compiling with <a class="el" href="docs_toolchain_settings.html#sdcc-settings">sdcc</a>:</p><ul>
<li><code>-m&lt;port&gt;</code>, <code>-D__PORT_&lt;port&gt;</code> and <code>-D__TARGET_&lt;plat&gt;</code></li>
</ul>
<p>When assembling with <a class="el" href="docs_toolchain_settings.html#sdasgb-settings">sdasgb</a> (for GB/AP) and <a class="el" href="docs_toolchain_settings.html#sdasz80-settings">sdasz80</a> (for SMS/GG):</p><ul>
<li>Select the appropriate include path: <code>-I&lt;gbdk-path&gt;lib/&lt;plat&gt;</code></li>
</ul>
<p>When linking with <a class="el" href="docs_toolchain_settings.html#sdldgb-settings">sdldgb</a> (for GB/AP) and <a class="el" href="docs_toolchain_settings.html#sdldz80-settings">sdldz80</a> (for SMS/GG or MSXDOS):</p><ul>
<li>Select the appropriate include paths: <code>-k &lt;gbdk-path&gt;lib/&lt;port&gt;</code>, <code>-k &lt;gbdk-path&gt;lib/&lt;plat&gt;</code></li>
<li>Include the appropriate library files <code>-l &lt;port&gt;.lib</code>, <code>-l &lt;plat&gt;.lib</code></li>
<li>The crt will be under <code>&lt;gbdk-path&gt;lib/&lt;plat&gt;/crt0.o</code></li>
</ul>
<p>MSXDOS requires an additional build step with <a class="el" href="docs_toolchain.html#utility_makecom">makecom</a> after <a class="el" href="docs_toolchain.html#makebin">makebin</a> to create the final binary:</p><ul>
<li><code>makecom &lt;image.bin&gt; [&lt;image.noi&gt;] &lt;output.com&gt;</code></li>
</ul>
<p>The NES port has <code>--no-peep</code> specified (in <a class="el" href="docs_toolchain.html#lcc">lcc</a>) due to a peephole related codegen bug in SDCC that has not yet been merged.</p><ul>
<li>If you wish to build without that flag then SDCC can be called directly instead of through lcc.</li>
<li>Alternately, custom peephole rules from a file can be passed in using <code>-Wf--peep-file</code> (lcc) or <code>--peep-file</code> (sdcc).</li>
</ul>
<p><a class="anchor" id="console_port_plat_settings"></a></p>
<h2><a class="anchor" id="autotoc_md137"></a>
Console Port and Platform Settings</h2>
<p>Note: Starting with GBDK-2020 4.1.0 and SDCC 4.2, the Game Boy and related clones use <code>sm83</code> for the port instead of <code>gbz80</code></p>
<ul>
<li>Nintendo Game Boy / Game Boy Color <br />
<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-msm83:gb</code></li>
<li>port:<code>sm83</code>, plat:<code>gb</code></li>
</ul>
</li>
<li>Analogue Pocket<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-msm83:ap</code></li>
<li>port:<code>sm83</code>, plat:<code>ap</code></li>
</ul>
</li>
<li>Mega Duck / Cougar Boy<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-msm83:duck</code></li>
<li>port:<code>sm83</code>, plat:<code>duck</code></li>
</ul>
</li>
<li>Sega Master System<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-mz80:sms</code></li>
<li>port:<code>z80</code>, plat:<code>sms</code></li>
</ul>
</li>
<li>Sega Game Gear<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-mz80:gg</code></li>
<li>port:<code>z80</code>, plat:<code>gg</code></li>
</ul>
</li>
<li>MSX DOS<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-mz80:msxdos</code></li>
<li>port:<code>z80</code>, plat:<code>msxdos</code></li>
</ul>
</li>
<li>NES<ul>
<li><a class="el" href="docs_toolchain.html#lcc">lcc</a> : <code>-mmos6502:nes</code></li>
<li>port:<code>mos6502</code>, plat:<code>nes</code></li>
</ul>
</li>
</ul>
<h1><a class="anchor" id="autotoc_md138"></a>
Cross-Platform Constants</h1>
<p>There are several constant #defines that can be used to help select console specific code during compile time (with <code>#ifdef</code>, <code>#ifndef</code>) .</p>
<h2><a class="anchor" id="autotoc_md139"></a>
Console Identifiers</h2>
<ul>
<li>When <code>&lt;gb/gb.h&gt;</code> is included (either directly or through <code>&lt;gbdk/platform.h&gt;</code>)<ul>
<li>When building for Game Boy:<ul>
<li><code>NINTENDO</code> will be #defined</li>
<li><code>GAMEBOY</code> will be #defined</li>
</ul>
</li>
<li>When building for Analogue Pocket<ul>
<li><code>NINTENDO</code> will be #defined</li>
<li><code>ANALOGUEPOCKET</code> will be #defined</li>
</ul>
</li>
<li>When building for Mega Duck / Cougar Boy<ul>
<li><code>NINTENDO</code> will be #defined</li>
<li><code>MEGADUCK</code> will be #defined</li>
</ul>
</li>
</ul>
</li>
<li>When <code>&lt;sms/sms.h&gt;</code> is included (either directly or through <code>&lt;gbdk/platform.h&gt;</code>)<ul>
<li>When building for Master System<ul>
<li><code>SEGA</code> will be #defined</li>
<li><code>MASTERSYSTEM</code> will be #defined</li>
</ul>
</li>
<li>When building for Game Gear<ul>
<li><code>SEGA</code> will be #defined</li>
<li><code>GAMEGEAR</code> will be #defined</li>
</ul>
</li>
</ul>
</li>
<li>When <code>&lt;msx/msx.h&gt;</code> is included (either directly or through <code>&lt;gbdk/platform.h&gt;</code>)<ul>
<li><code>MSXDOS</code> will be #defined</li>
</ul>
</li>
</ul>
<h2><a class="anchor" id="autotoc_md140"></a>
Console Hardware Properties</h2>
<p>Constants that describe properties of the console hardware are listed below. Their values will change to reflect the current console target that is being built.</p>
<ul>
<li><a class="el" href="nes_2hardware_8h.html#a519e327cac96f68a8ca9b77e0343672f">DEVICE_SCREEN_X_OFFSET</a>, <a class="el" href="nes_2hardware_8h.html#af334c0e7dd6e434b3dbebd45bcdeb75a">DEVICE_SCREEN_Y_OFFSET</a></li>
<li><a class="el" href="nes_2hardware_8h.html#add7f32ba868ef6517798f5fce337e4b2">DEVICE_SCREEN_WIDTH</a>, <a class="el" href="nes_2hardware_8h.html#ad252264fdcf900e5fbf611f7a45962ed">DEVICE_SCREEN_HEIGHT</a></li>
<li><a class="el" href="nes_2hardware_8h.html#a491dc081eae8c81e7ca88075ab806291">DEVICE_SCREEN_BUFFER_WIDTH</a>, <a class="el" href="nes_2hardware_8h.html#a81fb56b6778772f829dab4c534e7749e">DEVICE_SCREEN_BUFFER_HEIGHT</a></li>
<li><a class="el" href="nes_2hardware_8h.html#a4d682ed7a6158c5ba10afec739b17a8a">DEVICE_SCREEN_MAP_ENTRY_SIZE</a></li>
<li><a class="el" href="nes_2hardware_8h.html#af531e7ac0c0a58517fa3061631745c31">DEVICE_SPRITE_PX_OFFSET_X</a>, <a class="el" href="nes_2hardware_8h.html#a7f6c8420831388300bbec13ea4cb57a0">DEVICE_SPRITE_PX_OFFSET_Y</a></li>
<li><a class="el" href="sms_2hardware_8h.html#ad14c51cdfb347c34c364f54e67dc978d">DEVICE_SCREEN_PX_WIDTH</a>, <a class="el" href="sms_2hardware_8h.html#a7bd450aa268b881257089cf8cd6697ec">DEVICE_SCREEN_PX_HEIGHT</a></li>
</ul>
<h1><a class="anchor" id="autotoc_md141"></a>
Using &lt;gbdk/...&gt; headers</h1>
<p>Some include files under <code>&lt;gbdk/..&gt;</code> are cross platform and others allow the build process to auto-select the correct include file for the current target port and platform (console).</p>
<p>For example, the following can be used </p><pre class="fragment">#include &lt;gbdk/platform.h&gt;
#include &lt;gbdk/metasprites.h&gt;
</pre><p> Instead of </p><pre class="fragment">#include &lt;gb/gb.h&gt;
#include &lt;gb/metasprites.h&gt;
</pre><p> and </p><pre class="fragment">#include &lt;sms/sms.h&gt;
#include &lt;sms/metasprites.h&gt;
</pre><p><a class="anchor" id="docs_consoles_cross_platform_examples"></a></p>
<h1><a class="anchor" id="autotoc_md142"></a>
Cross Platform Example Projects</h1>
<p>GBDK includes an number of cross platform example projects. These projects show how to write code that can be compiled and run on multiple different consoles (for example Game Boy and Game Gear) with, in some cases, minimal differences.</p>
<p>They also show how to build for multiple target consoles with a single build command and <code>Makefile</code>. The <code>Makefile.targets</code> allows selecting different <code>port</code> and <code>plat</code> settings when calling the build stages.</p>
<h2><a class="anchor" id="autotoc_md143"></a>
Cross Platform Asset Example</h2>
<p>The cross-platform <code>Logo</code> example project shows how assets can be managed for multiple different console targets together.</p>
<p>In the example <a class="el" href="docs_toolchain.html#utility_png2asset">utility_png2asset</a> is used to generate assets in the native format for each console at compile-time from separate source PNG images. The Makefile is set to use the source PNG folder which matches the current console being compiled, and the source code uses <a class="el" href="gb_8h.html#a68651e50243349b48164a8ad983dca4e">set_native_tile_data()</a> to load the assets tiles in native format.</p>
<h1><a class="anchor" id="autotoc_md144"></a>
Hardware Summaries</h1>
<p>The specs below reflect the typical configuration of hardware when used with GBDK and is not meant as a complete list of their capabilities.</p>
<p>GB/AP/DUCK</p><ul>
<li>Sprites:<ul>
<li>256 tiles (upper 128 are shared with background) (amount is doubled in CGB mode)</li>
<li>tile flipping/mirroring: yes</li>
<li>40 total, max 10 per line</li>
<li>2 x 4 color palette (color 0 transparent). 8 x 4 color palettes in CGB mode</li>
</ul>
</li>
<li>Background: 256 tiles (typical setup: upper 128 are shared with sprites) (amount is doubled in CGB mode)<ul>
<li>tile flipping/mirroring: no (yes in CGB mode)</li>
<li>1 x 4 color palette. 8 x 4 color palettes in CGB mode</li>
</ul>
</li>
<li>Window "layer": available</li>
<li>Screen: 160 x 144</li>
<li>Hardware Map: 256 x 256</li>
</ul>
<p>SMS/GG</p><ul>
<li>Sprites:<ul>
<li>256 tiles (a bit less in the default setup)</li>
<li>tile flipping/mirroring: no</li>
<li>64 total, max 8 per line</li>
<li>1 x 16 color palette (color 0 transparent)</li>
</ul>
</li>
<li>Background: 512 tiles (upper 256 are shared with sprites)<ul>
<li>tile flipping/mirroring: yes</li>
<li>2 x 16 color palettes</li>
</ul>
</li>
<li>Window "layer": not available</li>
<li>SMS<ul>
<li>Screen: 256 x 192</li>
<li>Hardware Map: 256 x 224</li>
</ul>
</li>
<li>GG<ul>
<li>Screen: 160 x 144</li>
<li>Hardware Map: 256 x 224</li>
</ul>
</li>
</ul>
<p><a class="anchor" id="docs_consoles_safe_display_controller_access"></a></p>
<h2><a class="anchor" id="autotoc_md145"></a>
Safe VRAM / Display Controller Access</h2>
<p>GB/AP</p><ul>
<li>VRAM / Display Controller (PPU)<ul>
<li>VRAM and some other display data / registers should only be written to when the <a class="el" href="gb_2hardware_8h.html#a3b0bf7449b517b3cda2a89428db6deb9">STATF_B_BUSY</a> bit of <a class="el" href="gb_2hardware_8h.html#ad40ebf3b29add46cdd310a7e0802bc6b">STAT_REG</a> is off. Most GBDK API calls manage this automatically.</li>
</ul>
</li>
</ul>
<p>SMS/GG</p><ul>
<li>Display Controller (VDP)<ul>
<li>Writing to the VDP should not be interrupted while an operation is already in progress (since that will interfere with the internal data pointer causing data to be written to the wrong location).</li>
<li>Recommended approach: Avoid writing to the VDP (tiles, map, scrolling, colors, etc) during an interrupt routine (ISR).</li>
<li>Alternative (requires careful implementation): Make sure writes to the VDP during an ISR are only performed when the <a class="el" href="sms_8h.html#a388d1dff2698172ba8574e43f5c77c93">_shadow_OAM_OFF</a> flag indicates it is safe to do so.</li>
</ul>
</li>
</ul>
<p><a class="anchor" id="using_cgb_features"></a></p>
<h1><a class="anchor" id="autotoc_md146"></a>
Using Game Boy Color (CGB) Features</h1>
<h2><a class="anchor" id="autotoc_md147"></a>
Differences Versus the Regular Game Boy (DMG/GBP/SGB)</h2>
<p>These are some of the main hardware differences between the Regular Game Boy and the Game Boy Color.</p>
<ul>
<li>CPU: Optional 2x Speed mode</li>
<li>Serial Link: Additional Speeds 2KB/s, 32KB/s, 64KB/s</li>
<li>IR Port</li>
<li>Sprites:<ul>
<li>2 x 256 banks of tile patterns (2x as many) (typically upper 256 shared with background)</li>
<li>8 x 4 color palettes in CGB mode (BGR-555 per color, 32768 color choices)</li>
</ul>
</li>
<li>Background:<ul>
<li>2 x 256 banks of tile patterns (2x as many) (typically upper 256 shared with sprites)</li>
<li>Second map bank for tile attributes (color, flipping/mirroring, priority, bank)</li>
<li>8 x 4 color palettes in CGB mode (BGR-555 per color, 32768 color choices))</li>
<li>BG and Window master priority</li>
</ul>
</li>
<li>WRAM: 8 x 4K WRAM banks in the 0xD000 - 0xDFFF region</li>
<li>LCD VRAM DMA</li>
</ul>
<h2><a class="anchor" id="autotoc_md148"></a>
CGB features in GBDK</h2>
<p>These are some of the main GBDK API features for the CGB. Many of the items listed below link to additional information.</p>
<ul>
<li>Tile and Pattern data:<ul>
<li>Select VRAM Banks: <a class="el" href="gb_2hardware_8h.html#a5ccae0d556500e1055a0ec8de20c535a">VBK_REG</a> (used with <code>set_bkg/win/sprite_*()</code>)</li>
<li><a class="el" href="gb_8h.html#a0bcf384938628c4ab52e63b2df8f78f8">set_bkg_attributes()</a>, <a class="el" href="gb_8h.html#a1cefe143b3861632897e0c989401bce7">set_bkg_submap_attributes()</a></li>
</ul>
</li>
<li>Color:<ul>
<li><a class="el" href="msx_8h.html#a9f879bd31899f7989f887b6238de24e3">set_bkg_palette()</a>, <a class="el" href="msx_8h.html#a2215732f2ba2ec6406b65d3cca56a200">set_bkg_palette_entry()</a></li>
<li><a class="el" href="msx_8h.html#a7d5ed1aed79d8fd2894893d7f6f9b835">set_sprite_palette()</a>, <a class="el" href="msx_8h.html#a8b5c17235a3f65af70492e109a25f237">set_sprite_palette_entry()</a></li>
<li><a class="el" href="cgb_8h.html#a2a89f4110072dbe76805e7b07299788d">set_default_palette()</a></li>
<li><a class="el" href="cgb_8h.html#a4a118ad3ee36468a3fa616977a64864e">RGB()</a>, <a class="el" href="cgb_8h.html#a7d2ed0f10b2b74123a544327bbfd7564">RGB8()</a>, <a class="el" href="cgb_8h.html#ab5a6e450fcf10402278fe585a421dbbd">RGBHTML()</a></li>
</ul>
</li>
<li>Detect and change CPU speed: if (<a class="el" href="gb_8h.html#a874b9bd95b0a05d6a6072feabc879e45">_cpu</a> == <a class="el" href="gb_8h.html#aee435a3a0dde3dbd7b6112dbb456cde8">CGB_TYPE</a>), <a class="el" href="cgb_8h.html#a871b5b1aba74ab8764f72b73bc090adb">cpu_fast()</a></li>
<li>More details in <a class="el" href="cgb_8h.html">cgb.h</a> (<code>#include &lt;gb/cgb.h&gt;</code>)</li>
</ul>
<h2><a class="anchor" id="autotoc_md149"></a>
CGB Examples</h2>
<p>Several examples in GBDK show how to use CGB features, including the following:</p><ul>
<li><code>gb/colorbar</code>, <code>gb/dscan</code>, <code>cross-platform/large_map</code>, <code>cross-platform/logo</code>, <code>cross-platform/metasprites</code></li>
</ul>
<h1><a class="anchor" id="autotoc_md150"></a>
Porting Between Supported Consoles</h1>
<h2><a class="anchor" id="autotoc_md151"></a>
From Game Boy to Analogue Pocket</h2>
<p>The Analogue Pocket operating in <code>.pocket</code> mode is (for practical purposes) functionally identical to the Game Boy / Color though it has a couple changes listed below. These are handled automatically in GBDK as long as the practices outlined below are followed.</p>
<h3><a class="anchor" id="autotoc_md152"></a>
Official differences:</h3>
<ul>
<li>Altered register flag and address definitions<ul>
<li><a class="el" href="gb_2hardware_8h.html#ad40ebf3b29add46cdd310a7e0802bc6b">STAT</a> &amp; <a class="el" href="gb_2hardware_8h.html#a6515fdfaa50eeb7e63faeea54f77cd6b">LCDC</a>: Order of register bits is reversed<ul>
<li>Example: <a class="el" href="gb_2hardware_8h.html#ac112618942cb4719def91693616baaff">LCD on/off</a> is LCDC.0 instead of .7</li>
<li>Example: <a class="el" href="gb_2hardware_8h.html#ac1e4b66204a5bff207be36fdfedd63d5">LYC Interrupt enable</a> is STAT.1 instead of .6</li>
</ul>
</li>
<li><a class="el" href="gb_2hardware_8h.html#a6515fdfaa50eeb7e63faeea54f77cd6b">LCDC</a> address is <code>0xFF4E</code> instead of <code>0xFF40</code></li>
</ul>
</li>
<li>Different logo data in the header at address <code>0x0104</code>:<ul>
<li><code>0x01, 0x10, 0xCE, 0xEF, 0x00, 0x00, 0x44, 0xAA, 0x00, 0x74, 0x00, 0x18, 0x11, 0x95, 0x00, 0x34, 0x00, 0x1A, 0x00, 0xD5, 0x00, 0x22, 0x00, 0x69, 0x6F, 0xF6, 0xF7, 0x73, 0x09, 0x90, 0xE1, 0x10, 0x44, 0x40, 0x9A, 0x90, 0xD5, 0xD0, 0x44, 0x30, 0xA9, 0x21, 0x5D, 0x48, 0x22, 0xE0, 0xF8, 0x60</code></li>
</ul>
</li>
</ul>
<h3><a class="anchor" id="autotoc_md153"></a>
Observed differences:</h3>
<ul>
<li>MBC1 and MBC5 are supported, MBC3 won't save and RTC doesn't progress when game is not running, the HuC3 isn't supported at all (via JoseJX and sg).</li>
<li>The Serial Link port does not work</li>
<li>The IR port in CGB mode does not work as reliably as the Game Boy Color</li>
</ul>
<p>In order for software to be easily ported to the Analogue Pocket, or to run on both, use the following practices.</p>
<h3><a class="anchor" id="autotoc_md154"></a>
Registers and Flags</h3>
<p>Use API defined registers and register flags instead of hardwired ones.</p><ul>
<li>LCDC register: <a class="el" href="gb_2hardware_8h.html#a6515fdfaa50eeb7e63faeea54f77cd6b">LCDC_REG</a> or <a class="el" href="gb_2hardware_8h.html#a8b576a1fe1473ac4aff8afecb28035cb">rLCDC</a></li>
<li>STAT register: <a class="el" href="gb_2hardware_8h.html#ad40ebf3b29add46cdd310a7e0802bc6b">STAT_REG</a> or <a class="el" href="gb_2hardware_8h.html#a338ec378453b4457efdb3008978c0f28">rSTAT</a></li>
<li>LCDC flags: -&gt; LCDCF_... (example: <a class="el" href="gb_2hardware_8h.html#a1491fc03ed7f02e7309cc7b0c48b6c8a">LCDCF_ON</a>)</li>
<li>STAT flags: -&gt; STATF_... (example: <a class="el" href="gb_2hardware_8h.html#a3b53105cc5be896b48794ba82d2aeb4c">STATF_LYC</a>)</li>
</ul>
<h3><a class="anchor" id="autotoc_md155"></a>
Boot logo</h3>
<p>As long as the target console is <a class="el" href="docs_supported_consoles.html#docs_consoles_compiling">set during build time</a> then the correct boot logo will be automatically selected.</p>
<h2><a class="anchor" id="autotoc_md156"></a>
From Game Boy to SMS/GG</h2>
<h3><a class="anchor" id="autotoc_md157"></a>
Tile Data and Tile Map loading</h3>
<h4><a class="anchor" id="autotoc_md158"></a>
Tile and Map Data in 2bpp Game Boy Format</h4>
<ul>
<li><a class="el" href="gb_8h.html#a1f5101f2b7bb0123c26a3e257f843626">set_bkg_data()</a> and <a class="el" href="gb_8h.html#ae45b1c639698951b47e44fa8e89556f2">set_sprite_data()</a> will load 2bpp tile data in "game boy" format on both GB and SMS/GG.</li>
<li>On the SMS/GG <a class="el" href="gb_8h.html#aa224c9bac27c7fd268e62bdf33338a84">set_2bpp_palette()</a> sets 4 colors that will be used when loading 2bpp assets with <a class="el" href="gb_8h.html#a1f5101f2b7bb0123c26a3e257f843626">set_bkg_data()</a>. This allows GB assets to be easily colorized without changing the asset format. There is some performance penalty for using the conversion.</li>
<li><a class="el" href="msx_8h.html#a9a732aec1b7aec7d10a9d76ca4da2064">set_bkg_tiles()</a> loads 1-byte-per-tile tilemaps both for the GB and SMS/GG.</li>
</ul>
<h4><a class="anchor" id="autotoc_md159"></a>
Tile and Map Data in Native Format</h4>
<p>Use the following api calls when assets are avaialble in the native format for each platform.</p>
<p><a class="el" href="gb_8h.html#a68651e50243349b48164a8ad983dca4e">set_native_tile_data()</a></p><ul>
<li>GB/AP: loads 2bpp tiles data</li>
<li>SMS/GG: loads 4bpp tile data</li>
</ul>
<p><a class="el" href="gb_8h.html#a55f82ff980398dd97036fd936ebd727e">set_tile_map()</a></p><ul>
<li>GB/AP: loads 1-byte-per-tile tilemaps</li>
<li>SMS/GG: loads 2-byte-per-tile tilemaps</li>
</ul>
<p>There are also bit-depth specific API calls:</p><ul>
<li>1bpp: <a class="el" href="sms_8h.html#adcb394299a1033616fc7d2faec8bd6ad">set_1bpp_colors</a>, <a class="el" href="sms_8h.html#a4d5f74eed0489ebfdc2410ee3f9f7f04">set_bkg_1bpp_data</a>, <a class="el" href="sms_8h.html#a2cc121fbeb5570248531b85a8f0b5b97">set_sprite_1bpp_data</a></li>
<li>2bpp: <a class="el" href="sms_8h.html#aa224c9bac27c7fd268e62bdf33338a84">set_2bpp_palette</a>, <a class="el" href="sms_8h.html#aa7ba76e4d44dbf19da351fd1ea8e3023">set_bkg_2bpp_data</a>, <a class="el" href="sms_8h.html#a10ee2919fcab7a5c482816ed718d1c4a">set_sprite_2bpp_data</a>, <a class="el" href="sms_8h.html#ab752b1bb0f58da2a6d52e9747c4b3dd8">set_tile_2bpp_data</a> (sms/gg only)</li>
<li>2bpp: <a class="el" href="sms_8h.html#aeff13dca11be49e8c159820c616016ec">set_bkg_4bpp_data</a> (sms/gg only), <a class="el" href="sms_8h.html#a24f53cfe7e25c04fbb5dcb08cfb3b432">set_sprite_4bpp_data</a> (sms/gg only)</li>
</ul>
<h4><a class="anchor" id="autotoc_md160"></a>
Emulated Game Boy Color map attributes on the SMS/Game Gear</h4>
<p>On the Game Boy Color, <a class="el" href="gb_2hardware_8h.html#a5ccae0d556500e1055a0ec8de20c535a">VBK_REG</a> is used to select between the regular background tile map and the background attribute tile map (for setting tile color palette and other properties).</p>
<p>This behavior is emulated for the SMS/GG when using <a class="el" href="msx_8h.html#a9a732aec1b7aec7d10a9d76ca4da2064">set_bkg_tiles()</a> and <a class="el" href="gb_2hardware_8h.html#a5ccae0d556500e1055a0ec8de20c535a">VBK_REG</a>. It allows writing a 1-byte tile map separately from a 1-byte attributes map.</p>
<dl class="section note"><dt>Note</dt><dd>Tile map attributes on SMS/Game Gear use different control bits than the Game Boy Color, so a modified attribute map must be used.</dd></dl>
<h2><a class="anchor" id="autotoc_md161"></a>
From Game Boy to Mega Duck / Cougar Boy</h2>
<p>The Mega Duck is (for practical purposes) functionally identical to the Original Game Boy though it has a couple changes listed below.</p>
<h3><a class="anchor" id="autotoc_md162"></a>
Summary of Hardware changes:</h3>
<ul>
<li>Cartridge Boot Logo: not present on Mega Duck</li>
<li>Cartridge Header data: not present on Mega Duck</li>
<li>Program Entry Point: <code>0x0000</code> (on Game Boy: <code>0x0100</code> )</li>
<li>Display registers and flag definitions: Some changed</li>
<li>Audio registers and flag definitions: Some changed</li>
<li>MBC ROM bank switching register address: <code>0x0001</code> (many Game Boy MBCs use <code>0x2000 - 0x3FFF</code>)</li>
</ul>
<h3><a class="anchor" id="autotoc_md163"></a>
Best Practices</h3>
<p>In order for software to be easily ported to the Mega Duck, or to run on both, use these practices. That will allow GBDK to automatically handle <em>most</em> of the differences (for the exceptions see <a class="el" href="docs_supported_consoles.html#megaduck_sound_register_value_changes">Sound Register Value Changes</a>).</p><ul>
<li><a class="el" href="docs_supported_consoles.html#docs_consoles_compiling">Set the target console during build time</a></li>
<li>Use the GBDK definitions and macros for:<ul>
<li>Video Registers and Flags (examples: <a class="el" href="gb_2hardware_8h.html#a6515fdfaa50eeb7e63faeea54f77cd6b">LCDC_REG</a>, <a class="el" href="gb_2hardware_8h.html#a731588b96fb8cdbeb7e68c089373e6f8">LCDCF_BG8000</a>, etc)</li>
<li>Audio Registers and Flags (examples: <a class="el" href="gb_2hardware_8h.html#a7accf5feabd95a2d84c72f5915fff837">NR12_REG</a>, <a class="el" href="gb_2hardware_8h.html#a52593a64863d51fbf5860b0d31448972">NR43_REG</a>, etc)</li>
<li>Use the default <a class="el" href="msx_8h.html#ac996706e2a5e73f010841437f26d4d4f">SWITCH_ROM</a> macro for changing ROM banks</li>
</ul>
</li>
</ul>
<p><a class="anchor" id="megaduck_sound_register_value_changes"></a></p>
<h3><a class="anchor" id="autotoc_md164"></a>
Sound Register Value Changes</h3>
<p>There are two hardware changes which will not be handled automatically when following the practices mentioned above.</p>
<p>These changes may be required when using existing Sound Effects and Music Drivers written for the Game Boy.</p>
<ol type="1">
<li>Registers <a class="el" href="gb_2hardware_8h.html#a7accf5feabd95a2d84c72f5915fff837">NR12_REG</a>, <a class="el" href="gb_2hardware_8h.html#af1301c73bf93350045ba3a4887723ae8">NR22_REG</a>, <a class="el" href="gb_2hardware_8h.html#aba3d9fb63552bc02ec879696b581adac">NR42_REG</a>, and <a class="el" href="gb_2hardware_8h.html#a52593a64863d51fbf5860b0d31448972">NR43_REG</a> have their contents nybble swapped.<ul>
<li>To maintain compatibility the value to write (or the value read) can be converted this way: <code>((uint8_t)(value &lt;&lt; 4) | (uint8_t)(value &gt;&gt; 4))</code></li>
</ul>
</li>
<li>Register <a class="el" href="gb_2hardware_8h.html#a244ee6d8f6144be9b0f94602eddb6239">NR32_REG</a> has the volume bit values changed.<ul>
<li><code>Game Boy: Bits:6..5 : 00 = mute, 01 = 100%, 10 = 50%, 11 = 25%</code></li>
<li><code>Mega Duck: Bits:6..5 : 00 = mute, 01 = 25%, 10 = 50%, 11 = 100%</code></li>
<li>To maintain compatibility the value to write (or the value read) can be converted this way: <code>(((~(uint8_t)value) + (uint8_t)0x20u) &amp; (uint8_t)0x60u)</code></li>
</ul>
</li>
</ol>
<h3><a class="anchor" id="autotoc_md165"></a>
Graphics Register Bit Changes</h3>
<p>These changes are handled automatically when their GBDK definitions are used.</p>
<table class="markdownTable">
<tr class="markdownTableHead">
<th class="markdownTableHeadNone"><a class="el" href="gb_2hardware_8h.html#a6515fdfaa50eeb7e63faeea54f77cd6b">LCDC_REG</a> Flag </th><th class="markdownTableHeadNone">Game Boy </th><th class="markdownTableHeadNone">Mega Duck </th><th class="markdownTableHeadNone"></th><th class="markdownTableHeadNone">Purpose </th></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ac112618942cb4719def91693616baaff">LCDCF_B_ON</a> </td><td class="markdownTableBodyNone">.7 </td><td class="markdownTableBodyNone">.7 </td><td class="markdownTableBodyNone">(same) </td><td class="markdownTableBodyNone">Bit for LCD On/Off Select </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ac826fdb70a043ebb8f1b317b00db6ff3">LCDCF_B_WIN9C00</a> </td><td class="markdownTableBodyNone">.6 </td><td class="markdownTableBodyNone">.3 </td><td class="markdownTableBodyNone"></td><td class="markdownTableBodyNone">Bit for Window Tile Map Region Select </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ae1de721c95ddc8f29ba9b9deaee8d68c">LCDCF_B_WINON</a> </td><td class="markdownTableBodyNone">.5 </td><td class="markdownTableBodyNone">.5 </td><td class="markdownTableBodyNone">(same) </td><td class="markdownTableBodyNone">Bit for Window Display On/Off Control </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#aa336ca1c8bd29763222fc011a6272bdf">LCDCF_B_BG8000</a> </td><td class="markdownTableBodyNone">.4 </td><td class="markdownTableBodyNone">.4 </td><td class="markdownTableBodyNone">(same) </td><td class="markdownTableBodyNone">Bit for BG &amp; Window Tile Data Region Select </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a4889bb882e956665069212c4c8aa623b">LCDCF_B_BG9C00</a> </td><td class="markdownTableBodyNone">.3 </td><td class="markdownTableBodyNone">.2 </td><td class="markdownTableBodyNone"></td><td class="markdownTableBodyNone">Bit for BG Tile Map Region Select </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#aa8f5bcd5073aae5948a9647dcb76f779">LCDCF_B_OBJ16</a> </td><td class="markdownTableBodyNone">.2 </td><td class="markdownTableBodyNone">.1 </td><td class="markdownTableBodyNone"></td><td class="markdownTableBodyNone">Bit for Sprites Size Select </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a6f6852d0f1d295b03e1230d5d97cb3e9">LCDCF_B_OBJON</a> </td><td class="markdownTableBodyNone">.1 </td><td class="markdownTableBodyNone">.0 </td><td class="markdownTableBodyNone"></td><td class="markdownTableBodyNone">Bit for Sprites Display Visible/Hidden Select </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#aa1f66868f63af2af6544e84122de3cc3">LCDCF_B_BGON</a> </td><td class="markdownTableBodyNone">.0 </td><td class="markdownTableBodyNone">.6 </td><td class="markdownTableBodyNone"></td><td class="markdownTableBodyNone">Bit for Background Display Visible Hidden Select </td></tr>
</table>
<h3><a class="anchor" id="autotoc_md166"></a>
Detailed Register Address Changes</h3>
<p>These changes are handled automatically when their GBDK definitions are used.</p>
<table class="markdownTable">
<tr class="markdownTableHead">
<th class="markdownTableHeadNone">Register </th><th class="markdownTableHeadNone">Game Boy </th><th class="markdownTableHeadNone">Mega Duck </th></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a6515fdfaa50eeb7e63faeea54f77cd6b">LCDC_REG</a> </td><td class="markdownTableBodyNone">0xFF40 </td><td class="markdownTableBodyNone">0xFF10 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ad40ebf3b29add46cdd310a7e0802bc6b">STAT_REG</a> </td><td class="markdownTableBodyNone">0xFF41 </td><td class="markdownTableBodyNone">0xFF11 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a244b162cf13bbcb4fe842d7e298b39c2">SCY_REG</a> </td><td class="markdownTableBodyNone">0xFF42 </td><td class="markdownTableBodyNone">0xFF12 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a86cc170585319565195f2c163250be1f">SCX_REG</a> </td><td class="markdownTableBodyNone">0xFF43 </td><td class="markdownTableBodyNone">0xFF13 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#aeb643bd4eac2e6e410cae2fae677c0a7">LY_REG</a> </td><td class="markdownTableBodyNone">0xFF44 </td><td class="markdownTableBodyNone">0xFF18 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a591084a506c33266b7d6cc3b4b8936ae">LYC_REG</a> </td><td class="markdownTableBodyNone">0xFF45 </td><td class="markdownTableBodyNone">0xFF19 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ae13ce414d3fe7c98c1434918186dfc81">DMA_REG</a> </td><td class="markdownTableBodyNone">0xFF46 </td><td class="markdownTableBodyNone">0xFF1A </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#af577ba87ec3d13d7415e4c4a53cdf997">BGP_REG</a> </td><td class="markdownTableBodyNone">0xFF47 </td><td class="markdownTableBodyNone">0xFF1B </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a13f3e89f7b92258d825292e5058815c7">OBP0_REG</a> </td><td class="markdownTableBodyNone">0xFF48 </td><td class="markdownTableBodyNone">0xFF14 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a9da545164e049ef773128f869daece13">OBP1_REG</a> </td><td class="markdownTableBodyNone">0xFF49 </td><td class="markdownTableBodyNone">0xFF15 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a1c8d52607616ef37da335447e4cbe850">WY_REG</a> </td><td class="markdownTableBodyNone">0xFF4A </td><td class="markdownTableBodyNone">0xFF16 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a310aa43fbee2fd6b6b419df48acce1e0">WX_REG</a> </td><td class="markdownTableBodyNone">0xFF4B </td><td class="markdownTableBodyNone">0xFF17 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ad859dc62b1df1584ade0cbb822a3e46f">NR10_REG</a> </td><td class="markdownTableBodyNone">0xFF10 </td><td class="markdownTableBodyNone">0xFF20 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ad53dc7f22b99fce195210a95f2749a72">NR11_REG</a> </td><td class="markdownTableBodyNone">0xFF11 </td><td class="markdownTableBodyNone">0xFF22 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a7accf5feabd95a2d84c72f5915fff837">NR12_REG</a> </td><td class="markdownTableBodyNone">0xFF12 </td><td class="markdownTableBodyNone">0xFF21 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a3d30d4797321b403cd713d727fa3db6c">NR13_REG</a> </td><td class="markdownTableBodyNone">0xFF13 </td><td class="markdownTableBodyNone">0xFF23 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a04c340d91842e8ee2b93922c2bcf39a4">NR14_REG</a> </td><td class="markdownTableBodyNone">0xFF14 </td><td class="markdownTableBodyNone">0xFF24 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a6dd3af1c8e3c66409aa0bc889d98e171">NR21_REG</a> </td><td class="markdownTableBodyNone">0xFF16 </td><td class="markdownTableBodyNone">0xFF25 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#af1301c73bf93350045ba3a4887723ae8">NR22_REG</a> </td><td class="markdownTableBodyNone">0xFF17 </td><td class="markdownTableBodyNone">0xFF27 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a7bb32ac86e3fbf5f869410ba42620616">NR23_REG</a> </td><td class="markdownTableBodyNone">0xFF18 </td><td class="markdownTableBodyNone">0xFF28 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a6676e579a5e421adfb3d3e2d470d9ab6">NR24_REG</a> </td><td class="markdownTableBodyNone">0xFF19 </td><td class="markdownTableBodyNone">0xFF29 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a85d8e680d4d40a918b4195d2a4fada2a">NR30_REG</a> </td><td class="markdownTableBodyNone">0xFF1A </td><td class="markdownTableBodyNone">0xFF2A </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#aea78f857e34370d7e1177a8bafe08148">NR31_REG</a> </td><td class="markdownTableBodyNone">0xFF1B </td><td class="markdownTableBodyNone">0xFF2B </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a244ee6d8f6144be9b0f94602eddb6239">NR32_REG</a> </td><td class="markdownTableBodyNone">0xFF1C </td><td class="markdownTableBodyNone">0xFF2C </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a01c768b60853c8eecdefc2cedfc8d672">NR33_REG</a> </td><td class="markdownTableBodyNone">0xFF1D </td><td class="markdownTableBodyNone">0xFF2E </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ab6da3e2cdbac1331bef3f6de9c808ab1">NR34_REG</a> </td><td class="markdownTableBodyNone">0xFF1E </td><td class="markdownTableBodyNone">0xFF2D </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a557833cc1671aa0bd71f33766b4e0f24">NR41_REG</a> </td><td class="markdownTableBodyNone">0xFF20 </td><td class="markdownTableBodyNone">0xFF40 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#aba3d9fb63552bc02ec879696b581adac">NR42_REG</a> </td><td class="markdownTableBodyNone">0xFF21 </td><td class="markdownTableBodyNone">0xFF42 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a52593a64863d51fbf5860b0d31448972">NR43_REG</a> </td><td class="markdownTableBodyNone">0xFF22 </td><td class="markdownTableBodyNone">0xFF41 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a849d2cff8df2655f86b294466bec40d6">NR44_REG</a> </td><td class="markdownTableBodyNone">0xFF23 </td><td class="markdownTableBodyNone">0xFF43 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#a924fdf48f6ad020423f6309055314928">NR50_REG</a> </td><td class="markdownTableBodyNone">0xFF24 </td><td class="markdownTableBodyNone">0xFF44 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ab28f97eabd5f32d48ea27d97bd5dc64f">NR51_REG</a> </td><td class="markdownTableBodyNone">0xFF25 </td><td class="markdownTableBodyNone">0xFF46 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><a class="el" href="gb_2hardware_8h.html#ac429365dce851ca57d8fe4f7c54a1caa">NR52_REG</a> </td><td class="markdownTableBodyNone">0xFF26 </td><td class="markdownTableBodyNone">0xFF45 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td><td class="markdownTableBodyNone">- </td></tr>
</table>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.14-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
</div>
</body>
</html>