<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://f256wiki.wildbitscomputing.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WF</id>
	<title>Foenix F256 / Wildbits/K2 Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://f256wiki.wildbitscomputing.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WF"/>
	<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Special:Contributions/WF"/>
	<updated>2026-04-18T13:04:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38529</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38529"/>
		<updated>2026-04-15T01:12:09Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth, which should on its own be feasible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|1024&lt;br /&gt;
|888&lt;br /&gt;
|4×256&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|No 4bpp, this is all 8bpp&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|666&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites. RGB channels share low bit, 5551 = 16 bits&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
Scrolllable (requires stride or power-of-2 width/height etc) vs fixed (320x240|200 linear)&lt;br /&gt;
&lt;br /&gt;
RLE vs uncompressed. If RLE is scrollable, it&#039;ll need the line index. If RLE is fixed, then spans can cross scanlines and it&#039;s basically a continuous 1d compression&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64px tall (though 32px wide max) and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits? However, the initial scan of the sprite registers could assemble one linked list per layer. For each sprite, do vertical &amp;amp; horizontal clipping, if it&#039;s visible onscreen, then add it to the head of the linked list for its particular layer. 2 writes: update head pointer in layer, update next pointer in BRAM. This can be pipelined if needed. Then on render, multiple sprites can be set up simultaneously, if they don&#039;t overlap. So if we have 2 sprite renderer blocks, then if (xMax_Back ≥ xMin_Front) &amp;amp;&amp;amp; (xMin_Back ≤ x2Front) then there is overlap and the back sprite stalls waiting for the front sprite to finish. Need to calculate the mask of pixels they need, which based on base pointer plus bit depth, yields a sparse list of addresses that need to be read. Now, I think all graphics need this computation and might be part of the actual ram bus driver to save space?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38528</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38528"/>
		<updated>2026-04-15T00:04:53Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Bitmaps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth, which should on its own be feasible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|1024&lt;br /&gt;
|888&lt;br /&gt;
|4×256&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|No 4bpp, this is all 8bpp&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|666&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites. RGB channels share low bit, 5551 = 16 bits&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
Scrolllable (requires stride or power-of-2 width/height etc) vs fixed (320x240|200 linear)&lt;br /&gt;
&lt;br /&gt;
RLE vs uncompressed. If RLE is scrollable, it&#039;ll need the line index. If RLE is fixed, then spans can cross scanlines and it&#039;s basically a continuous 1d compression&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits? However, the initial scan of the sprite registers could assemble one linked list per layer. For each sprite, do vertical &amp;amp; horizontal clipping, if it&#039;s visible onscreen, then add it to the head of the linked list for its particular layer. 2 writes: update head pointer in layer, update next pointer in BRAM. This can be pipelined if needed. Then on render, multiple sprites can be set up simultaneously, if they don&#039;t overlap. So if we have 2 sprite renderer blocks, then if (xMax_Back ≥ xMin_Front) &amp;amp;&amp;amp; (xMin_Back ≤ x2Front) then there is overlap and the back sprite stalls waiting for the front sprite to finish. Need to calculate the mask of pixels they need, which based on base pointer plus bit depth, yields a sparse list of addresses that need to be read. Now, I think all graphics need this computation and might be part of the actual ram bus driver to save space?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38527</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38527"/>
		<updated>2026-04-13T01:13:34Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth, which should on its own be feasible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|1024&lt;br /&gt;
|888&lt;br /&gt;
|4×256&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|No 4bpp, this is all 8bpp&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|666&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites. RGB channels share low bit, 5551 = 16 bits&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits? However, the initial scan of the sprite registers could assemble one linked list per layer. For each sprite, do vertical &amp;amp; horizontal clipping, if it&#039;s visible onscreen, then add it to the head of the linked list for its particular layer. 2 writes: update head pointer in layer, update next pointer in BRAM. This can be pipelined if needed. Then on render, multiple sprites can be set up simultaneously, if they don&#039;t overlap. So if we have 2 sprite renderer blocks, then if (xMax_Back ≥ xMin_Front) &amp;amp;&amp;amp; (xMin_Back ≤ x2Front) then there is overlap and the back sprite stalls waiting for the front sprite to finish. Need to calculate the mask of pixels they need, which based on base pointer plus bit depth, yields a sparse list of addresses that need to be read. Now, I think all graphics need this computation and might be part of the actual ram bus driver to save space?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=65816_C_Compilers&amp;diff=38516</id>
		<title>65816 C Compilers</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=65816_C_Compilers&amp;diff=38516"/>
		<updated>2026-03-21T02:30:24Z</updated>

		<summary type="html">&lt;p&gt;WF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;[https://www.westerndesigncenter.com/wdc/tools.php WDC]&lt;br /&gt;
;[https://www.calypsi.cc/ Calypsi]&lt;br /&gt;
;[https://github.com/X65/K816 K816] (C-ish high level language)&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38515</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38515"/>
		<updated>2026-03-13T17:02:52Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth, which should on its own be feasible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|1024&lt;br /&gt;
|888&lt;br /&gt;
|4×256&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|No 4bpp, this is all 8bpp&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|666&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites. RGB channels share low bit, 5551 = 16 bits&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38509</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38509"/>
		<updated>2026-03-09T01:01:53Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D000: Master Control Registers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers 0-1 ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|MT_OVLY*&lt;br /&gt;
|MEMTEXT*&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MEMTEXT&#039;&#039;&#039;: Enable MEMTEXT mode (replaces text layer). Core2x only!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MT_OVLY&#039;&#039;&#039;: Show BG in overlay mode when BG = 0. Core2x only!&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00A: Master Control Register 2 ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00A&lt;br /&gt;
|$F0:100A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Drawline Enable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles safety margin from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D180: Bresenham Lines (Core2x Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D180&lt;br /&gt;
|$F0:1180&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Reset&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Bitmap #&lt;br /&gt;
|Start&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|Busy&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Reset&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Bitmap #&lt;br /&gt;
|Start&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|$D181&lt;br /&gt;
|$F0:1181&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Color&lt;br /&gt;
|-&lt;br /&gt;
|$D182&lt;br /&gt;
|$F0:1182&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X0 (16 bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO Data Count (13 bit, 8k depth)&lt;br /&gt;
|-&lt;br /&gt;
|$D184&lt;br /&gt;
|$F0:1184&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X1 (16 bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D186&lt;br /&gt;
|$F0:1186&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y0&lt;br /&gt;
|-&lt;br /&gt;
|$D187&lt;br /&gt;
|$F0:1187&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y1&lt;br /&gt;
|}&lt;br /&gt;
This shares timing with the 2nd bank of sprites, so the two are mutually exclusive.&lt;br /&gt;
&lt;br /&gt;
BASIC Example:&lt;br /&gt;
 1000  proc hwline(x0,y0,x1,y1,col)&lt;br /&gt;
 1005    ?$D00A=1:?$D180=1:pokew $D182,0&lt;br /&gt;
 1010    ?$D181=col:pokew $D182,x0:pokew $D184,x1&lt;br /&gt;
 1020    ?$D186=y0:?$D187=y1&lt;br /&gt;
 1030    ?$D180=3&lt;br /&gt;
 1040    while (?$D180&amp;amp;$80)&amp;lt;&amp;gt;$80:wend&lt;br /&gt;
 1045    ?$D00A=0&lt;br /&gt;
 1050  endproc&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MASK0&#039;&#039;&amp;lt;/u&amp;gt;*&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = Experimental in wf-dma cores, masks out $00 bytes from the source data, skipping writes for those pixels.&lt;br /&gt;
&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;br /&gt;
&lt;br /&gt;
== IO Page 4 (Core2x Only) ==&lt;br /&gt;
&lt;br /&gt;
=== $C000: LUT For MEMTEXT FG/BG Colors ===&lt;br /&gt;
&lt;br /&gt;
== IO Page 4 (Core2x Only) ==&lt;br /&gt;
&lt;br /&gt;
=== $C000: MEMTEXT Font Memory ===&lt;br /&gt;
4× Banks of 256 8×8 characters, or&lt;br /&gt;
&lt;br /&gt;
2× Banks of 256 8×16 characters&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38508</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38508"/>
		<updated>2026-03-09T00:48:10Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D180: Bresenham Lines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles safety margin from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D180: Bresenham Lines (Core2x Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D180&lt;br /&gt;
|$F0:1180&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Reset&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Bitmap #&lt;br /&gt;
|Start&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|Busy&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Reset&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Bitmap #&lt;br /&gt;
|Start&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|$D181&lt;br /&gt;
|$F0:1181&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Color&lt;br /&gt;
|-&lt;br /&gt;
|$D182&lt;br /&gt;
|$F0:1182&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X0 (16 bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO Data Count (13 bit, 8k depth)&lt;br /&gt;
|-&lt;br /&gt;
|$D184&lt;br /&gt;
|$F0:1184&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X1 (16 bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D186&lt;br /&gt;
|$F0:1186&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y0&lt;br /&gt;
|-&lt;br /&gt;
|$D187&lt;br /&gt;
|$F0:1187&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y1&lt;br /&gt;
|}&lt;br /&gt;
This shares timing with the 2nd bank of sprites, so the two are mutually exclusive.&lt;br /&gt;
&lt;br /&gt;
BASIC Example:&lt;br /&gt;
 1000  proc hwline(x0,y0,x1,y1,col)&lt;br /&gt;
 1005    ?$D00A=1:?$D180=1:pokew $D182,0&lt;br /&gt;
 1010    ?$D181=col:pokew $D182,x0:pokew $D184,x1&lt;br /&gt;
 1020    ?$D186=y0:?$D187=y1&lt;br /&gt;
 1030    ?$D180=3&lt;br /&gt;
 1040    while (?$D180&amp;amp;$80)&amp;lt;&amp;gt;$80:wend&lt;br /&gt;
 1045    ?$D00A=0&lt;br /&gt;
 1050  endproc&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MASK0&#039;&#039;&amp;lt;/u&amp;gt;*&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = Experimental in wf-dma cores, masks out $00 bytes from the source data, skipping writes for those pixels.&lt;br /&gt;
&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38507</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38507"/>
		<updated>2026-03-09T00:36:40Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D100: Bitmaps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles safety margin from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D180: Bresenham Lines =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D180&lt;br /&gt;
|$F0:1180&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Reset&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Bitmap #&lt;br /&gt;
|Start&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|Busy&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Reset&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Bitmap #&lt;br /&gt;
|Start&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|$D181&lt;br /&gt;
|$F0:1181&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Color&lt;br /&gt;
|-&lt;br /&gt;
|$D182&lt;br /&gt;
|$F0:1182&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X0 (16 bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO Data Count (13 bit, 8k depth)&lt;br /&gt;
|-&lt;br /&gt;
|$D184&lt;br /&gt;
|$F0:1184&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X1 (16 bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D186&lt;br /&gt;
|$F0:1186&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y0&lt;br /&gt;
|-&lt;br /&gt;
|$D187&lt;br /&gt;
|$F0:1187&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y1&lt;br /&gt;
|}&lt;br /&gt;
BASIC Example:&lt;br /&gt;
 1000  proc hwline(x0,y0,x1,y1,col)&lt;br /&gt;
 1005    ?$D00A=1:?$D180=1:pokew $D182,0&lt;br /&gt;
 1010    ?$D181=col:pokew $D182,x0:pokew $D184,x1&lt;br /&gt;
 1020    ?$D186=y0:?$D187=y1&lt;br /&gt;
 1030    ?$D180=3&lt;br /&gt;
 1040    while (?$D180&amp;amp;$80)&amp;lt;&amp;gt;$80:wend&lt;br /&gt;
 1045    ?$D00A=0&lt;br /&gt;
 1050  endproc&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MASK0&#039;&#039;&amp;lt;/u&amp;gt;*&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = Experimental in wf-dma cores, masks out $00 bytes from the source data, skipping writes for those pixels.&lt;br /&gt;
&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38506</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38506"/>
		<updated>2026-03-09T00:18:27Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $DF00: DMA Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles safety margin from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MASK0&#039;&#039;&amp;lt;/u&amp;gt;*&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = Experimental in wf-dma cores, masks out $00 bytes from the source data, skipping writes for those pixels.&lt;br /&gt;
&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38505</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38505"/>
		<updated>2026-03-08T21:17:49Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $DF00: DMA Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles safety margin from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MASK0&#039;&#039;&amp;lt;/u&amp;gt;*&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = Experimental in wf-dma cores&lt;br /&gt;
&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=FPU_Accumulator&amp;diff=38504</id>
		<title>FPU Accumulator</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=FPU_Accumulator&amp;diff=38504"/>
		<updated>2026-03-08T06:31:08Z</updated>

		<summary type="html">&lt;p&gt;WF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This design for a better FPU block for 8/16 bit access, which also integrates 32-bit integer processing. While it&#039;s 32 bits, copying around 32-bit values with the CPU is mostly avoided.&lt;br /&gt;
&lt;br /&gt;
There are 256 32-bit zeropage-like registers and one 32-bit accumulator. Any of the registers can hold useful constants (including 0, 1, etc) for reference. It&#039;s similar to the 6502 accumulator and zeropage values.&lt;br /&gt;
&lt;br /&gt;
(TBD - registers in RAM or FPGA? Former allows swapping in new sets, but more complicated bus mastering, steal cpu cycles.)&lt;br /&gt;
&lt;br /&gt;
Commands are issued by writing a byte to an I/O location. The location identifies the command to trigger, and the byte written is often a selector for which register number to use, sometimes a literal integer value, or ignored.&lt;br /&gt;
&lt;br /&gt;
Status bits (TBD) are available to read, with various errors, and integer as well as fp Z/N/V/C flags just like the 6502. V and C are only for integer ops.&lt;br /&gt;
&lt;br /&gt;
* Overflow/underflow (fp/int range, as well as f2i)&lt;br /&gt;
* Division by zero&lt;br /&gt;
* Int conversion lost fractional portion&lt;br /&gt;
&lt;br /&gt;
Set the integer fixed point location (TBD) which affects multiply, divide, and conversion with floats.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; - should there be separate signed &amp;amp; unsigned variants of integer operations (including F2I), or a mode bit for signedness? Should all integer commands respect a single signedness control flag?&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
For optimization of applying a stream of mathematical ops in repetitive ways, you can save bytecodes in the FPGA registers. These are generally in the form of &amp;lt;code&amp;gt;&amp;lt;op&amp;gt; &amp;lt;param&amp;gt;&amp;lt;/code&amp;gt; in terms of applying a write of byte &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; at op location &amp;lt;code&amp;gt;&amp;lt;op&amp;gt;&amp;lt;/code&amp;gt;. This is fine for very fixed pipelines with input data always at one location. However, for general use this will require its own set of flow control and register indices to loop over sets of registers, indirect through computed register values, or receive &amp;quot;pointers&amp;quot; to a register and using offsets.&lt;br /&gt;
&lt;br /&gt;
Op &amp;lt;code&amp;gt;run &amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;, although these could nest generally to support subroutines. Not sure how to handle the stack.&lt;br /&gt;
&lt;br /&gt;
Control flow would be unconditional loops, with tests to exit the loop on: Accumulator == 0, or offset = val.&lt;br /&gt;
&lt;br /&gt;
=== Option 1: Offset register ===&lt;br /&gt;
Add another 8-bit &amp;quot;offset&amp;quot; register, and an enable bit to config. Op to write, set mask, or reset mask against the config register. When enabled, all registers have an offset added to it. Op to set the offset, or add a signed 8-bit value to the offset. This allows scripting to advance through the register set.&lt;br /&gt;
&lt;br /&gt;
=== Option 2: Indirection ===&lt;br /&gt;
Have a mode bit for indirection. Any reg access will indirect through that register, but we&#039;ll need an offset for that as well? Annoying to swap between indirect and non-indirect, unless we move to 128 regs per bank?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; - directly support matrix multiplication and matrix addition, with width/height registers. Should hopefully be applicable to vector ops as well. BRAM is dual-ported, so we could read 2 registers to multiply per cycle, though multiplication is probably a couple of cycles. Could instantiate a couple of multipliers to really pipeline this hard.&lt;br /&gt;
&lt;br /&gt;
The given register (offset ignored!) is input A, the &amp;quot;matrix param&amp;quot; is input B, register A + offset is the output register? But then we can&#039;t iterate matrices with the output register. But we also likely can&#039;t overwrite a matrix as we compute, because we&#039;re using it as an input. Don&#039;t want to waste LUT space copying a matrix into a reserved area. But we could also use regs 0-8 as a temp 3x3 matrix? Nah, that&#039;s another copying a matrix, dummy operation. This could be a 4-byte op instead of 2: MATMUL, A, B, Result? Have 3 registers, when you write to Result it triggers it? Writing a register should capture whether it&#039;s in RAM and the register bank number.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Config registers&lt;br /&gt;
!&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Integer Control&#039;&#039;&#039;&lt;br /&gt;
|Signed&lt;br /&gt;
|64bit reg0&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Fixed point frac bits (0-31)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Mode&#039;&#039;&#039;&lt;br /&gt;
|RAM&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Regnum Hi (0-1 for fpga)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Register offset&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Offset&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Matrix Size&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Rows&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Columns&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Offset Enable&#039;&#039;&#039;&lt;br /&gt;
|All non-matrix&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Result&lt;br /&gt;
|MATB&lt;br /&gt;
|MATA&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bitmask&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Mask, for setting/resetting&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;RAM Start&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |24-bit address? Or in multiples of 4kB banks?&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Shared Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LOAD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|STORE&lt;br /&gt;
|Reg&lt;br /&gt;
|Reg = A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|SWAP&lt;br /&gt;
|Reg&lt;br /&gt;
|(A, Reg) = (Reg, A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LEXTRA&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Extra&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MASKW&lt;br /&gt;
|Reg&lt;br /&gt;
|Write mask to register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MASKS&lt;br /&gt;
|Reg&lt;br /&gt;
|Set mask bits in register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MASKC&lt;br /&gt;
|Reg&lt;br /&gt;
|Clear mask bits in register&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Floating Point Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FADD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A + Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FSUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A - Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FRSUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg - A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMUL&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A * Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FDIV&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A / Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FRDIV&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg / A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|F2I&lt;br /&gt;
|Signed flag&lt;br /&gt;
|A = Int(A) or UInt(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMIN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Min(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMAX&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Max(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FABS&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Abs(A)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Maybe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FADDB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A + Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FSUBB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A - Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMULB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A * Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FDIVB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A / Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FCLR&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = 0.0 (LOAD instead)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FNEG&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = -A (FRSUB instead)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FRECIP&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = 1.0/A (FRDIV instead)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FPOW&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A ^ Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FSQRT&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Sqrt(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FTRIG&lt;br /&gt;
|0&lt;br /&gt;
|A = Sin(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|A = Cos(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|A = Tan(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FATAN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Atan(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Sec(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Csc(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Cot(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FACOT&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Arccot(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Arcsin(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Arccos(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FFLOOR&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Floor(A), Reg = Frac(A)  (options?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FCEIL&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Ceil(A), Reg = Frac(A)  (options?)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Matrix Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MATA&lt;br /&gt;
|Reg&lt;br /&gt;
|Set param A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MATB&lt;br /&gt;
|Reg&lt;br /&gt;
|Set param B&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MATMUL&lt;br /&gt;
|Reg&lt;br /&gt;
|Reg = MATA * MATB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|MATADD&lt;br /&gt;
|Reg&lt;br /&gt;
|Reg = MATA + MATB&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Integer Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IADD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A + Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IADDC&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A + Reg + C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A - Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISUBC&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A - Reg - !C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IRSUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg - A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISETC&lt;br /&gt;
|0 or 1&lt;br /&gt;
|C = Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IMUL&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A * Reg (TBD - 64-bit result? Could auto-write Reg 0?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IDIV&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A / Reg (TBD - combined DIVMOD? 64/32 DIV?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IMOD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A % Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ICMP&lt;br /&gt;
|Reg&lt;br /&gt;
|Status = A - Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|INEG&lt;br /&gt;
|0&lt;br /&gt;
|A = -A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IAND&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A &amp;amp; Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IOR&lt;br /&gt;
|Reg&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;A = A | Reg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IXOR&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A ^ Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|I2F&lt;br /&gt;
|Signed Flag&lt;br /&gt;
|A = Float(Int(A)) or Float(UInt(A))&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISHL&lt;br /&gt;
|Count&lt;br /&gt;
|A = A &amp;lt;&amp;lt; Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISHR&lt;br /&gt;
|Count&lt;br /&gt;
|A = A &amp;gt;&amp;gt; Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISSHR&lt;br /&gt;
|Count&lt;br /&gt;
|A = A &amp;gt;&amp;gt;(signed) Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IROLL&lt;br /&gt;
|Count&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;A = (A &amp;lt;&amp;lt; Count) | (A &amp;gt;&amp;gt; (32 - Count))&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IUMIN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Min(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISMIN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Min(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IUMAX&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Max(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISMAX&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Max(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IABS&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Abs(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET0&lt;br /&gt;
|Byte&lt;br /&gt;
|Set byte 0 of accumulator&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET1&lt;br /&gt;
|Byte&lt;br /&gt;
|Set byte 1 of accumulator&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET2&lt;br /&gt;
|Byte&lt;br /&gt;
|Set byte 2 of accumulator&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET3&lt;br /&gt;
|Byte&lt;br /&gt;
|Set Byte 3 of accumulator&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38503</id>
		<title>WF FPGA Ideas</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38503"/>
		<updated>2026-03-03T00:25:07Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Memtext Bitmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Video enhancements ==&lt;br /&gt;
[[WF16 Video Architecture]]&lt;br /&gt;
&lt;br /&gt;
== Math coprocessor ==&lt;br /&gt;
[[FPU Accumulator]]&lt;br /&gt;
&lt;br /&gt;
== SDCard ==&lt;br /&gt;
Auto-tx on read. Could supersede this with auto-reading a 16-bit length to a storage pointer, running in the background, flag or interrupt when done. Loading straight into DDR3 would be good once audio/video can read from there.&lt;br /&gt;
&lt;br /&gt;
Stream MP3 or MIDI file from disk (or ddr3?) straight to chips&lt;br /&gt;
&lt;br /&gt;
== Memtext Bitmap ==&lt;br /&gt;
Akin to the C64 hi-res bitmap mode, have a 640x480 1bpp bitmap with 8x8 color cells as defined by the existing memtext (or on-FPGA?) color attributes.&lt;br /&gt;
&lt;br /&gt;
Font currently takes &lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
&lt;br /&gt;
* Address of bitmap data (same as memtext font pointer)&lt;br /&gt;
* Choose cell-based (C64-like, follows 8x8 or 8x16 memtext selection) or linear pixel byte layout&lt;br /&gt;
* FPGA color matrix (2x 16-color) or RAM color matrix (2x 256-color)&lt;br /&gt;
It&#039;s annoying that this has its own separate palette, which takes up a lot of space, but I get it that it&#039;s a separate parallel pipeline to the &amp;quot;graphics&amp;quot; section. However, I&#039;d rather just have it select which CLUT to use for FG and BG.&lt;br /&gt;
&lt;br /&gt;
== Bootstrap and Machine Identity ==&lt;br /&gt;
Access to the cores SDCard. Name something better than the current hardcoded names.&lt;br /&gt;
&lt;br /&gt;
Soft-boot into one of the other cores, instead of relying on jumpers to select the core. Have an extended PGZ header or new file format that can request such things. Note that PGZ should say how many and which 8k blocks or 64k banks it&#039;s hardcoded for. Should be another load format for &amp;quot;play nice&amp;quot; system tools that can be simultaneously loaded.&lt;br /&gt;
&lt;br /&gt;
Identify cores by an 8 character ASCII string, instead of bit fields. Maybe have a version number (16 bit) per release of any named platform.&lt;br /&gt;
&lt;br /&gt;
Have different ROM loads for different cores? Or boot from RAM if some magic bytes occur there instead of ROM., though that would be part of the ROM boot that can do that, what ISA would the code be?&lt;br /&gt;
&lt;br /&gt;
RP2040 uses the Slave SelectMAX x8 config interface of the FPGA, and its 8 data pins should be GPIO for the FPGA to talk back to the RP after it&#039;s up and running (unless the pins are used for something else). The RP software needs updating for that.&lt;br /&gt;
&lt;br /&gt;
Simplest comms would be splitting the 8-bit path into two 4-bit independent directional channels. Clock (toggle when new data is sent), Ack (receiver toggles when it&#039;s read), 2 data bits. All polled on the software end. The RP2040 could be crunching FAT32 stuff while the FPGA is waiting to write to it, no problem.&lt;br /&gt;
&lt;br /&gt;
SRAM can be retained between resets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;char my_crash_info[100] __attribute__((section(&amp;quot;.uninitialized_data&amp;quot;)));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and with a macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#define __uninitialized_ram(group) __attribute__((section(&amp;quot;.uninitialized_data.&amp;quot; #group))) group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;datetime_t __uninitialized_ram(persist_date);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tentatively Proposed RP2040 Startup ===&lt;br /&gt;
&lt;br /&gt;
* Read SD Card for magic &amp;lt;code&amp;gt;/MYCORE.TXT&amp;lt;/code&amp;gt; file containing the full path of the core filename to boot.&lt;br /&gt;
** If this exists, DIP switches can be some form of override. Need to be able to break in if something messes up. On configuring MYCORE, always tell the user to set their DIP switches to 00.&lt;br /&gt;
** If this doesn&#039;t exist, oldsk00l DIP switches determine the core to boot.&lt;br /&gt;
* Load compressed core file from card and get the FPGA going.&lt;br /&gt;
** Set the FPGA comm handshake pins to 0 before releasing the init/reset command to the FPGA.&lt;br /&gt;
* Load &amp;lt;code&amp;gt;/RPLIB&amp;lt;/code&amp;gt; library and jump into it, if exists (else infinite loop). This runs whatever library functionality can talk to the FPGA, and is upgradable as a file through the loaded utilities.&lt;br /&gt;
The library should have functions to browse the cores sdcard, and select which file to boot with.&lt;br /&gt;
&lt;br /&gt;
TODO - do the core selection DIP pins also hit the FPGA for flash banking? If so, then we might not be able to escape them.&lt;br /&gt;
&lt;br /&gt;
== Timers ==&lt;br /&gt;
Ensure that the 24-bit value latches when the LSB is read (or the MSB is written?) for consistent reads.&lt;br /&gt;
&lt;br /&gt;
== Wavetable Audio ==&lt;br /&gt;
Some form of wavetable audio is sorely missing for Amiga, TG16, SNES, Soundblaster era audio, especially sound effects. Basic multiple channels of stereo or panned mono, uncompressed samples, support some simple compression formats.&lt;br /&gt;
&lt;br /&gt;
Pull small buffers of audio into the FPGA from RAM, keep 2 live at a time, one playing, one buffered. At 25MHz with a 48KHz sample rate, 1 sample lasts 520 cycles (20µsec), could be fast enough to fetch while the last sample is playing and just single-buffer it? Or even a rolling window Should also support just-in-time software generation of each buffer, with IRQ notifications.&lt;br /&gt;
&lt;br /&gt;
Stretch samples to whatever the output sampling rate is. Linear interpolation would be neat, but probably optional. Same with the decay-to-zero that many old synth chips had.&lt;br /&gt;
&lt;br /&gt;
== Sound Chip Instances ==&lt;br /&gt;
Instead of duplicating hardware instances of sound chips, multiplex all their registers and internal variables. Access would select 1 of them, and the hardware would run with that multiplexer active on all its values. Compare the size taken, depends on how complex the chip is.&lt;br /&gt;
&lt;br /&gt;
Since sound chips don&#039;t need to be that fast, serially looping through and executing a cycle, accumulating their output, for the final audio sample would be fine. Some of them do this internally with their voices anyway.&lt;br /&gt;
&lt;br /&gt;
Register to select which instance(s) to use, so programs can be agnostic to what sound context exists with other things. Probably expose 2 chips at a time through the IO registers, with a separate one to select which bank of 2 to use. At least for mono chips, or those which are commonly in pairs. Stereo chips could just have 1 register set exposed.&lt;br /&gt;
&lt;br /&gt;
== 65816 support ==&lt;br /&gt;
Remap page 0 into any 64kB bank, allowing direct page, stack, etc, to have its own swappable space. However, need to consider how this goes for interrupts. An interrupt will probably have to remap to hardware bank 0, but then somehow restore the bank that used to be there. Keeping the upper 256 bytes locked somewhere (flash or bank 0 RAM) would solve that. The 8kB MMU can be used for these purposes already, but I wonder if the full bank swapping might be easier, but likely not really necessary as long as the MMU is around.&lt;br /&gt;
&lt;br /&gt;
== FPGA-based CPU ==&lt;br /&gt;
65816 but with a genuine 16-bit data bus.&lt;br /&gt;
&lt;br /&gt;
Keep 6809 in the same core with the 65816 running. Switch between either at any time (bus master), or alternate cycles. At core2x speed, they could each run at 6MHz alternately hitting the SRAM.&lt;br /&gt;
&lt;br /&gt;
If the bus can be more dynamic, especially during vblank/hblank, the CPUs can run a lot faster there.&lt;br /&gt;
&lt;br /&gt;
== Bitstream readers/writers ==&lt;br /&gt;
Write a byte or word to a FPGA location, it takes a CPU cycle to write it, and bumps its pointer.&lt;br /&gt;
&lt;br /&gt;
For a bit stream, a 32-bit bitpointer covers 4Gb = 512MB. A write would need to know the width to write. Maybe 16 registers, write a value to one of those to declare how many bits from the written value to write. This actually allows the index register to determine width dynamically, which is nice. Both read &amp;amp; write interfaces should use this. A complete hack but easier to use would be to have 18 regs. For any width &amp;gt;8 bits, a 2nd access to the next register would grab the high byte, even though it&#039;s technically the trigger for the next higher. But this would get confusing in 65816 16-bit mode, accessing lower lengths.&lt;br /&gt;
&lt;br /&gt;
Automatically converts between 32-bit bitstream pointer and 24-bit byte pointer + bit offset. When writing to the byte pointer, it automatically zeros out the bit offset, for easier initialization from standard word boundaries. If loading a bit pointer from normal pointer + bit offset, set the bit offset last.&lt;br /&gt;
&lt;br /&gt;
Separate read &amp;amp; write context, so copies, decompression, etc, can be done. Bit pointers can be directly read/written as well. Direction is always in the positive direction, though, at least for now.&lt;br /&gt;
&lt;br /&gt;
Probably good to support 0-length, for dynamically computed lengths. So with 0-16 supported, that&#039;s 17 entry points, kinda messy.&lt;br /&gt;
&lt;br /&gt;
Also, skip forward N bits without a read or write. Technically this could just be a read N bits and ignore the value, but this should be 0-65535 bits skipped. Could also just do a 32-bit add on the pointer register.&lt;br /&gt;
&lt;br /&gt;
8bit interface: 2 bitpointers, then 8 byte locs for pointer 0, and 8 byte locs for pointer 1.&lt;br /&gt;
&lt;br /&gt;
16bit interface: 2 bitpointers, then 16 word locs for pointer 0, 16 word locs for pointer 1. Writes triggered on high byte write. Reads trigger on low byte read, which readies the high byte.&lt;br /&gt;
&lt;br /&gt;
This is a CPU-blocking interface for reads, buffered for writes.&lt;br /&gt;
&lt;br /&gt;
== Optical Keyboard ==&lt;br /&gt;
Can this be sent as 9 events of 8bits, instead of 8 events of 9 bits (2 bytes)? However the self-describing row number might be useful to keep.&lt;br /&gt;
&lt;br /&gt;
== RLE Format(s) ==&lt;br /&gt;
RLE layers, DMA, and potentially sprites can use RLE encoding.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Span-based RLE formats&lt;br /&gt;
!bpp&lt;br /&gt;
!Layout&lt;br /&gt;
!length&lt;br /&gt;
!Max compression&lt;br /&gt;
!Breakeven&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;code&amp;gt;clllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-128&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|8px&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&amp;lt;code&amp;gt;cc111111&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-64&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|4 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-16&lt;br /&gt;
|4:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccCCCC llllllll llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|170:1 byte (512:3)&lt;br /&gt;
|3+3 pixels&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|&amp;lt;code&amp;gt;cccccccc llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|128:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|}&lt;br /&gt;
However, it would be useful to have spans of literal pixels as well, instead of just solid color span fills.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt; = span length L of color C, 0 = transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll cccccccc...&amp;lt;/code&amp;gt;= L count of individual pixels&lt;br /&gt;
&lt;br /&gt;
For a bpp less than 8, probably require them to fill an even byte or word count&lt;br /&gt;
&lt;br /&gt;
For now, RLE layers should be simple length + 8bpp aligned words. RLE bitmaps would be something different, maybe it&#039;s too flexible so we should just leave that to the CPU. It would save a lot of bandwidth for bitmap overlay layers with large transparent windows, though.&lt;br /&gt;
&lt;br /&gt;
== DMA/Blitter ==&lt;br /&gt;
Maybe separate out 2d mode into its own blitter?&lt;br /&gt;
&lt;br /&gt;
Flag to mask out the &#039;fill/mask&#039; color (default 0)&lt;br /&gt;
&lt;br /&gt;
Clip to output screen dimensions.&lt;br /&gt;
&lt;br /&gt;
Xflip, yflip, maybe 90° rotation, but that means dest dimensions change? Scaling? Full affine transform? &lt;br /&gt;
&lt;br /&gt;
Unpack RLE graphics, for better memory usage. Could still do x/y flip because this isn&#039;t raster-dependent. Must know the total x/y though if clipping is supported&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
&lt;br /&gt;
* bpp (could expand from src to dest given an offset?)&lt;br /&gt;
* src w/h/stride&lt;br /&gt;
* dest w/h/stride&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO - V2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Clipping? Or should the src/dest be handled in software?&lt;br /&gt;
&lt;br /&gt;
Ideally, there&#039;d be a clip bounds defined at the dest address, w, h, stride, bpp. The source address is defined, and it&#039;s blitted into an x/y in the dest screen, automatically clipped. This could also be used as a pixel/stamp plotter.&lt;br /&gt;
&lt;br /&gt;
If there end up being a large number of parameters for a src or dest, it would be nice to have multiple profiles. Either read src/dest profiles from ram, or have say 4 src &amp;amp; 4 dests saved, and blit from src N to dest M.&lt;br /&gt;
&lt;br /&gt;
RLE graphics should probably save their w/h and mode implicitly as the first 2 words, as they are their own free-form shapes.&lt;br /&gt;
&lt;br /&gt;
Since DMA currently only takes place during VBLANK, could be more efficient to have a DMA list to run when VSYNC hits, blasting those out as fast as possible.&lt;br /&gt;
&lt;br /&gt;
For 1bpp (or maybe others, too?) and/or/nor/nand/xor modes would be necessary.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38502</id>
		<title>WF FPGA Ideas</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38502"/>
		<updated>2026-03-02T23:49:36Z</updated>

		<summary type="html">&lt;p&gt;WF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Video enhancements ==&lt;br /&gt;
[[WF16 Video Architecture]]&lt;br /&gt;
&lt;br /&gt;
== Math coprocessor ==&lt;br /&gt;
[[FPU Accumulator]]&lt;br /&gt;
&lt;br /&gt;
== SDCard ==&lt;br /&gt;
Auto-tx on read. Could supersede this with auto-reading a 16-bit length to a storage pointer, running in the background, flag or interrupt when done. Loading straight into DDR3 would be good once audio/video can read from there.&lt;br /&gt;
&lt;br /&gt;
Stream MP3 or MIDI file from disk (or ddr3?) straight to chips&lt;br /&gt;
&lt;br /&gt;
== Memtext Bitmap ==&lt;br /&gt;
Akin to the C64 hi-res bitmap mode, have a 640x480 1bpp bitmap with 8x8 color cells as defined by the existing memtext (or on-FPGA?) color attributes.&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
&lt;br /&gt;
* Address of bitmap data (same as memtext font pointer)&lt;br /&gt;
* Choose cell-based (C64-like) or linear pixel byte layout&lt;br /&gt;
* FPGA color matrix (2x 16-color) or RAM color matrix (2x 256-color)&lt;br /&gt;
&lt;br /&gt;
== Bootstrap and Machine Identity ==&lt;br /&gt;
Access to the cores SDCard. Name something better than the current hardcoded names.&lt;br /&gt;
&lt;br /&gt;
Soft-boot into one of the other cores, instead of relying on jumpers to select the core. Have an extended PGZ header or new file format that can request such things. Note that PGZ should say how many and which 8k blocks or 64k banks it&#039;s hardcoded for. Should be another load format for &amp;quot;play nice&amp;quot; system tools that can be simultaneously loaded.&lt;br /&gt;
&lt;br /&gt;
Identify cores by an 8 character ASCII string, instead of bit fields. Maybe have a version number (16 bit) per release of any named platform.&lt;br /&gt;
&lt;br /&gt;
Have different ROM loads for different cores? Or boot from RAM if some magic bytes occur there instead of ROM., though that would be part of the ROM boot that can do that, what ISA would the code be?&lt;br /&gt;
&lt;br /&gt;
RP2040 uses the Slave SelectMAX x8 config interface of the FPGA, and its 8 data pins should be GPIO for the FPGA to talk back to the RP after it&#039;s up and running (unless the pins are used for something else). The RP software needs updating for that.&lt;br /&gt;
&lt;br /&gt;
Simplest comms would be splitting the 8-bit path into two 4-bit independent directional channels. Clock (toggle when new data is sent), Ack (receiver toggles when it&#039;s read), 2 data bits. All polled on the software end. The RP2040 could be crunching FAT32 stuff while the FPGA is waiting to write to it, no problem.&lt;br /&gt;
&lt;br /&gt;
SRAM can be retained between resets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;char my_crash_info[100] __attribute__((section(&amp;quot;.uninitialized_data&amp;quot;)));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and with a macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#define __uninitialized_ram(group) __attribute__((section(&amp;quot;.uninitialized_data.&amp;quot; #group))) group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;datetime_t __uninitialized_ram(persist_date);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tentatively Proposed RP2040 Startup ===&lt;br /&gt;
&lt;br /&gt;
* Read SD Card for magic &amp;lt;code&amp;gt;/MYCORE.TXT&amp;lt;/code&amp;gt; file containing the full path of the core filename to boot.&lt;br /&gt;
** If this exists, DIP switches can be some form of override. Need to be able to break in if something messes up. On configuring MYCORE, always tell the user to set their DIP switches to 00.&lt;br /&gt;
** If this doesn&#039;t exist, oldsk00l DIP switches determine the core to boot.&lt;br /&gt;
* Load compressed core file from card and get the FPGA going.&lt;br /&gt;
** Set the FPGA comm handshake pins to 0 before releasing the init/reset command to the FPGA.&lt;br /&gt;
* Load &amp;lt;code&amp;gt;/RPLIB&amp;lt;/code&amp;gt; library and jump into it, if exists (else infinite loop). This runs whatever library functionality can talk to the FPGA, and is upgradable as a file through the loaded utilities.&lt;br /&gt;
The library should have functions to browse the cores sdcard, and select which file to boot with.&lt;br /&gt;
&lt;br /&gt;
TODO - do the core selection DIP pins also hit the FPGA for flash banking? If so, then we might not be able to escape them.&lt;br /&gt;
&lt;br /&gt;
== Timers ==&lt;br /&gt;
Ensure that the 24-bit value latches when the LSB is read (or the MSB is written?) for consistent reads.&lt;br /&gt;
&lt;br /&gt;
== Wavetable Audio ==&lt;br /&gt;
Some form of wavetable audio is sorely missing for Amiga, TG16, SNES, Soundblaster era audio, especially sound effects. Basic multiple channels of stereo or panned mono, uncompressed samples, support some simple compression formats.&lt;br /&gt;
&lt;br /&gt;
Pull small buffers of audio into the FPGA from RAM, keep 2 live at a time, one playing, one buffered. At 25MHz with a 48KHz sample rate, 1 sample lasts 520 cycles (20µsec), could be fast enough to fetch while the last sample is playing and just single-buffer it? Or even a rolling window Should also support just-in-time software generation of each buffer, with IRQ notifications.&lt;br /&gt;
&lt;br /&gt;
Stretch samples to whatever the output sampling rate is. Linear interpolation would be neat, but probably optional. Same with the decay-to-zero that many old synth chips had.&lt;br /&gt;
&lt;br /&gt;
== Sound Chip Instances ==&lt;br /&gt;
Instead of duplicating hardware instances of sound chips, multiplex all their registers and internal variables. Access would select 1 of them, and the hardware would run with that multiplexer active on all its values. Compare the size taken, depends on how complex the chip is.&lt;br /&gt;
&lt;br /&gt;
Since sound chips don&#039;t need to be that fast, serially looping through and executing a cycle, accumulating their output, for the final audio sample would be fine. Some of them do this internally with their voices anyway.&lt;br /&gt;
&lt;br /&gt;
Register to select which instance(s) to use, so programs can be agnostic to what sound context exists with other things. Probably expose 2 chips at a time through the IO registers, with a separate one to select which bank of 2 to use. At least for mono chips, or those which are commonly in pairs. Stereo chips could just have 1 register set exposed.&lt;br /&gt;
&lt;br /&gt;
== 65816 support ==&lt;br /&gt;
Remap page 0 into any 64kB bank, allowing direct page, stack, etc, to have its own swappable space. However, need to consider how this goes for interrupts. An interrupt will probably have to remap to hardware bank 0, but then somehow restore the bank that used to be there. Keeping the upper 256 bytes locked somewhere (flash or bank 0 RAM) would solve that. The 8kB MMU can be used for these purposes already, but I wonder if the full bank swapping might be easier, but likely not really necessary as long as the MMU is around.&lt;br /&gt;
&lt;br /&gt;
== FPGA-based CPU ==&lt;br /&gt;
65816 but with a genuine 16-bit data bus.&lt;br /&gt;
&lt;br /&gt;
Keep 6809 in the same core with the 65816 running. Switch between either at any time (bus master), or alternate cycles. At core2x speed, they could each run at 6MHz alternately hitting the SRAM.&lt;br /&gt;
&lt;br /&gt;
If the bus can be more dynamic, especially during vblank/hblank, the CPUs can run a lot faster there.&lt;br /&gt;
&lt;br /&gt;
== Bitstream readers/writers ==&lt;br /&gt;
Write a byte or word to a FPGA location, it takes a CPU cycle to write it, and bumps its pointer.&lt;br /&gt;
&lt;br /&gt;
For a bit stream, a 32-bit bitpointer covers 4Gb = 512MB. A write would need to know the width to write. Maybe 16 registers, write a value to one of those to declare how many bits from the written value to write. This actually allows the index register to determine width dynamically, which is nice. Both read &amp;amp; write interfaces should use this. A complete hack but easier to use would be to have 18 regs. For any width &amp;gt;8 bits, a 2nd access to the next register would grab the high byte, even though it&#039;s technically the trigger for the next higher. But this would get confusing in 65816 16-bit mode, accessing lower lengths.&lt;br /&gt;
&lt;br /&gt;
Automatically converts between 32-bit bitstream pointer and 24-bit byte pointer + bit offset. When writing to the byte pointer, it automatically zeros out the bit offset, for easier initialization from standard word boundaries. If loading a bit pointer from normal pointer + bit offset, set the bit offset last.&lt;br /&gt;
&lt;br /&gt;
Separate read &amp;amp; write context, so copies, decompression, etc, can be done. Bit pointers can be directly read/written as well. Direction is always in the positive direction, though, at least for now.&lt;br /&gt;
&lt;br /&gt;
Probably good to support 0-length, for dynamically computed lengths. So with 0-16 supported, that&#039;s 17 entry points, kinda messy.&lt;br /&gt;
&lt;br /&gt;
Also, skip forward N bits without a read or write. Technically this could just be a read N bits and ignore the value, but this should be 0-65535 bits skipped. Could also just do a 32-bit add on the pointer register.&lt;br /&gt;
&lt;br /&gt;
8bit interface: 2 bitpointers, then 8 byte locs for pointer 0, and 8 byte locs for pointer 1.&lt;br /&gt;
&lt;br /&gt;
16bit interface: 2 bitpointers, then 16 word locs for pointer 0, 16 word locs for pointer 1. Writes triggered on high byte write. Reads trigger on low byte read, which readies the high byte.&lt;br /&gt;
&lt;br /&gt;
This is a CPU-blocking interface for reads, buffered for writes.&lt;br /&gt;
&lt;br /&gt;
== Optical Keyboard ==&lt;br /&gt;
Can this be sent as 9 events of 8bits, instead of 8 events of 9 bits (2 bytes)? However the self-describing row number might be useful to keep.&lt;br /&gt;
&lt;br /&gt;
== RLE Format(s) ==&lt;br /&gt;
RLE layers, DMA, and potentially sprites can use RLE encoding.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Span-based RLE formats&lt;br /&gt;
!bpp&lt;br /&gt;
!Layout&lt;br /&gt;
!length&lt;br /&gt;
!Max compression&lt;br /&gt;
!Breakeven&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;code&amp;gt;clllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-128&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|8px&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&amp;lt;code&amp;gt;cc111111&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-64&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|4 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-16&lt;br /&gt;
|4:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccCCCC llllllll llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|170:1 byte (512:3)&lt;br /&gt;
|3+3 pixels&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|&amp;lt;code&amp;gt;cccccccc llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|128:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|}&lt;br /&gt;
However, it would be useful to have spans of literal pixels as well, instead of just solid color span fills.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt; = span length L of color C, 0 = transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll cccccccc...&amp;lt;/code&amp;gt;= L count of individual pixels&lt;br /&gt;
&lt;br /&gt;
For a bpp less than 8, probably require them to fill an even byte or word count&lt;br /&gt;
&lt;br /&gt;
For now, RLE layers should be simple length + 8bpp aligned words. RLE bitmaps would be something different, maybe it&#039;s too flexible so we should just leave that to the CPU. It would save a lot of bandwidth for bitmap overlay layers with large transparent windows, though.&lt;br /&gt;
&lt;br /&gt;
== DMA/Blitter ==&lt;br /&gt;
Maybe separate out 2d mode into its own blitter?&lt;br /&gt;
&lt;br /&gt;
Flag to mask out the &#039;fill/mask&#039; color (default 0)&lt;br /&gt;
&lt;br /&gt;
Clip to output screen dimensions.&lt;br /&gt;
&lt;br /&gt;
Xflip, yflip, maybe 90° rotation, but that means dest dimensions change? Scaling? Full affine transform? &lt;br /&gt;
&lt;br /&gt;
Unpack RLE graphics, for better memory usage. Could still do x/y flip because this isn&#039;t raster-dependent. Must know the total x/y though if clipping is supported&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
&lt;br /&gt;
* bpp (could expand from src to dest given an offset?)&lt;br /&gt;
* src w/h/stride&lt;br /&gt;
* dest w/h/stride&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO - V2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Clipping? Or should the src/dest be handled in software?&lt;br /&gt;
&lt;br /&gt;
Ideally, there&#039;d be a clip bounds defined at the dest address, w, h, stride, bpp. The source address is defined, and it&#039;s blitted into an x/y in the dest screen, automatically clipped. This could also be used as a pixel/stamp plotter.&lt;br /&gt;
&lt;br /&gt;
If there end up being a large number of parameters for a src or dest, it would be nice to have multiple profiles. Either read src/dest profiles from ram, or have say 4 src &amp;amp; 4 dests saved, and blit from src N to dest M.&lt;br /&gt;
&lt;br /&gt;
RLE graphics should probably save their w/h and mode implicitly as the first 2 words, as they are their own free-form shapes.&lt;br /&gt;
&lt;br /&gt;
Since DMA currently only takes place during VBLANK, could be more efficient to have a DMA list to run when VSYNC hits, blasting those out as fast as possible.&lt;br /&gt;
&lt;br /&gt;
For 1bpp (or maybe others, too?) and/or/nor/nand/xor modes would be necessary.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Getting_Started&amp;diff=38501</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Getting_Started&amp;diff=38501"/>
		<updated>2026-02-27T02:19:45Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Powering your F256K and F256K2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Getting Powered Up ==&lt;br /&gt;
&lt;br /&gt;
=== Powering your F256K and F256K2 ===&lt;br /&gt;
&lt;br /&gt;
The F256K is powered via a standard 2.5mm DC Connector, which takes a centre-positive 12V 2A capable Power Supply.&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to use 9 V instead of 12 V, (&#039;&#039;I can personally vouch for it -Mu0n&#039;&#039;). Typical power draw is a little under 4 W.&lt;br /&gt;
&lt;br /&gt;
This type of power supply is quite common.  [https://www.amazon.com/Adapter-100-240V-Transformer-Charger-Security/dp/B091XSVV1Y Example 12V 2A capable power supply] (used by at least 1 Discord user successfully)&lt;br /&gt;
&lt;br /&gt;
The F256K2&#039;s higher end FPGA requires adding a [https://www.amazon.com/dp/B08CMK8BMT compatible heatsink] if you&#039;re running advanced cores like the upcoming 68k core, but is not required for the default K2c/e, 6809, or Core2x.&lt;br /&gt;
&lt;br /&gt;
=== Powering your F256Jr and (?) F256Jr.Jr ===&lt;br /&gt;
&lt;br /&gt;
The F256Jr is supplied as a Mini-ITX form factor mainboard, with a standard 24 pin ATX power supply connector for power connectivity.&lt;br /&gt;
&lt;br /&gt;
Since the F256Jr needs relatively little power, compared to a mini-ATX PC, a popular DC 12V 24pin Pico ATX PSU works well and is a compact solution.&lt;br /&gt;
&lt;br /&gt;
* [https://www.amazon.com/dp/B08F57GKCL Pico PSU] - You power the Pico PSU via a 12V DC center-positive Power Supply source.&lt;br /&gt;
* [https://www.amazon.com/dp/B07MXXXBV8 12V DC center-positive A/C Adapter] - Commonly used to power the Pico PSU.&lt;br /&gt;
The board itself has no power switch. If you do not have a Mini-ITX case, a pin header on the board can be bridged by a jumper and thereby used instead of a proper power switch as a stop gap solution. In this picture https://wiki.c256foenix.com/images/6/64/Pinout_Jr_December_7th_Trans.png  the pin header in question is shown in the lower right and is labeled with &#039;&#039;PW ON SPST Switch&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Getting programs onto the F256 ==&lt;br /&gt;
&lt;br /&gt;
=== SD Card === &lt;br /&gt;
&lt;br /&gt;
The F256K, F256K2, F256JR and F256Jr.Jr. have an SD card slot.  The device software to read the SD card is a bit touchy (it&#039;s inherited from the Commander X16 project) and doesn&#039;t work with all SD cards&lt;br /&gt;
&lt;br /&gt;
* Cards should support the V2 protocol (HC or XC); older cards that only support the V1 protocol (typically 2GB or less) won&#039;t work. By contrast, the kernels for the C256 machines generally only work with V1 cards.  Note that, in both cases, this is a software limitation -- all of the Foenix machines are electrically capable of using both kinds of cards.&lt;br /&gt;
* Partitioning should be MBR, and partition type 0x0c.&lt;br /&gt;
* Cards *MUST* be formatted FAT32 -- **NOT: FAT, FAT12, FAT16, or exFAT**.   &lt;br /&gt;
* Formatting with Windows 10/11 works fine, but make sure to force FAT32 (or use the command line: &amp;lt;code&amp;gt;format /FS:FAT32 H:&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Formatting with MacOS will only work using the &amp;lt;code&amp;gt;diskutil&amp;lt;/code&amp;gt; command line utility. An example usage looks like this: &amp;lt;code&amp;gt;sudo diskutil eraseDisk FAT32 [DiskName] MBRFormat /dev/[DiskNumber]&amp;lt;/code&amp;gt;.  You can use &amp;lt;code&amp;gt;diskutil list&amp;lt;/code&amp;gt; to get the disk number for the SD Card.&lt;br /&gt;
* Formatting and partitioning SD cards with Linux can be done using the &amp;lt;code&amp;gt;gnome-disk-utility&amp;lt;/code&amp;gt; (known simply as &amp;lt;u&amp;gt;Disks&amp;lt;/u&amp;gt;) and is installed on most mainstream distributions of Linux. &amp;lt;u&amp;gt;Disks&amp;lt;/u&amp;gt; will access all the drives on the computer so be sure you have the SD card selected when editing. [https://wiki.gnome.org/Apps/Disks Gnome/Disks wiki]&lt;br /&gt;
* FAT32 only supports a maximum partition size of 32Gb, on larger cards you will need to create multiple partitions -- however, only the first is recognized by DOS.&lt;br /&gt;
* Some folks have had luck formatting cards with the [https://www.sdcard.org/downloads/formatter/sd-memory-card-formatter-for-windows-download/ Official SD Association formatter for Windows].&lt;br /&gt;
&lt;br /&gt;
=== Curated Software Collections ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Mu0n/F256MiscGoodies/tree/main/SDCard_Collection Go here to get a nice curated collection of programs] - it was first pepared for VCF East 2025 for the showroom Foenix table, but it is actively getting further updates. simply unzip it to the root of the flash card. You are encouraged to browse and launch most things with the f/manager program by first diving into /- fm from superbasic.&lt;br /&gt;
* An older 2023 pack can be found here (and is referenced down below in the SuperBasic section of this current page), simply unzip it to the root of the flash card: [https://github.com/FoenixRetro/Documentation/blob/main/f256/archive older demo pack from 2023]&lt;br /&gt;
&lt;br /&gt;
=== Tutorial Video on 13 methods on running programs: ===&lt;br /&gt;
&amp;lt;youtube&amp;gt;0ShFv89KGDs&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
00:41 Method 1 - SuperBasic program&lt;br /&gt;
&lt;br /&gt;
01:51 Method 2 - .pgz, .pgZ or .pgx executable from SuperBasic&lt;br /&gt;
&lt;br /&gt;
03:12 Method 3 - Program residing in flash memory&lt;br /&gt;
&lt;br /&gt;
05:58 Method 4 - .pgz, .pgZ or .pgx from DOS&lt;br /&gt;
&lt;br /&gt;
07:31 Method 5 - f/manager utility&lt;br /&gt;
&lt;br /&gt;
12:31 Method 6 - 5.25&amp;quot; 1541 Commodore Disk Drive&lt;br /&gt;
&lt;br /&gt;
14:08 Method 7 - FoenixMgr python scripts for .pgz, .pgZ or .pgx&lt;br /&gt;
&lt;br /&gt;
17:52 Method 8 - FoenixMgr python scripts for .bin&lt;br /&gt;
&lt;br /&gt;
22:21 Method 9 - FoenixMgr modifying the flash programs &lt;br /&gt;
&lt;br /&gt;
25:41 Method 10 - Fcart &amp;amp; PGZ2FLASH to program a Flash Cartridge&lt;br /&gt;
&lt;br /&gt;
28:58 Method 10b - PGZ2Flash to program a Flash Program&lt;br /&gt;
&lt;br /&gt;
30:01 Method 11 - Fcart to REPROGRAM a Flash Cartridge&lt;br /&gt;
&lt;br /&gt;
33:51 Method 12 - Toolbox environment in 65816 extended mode&lt;br /&gt;
&lt;br /&gt;
=== Debug USB port ===&lt;br /&gt;
&lt;br /&gt;
* This is what most developers use as it&#039;s the most convenient.  Connect the debug USB port to your PC or Mac&lt;br /&gt;
&lt;br /&gt;
* You can use:&lt;br /&gt;
** [https://github.com/pweingar/FoenixMgr FoenixMgr] - works on Windows, Mac, Linux&lt;br /&gt;
*** A Python script to manage the Foenix series of retro style computers through their USB debug ports. This tool allows uploading files of various formats to system RAM, and displaying memory through various means.&lt;br /&gt;
&lt;br /&gt;
** [https://github.com/Trinity-11/FoenixIDE FoenixIDE] (Windows only)&lt;br /&gt;
*** Development and Debugging Suite for the C256 Foenix Family of Computers.&lt;br /&gt;
&lt;br /&gt;
=== wget ===&lt;br /&gt;
If you have the [[wifi]] configured, you can use [https://github.com/ghackwrench/F256_wget wget] to pull programs and data right off the web!&lt;br /&gt;
&lt;br /&gt;
== SuperBASIC ==&lt;br /&gt;
&lt;br /&gt;
The machine boots to SuperBASIC.  SuperBASIC is inspired by BBC BASIC but offers quite a bit more.&lt;br /&gt;
&lt;br /&gt;
* Read the [https://github.com/FoenixRetro/f256-superbasic/blob/main/reference/source/f256jr_basic_ref.pdf SuperBASIC Reference Manual].&lt;br /&gt;
&lt;br /&gt;
* Watch EMWhite&#039;s excellent intro series on Youtube:&lt;br /&gt;
** Full Playlist here: [https://www.youtube.com/playlist?list=PLeHjTvk7NPiSqGz4REMH-S4hjYpLS2YNR EMWhite&#039;s Intro Series - Full Playlist].&lt;br /&gt;
** Part 1 can be viewed here:&lt;br /&gt;
&amp;lt;youtube&amp;gt;G_S2c_MsqYA&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started, you can type in a sample program at the command prompt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 for i=1 to 5&lt;br /&gt;
20 print &amp;quot;Hello world&amp;quot;&lt;br /&gt;
30 next&lt;br /&gt;
run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SuperBASIC is similar to CBM (Microsoft) BASIC but has some differences.  For example, note in the sample above it&#039;s just &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;next i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The first 15 or so pages of the [https://github.com/FoenixRetro/f256-superbasic/blob/main/reference/source/f256jr_basic_ref.pdf SuperBASIC Reference Manual] are quite instructive.  &lt;br /&gt;
&lt;br /&gt;
SuperBASIC is actually much more powerful and supports structured programming (procedures, blocks etc.) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt; - Run this to display directory of SD card&lt;br /&gt;
&lt;br /&gt;
Loading &amp;amp; running programs off of the SD card is similarly easy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
load &amp;quot;JrWordl.bas&amp;quot;&lt;br /&gt;
run&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similar to the C64, you can save time in loading programs from the &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt; listing by using your cursor keys to go up to the entry, typing &amp;lt;code&amp;gt;load &amp;quot;&amp;lt;/code&amp;gt; (insert mode is active by default) etc.  You can use &amp;lt;code&amp;gt;CTRL+E&amp;lt;/code&amp;gt; to jump to the end of the line and use &amp;lt;code&amp;gt;CTRL+K&amp;lt;/code&amp;gt; to delete any text from the cursor to the end of the line.  Correctly place the closing &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; and hit &amp;lt;code&amp;gt;ENTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CTRL+C&amp;lt;/code&amp;gt; acts as a &amp;quot;break&amp;quot; command and stops any running SuperBASIC program or &amp;lt;code&amp;gt;LIST&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
Read built-in help/reference:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/help&amp;lt;/code&amp;gt; : But &#039;&#039;&#039;NOTE&#039;&#039;&#039;, this erases BASIC memory!  Use Backspace key to go back in menus and to exit.&lt;br /&gt;
&lt;br /&gt;
Explore the included demo SuperBASIC programs:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Program !! Notes !! Source&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;JrWordl.bas&amp;lt;/code&amp;gt; || Wordle game, guess 5 letter word ||&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;mandel.bas&amp;lt;/code&amp;gt; || Draws Mandlebrot set in graphics mode, takes between 2 and 3 hours || [https://github.com/Mu0n/F256KbasicBASICdoodles @Mu0n]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;rpg-demo.bas&amp;lt;/code&amp;gt; || UI sample that shows Zelda like RPG game.  Control the character with an Atari-joystick connected to JoyPort1 || @econtrerasd&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;Problematic_Code.bas&amp;lt;/code&amp;gt; || Displays scrolling starfield ||&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;noelrl.bas&amp;lt;/code&amp;gt; || Simple integer BASIC bench mark from Noel&#039;s retro lab.  Completes &amp;lt; 3.5 seconds, compares very favourably to other retro systems! || [https://www.youtube.com/watch?v=H05hM_Guoqk Youtube]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;dance.bas&amp;lt;/code&amp;gt; || Animates sprite of dancer || [https://github.com/Mu0n/F256KbasicBASICdoodles @Mu0n]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;luna.bas&amp;lt;/code&amp;gt; || Displays simple scene ||&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;blink.bas&amp;lt;/code&amp;gt; || Blinks drive access light || [https://github.com/Mu0n/F256KbasicBASICdoodles @Mu0n]&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;piano.bas&amp;lt;/code&amp;gt; || Play some notes with the PSG || [https://github.com/Mu0n/F256KbasicBASICdoodles @Mu0n]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Running pgz, pgZ, pgx Executable Files ===&lt;br /&gt;
Running executables from superbasic involves calling the &amp;quot;pexec program&amp;quot; normally stored in Flash memory, but which is written as simply as possible with a &amp;quot;-&amp;quot; (dash symbol without the quotes) to make it easy and convenient to run programs.&lt;br /&gt;
&lt;br /&gt;
You can use this notation to execute file.pgz (the same can be done with pgx, pgZ):&amp;lt;pre&amp;gt;&lt;br /&gt;
/- file.pgz&lt;br /&gt;
&amp;lt;/pre&amp;gt;The / is for running anything that&#039;s stored in flash&lt;br /&gt;
&lt;br /&gt;
The - is the special alias for pexec, as it is stored in flash&lt;br /&gt;
&lt;br /&gt;
Therefore /- is used together to launch an executable, which would follow as the first argument to the right. Keep in mind you need a space between /- and your program name.&lt;br /&gt;
&lt;br /&gt;
=== More Resources ===&lt;br /&gt;
=== This Wiki ===&lt;br /&gt;
&lt;br /&gt;
Explore all of the content of this Wiki, to expand your F256 series knowledge!&lt;br /&gt;
&lt;br /&gt;
=== Discord ===&lt;br /&gt;
&lt;br /&gt;
The [https://discord.gg/9vjUEGgcUS Foenix Retro Systems Discord] is the primary place to get questions answered.&lt;br /&gt;
&lt;br /&gt;
Also, if you resolve your question, and you didn&#039;t find the answer here on the Wiki, &#039;&#039;&#039;&#039;&#039;please consider contributing to the Wiki&#039;&#039;&#039;&#039;&#039;, for the benefit of others with the same question!&lt;br /&gt;
&lt;br /&gt;
=== Foenix Retro Systems Newsletter ===&lt;br /&gt;
&lt;br /&gt;
Read back issues [http://apps.emwhite.org/foenixmarketplace/ here] (also a great source for sample programs).   &lt;br /&gt;
&lt;br /&gt;
Issues starting at #4 cover the F256 line.  Issues 1-3 cover the previous version of the hardware (C256), although there are still many salient points.&lt;br /&gt;
&lt;br /&gt;
=== Youtube Channels with regular Foenix videos ===&lt;br /&gt;
Official Foenix Retro Systems channel: https://www.youtube.com/@foenixretrosys &lt;br /&gt;
&lt;br /&gt;
8-Bit Wall of Doom (from EMWhite): https://www.youtube.com/@8-bitwallofdoom&lt;br /&gt;
&lt;br /&gt;
AnyBit Fever Dreams (from Mu0n): https://www.youtube.com/@anybitfeverdreams&lt;br /&gt;
&lt;br /&gt;
Boisy Pitre (from MrPitre): https://www.youtube.com/@boisypitre&lt;br /&gt;
&lt;br /&gt;
digarok (from digarok): https://www.youtube.com/@digarok&lt;br /&gt;
&lt;br /&gt;
Micah Bly (from Micah): https://www.youtube.com/@micahbly8241&lt;br /&gt;
&lt;br /&gt;
NormanYen (from beethead): https://www.youtube.com/@normanyen5720&lt;br /&gt;
&lt;br /&gt;
Programmer vs World (from PlasmaTrout): https://makertube.net/c/programmervsworld/videos&lt;br /&gt;
&lt;br /&gt;
==== Specific youtube videos from heavy hitters: ====&lt;br /&gt;
Jan Beta reviews the F256K: https://www.youtube.com/watch?v=57FuA8YuXn0&lt;br /&gt;
&lt;br /&gt;
Perifractic (from Retro Recipes) reviews the F256K: https://www.youtube.com/watch?v=TJQgecozNzU&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38500</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38500"/>
		<updated>2026-02-25T23:52:28Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D018: Raster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles safety margin from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38499</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38499"/>
		<updated>2026-02-25T23:51:40Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D018: Raster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety margin, pauses from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38498</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38498"/>
		<updated>2026-02-25T23:49:12Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D018: Raster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2x DMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through line (8192 SRAM cycles from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety zone, disabled from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38497</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38497"/>
		<updated>2026-02-25T23:47:59Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D018: Raster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and  non-Core2xDMA&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|$002&lt;br /&gt;
|Core2x: DMA starts halfway through here (8192 SRAM cycles from SOF)&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety zone, disabled from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38496</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38496"/>
		<updated>2026-02-25T23:19:48Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D018: Raster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Raster line numbers in a frame&lt;br /&gt;
!Dec&lt;br /&gt;
!Hex&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|$000&lt;br /&gt;
|Start of frame, VBLANK, and DMA&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|$02B&lt;br /&gt;
|DMA safety zone, disabled from here&lt;br /&gt;
|-&lt;br /&gt;
|45&lt;br /&gt;
|$02D&lt;br /&gt;
|First visible line&lt;br /&gt;
|-&lt;br /&gt;
|524&lt;br /&gt;
|$20C&lt;br /&gt;
|Last visible line, last line of frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=User:WF&amp;diff=38495</id>
		<title>User:WF</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=User:WF&amp;diff=38495"/>
		<updated>2026-02-25T22:56:57Z</updated>

		<summary type="html">&lt;p&gt;WF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scratchpad for working on Foenijs. Feature requests are welcome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[WF FPGA Ideas]]&lt;br /&gt;
&lt;br /&gt;
[[Foenijs]]&lt;br /&gt;
&lt;br /&gt;
[[SuperBASIC Wiki Reference]]&lt;br /&gt;
&lt;br /&gt;
== Debugger Features ==&lt;br /&gt;
+ = implemented, - = unimplemented&lt;br /&gt;
&lt;br /&gt;
=== Stepping ===&lt;br /&gt;
+ Step 1 cycle&lt;br /&gt;
&lt;br /&gt;
- Step N cycles (easy, just not exposed now)&lt;br /&gt;
&lt;br /&gt;
+ Step to next raster line&lt;br /&gt;
&lt;br /&gt;
+ Step to next frame&lt;br /&gt;
&lt;br /&gt;
+ Step to IRQ&lt;br /&gt;
&lt;br /&gt;
+ Step to RTI&lt;br /&gt;
&lt;br /&gt;
+ Step Out (run until stack shrinks from the starting point)&lt;br /&gt;
&lt;br /&gt;
=== Breakpoints ===&lt;br /&gt;
+ Break on 16-bit PC (raw CPU PC)  &amp;lt;code&amp;gt;machine.cpu.breakpoints16[]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on 24-bit PC (post-MMU resolved address) &amp;lt;code&amp;gt;machine.cpu.breakpoints24[]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Break on 24-bit address read &amp;lt;code&amp;gt;machine.mmu.breakOnRead[]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on 24-bit address write (I/O only for now) &amp;lt;code&amp;gt;machine.mmu.breakOnWrite[]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on BRK &amp;lt;code&amp;gt;machine.cpu.breakOptions.breakOnBRK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on IRQ/NMI &amp;lt;code&amp;gt;machine.cpu.breakOptions.breakOnIRQ&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;.breakOnNMI&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on undocumented NOP (eg unexpected bytes) &amp;lt;code&amp;gt;machine.cpu.breakOptions.breakOnBadNOP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on RTI &amp;lt;code&amp;gt;machine.cpu.breakOptions.breakOnRTI&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Break on single-instruction infinite loop &amp;lt;code&amp;gt;machine.cpu.breakOptions.breakOnInfiniteLoop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Printing/Logging/Viewing ===&lt;br /&gt;
+ Log IRQ &amp;lt;code&amp;gt;machine.cpu.breakOptions.logIRQ&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+ Log BRK (always on for now)&lt;br /&gt;
&lt;br /&gt;
- Log SOF &lt;br /&gt;
&lt;br /&gt;
+ Capture CPU execution log, &amp;lt;code&amp;gt;machine.cpu.debug&amp;lt;/code&amp;gt;  to enable, &amp;lt;code&amp;gt;machine.cpu.log(n)&amp;lt;/code&amp;gt; to print, n is optional number of instructions&lt;br /&gt;
&lt;br /&gt;
+ Live updated memory view (lame, scroll through full memory)&lt;br /&gt;
&lt;br /&gt;
- Create any number of live memory views of different sizes &amp;amp; locations&lt;br /&gt;
&lt;br /&gt;
+ Stack entry provenance tracking&lt;br /&gt;
&lt;br /&gt;
- Upload labels file&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38494</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38494"/>
		<updated>2026-02-25T22:05:39Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D650: Interval Timers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
&lt;br /&gt;
Timer 0 runs at the 25.175MHz dot clock, while timer 1 counts frames which will be 60Hz or 70Hz depending on the video mode.&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38493</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38493"/>
		<updated>2026-02-25T21:56:23Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D650: Interval Timers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes if it stays enabled!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38492</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38492"/>
		<updated>2026-02-25T21:50:52Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $DF00: DMA Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38491</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38491"/>
		<updated>2026-02-25T21:26:07Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D650: Timers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Interval Timers ======&lt;br /&gt;
&#039;&#039;&#039;WARNING:&#039;&#039;&#039; The 24-bit timer values are not latched and will continue to update between both reads and writes of individual bytes!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38490</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38490"/>
		<updated>2026-02-23T15:18:20Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D900: Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
Core2x: There are 2 selectable banks of 64 sprites at these locations, depending on the bit 6 (SPR_SEL) in [[Memory Management|MMU_IO_CONTROL]] at $0001.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38489</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38489"/>
		<updated>2026-02-23T02:19:43Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D200: Tilemaps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = In some configurations, the first tilemap entry is ignored and the map starts at the second entry. This is still being investigated.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38488</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38488"/>
		<updated>2026-02-23T02:18:44Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D200: Tilemaps */ better scroll description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Tile Scroll X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; rowspan=&amp;quot;2&amp;quot; |Tile Scroll Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |16x16 Pixel Scroll SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |8x8 SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile Scroll Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = For 8×8px tilesets, the first map entry (2 bytes) seems to be skipped, so the pointer needs to point 2 bytes before the actual upper-left starting entry.&lt;br /&gt;
&lt;br /&gt;
For 16×16px tilesets, the tile map pointer directly points to the first entry. Very old cores might have had the same offset required.&lt;br /&gt;
&lt;br /&gt;
The scroll registers state where to start drawing the tilemap, meaning they scroll up and to the left as they increase.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38487</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38487"/>
		<updated>2026-02-22T04:56:28Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Numerical address computations for SRAM/VICKY pointers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FFFF&lt;br /&gt;
|64k&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM, except last 256 bytes&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|F256K2e only: Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion. Devices are laid out every 64 ($40) blocks (512kB).&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT Entry&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Block Number&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT Entry&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;16-bit MMU Address&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |MLUT Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM (0), Flash (1), Cartridge (2), or Reserved (3)&lt;br /&gt;
&lt;br /&gt;
===== Numerical address computations for SRAM/VICKY pointers =====&lt;br /&gt;
Full Gen 2 2MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = ((MMU Block &amp;amp; 0x300) &amp;lt;&amp;lt; 11) | ((MMU Block &amp;amp; 0x03F) &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = ((SRAM Address &amp;amp; 0x180000) &amp;gt;&amp;gt; 11) | ((SRAM address &amp;amp; 0x07e000) &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gen 1, or only using the first 512kB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = (MMU Block &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = (SRAM address &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat/SRAM Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38486</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38486"/>
		<updated>2026-02-22T03:58:45Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Memory Block Tables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FFFF&lt;br /&gt;
|64k&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM, except last 256 bytes&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|F256K2e only: Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion. Devices are laid out every 64 ($40) blocks (512kB).&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT Entry&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Block Number&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT Entry&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;16-bit MMU Address&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |MLUT Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM (0), Flash (1), Cartridge (2), or Reserved (3)&lt;br /&gt;
&lt;br /&gt;
===== Numerical address computations for SRAM/VICKY pointers =====&lt;br /&gt;
Full Gen 2 2MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = ((MMU Block &amp;amp; 0x300) &amp;lt;&amp;lt; 11) | ((MMU Block &amp;amp; 0x03F) &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = ((SRAM Address &amp;amp; 0x180000) &amp;gt;&amp;gt; 11) | ((SRAM address &amp;amp; 0x07fe000) &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gen 1, or only using the first 512kB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = (MMU Block &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = (SRAM address &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat/SRAM Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38485</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38485"/>
		<updated>2026-02-22T03:57:48Z</updated>

		<summary type="html">&lt;p&gt;WF: /* 8kB Block Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FFFF&lt;br /&gt;
|64k&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM, except last 256 bytes&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|F256K2e only: Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion. Devices are laid out every 64 ($40) blocks (512kB).&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT Entry&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Block Number&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT Entry&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;16-bit MMU Address&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |MLUT Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM (0), Flash (1), Cartridge (2), or Reserved (3)&lt;br /&gt;
&lt;br /&gt;
===== Numerical address computations for SRAM/VICKY pointers =====&lt;br /&gt;
Full Gen 2 2MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = ((MMU Block &amp;amp; 0x300) &amp;lt;&amp;lt; 11) | ((MMU Block &amp;amp; 0x03F) &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = ((SRAM Address &amp;amp; 0x180000) &amp;gt;&amp;gt; 11) | ((SRAM address &amp;amp; 0x07fe000) &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gen 1, or only using the first 512kB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = (MMU Block &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = (SRAM address &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38484</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38484"/>
		<updated>2026-02-21T20:27:24Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Flat Memory Models */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FFFF&lt;br /&gt;
|64k&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM, except last 256 bytes&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|F256K2e only: Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion. Devices are laid out every 64 ($40) blocks (512kB).&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Block Number&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MLUT&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;16-bit MMU Address&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |MLUT Entry&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;16-bit MMU Address&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |MLUT Entry&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block offset in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM (0), Flash (1), Cartridge (2), or Reserved (3)&lt;br /&gt;
&lt;br /&gt;
===== Numerical address computations for SRAM/VICKY pointers =====&lt;br /&gt;
Full Gen 2 2MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = ((MMU Block &amp;amp; 0x300) &amp;lt;&amp;lt; 11) | ((MMU Block &amp;amp; 0x03F) &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = ((SRAM Address &amp;amp; 0x180000) &amp;gt;&amp;gt; 11) | ((SRAM address &amp;amp; 0x07fe000) &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gen 1, or only using the first 512kB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SRAM address = (MMU Block &amp;lt;&amp;lt; 13) | (Byte offset)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU Block number = (SRAM address &amp;gt;&amp;gt; 13)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MMU byte offset = SRAM Address &amp;amp; 0x001fff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38483</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38483"/>
		<updated>2026-02-21T19:59:37Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Flat Memory Models */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FFFF&lt;br /&gt;
|64k&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM, expect last 256 bytes&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|F256K2e only: Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion.&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Block&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |MMU Block Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Block&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM, Flash, Cartridge, or Reserved&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38482</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38482"/>
		<updated>2026-02-21T19:41:03Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Memory Block Tables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FEFF&lt;br /&gt;
|64k - 256&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion.&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Block&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |MMU Block Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Block&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM, Flash, Cartridge, or Reserved&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat/SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | SRAM Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38481</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38481"/>
		<updated>2026-02-21T18:06:07Z</updated>

		<summary type="html">&lt;p&gt;WF: /* 8kB Block Layout */ fixed block to flat construction table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FEFF&lt;br /&gt;
|64k - 256&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion.&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MMU Block Address Construction&lt;br /&gt;
!&lt;br /&gt;
!23&lt;br /&gt;
!22&lt;br /&gt;
!21&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Block&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |MMU Block Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Block&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;25&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat SRAM&#039;&#039;&#039;&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Flash&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Flat Cart&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device (00-3F)&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM, Flash, Cartridge, or Reserved&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38480</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38480"/>
		<updated>2026-02-21T17:43:23Z</updated>

		<summary type="html">&lt;p&gt;WF: /* 8kB Block Layout */ Fixed block to flat mapping&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FEFF&lt;br /&gt;
|64k - 256&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion.&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
!Flat address&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|$00:0000 - $07:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$08:0000 - $0F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$10:0000 - $17:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|$18:0000 - $1F:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Final MMU Address Construction&lt;br /&gt;
!&amp;lt;u&amp;gt;&#039;&#039;22&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
!&amp;lt;u&amp;gt;&#039;&#039;21&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |MMU Block Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; rowspan=&amp;quot;2&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM, Flash, Cartridge, or Reserved&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same flash addresses, and $80, $180, $280, $380 all point to the same expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38479</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38479"/>
		<updated>2026-02-21T17:39:16Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Memory Block Tables */ Fixing memory block tables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FEFF&lt;br /&gt;
|64k - 256&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion.&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Final MMU Address Construction&lt;br /&gt;
!&amp;lt;u&amp;gt;&#039;&#039;22&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
!&amp;lt;u&amp;gt;&#039;&#039;21&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |MMU Block Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; rowspan=&amp;quot;2&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM, Flash, Cartridge, or Reserved&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same physical flash, and $80, $180, $280, $380 all point to the same physical expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$08:0000 - $08:1FFF||$200||$10:0000 - $10:1FFF||$300||$18:0000 - $18:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$08:2000 - $08:3FFF||$201||$10:2000 - $10:3FFF||$301||$18:2000 - $18:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$08:4000 - $08:5FFF||$202||$10:4000 - $10:5FFF||$302||$18:4000 - $18:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$08:6000 - $08:7FFF||$203||$10:6000 - $10:7FFF||$303||$18:6000 - $18:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$08:8000 - $08:9FFF||$204||$10:8000 - $10:9FFF||$304||$18:8000 - $18:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$08:A000 - $08:BFFF||$205||$10:A000 - $10:BFFF||$305||$18:A000 - $18:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$08:C000 - $08:DFFF||$206||$10:C000 - $10:DFFF||$306||$18:C000 - $18:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$08:E000 - $08:FFFF||$207||$10:E000 - $10:FFFF||$307||$18:E000 - $18:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$09:0000 - $09:1FFF||$208||$11:0000 - $11:1FFF||$308||$19:0000 - $19:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$09:2000 - $09:3FFF||$209||$11:2000 - $11:3FFF||$309||$19:2000 - $19:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$09:4000 - $09:5FFF||$20A||$11:4000 - $11:5FFF||$30A||$19:4000 - $19:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$09:6000 - $09:7FFF||$20B||$11:6000 - $11:7FFF||$30B||$19:6000 - $19:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$09:8000 - $09:9FFF||$20C||$11:8000 - $11:9FFF||$30C||$19:8000 - $19:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$09:A000 - $09:BFFF||$20D||$11:A000 - $11:BFFF||$30D||$19:A000 - $19:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$09:C000 - $09:DFFF||$20E||$11:C000 - $11:DFFF||$30E||$19:C000 - $19:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$09:E000 - $09:FFFF||$20F||$11:E000 - $11:FFFF||$30F||$19:E000 - $19:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$0A:0000 - $0A:1FFF||$210||$12:0000 - $12:1FFF||$310||$1A:0000 - $1A:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$0A:2000 - $0A:3FFF||$211||$12:2000 - $12:3FFF||$311||$1A:2000 - $1A:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$0A:4000 - $0A:5FFF||$212||$12:4000 - $12:5FFF||$312||$1A:4000 - $1A:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$0A:6000 - $0A:7FFF||$213||$12:6000 - $12:7FFF||$313||$1A:6000 - $1A:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$0A:8000 - $0A:9FFF||$214||$12:8000 - $12:9FFF||$314||$1A:8000 - $1A:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$0A:A000 - $0A:BFFF||$215||$12:A000 - $12:BFFF||$315||$1A:A000 - $1A:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$0A:C000 - $0A:DFFF||$216||$12:C000 - $12:DFFF||$316||$1A:C000 - $1A:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$0A:E000 - $0A:FFFF||$217||$12:E000 - $12:FFFF||$317||$1A:E000 - $1A:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$0B:0000 - $0B:1FFF||$218||$13:0000 - $13:1FFF||$318||$1B:0000 - $1B:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$0B:2000 - $0B:3FFF||$219||$13:2000 - $13:3FFF||$319||$1B:2000 - $1B:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$0B:4000 - $0B:5FFF||$21A||$13:4000 - $13:5FFF||$31A||$1B:4000 - $1B:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$0B:6000 - $0B:7FFF||$21B||$13:6000 - $13:7FFF||$31B||$1B:6000 - $1B:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$0B:8000 - $0B:9FFF||$21C||$13:8000 - $13:9FFF||$31C||$1B:8000 - $1B:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$0B:A000 - $0B:BFFF||$21D||$13:A000 - $13:BFFF||$31D||$1B:A000 - $1B:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$0B:C000 - $0B:DFFF||$21E||$13:C000 - $13:DFFF||$31E||$1B:C000 - $1B:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$0B:E000 - $0B:FFFF||$21F||$13:E000 - $13:FFFF||$31F||$1B:E000 - $1B:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$0C:0000 - $0C:1FFF||$220||$14:0000 - $14:1FFF||$320||$1C:0000 - $1C:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$0C:2000 - $0C:3FFF||$221||$14:2000 - $14:3FFF||$321||$1C:2000 - $1C:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$0C:4000 - $0C:5FFF||$222||$14:4000 - $14:5FFF||$322||$1C:4000 - $1C:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$0C:6000 - $0C:7FFF||$223||$14:6000 - $14:7FFF||$323||$1C:6000 - $1C:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$0C:8000 - $0C:9FFF||$224||$14:8000 - $14:9FFF||$324||$1C:8000 - $1C:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$0C:A000 - $0C:BFFF||$225||$14:A000 - $14:BFFF||$325||$1C:A000 - $1C:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$0C:C000 - $0C:DFFF||$226||$14:C000 - $14:DFFF||$326||$1C:C000 - $1C:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$0C:E000 - $0C:FFFF||$227||$14:E000 - $14:FFFF||$327||$1C:E000 - $1C:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$0D:0000 - $0D:1FFF||$228||$15:0000 - $15:1FFF||$328||$1D:0000 - $1D:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$0D:2000 - $0D:3FFF||$229||$15:2000 - $15:3FFF||$329||$1D:2000 - $1D:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$0D:4000 - $0D:5FFF||$22A||$15:4000 - $15:5FFF||$32A||$1D:4000 - $1D:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$0D:6000 - $0D:7FFF||$22B||$15:6000 - $15:7FFF||$32B||$1D:6000 - $1D:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$0D:8000 - $0D:9FFF||$22C||$15:8000 - $15:9FFF||$32C||$1D:8000 - $1D:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$0D:A000 - $0D:BFFF||$22D||$15:A000 - $15:BFFF||$32D||$1D:A000 - $1D:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$0D:C000 - $0D:DFFF||$22E||$15:C000 - $15:DFFF||$32E||$1D:C000 - $1D:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$0D:E000 - $0D:FFFF||$22F||$15:E000 - $15:FFFF||$32F||$1D:E000 - $1D:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$0E:0000 - $0E:1FFF||$230||$16:0000 - $16:1FFF||$330||$1E:0000 - $1E:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$0E:2000 - $0E:3FFF||$231||$16:2000 - $16:3FFF||$331||$1E:2000 - $1E:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$0E:4000 - $0E:5FFF||$232||$16:4000 - $16:5FFF||$332||$1E:4000 - $1E:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$0E:6000 - $0E:7FFF||$233||$16:6000 - $16:7FFF||$333||$1E:6000 - $1E:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$0E:8000 - $0E:9FFF||$234||$16:8000 - $16:9FFF||$334||$1E:8000 - $1E:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$0E:A000 - $0E:BFFF||$235||$16:A000 - $16:BFFF||$335||$1E:A000 - $1E:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$0E:C000 - $0E:DFFF||$236||$16:C000 - $16:DFFF||$336||$1E:C000 - $1E:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$0E:E000 - $0E:FFFF||$237||$16:E000 - $16:FFFF||$337||$1E:E000 - $1E:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$0F:0000 - $0F:1FFF||$238||$17:0000 - $17:1FFF||$338||$1F:0000 - $1F:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$0F:2000 - $0F:3FFF||$239||$17:2000 - $17:3FFF||$339||$1F:2000 - $1F:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$0F:4000 - $0F:5FFF||$23A||$17:4000 - $17:5FFF||$33A||$1F:4000 - $1F:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$0F:6000 - $0F:7FFF||$23B||$17:6000 - $17:7FFF||$33B||$1F:6000 - $1F:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$0F:8000 - $0F:9FFF||$23C||$17:8000 - $17:9FFF||$33C||$1F:8000 - $1F:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$0F:A000 - $0F:BFFF||$23D||$17:A000 - $17:BFFF||$33D||$1F:A000 - $1F:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$0F:C000 - $0F:DFFF||$23E||$17:C000 - $17:DFFF||$33E||$1F:C000 - $1F:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$0F:E000 - $0F:FFFF||$23F||$17:E000 - $17:FFFF||$33F||$1F:E000 - $1F:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38478</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Memory_Management&amp;diff=38478"/>
		<updated>2026-02-21T17:30:53Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Memory Block Tables */ Fixing memory block tables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The F256 series comes with 512KB or 2MB of SRAM, and 512 KB of internal system flash memory. Up to 256 KB additional Memory, either RAM or Flash, can be added through the [[Expansion Port]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+F256 Series Memory Capabilities&lt;br /&gt;
!Model&lt;br /&gt;
!Hardware CPU&lt;br /&gt;
!SRAM&lt;br /&gt;
!Flash&lt;br /&gt;
!Expansion Port&lt;br /&gt;
!DRAM&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|­—&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|65C02&lt;br /&gt;
|512kB (512k×8)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256Jr2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|F256K2&lt;br /&gt;
|65816&lt;br /&gt;
|2MB (1M×16)&lt;br /&gt;
|512kB&lt;br /&gt;
|256kB&lt;br /&gt;
|128MB (not yet supported)&lt;br /&gt;
|}&lt;br /&gt;
The 1st gen 65c02 systems have an 8-bit data bus and a 16-bit CPU address bus, with an MMU managing 8 × 8k banks to address 512kB RAM plus flash, expansion, and the IO pages.&lt;br /&gt;
&lt;br /&gt;
The 2nd gen 2MB 65816 systems have 16-bit wide SRAMs, enabling higher bandwidth through the FPGA, even though the processor still has an 8-bit wide data bus. The same 64k address MMU with 512kB RAM configuration is used, but the Core2x FPGA core released in the summer of 2025 can enable 24 bit (16 MB) addressing and the full 2MB of SRAM both flat &amp;amp; banked.&lt;br /&gt;
&lt;br /&gt;
A FPGA-based 6809 CPU can be optionally run on all F256 models which will also use this same MMU, and disable the hardware CPU. A 68k FPGA-based processor core is also coming, which should use flat memory addressing only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Changes associated with Core2x will be in &amp;lt;u&amp;gt;&#039;&#039;italics and underlined&#039;&#039;&amp;lt;/u&amp;gt; throughout this page.&lt;br /&gt;
&lt;br /&gt;
== Flat Memory Models ==&lt;br /&gt;
Core2x is the future standard FPGA load, with both 24-bit flat access and MMU 8k pages in bank 0. This allows for backwards compatibility, banking direct page and stack, as well as having separate chunks of memory visible in a single CPU-addressable bank for copying &amp;amp; other processing.&lt;br /&gt;
&lt;br /&gt;
The &#039;e&#039; FPGA load for series 2 provides this same 65816 flat memory model, with the older 1x speed &amp;amp; graphics capabilities. It hasn&#039;t been used much yet.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Address&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$00:0000 - $00:FEFF&lt;br /&gt;
|64k - 256&lt;br /&gt;
|Core2x: 8×8kB MMU banked&lt;br /&gt;
F256K2e: SRAM&lt;br /&gt;
|-&lt;br /&gt;
|$00:FF00 - $00:FFFF&lt;br /&gt;
|256&lt;br /&gt;
|Mirror of the last page of Flash, for boot purposes&lt;br /&gt;
|-&lt;br /&gt;
|$01:0000 - $1F:FFFF&lt;br /&gt;
|2M - 64k&lt;br /&gt;
|Rest of SRAM*&lt;br /&gt;
|-&lt;br /&gt;
|$20:0000 - $9F:FFFF&lt;br /&gt;
|8M&lt;br /&gt;
|DDR3 window (to be implemented?)&lt;br /&gt;
|-&lt;br /&gt;
|$F0:0000 - $F0:BFFF&lt;br /&gt;
|64k reserved&lt;br /&gt;
|[[IO Pages]]*&lt;br /&gt;
|-&lt;br /&gt;
|$F4:0000 - $F7:FFFF&lt;br /&gt;
|256k&lt;br /&gt;
|Cartridge*&lt;br /&gt;
|-&lt;br /&gt;
|$F8:0000 - $FF:FFFF&lt;br /&gt;
|512k&lt;br /&gt;
|Internal Flash*&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;* NOTE:&#039;&#039;&#039; In Core2x, the starred regions must have a MMU bit enabled to expose them to the 24-bit flat address. They are only mapped through the MMU by default at boot.&lt;br /&gt;
&lt;br /&gt;
== Memory Management Unit (MMU) ==&lt;br /&gt;
&lt;br /&gt;
=== 8kB Block Layout ===&lt;br /&gt;
The MMU splits the 64kB address space into 8 visible slots of 8kB each. A theoretical max of 256 selectable 8kB blocks yields a 2MB address space, which maps 512kB RAM, flash, and expansion.&lt;br /&gt;
&lt;br /&gt;
The Core2x MMU expands the bank numbers to 10 bits, repeating the original layout 4 times, to expose all 2MB of SRAM while remaining backwards compatible.&lt;br /&gt;
&lt;br /&gt;
IO pages have their own space of numbered banks that overlay one fixed slot (6, $C000-$DFFF).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Memory Mapping&lt;br /&gt;
!MMU 8kB Block Number!!Purpose&lt;br /&gt;
!Flat memory flag&lt;br /&gt;
|-&lt;br /&gt;
|$00 - $3F||512K SRAM &amp;lt;u&amp;gt;&#039;&#039;(Page 0)&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$40 - $7F||512K System Flash&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|$80 - $9F||256K Cartridge&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|$A0 - $FF||Reserved&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Core2x expansion&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$100 - $13F&lt;br /&gt;
|512K SRAM Page 1&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|-&lt;br /&gt;
|$140 - $1FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$200 - $23F&lt;br /&gt;
|512K SRAM Page 2&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|-&lt;br /&gt;
|$240 - $2FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$300 - $33F&lt;br /&gt;
|512K SRAM Page 3&lt;br /&gt;
|SRAM_EN&lt;br /&gt;
|-&lt;br /&gt;
|$340 - $3FF&lt;br /&gt;
|Mirror of Flash, Cart, Reserved&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Final MMU Address Construction&lt;br /&gt;
!&amp;lt;u&amp;gt;&#039;&#039;22&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
!&amp;lt;u&amp;gt;&#039;&#039;21&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
!20&lt;br /&gt;
!19&lt;br /&gt;
!18&lt;br /&gt;
!17&lt;br /&gt;
!16&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |MMU Block Number&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; rowspan=&amp;quot;2&amp;quot; |Byte offset in 8k block&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;u&amp;gt;&#039;&#039;Expansion&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Device&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Block number in device&lt;br /&gt;
|}&lt;br /&gt;
Device = SRAM, Flash, Cartridge, or Reserved&lt;br /&gt;
&lt;br /&gt;
=== Configuring the MMU ===&lt;br /&gt;
There are 4 separate sets of MMU configurations called MLUT 0-3 (Memory Lookup Tables), for easy switching between well-known (including kernel vs user) memory mapping states. Each MLUT holds 8 bank selections, one for each 8kB memory slot respectively. IO mapping is optional, independent of MLUT selection, and overrides slot 6 at $C000.&lt;br /&gt;
&lt;br /&gt;
Only one MLUT is active at any one time. To select the active MLUT, the lower two bits of address $0000 (MMU_MEM_CTRL) are used.&lt;br /&gt;
&lt;br /&gt;
Editing of MLUTs is also controlled by MMU_MEM_CTRL ($0000): Bits 4 and 5 determine which MLUT to be edited, independent of which MLUT is active. Bit 7 has to be set to 1 to enable editing. When editing is enabled, the block number of a physical memory area can be written to the slot register address to map that area to the address in CPU address space. If editing is not enabled (bit 7 of $0000 is 0), the slot register addresses act as ordinary memory with no side effect.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Static MMU Registers&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_MEM_CTRL&lt;br /&gt;
|EDIT_EN&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |EDIT_LUT&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SRAM_EN&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| -&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |ACT_LUT&lt;br /&gt;
|-&lt;br /&gt;
|$0001&lt;br /&gt;
|RW&lt;br /&gt;
|MMU_IO_CTRL&lt;br /&gt;
| -&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;SPR_SEL&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_FLASH&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;MOVE_IO&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;IO_PAGE_EXT&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|IO_DISABLE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |IO_PAGE&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;ACT_LUT&#039;&#039;&#039;: These two bits specify which MLUT (0–3) is used to translate CPU bus address to system bus addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;: Selects which MLUT (0-3) will be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EDIT_EN&#039;&#039;&#039;: If set (1), this bit enables MLUT editing, and memory addresses $0008–$000F (&amp;lt;u&amp;gt;&#039;&#039;and $0002-$0003&#039;&#039;&amp;lt;/u&amp;gt;) will be used to edit the selected &#039;&#039;&#039;EDIT_LUT&#039;&#039;&#039;. If clear (0), those memory locations will be standard memory locations and will be mapped like the rest of slot 0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;: Selects which IO page (0-3) is mapped to slot 6, when not disabled with &#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IO_DISABLE&#039;&#039;&#039;: If set (1), slot 6 ($C000-$DFFF) is mapped through the active MLUT as normal. If clear (0), slot 6 is mapped to the selected &#039;&#039;&#039;IO_PAGE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note that writing a simple page number to register $0001 easily selects that IO page (including 0) to be visible, although there are also other Core2x entries now as well.&lt;br /&gt;
&lt;br /&gt;
==== Core2x MMU Registers ====&lt;br /&gt;
&#039;&#039;&amp;lt;u&amp;gt;&#039;&#039;&#039;SRAM_EN&#039;&#039;&#039;&amp;lt;/u&amp;gt;&#039;&#039;: Enables access to the SRAM pages 1-3 in flat addresses 00:0000 to 1f:0000. Disables MMU 8k bank access to SRAM only. IO and Flash/Cart are affected by their own bits below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;IO_PAGE_EXT&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Bit 2 of the total IO page number, enabling pages 4 and 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_IO&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves IO pages from MMU access to 24-bit address F0:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;MOVE_FLASH&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Moves Cartridge &amp;amp; Flash addressing from MMU access to flat address F4:0000 and F8:0000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;&#039;&#039;SPR_SEL&#039;&#039;&#039;&#039;&#039;&amp;lt;/u&amp;gt;: Select current Sprite Block in IO Page 0. 0 = Sprite 0-63, 1 = Sprite 64-127.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+MLUT Slot Editing Registers (only visible with EDIT_EN enabled)&lt;br /&gt;
!Address&lt;br /&gt;
!R/W&lt;br /&gt;
!MLUT Slot Address&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0002&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 3 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 2 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 1 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 0 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&amp;lt;u&amp;gt;$0003&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 7 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 6 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 5 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&#039;&#039;&amp;lt;u&amp;gt;Slot 4 [9:8]&amp;lt;/u&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0008&lt;br /&gt;
|&lt;br /&gt;
|$0000 - $1FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 0 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$0009&lt;br /&gt;
|&lt;br /&gt;
|$2000 - $3FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 1 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000A&lt;br /&gt;
|&lt;br /&gt;
|$4000 - $5FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 2 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000B&lt;br /&gt;
|&lt;br /&gt;
|$6000 - $7FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 3 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000C&lt;br /&gt;
|&lt;br /&gt;
|$8000 - $9FFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 4 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000D&lt;br /&gt;
|&lt;br /&gt;
|$A000 - $BFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 5 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000E&lt;br /&gt;
|&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 6 block number [7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$000F&lt;br /&gt;
|&lt;br /&gt;
|$E000 - $FFFF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Edit MLUT Slot 7 block number [7:0]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
[[IO Pages|I/O Pages]]&lt;br /&gt;
!I/O Page&lt;br /&gt;
!B3&lt;br /&gt;
!B1&lt;br /&gt;
!B0&lt;br /&gt;
!MOVE_IO Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:0000 - $F0:1FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Low level I/O Register (gamma table, Mouse GFX, all IO devices and vicky registers)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:2000 - $F0:3FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display font memory and graphic color MLUTs 0,1,2,3&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:4000 - $F0:5FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display character matrix&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:6000 - $F0:7FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|Text display color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;4&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:8000 - $F0:9FFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text Color background LUT 0 &amp;amp; 1, Foreground LUT 0 &amp;amp; 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;5&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;0&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;$F0:A000 - $F0:BFFF&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|&amp;lt;u&amp;gt;&#039;&#039;Memory text FONT 0,1,2,3 for 8x8 or 0,1 for 8x16&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memory Block Tables ==&lt;br /&gt;
The following table shows which block number has to be written into a slot register to make the each 8 KB block of memory available to the CPU.&lt;br /&gt;
&lt;br /&gt;
Note that since Flash &amp;amp; Expansion are mirrored across all 4 Core2x expansion ranges, MMU blocks $40, $140, $240, $340 all point to the same physical flash, and $80, $180, $280, $380 all point to the same physical expansion addresses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | RAM&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Flash&lt;br /&gt;
| rowspan=&amp;quot;66&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; scope=&amp;quot;col&amp;quot; | Expansion&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Block Number&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Flat Address&lt;br /&gt;
|-&lt;br /&gt;
|$00||$00:0000 - $00:1FFF||$40||$F8:0000 - $F8:1FFF||$80||$F4:0000 - $F4:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$01||$00:2000 - $00:3FFF||$41||$F8:2000 - $F8:3FFF||$81||$F4:2000 - $F4:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$02||$00:4000 - $00:5FFF||$42||$F8:4000 - $F8:5FFF||$82||$F4:4000 - $F4:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$03||$00:6000 - $00:7FFF||$43||$F8:6000 - $F8:7FFF||$83||$F4:6000 - $F4:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$04||$00:8000 - $00:9FFF||$44||$F8:8000 - $F8:9FFF||$84||$F4:8000 - $F4:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$05||$00:A000 - $00:BFFF||$45||$F8:A000 - $F8:BFFF||$85||$F4:A000 - $F4:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$06||$00:C000 - $00:DFFF||$46||$F8:C000 - $F8:DFFF||$86||$F4:C000 - $F4:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$07||$00:E000 - $00:FFFF||$47||$F8:E000 - $F8:FFFF||$87||$F4:E000 - $F4:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$08||$01:0000 - $01:1FFF||$48||$F9:0000 - $F9:1FFF||$88||$F5:0000 - $F5:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$01:2000 - $01:3FFF||$49||$F9:2000 - $F9:3FFF||$89||$F5:2000 - $F5:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$01:4000 - $01:5FFF||$4A||$F9:4000 - $F9:5FFF||$8A||$F5:4000 - $F5:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$01:6000 - $01:7FFF||$4B||$F9:6000 - $F9:7FFF||$8B||$F5:6000 - $F5:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0C||$01:8000 - $01:9FFF||$4C||$F9:8000 - $F9:9FFF||$8C||$F5:8000 - $F5:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$0D||$01:A000 - $01:BFFF||$4D||$F9:A000 - $F9:BFFF||$8D||$F5:A000 - $F5:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0E||$01:C000 - $01:DFFF||$4E||$F9:C000 - $F9:DFFF||$8E||$F5:C000 - $F5:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0F||$01:E000 - $01:FFFF||$4F||$F9:E000 - $F9:FFFF||$8F||$F5:E000 - $F5:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10||$02:0000 - $02:1FFF||$50||$FA:0000 - $FA:1FFF||$90||$F6:0000 - $F6:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11||$02:2000 - $02:3FFF||$51||$FA:2000 - $FA:3FFF||$91||$F6:2000 - $F6:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12||$02:4000 - $02:5FFF||$52||$FA:4000 - $FA:5FFF||$92||$F6:4000 - $F6:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13||$02:6000 - $02:7FFF||$53||$FA:6000 - $FA:7FFF||$93||$F6:6000 - $F6:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$14||$02:8000 - $02:9FFF||$54||$FA:8000 - $FA:9FFF||$94||$F6:8000 - $F6:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$15||$02:A000 - $02:BFFF||$55||$FA:A000 - $FA:BFFF||$95||$F6:A000 - $F6:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$16||$02:C000 - $02:DFFF||$56||$FA:C000 - $FA:DFFF||$96||$F6:C000 - $F6:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$17||$02:E000 - $02:FFFF||$57||$FA:E000 - $FA:FFFF||$97||$F6:E000 - $F6:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$18||$03:0000 - $03:1FFF||$58||$FB:0000 - $FB:1FFF||$98||$F7:0000 - $F7:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$19||$03:2000 - $03:3FFF||$59||$FB:2000 - $FB:3FFF||$99||$F7:2000 - $F7:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1A||$03:4000 - $03:5FFF||$5A||$FB:4000 - $FB:5FFF||$9A||$F7:4000 - $F7:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1B||$03:6000 - $03:7FFF||$5B||$FB:6000 - $FB:7FFF||$9B||$F7:6000 - $F7:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1C||$03:8000 - $03:9FFF||$5C||$FB:8000 - $FB:9FFF||$9C||$F7:8000 - $F7:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$1D||$03:A000 - $03:BFFF||$5D||$FB:A000 - $FB:BFFF||$9D||$F7:A000 - $F7:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1E||$03:C000 - $03:DFFF||$5E||$FB:C000 - $FB:DFFF||$9E||$F7:C000 - $F7:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$1F||$03:E000 - $03:FFFF||$5F||$FB:E000 - $FB:FFFF||$9F||$F7:E000 - $F7:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$20||$04:0000 - $04:1FFF||$60||$FC:0000 - $FC:1FFF	&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$21||$04:2000 - $04:3FFF||$61||$FC:2000 - $FC:3FFF	&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$22||$04:4000 - $04:5FFF||$62||$FC:4000 - $FC:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$23||$04:6000 - $04:7FFF||$63||$FC:6000 - $FC:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$24||$04:8000 - $04:9FFF||$64||$FC:8000 - $FC:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$25||$04:A000 - $04:BFFF||$65||$FC:A000 - $FC:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$26||$04:C000 - $04:DFFF||$66||$FC:C000 - $FC:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$27||$04:E000 - $04:FFFF||$67||$FC:E000 - $FC:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$28||$05:0000 - $05:1FFF||$68||$FD:0000 - $FD:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$29||$05:2000 - $05:3FFF||$69||$FD:2000 - $FD:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2A||$05:4000 - $05:5FFF||$6A||$FD:4000 - $FD:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2B||$05:6000 - $05:7FFF||$6B||$FD:6000 - $FD:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2C||$05:8000 - $05:9FFF||$6C||$FD:8000 - $FD:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$2D||$05:A000 - $05:BFFF||$6D||$FD:A000 - $FD:BFFF	&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$2E||$05:C000 - $05:DFFF||$6E||$FD:C000 - $FD:DFFF	&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$2F||$05:E000 - $05:FFFF||$6F||$FD:E000 - $FD:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$30||$06:0000 - $06:1FFF||$70||$FE:0000 - $FE:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$31||$06:2000 - $06:3FFF||$71||$FE:2000 - $FE:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$32||$06:4000 - $06:5FFF||$72||$FE:4000 - $FE:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$33||$06:6000 - $06:7FFF||$73||$FE:6000 - $FE:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$34||$06:8000 - $06:9FFF||$74||$FE:8000 - $FE:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$35||$06:A000 - $06:BFFF||$75||$FE:A000 - $FE:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$36||$06:C000 - $06:DFFF||$76||$FE:C000 - $FE:DFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$37||$06:E000 - $06:FFFF||$77||$FE:E000 - $FE:FFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$38||$07:0000 - $07:1FFF||$78||$FF:0000 - $FF:1FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$39||$07:2000 - $07:3FFF||$79||$FF:2000 - $FF:3FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3A||$07:4000 - $07:5FFF||$7A||$FF:4000 - $FF:5FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3B||$07:6000 - $07:7FFF||$7B||$FF:6000 - $FF:7FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3C||$07:8000 - $07:9FFF||$7C||$FF:8000 - $FF:9FFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3D||$07:A000 - $07:BFFF||$7D||$FF:A000 - $FF:BFFF	&lt;br /&gt;
|-&lt;br /&gt;
|$3E||$07:C000 - $07:DFFF||$7E||$FF:C000 - $FF:DFFF	&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$3F||$07:E000 - $07:FFFF||$7F||$FF:E000 - $FF:FFFF	&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For Core2x extended map 65816 core:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 1&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 2&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
| rowspan=66 style=&amp;quot;border: none; background: none;&amp;quot; |&lt;br /&gt;
! colspan=2 scope=col| &amp;lt;u&amp;gt;&#039;&#039;512K SRAM Page 3&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Physical Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Physical Address&lt;br /&gt;
&lt;br /&gt;
! scope=col | Block Number&lt;br /&gt;
! scope=col | Physical Address&lt;br /&gt;
|-&lt;br /&gt;
|$100||$20:0000 - $20:1FFF||$200||$40:0000 - $40:1FFF||$300||$60:0000 - $60:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$101||$20:2000 - $20:3FFF||$201||$40:2000 - $40:3FFF||$301||$60:2000 - $60:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$102||$20:4000 - $20:5FFF||$202||$40:4000 - $40:5FFF||$302||$60:4000 - $60:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$103||$20:6000 - $20:7FFF||$203||$40:6000 - $40:7FFF||$303||$60:6000 - $60:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$104||$20:8000 - $20:9FFF||$204||$40:8000 - $40:9FFF||$304||$60:8000 - $60:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$105||$20:A000 - $20:BFFF||$205||$40:A000 - $40:BFFF||$305||$60:A000 - $60:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$106||$20:C000 - $20:DFFF||$206||$40:C000 - $40:DFFF||$306||$60:C000 - $60:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$107||$20:E000 - $20:FFFF||$207||$40:E000 - $40:FFFF||$307||$60:E000 - $60:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$108||$21:0000 - $21:1FFF||$208||$41:0000 - $41:1FFF||$308||$61:0000 - $61:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$109||$21:2000 - $21:3FFF||$209||$41:2000 - $41:3FFF||$309||$61:2000 - $61:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10A||$21:4000 - $21:5FFF||$20A||$41:4000 - $41:5FFF||$30A||$61:4000 - $61:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10B||$21:6000 - $21:7FFF||$20B||$41:6000 - $41:7FFF||$30B||$61:6000 - $61:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10C||$21:8000 - $21:9FFF||$20C||$41:8000 - $41:9FFF||$30C||$61:8000 - $61:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$10D||$21:A000 - $21:BFFF||$20D||$41:A000 - $41:BFFF||$30D||$61:A000 - $61:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10E||$21:C000 - $21:DFFF||$20E||$41:C000 - $41:DFFF||$30E||$61:C000 - $61:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$10F||$21:E000 - $21:FFFF||$20F||$41:E000 - $41:FFFF||$30F||$61:E000 - $61:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$110||$22:0000 - $22:1FFF||$210||$42:0000 - $42:1FFF||$310||$62:0000 - $62:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$111||$22:2000 - $22:3FFF||$211||$42:2000 - $42:3FFF||$311||$62:2000 - $62:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$112||$22:4000 - $22:5FFF||$212||$42:4000 - $42:5FFF||$312||$62:4000 - $62:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$113||$22:6000 - $22:7FFF||$213||$42:6000 - $42:7FFF||$313||$62:6000 - $62:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$114||$22:8000 - $22:9FFF||$214||$42:8000 - $42:9FFF||$314||$62:8000 - $62:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$115||$22:A000 - $22:BFFF||$215||$42:A000 - $42:BFFF||$315||$62:A000 - $62:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$116||$22:C000 - $22:DFFF||$216||$42:C000 - $42:DFFF||$316||$62:C000 - $62:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$117||$22:E000 - $22:FFFF||$217||$42:E000 - $42:FFFF||$317||$62:E000 - $62:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$118||$23:0000 - $23:1FFF||$218||$43:0000 - $43:1FFF||$318||$63:0000 - $63:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$119||$23:2000 - $23:3FFF||$219||$43:2000 - $43:3FFF||$319||$63:2000 - $63:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11A||$23:4000 - $23:5FFF||$21A||$43:4000 - $43:5FFF||$31A||$63:4000 - $63:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11B||$23:6000 - $23:7FFF||$21B||$43:6000 - $43:7FFF||$31B||$63:6000 - $63:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11C||$23:8000 - $23:9FFF||$21C||$43:8000 - $43:9FFF||$31C||$63:8000 - $63:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$11D||$23:A000 - $23:BFFF||$21D||$43:A000 - $43:BFFF||$31D||$63:A000 - $63:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11E||$23:C000 - $23:DFFF||$21E||$43:C000 - $43:DFFF||$31E||$63:C000 - $63:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$11F||$23:E000 - $23:FFFF||$21F||$43:E000 - $43:FFFF||$31F||$63:E000 - $63:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$120||$24:0000 - $24:1FFF||$220||$44:0000 - $44:1FFF&lt;br /&gt;
|$320&lt;br /&gt;
|$64:0000 - $64:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$121||$24:2000 - $24:3FFF||$221||$44:2000 - $44:3FFF&lt;br /&gt;
|$321&lt;br /&gt;
|$64:2000 - $64:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$122||$24:4000 - $24:5FFF||$222||$44:4000 - $44:5FFF&lt;br /&gt;
|$322&lt;br /&gt;
|$64:4000 - $64:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$123||$24:6000 - $24:7FFF||$223||$44:6000 - $44:7FFF&lt;br /&gt;
|$323&lt;br /&gt;
|$64:6000 - $64:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$124||$24:8000 - $24:9FFF||$224||$44:8000 - $44:9FFF&lt;br /&gt;
|$324&lt;br /&gt;
|$64:8000 - $64:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$125||$24:A000 - $24:BFFF||$225||$44:A000 - $44:BFFF&lt;br /&gt;
|$325&lt;br /&gt;
|$64:A000 - $64:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$126||$24:C000 - $24:DFFF||$226||$44:C000 - $44:DFFF&lt;br /&gt;
|$326&lt;br /&gt;
|$64:C000 - $64:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$127||$24:E000 - $24:FFFF||$227||$44:E000 - $44:FFFF&lt;br /&gt;
|$327&lt;br /&gt;
|$64:E000 - $64:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$128||$25:0000 - $25:1FFF||$228||$45:0000 - $45:1FFF&lt;br /&gt;
|$328&lt;br /&gt;
|$65:0000 - $65:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$129||$25:2000 - $25:3FFF||$229||$45:2000 - $45:3FFF&lt;br /&gt;
|$329&lt;br /&gt;
|$65:2000 - $65:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12A||$25:4000 - $25:5FFF||$22A||$45:4000 - $45:5FFF&lt;br /&gt;
|$32A&lt;br /&gt;
|$65:4000 - $65:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12B||$25:6000 - $25:7FFF||$22B||$45:6000 - $45:7FFF&lt;br /&gt;
|$32B&lt;br /&gt;
|$65:6000 - $65:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12C||$25:8000 - $25:9FFF||$22C||$45:8000 - $45:9FFF&lt;br /&gt;
|$32C&lt;br /&gt;
|$65:8000 - $65:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$12D||$25:A000 - $25:BFFF||$22D||$45:A000 - $45:BFFF&lt;br /&gt;
|$32D&lt;br /&gt;
|$65:A000 - $65:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12E||$25:C000 - $25:DFFF||$22E||$45:C000 - $45:DFFF&lt;br /&gt;
|$32E&lt;br /&gt;
|$65:C000 - $65:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$12F||$25:E000 - $25:FFFF||$22F||$45:E000 - $45:FFFF&lt;br /&gt;
|$32F&lt;br /&gt;
|$65:E000 - $65:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$130||$26:0000 - $26:1FFF||$230||$46:0000 - $46:1FFF&lt;br /&gt;
|$330&lt;br /&gt;
|$66:0000 - $66:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$131||$26:2000 - $26:3FFF||$231||$46:2000 - $46:3FFF&lt;br /&gt;
|$331&lt;br /&gt;
|$66:2000 - $66:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$132||$26:4000 - $26:5FFF||$232||$46:4000 - $46:5FFF&lt;br /&gt;
|$332&lt;br /&gt;
|$66:4000 - $66:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$133||$26:6000 - $26:7FFF||$233||$46:6000 - $46:7FFF&lt;br /&gt;
|$333&lt;br /&gt;
|$66:6000 - $66:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$134||$26:8000 - $26:9FFF||$234||$46:8000 - $46:9FFF&lt;br /&gt;
|$334&lt;br /&gt;
|$66:8000 - $66:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$135||$26:A000 - $26:BFFF||$235||$46:A000 - $46:BFFF&lt;br /&gt;
|$335&lt;br /&gt;
|$66:A000 - $66:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$136||$26:C000 - $26:DFFF||$236||$46:C000 - $46:DFFF&lt;br /&gt;
|$336&lt;br /&gt;
|$66:C000 - $66:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$137||$26:E000 - $26:FFFF||$237||$46:E000 - $46:FFFF&lt;br /&gt;
|$337&lt;br /&gt;
|$66:E000 - $66:FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$138||$27:0000 - $27:1FFF||$238||$47:0000 - $47:1FFF&lt;br /&gt;
|$338&lt;br /&gt;
|$67:0000 - $67:1FFF&lt;br /&gt;
|-&lt;br /&gt;
|$139||$27:2000 - $27:3FFF||$239||$47:2000 - $47:3FFF&lt;br /&gt;
|$339&lt;br /&gt;
|$67:2000 - $67:3FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13A||$27:4000 - $27:5FFF||$23A||$47:4000 - $47:5FFF&lt;br /&gt;
|$33A&lt;br /&gt;
|$67:4000 - $67:5FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13B||$27:6000 - $27:7FFF||$23B||$47:6000 - $47:7FFF&lt;br /&gt;
|$33B&lt;br /&gt;
|$67:6000 - $67:7FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13C||$27:8000 - $27:9FFF||$23C||$47:8000 - $47:9FFF&lt;br /&gt;
|$33C&lt;br /&gt;
|$67:8000 - $67:9FFF&lt;br /&gt;
|-&lt;br /&gt;
|$13D||$27:A000 - $27:BFFF||$23D||$47:A000 - $47:BFFF&lt;br /&gt;
|$33D&lt;br /&gt;
|$67:A000 - $67:BFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13E||$27:C000 - $27:DFFF||$23E||$47:C000 - $47:DFFF&lt;br /&gt;
|$33E&lt;br /&gt;
|$67:C000 - $67:DFFF&lt;br /&gt;
|-&lt;br /&gt;
|$13F||$27:E000 - $27:FFFF||$23F||$47:E000 - $47:FFFF&lt;br /&gt;
|$33F&lt;br /&gt;
|$67:E000 - $67:FFFF&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38477</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38477"/>
		<updated>2026-02-21T05:48:45Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Tiles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth, which should on its own be feasible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|1024&lt;br /&gt;
|888&lt;br /&gt;
|4×256&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|No 4bpp, this is all 8bpp&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|666&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites. RGB channels share low bit, 5551 = 16 bits&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=FPU_Accumulator&amp;diff=38476</id>
		<title>FPU Accumulator</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=FPU_Accumulator&amp;diff=38476"/>
		<updated>2026-02-20T09:14:52Z</updated>

		<summary type="html">&lt;p&gt;WF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This design for a better FPU block for 8/16 bit access, which also integrates 32-bit integer processing. While it&#039;s 32 bits, copying around 32-bit values with the CPU is mostly avoided.&lt;br /&gt;
&lt;br /&gt;
There are 256 32-bit zeropage-like registers and one 32-bit accumulator. Any of the registers can hold useful constants (including 0, 1, etc) for reference. It&#039;s similar to the 6502 accumulator and zeropage values.&lt;br /&gt;
&lt;br /&gt;
(TBD - registers in RAM or FPGA? Former allows swapping in new sets, but more complicated bus mastering, steal cpu cycles.)&lt;br /&gt;
&lt;br /&gt;
Commands are issued by writing a byte to an I/O location. The location identifies the command to trigger, and the byte written is often a selector for which register number to use, sometimes a literal integer value, or ignored.&lt;br /&gt;
&lt;br /&gt;
Status bits (TBD) are available to read, with various errors, and integer as well as fp Z/N/V/C flags just like the 6502. V and C are only for integer ops.&lt;br /&gt;
&lt;br /&gt;
* Overflow/underflow (fp/int range, as well as f2i)&lt;br /&gt;
* Division by zero&lt;br /&gt;
* Int conversion lost fractional portion&lt;br /&gt;
&lt;br /&gt;
Set the integer fixed point location (TBD) which affects multiply, divide, and conversion with floats.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039; - should there be separate signed &amp;amp; unsigned variants of integer operations (including F2I), or a mode bit for signedness? Should all integer commands respect a single signedness control flag?&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Integer control flag&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Signed&lt;br /&gt;
|64bit reg0&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Fixed point frac bits (0-31)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Shared Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|LOAD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|STORE&lt;br /&gt;
|Reg&lt;br /&gt;
|Reg = A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|SWAP&lt;br /&gt;
|Reg&lt;br /&gt;
|(A, Reg) = (Reg, A)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Floating Point Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FADD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A + Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FSUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A - Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FRSUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg - A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMUL&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A * Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FDIV&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A / Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FRDIV&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg / A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|F2I&lt;br /&gt;
|Signed flag&lt;br /&gt;
|A = Int(A) or UInt(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMIN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Min(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMAX&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Max(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FABS&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Abs(A)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Maybe&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FADDB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A + Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FSUBB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A - Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FMULB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A * Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FDIVB&lt;br /&gt;
|Byte&lt;br /&gt;
|A = A / Val&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FCLR&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = 0.0 (LOAD instead)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FNEG&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = -A (FRSUB instead)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FRECIP&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = 1.0/A (FRDIV instead)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FPOW&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A ^ Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FSQRT&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Sqrt(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FTRIG&lt;br /&gt;
|0&lt;br /&gt;
|A = Sin(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|A = Cos(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|A = Tan(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FATAN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Atan(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Sec(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Csc(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Cot(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FACOT&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Arccot(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Arcsin(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|A = Arccos(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FFLOOR&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Floor(A), Reg = Frac(A)  (options?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|FCEIL&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Ceil(A), Reg = Frac(A)  (options?)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Integer Operations&lt;br /&gt;
!Cmd #&lt;br /&gt;
!Name&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IADD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A + Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IADDC&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A + Reg + C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A - Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISUBC&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A - Reg - !C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IRSUB&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Reg - A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISETC&lt;br /&gt;
|0 or 1&lt;br /&gt;
|C = Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IMUL&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A * Reg (TBD - 64-bit result? Could auto-write Reg 0?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IDIV&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A / Reg (TBD - combined DIVMOD? 64/32 DIV?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IMOD&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A % Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ICMP&lt;br /&gt;
|Reg&lt;br /&gt;
|Status = A - Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|INEG&lt;br /&gt;
|0&lt;br /&gt;
|A = -A&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IAND&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A &amp;amp; Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IOR&lt;br /&gt;
|Reg&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;A = A | Reg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IXOR&lt;br /&gt;
|Reg&lt;br /&gt;
|A = A ^ Reg&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|I2F&lt;br /&gt;
|Signed Flag&lt;br /&gt;
|A = Float(Int(A)) or Float(UInt(A))&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISHL&lt;br /&gt;
|Count&lt;br /&gt;
|A = A &amp;lt;&amp;lt; Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISHR&lt;br /&gt;
|Count&lt;br /&gt;
|A = A &amp;gt;&amp;gt; Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISSHR&lt;br /&gt;
|Count&lt;br /&gt;
|A = A &amp;gt;&amp;gt;(signed) Value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IROLL&lt;br /&gt;
|Count&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;A = (A &amp;lt;&amp;lt; Count) | (A &amp;gt;&amp;gt; (32 - Count))&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IUMIN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Min(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISMIN&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Min(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IUMAX&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Max(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISMAX&lt;br /&gt;
|Reg&lt;br /&gt;
|A = Max(A, Reg)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|IABS&lt;br /&gt;
|Ignored&lt;br /&gt;
|A = Abs(A)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET0&lt;br /&gt;
|Byte&lt;br /&gt;
|Set byte 0 of accumulator&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET1&lt;br /&gt;
|Byte&lt;br /&gt;
|Set byte 1 of accumulator&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET2&lt;br /&gt;
|Byte&lt;br /&gt;
|Set byte 2 of accumulator&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|ISET3&lt;br /&gt;
|Byte&lt;br /&gt;
|Set Byte 3 of accumulator&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38475</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38475"/>
		<updated>2026-02-20T06:49:57Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Global settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth, which should on its own be feasible.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=Emulation&amp;diff=38474</id>
		<title>Emulation</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=Emulation&amp;diff=38474"/>
		<updated>2026-02-20T06:49:15Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Foenijs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FoenixIDE ==&lt;br /&gt;
The FoenixIDE provides emulation of various Foenix Retro Systems including,&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!System&lt;br /&gt;
!Descripton&lt;br /&gt;
|-&lt;br /&gt;
|F256K(816)&lt;br /&gt;
|The F256K computer with integrated keyboard and WDC65C816 processor.&lt;br /&gt;
|-&lt;br /&gt;
|F256K&lt;br /&gt;
|The F256K computer with integrated keyboard and WDC65C02 processor.&lt;br /&gt;
|-&lt;br /&gt;
|Jr(816)&lt;br /&gt;
|The F256 Jr. computer with a WDC65C816 processor.&lt;br /&gt;
|-&lt;br /&gt;
|Jr&lt;br /&gt;
|The F256 Jr. computer with a WDC65C02 processor.&lt;br /&gt;
|-&lt;br /&gt;
|U+&lt;br /&gt;
|The C256 Foenix U+ (4Meg RAM Config) - Legacy&lt;br /&gt;
|-&lt;br /&gt;
|U&lt;br /&gt;
|The C256 Foenix U (2Meg RAM Config) - Legacy&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|The C256 Foenix FMX - Legacy&lt;br /&gt;
|-&lt;br /&gt;
|B&lt;br /&gt;
|The C256 Foenix (original) - Legacy&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===  Installation ===&lt;br /&gt;
The current Windows installation file (FoenixIDE.Setup.msi) and source code can be found here, &lt;br /&gt;
&#039;&#039;&#039;https://github.com/Trinity-11/FoenixIDE/releases&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Foenijs ==&lt;br /&gt;
Runs in your browser with no setup.&lt;br /&gt;
&lt;br /&gt;
https://www.white-flame.com/foenijs/, Wiki page [[Foenijs]]&lt;br /&gt;
&lt;br /&gt;
* Supports the F256 line (Jr, Jr2, K, K2), with 65c02 and 65816&lt;br /&gt;
* All graphics modes &amp;amp; features&lt;br /&gt;
* All audio chips (still some rough edges)&lt;br /&gt;
* PS/2 mouse, PS/2 keyboard, and built-in K keyboard emulation&lt;br /&gt;
* NES/SNES via USB gamepads, Atari joystick via keyboard.&lt;br /&gt;
* SD Card images are persistently stored in your browser&#039;s IndexedDB&lt;br /&gt;
** Card library, with full card image upload/download, and new formatted image creation&lt;br /&gt;
** Individual file transfers directly to/from card images&lt;br /&gt;
** 1-click program launch&lt;br /&gt;
* Strong CPU, stack, and device debugging support, with live views for memory and individual graphics data.&lt;br /&gt;
* Directly run a program or mount a card by adding URL parameters&lt;br /&gt;
** &amp;lt;code&amp;gt;url=http://...&amp;lt;/code&amp;gt; to a &amp;lt;code&amp;gt;pgz&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pgx&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;bas&amp;lt;/code&amp;gt; program, or &amp;lt;code&amp;gt;bin&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;iso&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;img&amp;lt;/code&amp;gt; card image with optional &amp;lt;code&amp;gt;.gz&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt;.&lt;br /&gt;
*** Github links automatically rewrite to their &amp;lt;code&amp;gt;raw.githubusercontent.com&amp;lt;/code&amp;gt; form to get around CORS issues.&lt;br /&gt;
** &amp;lt;code&amp;gt;run=filename&amp;lt;/code&amp;gt; to autorun a file within a card image URL&lt;br /&gt;
** &amp;lt;code&amp;gt;model=f256jr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f256jr2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f256k&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;f256k2&amp;lt;/code&amp;gt;&lt;br /&gt;
** Formatted as e.g.  &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://www.white-flame.com/foenijs/?url=...&amp;amp;model=&amp;lt;/nowiki&amp;gt;...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
&lt;br /&gt;
* Core2x and 6809&lt;br /&gt;
* Better Atari joystick support&lt;br /&gt;
* Networking&lt;br /&gt;
* K2 optical keyboard&lt;br /&gt;
* Cartridges&lt;br /&gt;
* Hardware I/O ports: debug ports, IEC port, DIP switches, MIDI ports&lt;br /&gt;
&lt;br /&gt;
[https://discord.com/channels/691915291721990194/1455809214231478414 Discord support channel] on the Wildbits server, with the author wf2. Feature requests are welcomed.&lt;br /&gt;
&lt;br /&gt;
== MAME ==&lt;br /&gt;
This emulator is currently under development (23 Mar 2025).  See here: https://github.com/dtremblay/mame&lt;br /&gt;
&lt;br /&gt;
Releases are published in GitHub and announced in Discord: https://discord.com/channels/691915291721990194/1330998392481906768&lt;br /&gt;
&lt;br /&gt;
(a work-in-progress sdcard .img file containing many games, tools and media files prepared in March 2025 can be found here: https://github.com/Mu0n/F256MiscGoodies/tree/main/SDCard_Collection consult the readme of that page to get the right file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MAME is available for Linux, Mac and Windows.  Future development of the F256 machines will support the 65816, 6809 and 68000 processors.&lt;br /&gt;
&lt;br /&gt;
Currently, only the F256K is partially implemented.&lt;br /&gt;
&lt;br /&gt;
* Memory Management Unit (MMU) at address $0&lt;br /&gt;
* SD Card with SPI&lt;br /&gt;
* Matrix Keyboard with VIA&lt;br /&gt;
* Game Controllers: Atari Joysticks with VIA&lt;br /&gt;
* Text display, Sprites, Tiles and Bitmaps (respecting the layers)&lt;br /&gt;
* Interrupts: SOF, SOL, RTC, Timers, VIA0, VIA1&lt;br /&gt;
* Timers: Real-Time Clock (RTC), Timer0 (at 25Mhz) and Timer1 (at SOF 60 or 70Hz)&lt;br /&gt;
* Math processor&lt;br /&gt;
* Random Number Generator (RNG)&lt;br /&gt;
* Sound Chips: PSG (dual - stereo), OPL, SID (dual - stereo)&lt;br /&gt;
* Direct Memory Access (DMA)&lt;br /&gt;
Unimplemented features:&lt;br /&gt;
&lt;br /&gt;
* UART (serial port)&lt;br /&gt;
* IEC&lt;br /&gt;
* CODEC&lt;br /&gt;
* NES/SNES Game Controllers&lt;br /&gt;
* PS/2 Mouse and Keyboard&lt;br /&gt;
* WIFI&lt;br /&gt;
* Buzzer and status LEDs&lt;br /&gt;
* Debug port&lt;br /&gt;
* DIP switches&lt;br /&gt;
* External Memory Cartridge&lt;br /&gt;
&lt;br /&gt;
====== How to Run MAME ======&lt;br /&gt;
MAME has quite an extensive list of features that can be enabled and disabled.&lt;br /&gt;
&lt;br /&gt;
To run F256K in full screen mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./f256 f256k&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To run in window mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./f256 f256k -window -resolution 800x600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set a disk image (for the SD Card):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./f256 f256k -harddisk sdcard.img&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To disable sound:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./f256 f256k -sound none&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To collect logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./f256 f256k -log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Within MAME emulator, you can see the frame rate (in percent) by pressing the &#039;&#039;&#039;F11&#039;&#039;&#039; key.&lt;br /&gt;
&lt;br /&gt;
You can modify settings and key assignments using the &#039;&#039;&#039;TAB&#039;&#039;&#039; key.&lt;br /&gt;
&lt;br /&gt;
You can see the debug console (to step in CPU memory and view memory values) using the back-tick key &#039;&#039;&#039;`&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exit the emulator using the &#039;&#039;&#039;ESC&#039;&#039;&#039; key.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Note&#039;&#039;&#039;: all these keys can be modified, so these are the default settings.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====== Creating an SD Card Image to use in MAME Emulator and Foenix IDE ======&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;&#039;Easy Method:&#039;&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use the FoenixIDE to write your SD Card to a single ISO file. In the FoenixIDE menu, select &#039;&#039;&#039;Tools | Export SD Card to IMG.&#039;&#039;&#039;  You will then get a Save dialog: pick a filename to save.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;u&amp;gt;Hard Method:&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;These instructions require a Linux Operating System or MinGW.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Create a blank image of 64 blocks of 1 MB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dd if=/dev/zero of=sdcard.img bs=1M count=64&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Partition the image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;parted sdcard.img --script mklabel msdos&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;parted sdcard.img --script mkpart primary fat32 1MiB 100%&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You need to know the starting sector for the next step.  To find the &#039;&#039;&#039;starting&#039;&#039;&#039; &#039;&#039;&#039;sector&#039;&#039;&#039;: &amp;lt;code&amp;gt;fdisk -l sdcard.img&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&#039;ll get something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Device Boot Start End Sectors Size Id Type&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sdcard.img1 2048 131071 129024 63M c W95 FAT32 (LBA)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;starting sector&#039;&#039;&#039; is &amp;quot;2048&amp;quot; in the listing above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a Loop Device for Formatting&lt;br /&gt;
&lt;br /&gt;
Map the partition to a loop device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo losetup -o $((2048 * 512)) --sizelimit $((129024 * 512)) /dev/loop0 sdcard.img&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Format it: &amp;lt;code&amp;gt;sudo mkfs.vfat -F 32 /dev/loop0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detach it: &amp;lt;code&amp;gt;sudo losetup -d /dev/loop0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The disk image is now ready, but it&#039;s empty.  To copy files into the disk, you need to mount it. After it&#039;s mounted, you can copy files to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mkdir /mnt/f256&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mount -o loop,offset=$((2048 * 512)) sdcard.img /mnt/f256&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cp myfile.txt mnt/&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo umount mnt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38473</id>
		<title>WF FPGA Ideas</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38473"/>
		<updated>2026-02-20T06:46:32Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Bitstream readers/writers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Video enhancements ==&lt;br /&gt;
[[WF16 Video Architecture]]&lt;br /&gt;
&lt;br /&gt;
== Math coprocessor ==&lt;br /&gt;
[[FPU Accumulator]]&lt;br /&gt;
&lt;br /&gt;
== SDCard ==&lt;br /&gt;
Auto-tx on read. Could supersede this with auto-reading a 16-bit length to a storage pointer, running in the background, flag or interrupt when done. Loading straight into DDR3 would be good once audio/video can read from there.&lt;br /&gt;
&lt;br /&gt;
Stream MP3 or MIDI file from disk (or ddr3?) straight to chips&lt;br /&gt;
&lt;br /&gt;
== Bootstrap and Machine Identity ==&lt;br /&gt;
Access to the cores SDCard. Name something better than the current hardcoded names.&lt;br /&gt;
&lt;br /&gt;
Soft-boot into one of the other cores, instead of relying on jumpers to select the core. Have an extended PGZ header or new file format that can request such things. Note that PGZ should say how many and which 8k blocks or 64k banks it&#039;s hardcoded for. Should be another load format for &amp;quot;play nice&amp;quot; system tools that can be simultaneously loaded.&lt;br /&gt;
&lt;br /&gt;
Identify cores by an 8 character ASCII string, instead of bit fields. Maybe have a version number (16 bit) per release of any named platform.&lt;br /&gt;
&lt;br /&gt;
Have different ROM loads for different cores? Or boot from RAM if some magic bytes occur there instead of ROM., though that would be part of the ROM boot that can do that, what ISA would the code be?&lt;br /&gt;
&lt;br /&gt;
RP2040 uses the Slave SelectMAX x8 config interface of the FPGA, and its 8 data pins should be GPIO for the FPGA to talk back to the RP after it&#039;s up and running (unless the pins are used for something else). The RP software needs updating for that.&lt;br /&gt;
&lt;br /&gt;
Simplest comms would be splitting the 8-bit path into two 4-bit independent directional channels. Clock (toggle when new data is sent), Ack (receiver toggles when it&#039;s read), 2 data bits. All polled on the software end. The RP2040 could be crunching FAT32 stuff while the FPGA is waiting to write to it, no problem.&lt;br /&gt;
&lt;br /&gt;
SRAM can be retained between resets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;char my_crash_info[100] __attribute__((section(&amp;quot;.uninitialized_data&amp;quot;)));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and with a macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#define __uninitialized_ram(group) __attribute__((section(&amp;quot;.uninitialized_data.&amp;quot; #group))) group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;datetime_t __uninitialized_ram(persist_date);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tentatively Proposed RP2040 Startup ===&lt;br /&gt;
&lt;br /&gt;
* Read SD Card for magic &amp;lt;code&amp;gt;/MYCORE.TXT&amp;lt;/code&amp;gt; file containing the full path of the core filename to boot.&lt;br /&gt;
** If this exists, DIP switches can be some form of override. Need to be able to break in if something messes up. On configuring MYCORE, always tell the user to set their DIP switches to 00.&lt;br /&gt;
** If this doesn&#039;t exist, oldsk00l DIP switches determine the core to boot.&lt;br /&gt;
* Load compressed core file from card and get the FPGA going.&lt;br /&gt;
** Set the FPGA comm handshake pins to 0 before releasing the init/reset command to the FPGA.&lt;br /&gt;
* Load &amp;lt;code&amp;gt;/RPLIB&amp;lt;/code&amp;gt; library and jump into it, if exists (else infinite loop). This runs whatever library functionality can talk to the FPGA, and is upgradable as a file through the loaded utilities.&lt;br /&gt;
The library should have functions to browse the cores sdcard, and select which file to boot with.&lt;br /&gt;
&lt;br /&gt;
TODO - do the core selection DIP pins also hit the FPGA for flash banking? If so, then we might not be able to escape them.&lt;br /&gt;
&lt;br /&gt;
== Timers ==&lt;br /&gt;
Ensure that the 24-bit value latches when the LSB is read (or the MSB is written?) for consistent reads.&lt;br /&gt;
&lt;br /&gt;
== Wavetable Audio ==&lt;br /&gt;
Some form of wavetable audio is sorely missing for Amiga, TG16, SNES, Soundblaster era audio, especially sound effects. Basic multiple channels of stereo or panned mono, uncompressed samples, support some simple compression formats.&lt;br /&gt;
&lt;br /&gt;
Pull small buffers of audio into the FPGA from RAM, keep 2 live at a time, one playing, one buffered. At 25MHz with a 48KHz sample rate, 1 sample lasts 520 cycles (20µsec), could be fast enough to fetch while the last sample is playing and just single-buffer it? Or even a rolling window Should also support just-in-time software generation of each buffer, with IRQ notifications.&lt;br /&gt;
&lt;br /&gt;
Stretch samples to whatever the output sampling rate is. Linear interpolation would be neat, but probably optional. Same with the decay-to-zero that many old synth chips had.&lt;br /&gt;
&lt;br /&gt;
== Sound Chip Instances ==&lt;br /&gt;
Instead of duplicating hardware instances of sound chips, multiplex all their registers and internal variables. Access would select 1 of them, and the hardware would run with that multiplexer active on all its values. Compare the size taken, depends on how complex the chip is.&lt;br /&gt;
&lt;br /&gt;
Since sound chips don&#039;t need to be that fast, serially looping through and executing a cycle, accumulating their output, for the final audio sample would be fine. Some of them do this internally with their voices anyway.&lt;br /&gt;
&lt;br /&gt;
Register to select which instance(s) to use, so programs can be agnostic to what sound context exists with other things. Probably expose 2 chips at a time through the IO registers, with a separate one to select which bank of 2 to use. At least for mono chips, or those which are commonly in pairs. Stereo chips could just have 1 register set exposed.&lt;br /&gt;
&lt;br /&gt;
== 65816 support ==&lt;br /&gt;
Remap page 0 into any 64kB bank, allowing direct page, stack, etc, to have its own swappable space. However, need to consider how this goes for interrupts. An interrupt will probably have to remap to hardware bank 0, but then somehow restore the bank that used to be there. Keeping the upper 256 bytes locked somewhere (flash or bank 0 RAM) would solve that. The 8kB MMU can be used for these purposes already, but I wonder if the full bank swapping might be easier, but likely not really necessary as long as the MMU is around.&lt;br /&gt;
&lt;br /&gt;
== FPGA-based CPU ==&lt;br /&gt;
65816 but with a genuine 16-bit data bus.&lt;br /&gt;
&lt;br /&gt;
Keep 6809 in the same core with the 65816 running. Switch between either at any time (bus master), or alternate cycles. At core2x speed, they could each run at 6MHz alternately hitting the SRAM.&lt;br /&gt;
&lt;br /&gt;
If the bus can be more dynamic, especially during vblank/hblank, the CPUs can run a lot faster there.&lt;br /&gt;
&lt;br /&gt;
== Bitstream readers/writers ==&lt;br /&gt;
Write a byte or word to a FPGA location, it takes a CPU cycle to write it, and bumps its pointer.&lt;br /&gt;
&lt;br /&gt;
For a bit stream, a 32-bit bitpointer covers 4Gb = 512MB. A write would need to know the width to write. Maybe 16 registers, write a value to one of those to declare how many bits from the written value to write. This actually allows the index register to determine width dynamically, which is nice. Both read &amp;amp; write interfaces should use this. A complete hack but easier to use would be to have 18 regs. For any width &amp;gt;8 bits, a 2nd access to the next register would grab the high byte, even though it&#039;s technically the trigger for the next higher. But this would get confusing in 65816 16-bit mode, accessing lower lengths.&lt;br /&gt;
&lt;br /&gt;
Automatically converts between 32-bit bitstream pointer and 24-bit byte pointer + bit offset. When writing to the byte pointer, it automatically zeros out the bit offset, for easier initialization from standard word boundaries. If loading a bit pointer from normal pointer + bit offset, set the bit offset last.&lt;br /&gt;
&lt;br /&gt;
Separate read &amp;amp; write context, so copies, decompression, etc, can be done. Bit pointers can be directly read/written as well. Direction is always in the positive direction, though, at least for now.&lt;br /&gt;
&lt;br /&gt;
Probably good to support 0-length, for dynamically computed lengths. So with 0-16 supported, that&#039;s 17 entry points, kinda messy.&lt;br /&gt;
&lt;br /&gt;
Also, skip forward N bits without a read or write. Technically this could just be a read N bits and ignore the value, but this should be 0-65535 bits skipped. Could also just do a 32-bit add on the pointer register.&lt;br /&gt;
&lt;br /&gt;
8bit interface: 2 bitpointers, then 8 byte locs for pointer 0, and 8 byte locs for pointer 1.&lt;br /&gt;
&lt;br /&gt;
16bit interface: 2 bitpointers, then 16 word locs for pointer 0, 16 word locs for pointer 1. Writes triggered on high byte write. Reads trigger on low byte read, which readies the high byte.&lt;br /&gt;
&lt;br /&gt;
This is a CPU-blocking interface for reads, buffered for writes.&lt;br /&gt;
&lt;br /&gt;
== Optical Keyboard ==&lt;br /&gt;
Can this be sent as 9 events of 8bits, instead of 8 events of 9 bits (2 bytes)? However the self-describing row number might be useful to keep.&lt;br /&gt;
&lt;br /&gt;
== RLE Format(s) ==&lt;br /&gt;
RLE layers, DMA, and potentially sprites can use RLE encoding.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Span-based RLE formats&lt;br /&gt;
!bpp&lt;br /&gt;
!Layout&lt;br /&gt;
!length&lt;br /&gt;
!Max compression&lt;br /&gt;
!Breakeven&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;code&amp;gt;clllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-128&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|8px&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&amp;lt;code&amp;gt;cc111111&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-64&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|4 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-16&lt;br /&gt;
|4:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccCCCC llllllll llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|170:1 byte (512:3)&lt;br /&gt;
|3+3 pixels&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|&amp;lt;code&amp;gt;cccccccc llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|128:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|}&lt;br /&gt;
However, it would be useful to have spans of literal pixels as well, instead of just solid color span fills.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt; = span length L of color C, 0 = transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll cccccccc...&amp;lt;/code&amp;gt;= L count of individual pixels&lt;br /&gt;
&lt;br /&gt;
For a bpp less than 8, probably require them to fill an even byte or word count&lt;br /&gt;
&lt;br /&gt;
For now, RLE layers should be simple length + 8bpp aligned words. RLE bitmaps would be something different, maybe it&#039;s too flexible so we should just leave that to the CPU. It would save a lot of bandwidth for bitmap overlay layers with large transparent windows, though.&lt;br /&gt;
&lt;br /&gt;
== DMA/Blitter ==&lt;br /&gt;
Maybe separate out 2d mode into its own blitter?&lt;br /&gt;
&lt;br /&gt;
Flag to mask out the &#039;fill/mask&#039; color (default 0)&lt;br /&gt;
&lt;br /&gt;
Clip to output screen dimensions.&lt;br /&gt;
&lt;br /&gt;
Xflip, yflip, maybe 90° rotation, but that means dest dimensions change? Scaling? Full affine transform? &lt;br /&gt;
&lt;br /&gt;
Unpack RLE graphics, for better memory usage. Could still do x/y flip because this isn&#039;t raster-dependent. Must know the total x/y though if clipping is supported&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
&lt;br /&gt;
* bpp (could expand from src to dest given an offset?)&lt;br /&gt;
* src w/h/stride&lt;br /&gt;
* dest w/h/stride&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO - V2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Clipping? Or should the src/dest be handled in software?&lt;br /&gt;
&lt;br /&gt;
Ideally, there&#039;d be a clip bounds defined at the dest address, w, h, stride, bpp. The source address is defined, and it&#039;s blitted into an x/y in the dest screen, automatically clipped. This could also be used as a pixel/stamp plotter.&lt;br /&gt;
&lt;br /&gt;
If there end up being a large number of parameters for a src or dest, it would be nice to have multiple profiles. Either read src/dest profiles from ram, or have say 4 src &amp;amp; 4 dests saved, and blit from src N to dest M.&lt;br /&gt;
&lt;br /&gt;
RLE graphics should probably save their w/h and mode implicitly as the first 2 words, as they are their own free-form shapes.&lt;br /&gt;
&lt;br /&gt;
Since DMA currently only takes place during VBLANK, could be more efficient to have a DMA list to run when VSYNC hits, blasting those out as fast as possible.&lt;br /&gt;
&lt;br /&gt;
For 1bpp (or maybe others, too?) and/or/nor/nand/xor modes would be necessary.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38472</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38472"/>
		<updated>2026-02-20T06:45:43Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Global settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth.&lt;br /&gt;
&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!Dot clock&lt;br /&gt;
!HDMI Serializer&lt;br /&gt;
|-&lt;br /&gt;
|640x480&lt;br /&gt;
|25.175 MHz&lt;br /&gt;
|125.875 MHz&lt;br /&gt;
|-&lt;br /&gt;
|960x540&lt;br /&gt;
|37.125 MHz&lt;br /&gt;
|186.625 MHz&lt;br /&gt;
|}&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38471</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38471"/>
		<updated>2026-02-20T06:37:17Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth.&lt;br /&gt;
&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
Since transparency doesn&#039;t work well with a separate sprite line buffer, I wonder how many parallel sprite units could be in wait to be polled per layer for proper stacking of transparency. These would be similar to shift registers, but basically just a word cache that can render a pixel given an X coordinate that&#039;s asked of it. It would be a priority queue that the topmost one that serves that xcoord could present its pixel, and interest would trickle down and vie for a pull from the sram bus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38470</id>
		<title>IO Pages</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=IO_Pages&amp;diff=38470"/>
		<updated>2026-02-20T06:27:20Z</updated>

		<summary type="html">&lt;p&gt;WF: /* $D880: NES/SNES Gamepads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More detailed information is found in the [[Manuals]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;SRAM Address&amp;gt;&#039;&#039;&#039;SRAM Address&#039;&#039;&#039;&amp;lt;/span&amp;gt;: Raw addresses for the system SRAM chip. The VICKY can only address the system SRAM (for now, DDR3 support coming). The 1st gen hardware has 512kB (19-bit space), while the 2nd gen has 2MB (21-bit space). The 24-bit pointers used are direct addresses into the SRAM chip, regardless of how the 2MB is mapped to the CPU&#039;s/MMU&#039;s address space. For instance, the Core2x MMU has 4 separate 512kB banks at non-consecutive addresses; these 4 banks are all linear+consecutive in the SRAM, and that view must be addressed here instead of its 8k block offset addresses.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Model names&#039;&#039;&#039;: Certain features are only available on certain models, and these terms are used exactly. For instance, &amp;quot;F256Jr&amp;quot; means exactly the 1st gen Jr, not the entire Jr line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGR&amp;quot;&amp;gt;&#039;&#039;&#039;BGR&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Blue, Green, Red order.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;BGRx&amp;quot;&amp;gt;&#039;&#039;&#039;BGRx&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 4-byte aligned color entry in Blue, Green, Red order, with the 4th byte unused.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;RGB&amp;quot;&amp;gt;&#039;&#039;&#039;RGB&#039;&#039;&#039;&amp;lt;/span&amp;gt;: A 3-byte color entry in Red, Green, Blue order, as things should be.&lt;br /&gt;
&lt;br /&gt;
== IO Page 0 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Gamma Lookup ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C0FF&lt;br /&gt;
|$F0:0000 - $F0:00FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Blue gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C400 - $C4FF&lt;br /&gt;
|$F0:0400 - $F0:04FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Green gamma conversion table&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $C8FF&lt;br /&gt;
|$F0:0800 - $F0:08FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Red gamma conversion table&lt;br /&gt;
|}&lt;br /&gt;
Each area is 256 bytes, mapping an 8-bit value (offset) to an 8-bit value (memory value), mirrored 4 times currently to fill each 1kB address space.&lt;br /&gt;
&lt;br /&gt;
====== $CC00: Mouse Pointer Bitmap ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$CC00 - $CCFF&lt;br /&gt;
|$F0:0C00 - $F0:0CFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Mouse pointer bitmap (16×16 greyscale bytes)&lt;br /&gt;
|}&lt;br /&gt;
This is currently mirrored 4 times in $CC00 - $CFFF.&lt;br /&gt;
&lt;br /&gt;
===== $D000: VICKY Config =====&lt;br /&gt;
&lt;br /&gt;
====== $D000: Master Control Registers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D000&lt;br /&gt;
|$F0:1000&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_0&lt;br /&gt;
|—&lt;br /&gt;
|GAMMA&lt;br /&gt;
|SPRITE&lt;br /&gt;
|TILE&lt;br /&gt;
|BITMAP&lt;br /&gt;
|GRAPH&lt;br /&gt;
|OVRLY&lt;br /&gt;
|TEXT&lt;br /&gt;
|-&lt;br /&gt;
|$D001&lt;br /&gt;
|$F0:1001&lt;br /&gt;
|RW&lt;br /&gt;
|MSTR_CTRL_1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FON_SET&lt;br /&gt;
|FON_OVLY&lt;br /&gt;
|MON_SLP&lt;br /&gt;
|DBL_Y&lt;br /&gt;
|DBL_X&lt;br /&gt;
|CLK_70&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;TEXT&#039;&#039;&#039;: Enable text layer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OVRLY&#039;&#039;&#039;: Overlay text on graphics, by making text background transparent. See &#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GRAPH&#039;&#039;&#039;: Enable graphics layers (tile, sprites, bitmaps)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BITMAP&#039;&#039;&#039;: Enable bitmap layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TILE&#039;&#039;&#039;: Enable tile layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SPRITE&#039;&#039;&#039;: Enable sprite layers (if &#039;&#039;&#039;GRAPH&#039;&#039;&#039; is also set)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAMMA&#039;&#039;&#039;: Enable gamma correction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CLK_70&#039;&#039;&#039;: Enable 400p70, else 480p60&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DBL_X&#039;&#039;&#039;, &#039;&#039;&#039;DBL_Y&#039;&#039;&#039;: Double text mode character width &amp;amp; height&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MON_SLP&#039;&#039;&#039;: Turn off monitor SYNC, putting it into sleep mode&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_OVLY&#039;&#039;&#039;: Only BG color 0 is transparent in &#039;&#039;&#039;OVRLY&#039;&#039;&#039; mode. Else, all BG colors are transparent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FON_SET&#039;&#039;&#039;: Chooses font set 0 or 1&lt;br /&gt;
&lt;br /&gt;
====== $D002: Layers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D002&lt;br /&gt;
|$F0:1002&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 1&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 0&lt;br /&gt;
|-&lt;br /&gt;
|$D003&lt;br /&gt;
|$F0:1003&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Layer 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Values&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0-2: Bitmap 0-2&lt;br /&gt;
4-6: Tilemap 0-2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D004: Border ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D004&lt;br /&gt;
|$F0:1004&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_CTRL&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SCROLL_X&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D005&lt;br /&gt;
|$F0:1005&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D006&lt;br /&gt;
|$F0:1006&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D007&lt;br /&gt;
|$F0:1007&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Border color Red component&lt;br /&gt;
|-&lt;br /&gt;
|$D008&lt;br /&gt;
|$F0:1008&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_WIDTH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_X&lt;br /&gt;
|-&lt;br /&gt;
|$D009&lt;br /&gt;
|$F0:1009&lt;br /&gt;
|RW&lt;br /&gt;
|BRDR_HEIGHT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |SIZE_Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D00D: Background ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D00D&lt;br /&gt;
|$F0:100D&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_BLUE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Blue component&lt;br /&gt;
|-&lt;br /&gt;
|$D00E&lt;br /&gt;
|$F0:100E&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_GREEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Green component&lt;br /&gt;
|-&lt;br /&gt;
|$D00F&lt;br /&gt;
|$F0:100F&lt;br /&gt;
|RW&lt;br /&gt;
|BGND_RED&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Background color Red component&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D010: Text Cursor ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D010&lt;br /&gt;
|$F0:1010&lt;br /&gt;
|RW&lt;br /&gt;
|CCR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FLASH_DIS&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RATE&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RATE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 1 second&lt;br /&gt;
1: 1/2 second&lt;br /&gt;
2: 1/4 second&lt;br /&gt;
3: 1/8 second&lt;br /&gt;
|-&lt;br /&gt;
|$D012&lt;br /&gt;
|$F0:1012&lt;br /&gt;
|RW&lt;br /&gt;
|CCH&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor character code&lt;br /&gt;
|-&lt;br /&gt;
|$D014&lt;br /&gt;
|$F0:1014&lt;br /&gt;
|RW&lt;br /&gt;
|CURX&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D016&lt;br /&gt;
|$F0:1016&lt;br /&gt;
|RW&lt;br /&gt;
|CURY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Cursor Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D018: Raster ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|R&lt;br /&gt;
|RAST_COL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current column (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D01A&lt;br /&gt;
|$F0:101A&lt;br /&gt;
|R&lt;br /&gt;
|RAST_ROW&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Raster current row (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D018&lt;br /&gt;
|$F0:1018&lt;br /&gt;
|W&lt;br /&gt;
|LINT_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$D019&lt;br /&gt;
|$F0:1019&lt;br /&gt;
|W&lt;br /&gt;
|LINT_L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Line interrupt line (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D100: Bitmaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D100&lt;br /&gt;
|$F0:1100&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D108&lt;br /&gt;
|$F0:1108&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D110&lt;br /&gt;
|$F0:1110&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Bitmap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of pixels (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D200: Tilemaps =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D200&lt;br /&gt;
|$F0:1200&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 0&lt;br /&gt;
|-&lt;br /&gt;
|$D20C&lt;br /&gt;
|$F0:120C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 1&lt;br /&gt;
|-&lt;br /&gt;
|$D218&lt;br /&gt;
|$F0:1218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tilemap 2&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|TILE_SIZE_8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile map entries (24-bit) &#039;&#039;&#039;**&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_X (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MAP_SIZE_Y (8-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$08&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |X[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SSX&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |X[9:4]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0A&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Y[3:0]&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Y[7:4]&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;**&#039;&#039;&#039; = For 8×8px tilesets, the first map entry (2 bytes) seems to be skipped, so the pointer needs to point 2 bytes before the actual upper-left starting entry.&lt;br /&gt;
&lt;br /&gt;
For 16×16px tilesets, the tile map pointer directly points to the first entry. Very old cores might have had the same offset required.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile Map Entry&lt;br /&gt;
!Offset&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
| +0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile number&lt;br /&gt;
|-&lt;br /&gt;
| +1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |CLUT&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tileset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D280: Tilesets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D280&lt;br /&gt;
|$F0:1280&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 0&lt;br /&gt;
|-&lt;br /&gt;
|$D284&lt;br /&gt;
|$F0:1284&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 1&lt;br /&gt;
|-&lt;br /&gt;
|$D288&lt;br /&gt;
|$F0:1288&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 2&lt;br /&gt;
|-&lt;br /&gt;
|$D28C&lt;br /&gt;
|$F0:128C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 3&lt;br /&gt;
|-&lt;br /&gt;
|$D290&lt;br /&gt;
|$F0:1290&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 4&lt;br /&gt;
|-&lt;br /&gt;
|$D294&lt;br /&gt;
|$F0:1294&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 5&lt;br /&gt;
|-&lt;br /&gt;
|$D298&lt;br /&gt;
|$F0:1298&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 6&lt;br /&gt;
|-&lt;br /&gt;
|$D29C&lt;br /&gt;
|$F0:129C&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tileset 7&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of tile pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SQUARE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Layout of Tileset Pixels&lt;br /&gt;
!SQUARE&lt;br /&gt;
!8×8 px Tiles&lt;br /&gt;
!16×16 px Tiles&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|8×1024 px&lt;br /&gt;
|16×2048 px&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|128×128 px&lt;br /&gt;
|256×256 px&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D400: Sound =====&lt;br /&gt;
&lt;br /&gt;
====== $D400: SID chips ======&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|SID_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D400&lt;br /&gt;
|$F0:1400&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Left SID&lt;br /&gt;
|-&lt;br /&gt;
|$D500&lt;br /&gt;
|$F0:1500&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Right SID&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$00&lt;br /&gt;
|W&lt;br /&gt;
|Voice 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$02&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$04&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$05&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$06&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$07&lt;br /&gt;
|W&lt;br /&gt;
|Voice 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$09&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0B&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0C&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0D&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$0E&lt;br /&gt;
|W&lt;br /&gt;
|Voice 3&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Frequency (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$10&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pulse width (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$12&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|NOISE&lt;br /&gt;
|PULSE&lt;br /&gt;
|SAW&lt;br /&gt;
|TRI&lt;br /&gt;
|TEST&lt;br /&gt;
|RING&lt;br /&gt;
|SYNC&lt;br /&gt;
|GATE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$13&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |ATTACK&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |DELAY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$14&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |SUSTAIN&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RELEASE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$15&lt;br /&gt;
|W&lt;br /&gt;
|Misc&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |FC[2:0]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$16&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FC[10:3]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$17&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RESONANCE&lt;br /&gt;
|EXT&lt;br /&gt;
|FILTV3&lt;br /&gt;
|FILTV2&lt;br /&gt;
|FILTV1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +$18&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|MUTEV3&lt;br /&gt;
|HIGH&lt;br /&gt;
|BAND&lt;br /&gt;
|LOW&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |VOLUME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D580: OPL3 (NOT on F256Jr!) ======&lt;br /&gt;
Main page: [[Use the OPL3 YMF262]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D580&lt;br /&gt;
|$F0:1580&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address registers for ports $000 - $0FF&lt;br /&gt;
|-&lt;br /&gt;
|$D581&lt;br /&gt;
|$F0:1581&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data registers for all ports&lt;br /&gt;
|-&lt;br /&gt;
|$D582&lt;br /&gt;
|$F0:1582&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Address register for ports $100 - $1FF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D600: PSGs ======&lt;br /&gt;
Main page: [[Use the PSG]]&lt;br /&gt;
&lt;br /&gt;
Stereo separation is enabled with the &#039;&#039;&#039;[[IO Pages#$D6A0: System Control Registers|PSG_ST]]&#039;&#039;&#039; flag. By default, both PSGs go to both speakers.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D600&lt;br /&gt;
|$F0:1600&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left&lt;br /&gt;
|-&lt;br /&gt;
|$D608&lt;br /&gt;
|$F0:1608&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Left + Right&lt;br /&gt;
|-&lt;br /&gt;
|$D610&lt;br /&gt;
|$F0:1610&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PSG Right&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D620: CODEC ======&lt;br /&gt;
Main page: [[Use the CODEC]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D620&lt;br /&gt;
|$F0:1620&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DATA[7:0]&lt;br /&gt;
|-&lt;br /&gt;
|$D621&lt;br /&gt;
|$F0:1621&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |REGISTER&lt;br /&gt;
|DATA[8]&lt;br /&gt;
|-&lt;br /&gt;
|$D622&lt;br /&gt;
|$F0:1622&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|BUSY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|START&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D630: System =====&lt;br /&gt;
&lt;br /&gt;
====== $D630: UART ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|R&lt;br /&gt;
|RXD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |RX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|TXR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TX_DATA&lt;br /&gt;
|-&lt;br /&gt;
|$D631&lt;br /&gt;
|$F0:1631&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|STAT&lt;br /&gt;
|ERR&lt;br /&gt;
|TXE&lt;br /&gt;
|RXA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |&#039;&#039;&#039;DLAB = 1&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$D630&lt;br /&gt;
|$F0:1630&lt;br /&gt;
|RW&lt;br /&gt;
|DL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |DIV (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$D632&lt;br /&gt;
|$F0:1632&lt;br /&gt;
|R&lt;br /&gt;
|IIR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |FIFO&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |STATE&lt;br /&gt;
|/PENDING&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|FCR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |RXT&lt;br /&gt;
|FIFO64&lt;br /&gt;
|—&lt;br /&gt;
|DMA&lt;br /&gt;
|TXR&lt;br /&gt;
|RXR&lt;br /&gt;
|FIFOE&lt;br /&gt;
|-&lt;br /&gt;
|$D633&lt;br /&gt;
|$F0:1633&lt;br /&gt;
|RW&lt;br /&gt;
|LCR&lt;br /&gt;
|DLAB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |PARITY&lt;br /&gt;
|STOP&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |DATA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D640: PS/2 ======&lt;br /&gt;
See: [[Use the PS/2 Mouse]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D640&lt;br /&gt;
|$F0:1640&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_CTRL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MCLR&lt;br /&gt;
|KCLR&lt;br /&gt;
|M_WR&lt;br /&gt;
|—&lt;br /&gt;
|K_WR&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$D641&lt;br /&gt;
|$F0:1641&lt;br /&gt;
|RW&lt;br /&gt;
|PS2_OUT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data to keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$D642&lt;br /&gt;
|$F0:1642&lt;br /&gt;
|R&lt;br /&gt;
|KBD_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from keyboard FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D643&lt;br /&gt;
|$F0:1643&lt;br /&gt;
|R&lt;br /&gt;
|MS_IN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data in from mouse FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D644&lt;br /&gt;
|$F0:1644&lt;br /&gt;
|R&lt;br /&gt;
|PS2_STAT&lt;br /&gt;
|K_AK&lt;br /&gt;
|K_NK&lt;br /&gt;
|M_AK&lt;br /&gt;
|M_NK&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MEMP&lt;br /&gt;
|KEMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D650: Timers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D650&lt;br /&gt;
|$F0:1650&lt;br /&gt;
|W&lt;br /&gt;
|T0_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T0_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D651&lt;br /&gt;
|$F0:1651&lt;br /&gt;
|RW&lt;br /&gt;
|T0_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D654&lt;br /&gt;
|$F0:1654&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D655&lt;br /&gt;
|$F0:1655&lt;br /&gt;
|RW&lt;br /&gt;
|T0_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|$D658&lt;br /&gt;
|$F0:1658&lt;br /&gt;
|W&lt;br /&gt;
|T1_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|UP&lt;br /&gt;
|LD&lt;br /&gt;
|CLR&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|T1_STAT&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|EQ&lt;br /&gt;
|-&lt;br /&gt;
|$D659&lt;br /&gt;
|$F0:1659&lt;br /&gt;
|RW&lt;br /&gt;
|T1_VAL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VAL (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D65C&lt;br /&gt;
|$F0:165C&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP_CTR&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|RELD&lt;br /&gt;
|RECLR&lt;br /&gt;
|-&lt;br /&gt;
|$D65D&lt;br /&gt;
|$F0:165D&lt;br /&gt;
|RW&lt;br /&gt;
|T1_CMP&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |CMP (24-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D660: Interrupts ======&lt;br /&gt;
Main page: [[IRQ]], [[IRQ Programming]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D660&lt;br /&gt;
|$F0:1660&lt;br /&gt;
|&lt;br /&gt;
|INT_PENDING&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D664&lt;br /&gt;
|$F0:1664&lt;br /&gt;
|&lt;br /&gt;
|INT_POLARITY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D668&lt;br /&gt;
|$F0:1668&lt;br /&gt;
|&lt;br /&gt;
|INT_EDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D66C&lt;br /&gt;
|$F0:166C&lt;br /&gt;
|&lt;br /&gt;
|INT_MASK&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Per-interrupt flags (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOF&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Frame interrupt (beginning of VSYNC)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|INT_VKY_SOL&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Start of Line interrupt&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_KBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 keyboard event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|INT_PS2_MOUSE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS/2 mouse event&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER0 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_TIMER_1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |TIMER1 has reached its target value&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_CARTRIDGE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt asserted from cartridge port&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|INT_UART&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |The UART is ready to receive or send data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $10&lt;br /&gt;
|&lt;br /&gt;
|INT_RTC&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Interrupt from real time clock chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $20&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the joystick VIA chip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $40&lt;br /&gt;
|&lt;br /&gt;
|INT_VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Event from the keyboard VIA chip (F256k Series Only!)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1 &amp;amp; $80&lt;br /&gt;
|&lt;br /&gt;
|INT_SDC_INS&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card has been inserted&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $01&lt;br /&gt;
|&lt;br /&gt;
|IEC_DATA_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC data in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $02&lt;br /&gt;
|&lt;br /&gt;
|IEC_CLK_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC clock in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $04&lt;br /&gt;
|&lt;br /&gt;
|IEC_ATN_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC attention in&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2 &amp;amp; $08&lt;br /&gt;
|&lt;br /&gt;
|IEC_SREQ_i&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |IEC service request in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D670: DIP Switches ======&lt;br /&gt;
Main page: [[DIP switches]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D670&lt;br /&gt;
|$F0:1670&lt;br /&gt;
|R&lt;br /&gt;
|&lt;br /&gt;
|GAMMA&lt;br /&gt;
|USER2&lt;br /&gt;
|USER1&lt;br /&gt;
|USER0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BOOT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D680: IEC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D680&lt;br /&gt;
|$F0:1680&lt;br /&gt;
|R&lt;br /&gt;
|IEC_I&lt;br /&gt;
|SRQ_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|ATN_i&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_i&lt;br /&gt;
|DAT_i&lt;br /&gt;
|-&lt;br /&gt;
|$D681&lt;br /&gt;
|$F0:1681&lt;br /&gt;
|RW&lt;br /&gt;
|IEC_O&lt;br /&gt;
|SRQ_o&lt;br /&gt;
|RST_o&lt;br /&gt;
|NMI_EN&lt;br /&gt;
|ATN_o&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|CLK_o&lt;br /&gt;
|DAT_o&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D690: RTC ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D690&lt;br /&gt;
|$F0:1690&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D691&lt;br /&gt;
|$F0:1691&lt;br /&gt;
|RW&lt;br /&gt;
|Seconds Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D692&lt;br /&gt;
|$F0:1692&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D693&lt;br /&gt;
|$F0:1693&lt;br /&gt;
|RW&lt;br /&gt;
|Minutes Alarm&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D694&lt;br /&gt;
|$F0:1694&lt;br /&gt;
|RW&lt;br /&gt;
|Hours&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D695&lt;br /&gt;
|$F0:1695&lt;br /&gt;
|RW&lt;br /&gt;
|Hours Alarm&lt;br /&gt;
|AM/PM&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D696&lt;br /&gt;
|$F0:1696&lt;br /&gt;
|RW&lt;br /&gt;
|Days&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D697&lt;br /&gt;
|$F0:1697&lt;br /&gt;
|RW&lt;br /&gt;
|Days Alarm&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D698&lt;br /&gt;
|$F0:1698&lt;br /&gt;
|RW&lt;br /&gt;
|Day of Week&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D699&lt;br /&gt;
|$F0:1699&lt;br /&gt;
|RW&lt;br /&gt;
|Month&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69A&lt;br /&gt;
|$F0:169A&lt;br /&gt;
|RW&lt;br /&gt;
|Year&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|-&lt;br /&gt;
|$D69B&lt;br /&gt;
|$F0:169B&lt;br /&gt;
|RW&lt;br /&gt;
|Rates&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |WD&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |RS&lt;br /&gt;
|-&lt;br /&gt;
|$D69C&lt;br /&gt;
|$F0:169C&lt;br /&gt;
|RW&lt;br /&gt;
|Enables&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AIE&lt;br /&gt;
|PIE&lt;br /&gt;
|PWRIE&lt;br /&gt;
|ABE&lt;br /&gt;
|-&lt;br /&gt;
|$D69D&lt;br /&gt;
|$F0:169D&lt;br /&gt;
|RW&lt;br /&gt;
|Flags&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|AF&lt;br /&gt;
|PF&lt;br /&gt;
|PWRF&lt;br /&gt;
|BVF&lt;br /&gt;
|-&lt;br /&gt;
|$D69E&lt;br /&gt;
|$F0:169E&lt;br /&gt;
|RW&lt;br /&gt;
|Control&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|UTI&lt;br /&gt;
|STOP&lt;br /&gt;
|12/24&lt;br /&gt;
|DSE&lt;br /&gt;
|-&lt;br /&gt;
|$D69F&lt;br /&gt;
|$F0:169F&lt;br /&gt;
|RW&lt;br /&gt;
|Century&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |10s digit&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |1s digit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A0: System Control Registers ======&lt;br /&gt;
Main page: [[Use the LEDs]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A0&lt;br /&gt;
|$F0:16A0&lt;br /&gt;
|W&lt;br /&gt;
|SYS0&lt;br /&gt;
|RESET&lt;br /&gt;
|NET_LED&lt;br /&gt;
|LOCK_LED&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|R&lt;br /&gt;
|SYS0&lt;br /&gt;
|—&lt;br /&gt;
|SD_WP&lt;br /&gt;
|SD_CD&lt;br /&gt;
|BUZZ&lt;br /&gt;
|L1&lt;br /&gt;
|L0&lt;br /&gt;
|SD_LED&lt;br /&gt;
|PWR_LED&lt;br /&gt;
|-&lt;br /&gt;
|$D6A1&lt;br /&gt;
|$F0:16A1&lt;br /&gt;
|RW&lt;br /&gt;
|SYS1&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L1_RATE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |L0_RATE&lt;br /&gt;
|SID_ST&lt;br /&gt;
|PSG_ST&lt;br /&gt;
|L1_MAN&lt;br /&gt;
|L0_MAN&lt;br /&gt;
|-&lt;br /&gt;
|$D6A2&lt;br /&gt;
|$F0:16A2&lt;br /&gt;
|RW&lt;br /&gt;
|RST0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $DE to enable RESET bit&lt;br /&gt;
|-&lt;br /&gt;
|$D6A3&lt;br /&gt;
|$F0:16A3&lt;br /&gt;
|RW&lt;br /&gt;
|RST1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Set to $AD to enable RESET bit&lt;br /&gt;
|}&lt;br /&gt;
To trigger a software reset, write $DE and $AD to $D6A2 &amp;amp; 3 respectively (which is $ADDE in little-endian 16-bit write instead of $DEAD, but whatever), then set the RESET bit and clear it.&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: F256k Series LEDs ======&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:red&amp;gt;NOTE:&amp;lt;/span&amp;gt;&#039;&#039;&#039; These write-only addresses overlap with the read-only MID addresses! The network LED color is non-contiguous with the others, and swapped color order!&lt;br /&gt;
&lt;br /&gt;
Main page: [[Use the LEDs#LED_Color_Registers_on_the_K_and_K2]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Power LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Media LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6AD&lt;br /&gt;
|$F0:16AD&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Shift LED color ([[IO Pages#BGR|BGR]])&lt;br /&gt;
|-&lt;br /&gt;
|$D6B3&lt;br /&gt;
|$F0:16B3&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Network LED color &#039;&#039;&#039;([[IO Pages#RGB|RGB]])&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6A7: Machine ID and FPGA Core Versions ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6A7&lt;br /&gt;
|$F0:16A7&lt;br /&gt;
|R&lt;br /&gt;
|MID&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |[[MID codes for machine identification|Machine ID]]&lt;br /&gt;
|-&lt;br /&gt;
|$D6A8&lt;br /&gt;
|$F0:16A8&lt;br /&gt;
|R&lt;br /&gt;
|PCBID0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 0: &amp;quot;B&amp;quot; (See also $D6EB)&lt;br /&gt;
|-&lt;br /&gt;
|$D6A9&lt;br /&gt;
|$F0:16A9&lt;br /&gt;
|R&lt;br /&gt;
|PCBID1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |ASCII character 1: &amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|$D6AA&lt;br /&gt;
|$F0:16AA&lt;br /&gt;
|R&lt;br /&gt;
|CHSV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY sub-version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AC&lt;br /&gt;
|$F0:16AC&lt;br /&gt;
|R&lt;br /&gt;
|CHV&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY version in BCD (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6AE&lt;br /&gt;
|$F0:16AE&lt;br /&gt;
|R&lt;br /&gt;
|CHN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VICKY number in BCD (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6E0: Mouse Pointer Control ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E0&lt;br /&gt;
|$F0:16E0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|EN&lt;br /&gt;
|-&lt;br /&gt;
|$D6E2&lt;br /&gt;
|$F0:16E2&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E4&lt;br /&gt;
|$F0:16E4&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$D6E6&lt;br /&gt;
|$F0:16E6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_0&lt;br /&gt;
|-&lt;br /&gt;
|$D6E7&lt;br /&gt;
|$F0:16E7&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_1&lt;br /&gt;
|-&lt;br /&gt;
|$D6E8&lt;br /&gt;
|$F0:16E8&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PS2_BYTE_2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $D6EB: PCB Information ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D6EB&lt;br /&gt;
|$F0:16EB&lt;br /&gt;
|R&lt;br /&gt;
|PCBMA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Major Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EC&lt;br /&gt;
|$F0:16EC&lt;br /&gt;
|R&lt;br /&gt;
|PCBMI&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Minor Rev (ASCII)&lt;br /&gt;
|-&lt;br /&gt;
|$D6ED&lt;br /&gt;
|$F0:16ED&lt;br /&gt;
|R&lt;br /&gt;
|PCBD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Day (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EE&lt;br /&gt;
|$F0:16EE&lt;br /&gt;
|R&lt;br /&gt;
|PCBM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Month (BCD)&lt;br /&gt;
|-&lt;br /&gt;
|$D6EF&lt;br /&gt;
|$F0:16EF&lt;br /&gt;
|R&lt;br /&gt;
|PCBY&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |PCB Year (BCD)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D700: VS1053b (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the VS1053b chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D700&lt;br /&gt;
|$F0:1700&lt;br /&gt;
|&lt;br /&gt;
|SCI Control&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Control the flow of information&lt;br /&gt;
|-&lt;br /&gt;
|$D701&lt;br /&gt;
|$F0:1701&lt;br /&gt;
|&lt;br /&gt;
|SCI Address&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Select to which VS1053b address to write to&lt;br /&gt;
|-&lt;br /&gt;
|$D702&lt;br /&gt;
|$F0:1702&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D703&lt;br /&gt;
|$F0:1703&lt;br /&gt;
|&lt;br /&gt;
|SCI Data 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of data&lt;br /&gt;
|-&lt;br /&gt;
|$D704&lt;br /&gt;
|$F0:1704&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |First byte of the remaining byte count in the FIFO&lt;br /&gt;
|-&lt;br /&gt;
|$D705&lt;br /&gt;
|$F0:1705&lt;br /&gt;
|&lt;br /&gt;
|FIFO Count 2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Second byte of the remaining byte count in the FIFO&lt;br /&gt;
|}&lt;br /&gt;
If the MIDI mode is set up, its data port is down at [[IO Pages#$DDB1: VS1053b MIDI (F256 Gen 2 only)|$DDB1]].&lt;br /&gt;
&lt;br /&gt;
===== $D800: Text Mode CLUT =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $D83F&lt;br /&gt;
|$F0:1800 - $F0:183F&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text foreground colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D840 - $D87F&lt;br /&gt;
|$F0:1840 - $F0:187f&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text background colors (16 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D880: NES/SNES Gamepads =====&lt;br /&gt;
Main page: [[Use the SNES/NES controllers]]&lt;br /&gt;
&lt;br /&gt;
Buttons are active low, 0 = pressed&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D880&lt;br /&gt;
|$F0:1880&lt;br /&gt;
|R&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|DONE&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|W&lt;br /&gt;
|NES_CTRL&lt;br /&gt;
|NES_TRIG&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|MODE&lt;br /&gt;
|—&lt;br /&gt;
|NES_EN&lt;br /&gt;
|-&lt;br /&gt;
|$D884&lt;br /&gt;
|$F0:1884&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 0&lt;br /&gt;
|-&lt;br /&gt;
|$D886&lt;br /&gt;
|$F0:1886&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 1&lt;br /&gt;
|-&lt;br /&gt;
|$D888&lt;br /&gt;
|$F0:1888&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 2&lt;br /&gt;
|-&lt;br /&gt;
|$D88A&lt;br /&gt;
|$F0:188A&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Pad 3&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=0&lt;br /&gt;
|A&lt;br /&gt;
|B&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|B&lt;br /&gt;
|Y&lt;br /&gt;
|SELECT&lt;br /&gt;
|START&lt;br /&gt;
|UP&lt;br /&gt;
|DOWN&lt;br /&gt;
|LEFT&lt;br /&gt;
|RIGHT&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|&lt;br /&gt;
|Mode=1&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|A&lt;br /&gt;
|X&lt;br /&gt;
|L&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $D900: Sprites =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$D900 - $DAFF&lt;br /&gt;
|$F0:1900 - $F0:1AFF&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |64 × 8-byte Sprite Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |SIZE&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LAYER&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |LUT&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|SIZE&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |0: 32×32&lt;br /&gt;
1: 24×24&lt;br /&gt;
&lt;br /&gt;
2: 16×16&lt;br /&gt;
&lt;br /&gt;
3: 8×8&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |[[IO Pages#SRAM Address|SRAM Address]] of sprite pixels (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X position (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y position (16-bit)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DB00: Moar system =====&lt;br /&gt;
&lt;br /&gt;
====== $DB00: VIAs ======&lt;br /&gt;
See: [[Keyboard raw codes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; = F256k series only&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DB00*&lt;br /&gt;
|$F0:1B00*&lt;br /&gt;
|&lt;br /&gt;
|VIA1&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Internal Keyboard VIA*&lt;br /&gt;
|-&lt;br /&gt;
|$DC00&lt;br /&gt;
|$F0:1C00&lt;br /&gt;
|&lt;br /&gt;
|VIA0&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Atari joystick VIA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|IORB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 0, keyboard column 8*&lt;br /&gt;
VIA1: Keyboard columns 0-7*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|IORA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VIA0: Joystick 1&lt;br /&gt;
VIA1: Keyboard row*&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
|RW&lt;br /&gt;
|DDRB&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port B Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +3&lt;br /&gt;
|RW&lt;br /&gt;
|DDRA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data Direction Register&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +4&lt;br /&gt;
|RW&lt;br /&gt;
|T1C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +6&lt;br /&gt;
|RW&lt;br /&gt;
|T1L&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 1 Latch (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +8&lt;br /&gt;
|RW&lt;br /&gt;
|T2C&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Timer 2 Counter (16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +A&lt;br /&gt;
|RW&lt;br /&gt;
|SDR&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Serial Data Registers&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +B&lt;br /&gt;
|RW&lt;br /&gt;
|ACR&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |T1_CTRL&lt;br /&gt;
|T2_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |SR_CTRL&lt;br /&gt;
|PBL_EN&lt;br /&gt;
|PAL_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +C&lt;br /&gt;
|RW&lt;br /&gt;
|PCR&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CB2_CTRL&lt;br /&gt;
|CB1_CTRL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |CA1_CTRL&lt;br /&gt;
|CA1_CTRL&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +D&lt;br /&gt;
|RW&lt;br /&gt;
|IFR&lt;br /&gt;
|IRQF&lt;br /&gt;
|T1F&lt;br /&gt;
|T2F&lt;br /&gt;
|CB1F&lt;br /&gt;
|CB2F&lt;br /&gt;
|SRF&lt;br /&gt;
|CA1F&lt;br /&gt;
|CA2F&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +E&lt;br /&gt;
|RW&lt;br /&gt;
|IER&lt;br /&gt;
|SET&lt;br /&gt;
|T1E&lt;br /&gt;
|T2E&lt;br /&gt;
|CB1E&lt;br /&gt;
|CB2E&lt;br /&gt;
|SRE&lt;br /&gt;
|CA1E&lt;br /&gt;
|CA2E&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +F&lt;br /&gt;
|RW&lt;br /&gt;
|IORA2&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Port A Data (no handshake)&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA0 Joystick Bits&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|Keyboard column 8*&lt;br /&gt;
|Button 2&lt;br /&gt;
|Button 1&lt;br /&gt;
|Button 0&lt;br /&gt;
|Right&lt;br /&gt;
|Left&lt;br /&gt;
|Down&lt;br /&gt;
|Up&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+VIA1 Internal Keyboard Matrix*&lt;br /&gt;
!&lt;br /&gt;
!PB0&lt;br /&gt;
!PB1&lt;br /&gt;
!PB2&lt;br /&gt;
!PB3&lt;br /&gt;
!PB4&lt;br /&gt;
!PB5&lt;br /&gt;
!PB6&lt;br /&gt;
!PB7&lt;br /&gt;
!VIA0 PB7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA0&#039;&#039;&#039;&lt;br /&gt;
|Del&lt;br /&gt;
|Return&lt;br /&gt;
|Left&lt;br /&gt;
|F7&lt;br /&gt;
|F1&lt;br /&gt;
|F3&lt;br /&gt;
|F5&lt;br /&gt;
|Up&lt;br /&gt;
|Down&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA1&#039;&#039;&#039;&lt;br /&gt;
|3&lt;br /&gt;
|W&lt;br /&gt;
|A&lt;br /&gt;
|4&lt;br /&gt;
|Z&lt;br /&gt;
|S&lt;br /&gt;
|E&lt;br /&gt;
|LShift&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA2&#039;&#039;&#039;&lt;br /&gt;
|5&lt;br /&gt;
|R&lt;br /&gt;
|D&lt;br /&gt;
|6&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|T&lt;br /&gt;
|X&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA3&#039;&#039;&#039;&lt;br /&gt;
|7&lt;br /&gt;
|Y&lt;br /&gt;
|G&lt;br /&gt;
|8&lt;br /&gt;
|B&lt;br /&gt;
|H&lt;br /&gt;
|U&lt;br /&gt;
|V&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA4&#039;&#039;&#039;&lt;br /&gt;
|9&lt;br /&gt;
|I&lt;br /&gt;
|J&lt;br /&gt;
|0&lt;br /&gt;
|M&lt;br /&gt;
|K&lt;br /&gt;
|O&lt;br /&gt;
|N&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA5&#039;&#039;&#039;&lt;br /&gt;
| -&lt;br /&gt;
|P&lt;br /&gt;
|L&lt;br /&gt;
|Caps&lt;br /&gt;
|.&lt;br /&gt;
|;&lt;br /&gt;
|[&lt;br /&gt;
|,&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA6&#039;&#039;&#039;&lt;br /&gt;
|=&lt;br /&gt;
|]&lt;br /&gt;
|&#039;&lt;br /&gt;
|Home&lt;br /&gt;
|RShift&lt;br /&gt;
|Alt&lt;br /&gt;
|Tab&lt;br /&gt;
|/&lt;br /&gt;
|Right&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PA7&#039;&#039;&#039;&lt;br /&gt;
|1&lt;br /&gt;
|BS&lt;br /&gt;
|Ctrl&lt;br /&gt;
|2&lt;br /&gt;
|Space&lt;br /&gt;
|Foenix&lt;br /&gt;
|Q&lt;br /&gt;
|Run/Stop&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====== $DD00: SD Card Controllers ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD00&lt;br /&gt;
|$F0:1D00&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 0 (external)&lt;br /&gt;
|-&lt;br /&gt;
|$DD20&lt;br /&gt;
|$F0:1D20&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SD Card 1 (internal)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +0&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|SPI_BUSY&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|SPI_CLK&lt;br /&gt;
|CS_EN&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| +1&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |SPI_DATA&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;SPI_CLK&#039;&#039;&#039;: 400MHz init clock when set, 12.5MHz standard clock when clear.&lt;br /&gt;
&lt;br /&gt;
====== $DD40: F256K2 Case LCD Screen ======&lt;br /&gt;
Main page: [[Use the K2 LCD]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DD40&lt;br /&gt;
|$F0:1D40&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_CMD&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Command&lt;br /&gt;
|-&lt;br /&gt;
|$DD41&lt;br /&gt;
|$F0:1D41&lt;br /&gt;
|&lt;br /&gt;
|LCD_CMD_DTA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DD42&lt;br /&gt;
|$F0:1D42&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_LO&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[2:0]&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Blue&lt;br /&gt;
|-&lt;br /&gt;
|$DD43&lt;br /&gt;
|$F0:1D43&lt;br /&gt;
|&lt;br /&gt;
|LCD_PIX_HI&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Red&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Green[5:3]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDA0: Wavetable Header, and SAM2695 (F256 Gen 2 only) =====&lt;br /&gt;
Main page: [[Use the Sam2695 Dream MIDI chip]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDA0&lt;br /&gt;
|$F0:1DA0&lt;br /&gt;
|R&lt;br /&gt;
|MIDI_STATUS&lt;br /&gt;
|TX_EMPTY&lt;br /&gt;
|RX_FULL&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
|$DDA1&lt;br /&gt;
|$F0:1DA1&lt;br /&gt;
|RW&lt;br /&gt;
|MIDI_FIFO_DATA_PORT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|-&lt;br /&gt;
|$DDA2&lt;br /&gt;
|$F0:1DA2&lt;br /&gt;
|&lt;br /&gt;
|MIDI_RXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Rx FIFO Data count (12-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DDA4&lt;br /&gt;
|$F0:1DA4&lt;br /&gt;
|&lt;br /&gt;
|MIDI_TXD_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
The SAM2695 drives the hardware MIDI jacks.&lt;br /&gt;
&lt;br /&gt;
Writing to $DDA1 also gets written to the wavetable pin headers.&lt;br /&gt;
&lt;br /&gt;
===== $DDB1: VS1053b MIDI Port (F256 Gen 2 only) =====&lt;br /&gt;
The rest of the VS1053b is up at [[IO Pages#$D700: VS1053b (F256 Gen 2 only)|$D700]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDB1&lt;br /&gt;
|$F0:1DB1&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DDC0: Optical Keyboard Controller (F256K2 Only) =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DDC0&lt;br /&gt;
|$F0:1DC0&lt;br /&gt;
|&lt;br /&gt;
|OPT_KBD_DATA&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |FIFO queue. Each event is two 8-bit reads from here&lt;br /&gt;
|-&lt;br /&gt;
|$DDC1&lt;br /&gt;
|$F0:1DC1&lt;br /&gt;
|R&lt;br /&gt;
|OPT_KBD_STATUS&lt;br /&gt;
|MECH&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|FIFO_EMPTY&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |MECH = No optical keyboard if set&lt;br /&gt;
|-&lt;br /&gt;
|$DDC2&lt;br /&gt;
|$F0:1DC2&lt;br /&gt;
|&lt;br /&gt;
|OPT_KB_COUNT&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Number of events in optical keyboard queue (12-bit)&lt;br /&gt;
|}&lt;br /&gt;
Each event (keydown, keyup) re-sends the entire keyboard matrix in 8 events, corresponding to rows 0-7. Each row has 9 columns across its two event bytes:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Event Data&lt;br /&gt;
!Byte&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Row number (0-7)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Col8&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Col7&lt;br /&gt;
|Col6&lt;br /&gt;
|Col5&lt;br /&gt;
|Col4&lt;br /&gt;
|Col3&lt;br /&gt;
|Col2&lt;br /&gt;
|Col1&lt;br /&gt;
|Col0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== $DE00: Integer Math Coprocessor =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DE00&lt;br /&gt;
|$F0:1E00&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE02&lt;br /&gt;
|$F0:1E02&lt;br /&gt;
|RW&lt;br /&gt;
|MULU_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication B (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE04&lt;br /&gt;
|$F0:1E04&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_DEN&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Denominator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE06&lt;br /&gt;
|$F0:1E06&lt;br /&gt;
|RW&lt;br /&gt;
|DIVU_NUM&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Division Numerator (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE08&lt;br /&gt;
|$F0:1E08&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_A&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE0C&lt;br /&gt;
|$F0:1E0C&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_B&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition B (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|$DE10&lt;br /&gt;
|$F0:1E10&lt;br /&gt;
|RW&lt;br /&gt;
|MULU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Multiplication A×B Result (Unsigned 32-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE14&lt;br /&gt;
|$F0:1E14&lt;br /&gt;
|RW&lt;br /&gt;
|QUOU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Quotient of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE16&lt;br /&gt;
|$F0:1E16&lt;br /&gt;
|RW&lt;br /&gt;
|REMU&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Remainder of Num/Den (Unsigned 16-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DE18&lt;br /&gt;
|$F0:1E18&lt;br /&gt;
|RW&lt;br /&gt;
|ADD_R&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Addition A+B Result (Unsigned 32-bit)&lt;br /&gt;
|}&lt;br /&gt;
Multiplication, division, and addition operations are completely independent of each other. Results are available immediately.&lt;br /&gt;
&lt;br /&gt;
===== $DF00: DMA Controller =====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$DF00&lt;br /&gt;
|$F0:1F00&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|START&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|INT_EN&lt;br /&gt;
|FILL&lt;br /&gt;
|2D&lt;br /&gt;
|ENABLE&lt;br /&gt;
|-&lt;br /&gt;
|$DF01&lt;br /&gt;
|$F0:1F01&lt;br /&gt;
|W&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Fill data byte&lt;br /&gt;
|-&lt;br /&gt;
|$DF04&lt;br /&gt;
|$F0:1F04&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF08&lt;br /&gt;
|$F0:1F08&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination [[IO Pages#SRAM Address|SRAM Address]] (24-bit)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0C&lt;br /&gt;
|$F0:1F0C&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Count (24-bit, not 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Width (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF0E&lt;br /&gt;
|$F0:1F0E&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Height (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF10&lt;br /&gt;
|$F0:1F10&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Source stride (16-bit, 2D mode)&lt;br /&gt;
|-&lt;br /&gt;
|$DF12&lt;br /&gt;
|$F0:1F12&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Destination stride (16-bit, 2D mode)&lt;br /&gt;
|}&lt;br /&gt;
DMA only runs during VBlank, and halts the CPU to take over the entire bus. This runs at 100MHz, at 8 bits (gen 1) or 16 bits (gen 2) wide.&lt;br /&gt;
&lt;br /&gt;
== IO Page 1 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Mode Font Sets ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $C7FF&lt;br /&gt;
|$F0:2000 - $F0:27FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 0 (256 × 8-byte chars)&lt;br /&gt;
|-&lt;br /&gt;
|$C800 - $CFFF&lt;br /&gt;
|$F0:2800 - $F0:2FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Font set 1 (256 × 8-byte chars)&lt;br /&gt;
|}&lt;br /&gt;
Characters are 8×8 pixels. Each byte is an 8-pixel row of bits, with MSB at the left. 8 rows top to bottom.&lt;br /&gt;
&lt;br /&gt;
====== $D000: Graphics CLUTs ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$D000 - $D3FF&lt;br /&gt;
|$F0:3000 - $F0:33FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 0 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D400 - $D7FF&lt;br /&gt;
|$F0:3400 - $F0:37FF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 1 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$D800 - $DBFF&lt;br /&gt;
|$F0:3800 - $F0:3BFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 2 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|-&lt;br /&gt;
|$DC00 - $DFFF&lt;br /&gt;
|$F0:3C00 - $F0:3FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Graphics CLUT 3 (256 × [[IO Pages#BGRx|BGRx]])&lt;br /&gt;
|}&lt;br /&gt;
== IO Page 2 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Character Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:4000 - $F0:5FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
|Text screen character matrix&lt;br /&gt;
|}&lt;br /&gt;
1 byte per character, 40 or 80 characters per row, 25|30|50|60 rows in the matrix. Each character byte refers to an entry in the currently selected font set.&lt;br /&gt;
&lt;br /&gt;
80×60 characters uses 4800 ($12C0) bytes, which is only a bit more than half the 8k allocation.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Size of matrix&lt;br /&gt;
!Rows&lt;br /&gt;
!40 column&lt;br /&gt;
!80 column&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|1000, $03E8&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|1200, $04B0&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|2000, $07D0&lt;br /&gt;
|4000, $0FA0&lt;br /&gt;
|-&lt;br /&gt;
|60&lt;br /&gt;
|2400, $0960&lt;br /&gt;
|4800, $12C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== IO Page 3 ==&lt;br /&gt;
&lt;br /&gt;
====== $C000: Text Screen Color Matrix ======&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!MMU&lt;br /&gt;
!Flat&lt;br /&gt;
!R/W&lt;br /&gt;
!Name&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|$C000 - $DFFF&lt;br /&gt;
|$F0:6000 - $F0:7FFF&lt;br /&gt;
|RW&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Text screen color matrix&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |FG color (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |BG color (0-15)&lt;br /&gt;
|}&lt;br /&gt;
Exact same layout as the character matrix. One color matrix byte associates to one character matrix byte at the same offset.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38469</id>
		<title>WF FPGA Ideas</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF_FPGA_Ideas&amp;diff=38469"/>
		<updated>2026-02-18T01:19:45Z</updated>

		<summary type="html">&lt;p&gt;WF: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Video enhancements ==&lt;br /&gt;
[[WF16 Video Architecture]]&lt;br /&gt;
&lt;br /&gt;
== Math coprocessor ==&lt;br /&gt;
[[FPU Accumulator]]&lt;br /&gt;
&lt;br /&gt;
== SDCard ==&lt;br /&gt;
Auto-tx on read. Could supersede this with auto-reading a 16-bit length to a storage pointer, running in the background, flag or interrupt when done. Loading straight into DDR3 would be good once audio/video can read from there.&lt;br /&gt;
&lt;br /&gt;
Stream MP3 or MIDI file from disk (or ddr3?) straight to chips&lt;br /&gt;
&lt;br /&gt;
== Bootstrap and Machine Identity ==&lt;br /&gt;
Access to the cores SDCard. Name something better than the current hardcoded names.&lt;br /&gt;
&lt;br /&gt;
Soft-boot into one of the other cores, instead of relying on jumpers to select the core. Have an extended PGZ header or new file format that can request such things. Note that PGZ should say how many and which 8k blocks or 64k banks it&#039;s hardcoded for. Should be another load format for &amp;quot;play nice&amp;quot; system tools that can be simultaneously loaded.&lt;br /&gt;
&lt;br /&gt;
Identify cores by an 8 character ASCII string, instead of bit fields. Maybe have a version number (16 bit) per release of any named platform.&lt;br /&gt;
&lt;br /&gt;
Have different ROM loads for different cores? Or boot from RAM if some magic bytes occur there instead of ROM., though that would be part of the ROM boot that can do that, what ISA would the code be?&lt;br /&gt;
&lt;br /&gt;
RP2040 uses the Slave SelectMAX x8 config interface of the FPGA, and its 8 data pins should be GPIO for the FPGA to talk back to the RP after it&#039;s up and running (unless the pins are used for something else). The RP software needs updating for that.&lt;br /&gt;
&lt;br /&gt;
Simplest comms would be splitting the 8-bit path into two 4-bit independent directional channels. Clock (toggle when new data is sent), Ack (receiver toggles when it&#039;s read), 2 data bits. All polled on the software end. The RP2040 could be crunching FAT32 stuff while the FPGA is waiting to write to it, no problem.&lt;br /&gt;
&lt;br /&gt;
SRAM can be retained between resets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;char my_crash_info[100] __attribute__((section(&amp;quot;.uninitialized_data&amp;quot;)));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and with a macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#define __uninitialized_ram(group) __attribute__((section(&amp;quot;.uninitialized_data.&amp;quot; #group))) group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;datetime_t __uninitialized_ram(persist_date);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tentatively Proposed RP2040 Startup ===&lt;br /&gt;
&lt;br /&gt;
* Read SD Card for magic &amp;lt;code&amp;gt;/MYCORE.TXT&amp;lt;/code&amp;gt; file containing the full path of the core filename to boot.&lt;br /&gt;
** If this exists, DIP switches can be some form of override. Need to be able to break in if something messes up. On configuring MYCORE, always tell the user to set their DIP switches to 00.&lt;br /&gt;
** If this doesn&#039;t exist, oldsk00l DIP switches determine the core to boot.&lt;br /&gt;
* Load compressed core file from card and get the FPGA going.&lt;br /&gt;
** Set the FPGA comm handshake pins to 0 before releasing the init/reset command to the FPGA.&lt;br /&gt;
* Load &amp;lt;code&amp;gt;/RPLIB&amp;lt;/code&amp;gt; library and jump into it, if exists (else infinite loop). This runs whatever library functionality can talk to the FPGA, and is upgradable as a file through the loaded utilities.&lt;br /&gt;
The library should have functions to browse the cores sdcard, and select which file to boot with.&lt;br /&gt;
&lt;br /&gt;
TODO - do the core selection DIP pins also hit the FPGA for flash banking? If so, then we might not be able to escape them.&lt;br /&gt;
&lt;br /&gt;
== Timers ==&lt;br /&gt;
Ensure that the 24-bit value latches when the LSB is read (or the MSB is written?) for consistent reads.&lt;br /&gt;
&lt;br /&gt;
== Wavetable Audio ==&lt;br /&gt;
Some form of wavetable audio is sorely missing for Amiga, TG16, SNES, Soundblaster era audio, especially sound effects. Basic multiple channels of stereo or panned mono, uncompressed samples, support some simple compression formats.&lt;br /&gt;
&lt;br /&gt;
Pull small buffers of audio into the FPGA from RAM, keep 2 live at a time, one playing, one buffered. At 25MHz with a 48KHz sample rate, 1 sample lasts 520 cycles (20µsec), could be fast enough to fetch while the last sample is playing and just single-buffer it? Or even a rolling window Should also support just-in-time software generation of each buffer, with IRQ notifications.&lt;br /&gt;
&lt;br /&gt;
Stretch samples to whatever the output sampling rate is. Linear interpolation would be neat, but probably optional. Same with the decay-to-zero that many old synth chips had.&lt;br /&gt;
&lt;br /&gt;
== Sound Chip Instances ==&lt;br /&gt;
Instead of duplicating hardware instances of sound chips, multiplex all their registers and internal variables. Access would select 1 of them, and the hardware would run with that multiplexer active on all its values. Compare the size taken, depends on how complex the chip is.&lt;br /&gt;
&lt;br /&gt;
Since sound chips don&#039;t need to be that fast, serially looping through and executing a cycle, accumulating their output, for the final audio sample would be fine. Some of them do this internally with their voices anyway.&lt;br /&gt;
&lt;br /&gt;
Register to select which instance(s) to use, so programs can be agnostic to what sound context exists with other things. Probably expose 2 chips at a time through the IO registers, with a separate one to select which bank of 2 to use. At least for mono chips, or those which are commonly in pairs. Stereo chips could just have 1 register set exposed.&lt;br /&gt;
&lt;br /&gt;
== 65816 support ==&lt;br /&gt;
Remap page 0 into any 64kB bank, allowing direct page, stack, etc, to have its own swappable space. However, need to consider how this goes for interrupts. An interrupt will probably have to remap to hardware bank 0, but then somehow restore the bank that used to be there. Keeping the upper 256 bytes locked somewhere (flash or bank 0 RAM) would solve that. The 8kB MMU can be used for these purposes already, but I wonder if the full bank swapping might be easier, but likely not really necessary as long as the MMU is around.&lt;br /&gt;
&lt;br /&gt;
== FPGA-based CPU ==&lt;br /&gt;
65816 but with a genuine 16-bit data bus.&lt;br /&gt;
&lt;br /&gt;
Keep 6809 in the same core with the 65816 running. Switch between either at any time (bus master), or alternate cycles. At core2x speed, they could each run at 6MHz alternately hitting the SRAM.&lt;br /&gt;
&lt;br /&gt;
If the bus can be more dynamic, especially during vblank/hblank, the CPUs can run a lot faster there.&lt;br /&gt;
&lt;br /&gt;
== Bitstream readers/writers ==&lt;br /&gt;
Write a byte or word to a FPGA location, it takes a CPU cycle to write it, and bumps its pointer.&lt;br /&gt;
&lt;br /&gt;
For a bit stream, a 32-bit bitpointer covers 4Gb = 512MB. A write would need to know the width to write. Maybe 16 registers, write a value to one of those to declare how many bits from the written value to write. This actually allows the index register to determine width dynamically, which is nice. Both read &amp;amp; write interfaces should use this. A complete hack but easier to use would be to have 18 regs. For any width &amp;gt;8 bits, a 2nd access to the next register would grab the high byte, even though it&#039;s technically the trigger for the next higher. But this would get confusing in 65816 16-bit mode, accessing lower lengths.&lt;br /&gt;
&lt;br /&gt;
Separate read &amp;amp; write context, so copies, decompression, etc, can be done. Bit pointers can be directly read/written as well. Direction is always in the positive direction, though, at least for now.&lt;br /&gt;
&lt;br /&gt;
Probably good to support 0-length, for dynamically computed lengths. So with 0-16 supported, that&#039;s 17 entry points, kinda messy.&lt;br /&gt;
&lt;br /&gt;
Also, skip forward N bits without a read or write. Technically this could just be a read N bits and ignore the value, but this should be 0-65535 bits skipped. Could also just do a 32-bit add on the pointer register.&lt;br /&gt;
&lt;br /&gt;
8bit interface: 2 bitpointers, then 8 byte locs for pointer 0, and 8 byte locs for pointer 1.&lt;br /&gt;
&lt;br /&gt;
16bit interface: 2 bitpointers, then 16 word locs for pointer 0, 16 word locs for pointer 1. Writes triggered on high byte write. Reads trigger on low byte read, which readies the high byte.&lt;br /&gt;
&lt;br /&gt;
This is a CPU-blocking interface for reads, buffered for writes.&lt;br /&gt;
&lt;br /&gt;
== Optical Keyboard ==&lt;br /&gt;
Can this be sent as 9 events of 8bits, instead of 8 events of 9 bits (2 bytes)? However the self-describing row number might be useful to keep.&lt;br /&gt;
&lt;br /&gt;
== RLE Format(s) ==&lt;br /&gt;
RLE layers, DMA, and potentially sprites can use RLE encoding.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Span-based RLE formats&lt;br /&gt;
!bpp&lt;br /&gt;
!Layout&lt;br /&gt;
!length&lt;br /&gt;
!Max compression&lt;br /&gt;
!Breakeven&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|&amp;lt;code&amp;gt;clllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-128&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|8px&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&amp;lt;code&amp;gt;cc111111&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-64&lt;br /&gt;
|16:1 byte&lt;br /&gt;
|4 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-16&lt;br /&gt;
|4:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&amp;lt;code&amp;gt;ccccCCCC llllllll llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|170:1 byte (512:3)&lt;br /&gt;
|3+3 pixels&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|&amp;lt;code&amp;gt;cccccccc llllllll&amp;lt;/code&amp;gt;&lt;br /&gt;
|1-256&lt;br /&gt;
|128:1 byte&lt;br /&gt;
|2 pixels&lt;br /&gt;
|}&lt;br /&gt;
However, it would be useful to have spans of literal pixels as well, instead of just solid color span fills.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt; = span length L of color C, 0 = transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll cccccccc...&amp;lt;/code&amp;gt;= L count of individual pixels&lt;br /&gt;
&lt;br /&gt;
For a bpp less than 8, probably require them to fill an even byte or word count&lt;br /&gt;
&lt;br /&gt;
For now, RLE layers should be simple length + 8bpp aligned words. RLE bitmaps would be something different, maybe it&#039;s too flexible so we should just leave that to the CPU. It would save a lot of bandwidth for bitmap overlay layers with large transparent windows, though.&lt;br /&gt;
&lt;br /&gt;
== DMA/Blitter ==&lt;br /&gt;
Maybe separate out 2d mode into its own blitter?&lt;br /&gt;
&lt;br /&gt;
Flag to mask out the &#039;fill/mask&#039; color (default 0)&lt;br /&gt;
&lt;br /&gt;
Clip to output screen dimensions.&lt;br /&gt;
&lt;br /&gt;
Xflip, yflip, maybe 90° rotation, but that means dest dimensions change? Scaling? Full affine transform? &lt;br /&gt;
&lt;br /&gt;
Unpack RLE graphics, for better memory usage. Could still do x/y flip because this isn&#039;t raster-dependent. Must know the total x/y though if clipping is supported&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
&lt;br /&gt;
* bpp (could expand from src to dest given an offset?)&lt;br /&gt;
* src w/h/stride&lt;br /&gt;
* dest w/h/stride&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO - V2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Clipping? Or should the src/dest be handled in software?&lt;br /&gt;
&lt;br /&gt;
Ideally, there&#039;d be a clip bounds defined at the dest address, w, h, stride, bpp. The source address is defined, and it&#039;s blitted into an x/y in the dest screen, automatically clipped. This could also be used as a pixel/stamp plotter.&lt;br /&gt;
&lt;br /&gt;
If there end up being a large number of parameters for a src or dest, it would be nice to have multiple profiles. Either read src/dest profiles from ram, or have say 4 src &amp;amp; 4 dests saved, and blit from src N to dest M.&lt;br /&gt;
&lt;br /&gt;
RLE graphics should probably save their w/h and mode implicitly as the first 2 words, as they are their own free-form shapes.&lt;br /&gt;
&lt;br /&gt;
Since DMA currently only takes place during VBLANK, could be more efficient to have a DMA list to run when VSYNC hits, blasting those out as fast as possible.&lt;br /&gt;
&lt;br /&gt;
For 1bpp (or maybe others, too?) and/or/nor/nand/xor modes would be necessary.&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38468</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38468"/>
		<updated>2026-02-18T01:16:19Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth.&lt;br /&gt;
&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Per Line Sprite Limits&lt;br /&gt;
!&lt;br /&gt;
!Sprites&lt;br /&gt;
!Pixels&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|32&lt;br /&gt;
|34*8 = 272&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|20&lt;br /&gt;
|20*16 = 320&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|16 single-wide&lt;br /&gt;
|256&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|64 or 128 (no limit)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|6-57&lt;br /&gt;
|≤512&lt;br /&gt;
|[https://cx16forum.com/forum/viewtopic.php?p=26089#p26089]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|96&lt;br /&gt;
|1536&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |none, sprite frame buffer&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38467</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38467"/>
		<updated>2026-02-17T22:19:54Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth.&lt;br /&gt;
&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop. Probably have an 8-bit register access mode (high bytes &amp;amp; low bytes in different areas, for 256 sprites) vs 16-bit register access mode (for 65816 16-bit copies with indices from 0-510).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38466</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38466"/>
		<updated>2026-02-17T00:36:32Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Sprites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth.&lt;br /&gt;
&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
Need to ensure that tile layers are max 65536 pixels wide/tall, since that&#039;s what the scroll layers deal with.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
I do like the genesis idea of having a linked list of active sprites, as it can save time scanning the active sprites and finishing early. Question is should there be multiple sprite layers, each with their own list head, or one sprite list with each sprite having its depth independently set with its priority bits?&lt;br /&gt;
&lt;br /&gt;
For transparency, we probably need 2 sprite linebuffers, one for the transparent part, and one for the solid part. Each holds its own layer in the upper bits. 18 bit entries = 16-bit 4444 RGBA, plus 2 bits layer selection. Now, there&#039;s nothing for enabling/disabling the pixel, though. The transparency layer could be enabled by alpha channel, and because of stacked blending of transparent requires the actual full color value. The solid layer could do clut + 8bpp + enable bit, for 13 bits total, or 12bpp plus 2bpp layer plus 1bbp enable, for 15 bits total, since we know that&#039;s not transparent. We probably want a flag for the layer/global as to whether sprite transparency stacks or not, since enabling it will blend deeper transparent sprite pixels from being obscured to the topmost transparency layer.&lt;br /&gt;
&lt;br /&gt;
Sprite register should probably be a structure of arrays, so you can wholesale copy x/y locations faster than copying literally the entire sprite definition block every frame. Individual sprite updates for color, frame, etc can be set during animation handling, and directly set the sprite register instead of that needing to be part of the update loop.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Length is 1-128, there is no zero-length span.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon filling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
	<entry>
		<id>https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38465</id>
		<title>WF16 Video Architecture</title>
		<link rel="alternate" type="text/html" href="https://f256wiki.wildbitscomputing.com/index.php?title=WF16_Video_Architecture&amp;diff=38465"/>
		<updated>2026-02-16T23:24:28Z</updated>

		<summary type="html">&lt;p&gt;WF: /* Layers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Global settings ==&lt;br /&gt;
CRT emulation, only for low resolution layers.&lt;br /&gt;
&lt;br /&gt;
640×480 for 4:3 output, or 960×540 for 16:9 output, if bandwidth can run it. Requires 1.6875× the bandwidth.&lt;br /&gt;
&lt;br /&gt;
Non-integer pixel aspect flags, again only for low res layers. Match 320×200 and 256×200 non-square aspects blended on a 480p/540p base output. Keep it at 60Hz&lt;br /&gt;
&lt;br /&gt;
Select 50 or 60 Hz in any resolution. Ditch 70Hz, as nothing syncs to that in the PC space for compatibility. 50Hz is much lower priority, but can be done by extending vblank time and keeping pixel clock the same. If 640×400 res is still used, have it at 60Hz, again same pixel clock but longer vblank.&lt;br /&gt;
&lt;br /&gt;
Global scroll register, for setting where 0,0 is on the display. This might also change how the raster lines are counted, going from say -100 to 380 instead of 0 to 480, to line up with borders and such.&lt;br /&gt;
&lt;br /&gt;
Let the mouse pointer pick a CLUT, instead of being locked to grayscale. Or have its own dedicated 16-color one.&lt;br /&gt;
&lt;br /&gt;
== Palettes ==&lt;br /&gt;
Reduce from 24-bit to 16-bit, better suited to 65816, and makes a lot of addressing simpler.&lt;br /&gt;
&lt;br /&gt;
5-5-5-1 masked, or 4-4-4-4 RGBA? Leaning towards the latter. Using transparency 0=opaque, 15=fully transparent is probably easier.&lt;br /&gt;
&lt;br /&gt;
Have a FPGA block which separates &amp;amp; combines 4 values into 1, all R/W registers, avoid all the shifting. Include signed clamping when converting to the single RGB word.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Palettes are always 4-4-4-4, but direct color 5-5-5-1 or 4-4-4-4 can be used for bitmap layers? Probably best to keep it the same, but given clear displays today, the 5-5-5 would look better for full-color backgrounds.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+4bpp Palette Configurations&lt;br /&gt;
!&lt;br /&gt;
!Entries&lt;br /&gt;
!Depth&lt;br /&gt;
!Palettes&lt;br /&gt;
!Tiles&lt;br /&gt;
!Sprites&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|555&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64&lt;br /&gt;
|333&lt;br /&gt;
|4×16&lt;br /&gt;
|0-3&lt;br /&gt;
|0-3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|512&lt;br /&gt;
|333&lt;br /&gt;
|32×16&lt;br /&gt;
|0-15&lt;br /&gt;
|16-31&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-15&lt;br /&gt;
|0-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|4096&lt;br /&gt;
|444&lt;br /&gt;
|256×16&lt;br /&gt;
|—&lt;br /&gt;
|0-255&lt;br /&gt;
|Everything is sprites&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|256&lt;br /&gt;
|444&lt;br /&gt;
|16×16&lt;br /&gt;
|0-7&lt;br /&gt;
|8-15&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|3072&lt;br /&gt;
|4444&lt;br /&gt;
|192×16&lt;br /&gt;
|0-31 + layer&lt;br /&gt;
|0-31&lt;br /&gt;
|4bit brightness, each layer/type has its own 32 palettes&lt;br /&gt;
|}&lt;br /&gt;
== HDMA ==&lt;br /&gt;
After a line has been rendered to the line buffer, run the HDMA list. If the HDMA list is done, then trigger the EOL interrupt if enabled. The timing that a line &amp;amp; HDMA takes is dynamic. The EOL should always be fired for a line even if there is no time left.&lt;br /&gt;
&lt;br /&gt;
Ideally, if the NMI line could be connected, the EOL interrupt can be dedicated there for minimizing latency.&lt;br /&gt;
&lt;br /&gt;
At first, the HDMA list should contain a line number to wait for, a count, and number of address/data pairs in video IO space to write, and whether to fire an interrupt.&lt;br /&gt;
&lt;br /&gt;
Advanced features would be to load a value from a table, offset by the raster number. And run the HDMA (with optional interrupt) every line until the target line is reached.&lt;br /&gt;
&lt;br /&gt;
There could be some BRAM dedicated to HDMA use or other on-chip variable storage. Would free up the bus, and take smaller indexing for where to copy from. Also, could set some state vars.&lt;br /&gt;
&lt;br /&gt;
The rasterline would likely be the graphics line, not the hi-res line but this could also be an option.&lt;br /&gt;
&lt;br /&gt;
The HDMA &amp;quot;program counter&amp;quot; is visible and editable, and can be safely modified after EOL interrupt. If it&#039;s $000000, then it&#039;s disabled? Should HDMA lists be on-chip? Have HDMA variables on-chip, referred to by the copies by small index?&lt;br /&gt;
&lt;br /&gt;
This has the effect of externalizing and obsoleting the rasterline interrupt registers, as the HDMA could just fire them on a list of lines instead, without running any actual DMA.&lt;br /&gt;
&lt;br /&gt;
SNES sets up the destination as part of the HDMA config, then each line only has the data to write. Saves cycles, and is probably reasonable to implement, given what these tend to be used for. Examples at https://snes.nesdev.org/wiki/HDMA_examples&lt;br /&gt;
&lt;br /&gt;
While it might be a lot for HDMA, DMA&#039;ing in a chunk of sprite registers from SRAM would be nice. This might be something for normal DMA during VBLANK.&lt;br /&gt;
&lt;br /&gt;
== Line Buffers ==&lt;br /&gt;
Use 36bit BRAMs, storing 3 12-bit pixels per word. This is the final output buffer, no alpha necessary.&lt;br /&gt;
&lt;br /&gt;
2 line buffers would be used for CRT emulations, or 3 if we need a work one. 320px wide / 3 = 107 words per line, 321 words total (3 linebuffers), 11,556 bits.&lt;br /&gt;
&lt;br /&gt;
== Layers ==&lt;br /&gt;
Every layer def has these:&lt;br /&gt;
&lt;br /&gt;
* Type (tile, bitmap, RLE, sprite?)&lt;br /&gt;
* Base pointer (could be page-aligned 16-bit, for 16MB range?, else 32-bit pointer)&lt;br /&gt;
* x/y pixel scroll (16-bit wrapping). Could share these in scroll groups, but not a big deal to duplicate these. This includes scrolling sprite layers&lt;br /&gt;
* CLUT selection&lt;br /&gt;
* Bit depth?&lt;br /&gt;
* Clip window?&lt;br /&gt;
* Masking enable &amp;amp; layer target&lt;br /&gt;
* Last layer flag? Meaning color 0 isn&#039;t transparent and uses the CLUT color to fill in the background&lt;br /&gt;
* High or low resolution? Some modes and bit depths are low enough bandwidth to do at 480p&lt;br /&gt;
&lt;br /&gt;
64-byte cache per layer, for retaining sprite/tile graphics for reuse (more if bpp is smaller), or a readahead buffer for DDR3 for RLE and bitmap modes, which don&#039;t reuse anything anyway&lt;br /&gt;
&lt;br /&gt;
=== No-overdraw bandwidth reduction ===&lt;br /&gt;
Have multiple hardware instances of layer renderers, all fighting for external bandwidth. Render front-to-back, with transparent pixels causing the next layer underneath to want to draw that pixel. Each layer only requests individual pixels that it needs to draw, and keeps some cache for redrawing the same sprite/tile on the same line. The first layer gets all pixels requested. The only wasted reads are when a read pixel is transparent and dispatches deeper, and 16-bit wide reads where not all the bits are used.&lt;br /&gt;
&lt;br /&gt;
Tilemap data is probably fetched regardless if it&#039;s in DDR3. For SRAM, just grabbing &amp;amp; caching the current tile is fine. Tile 0 assumed blank means avoiding fetching any of those pixels.&lt;br /&gt;
&lt;br /&gt;
=== Alpha Transparency ===&lt;br /&gt;
A pixel entry in the line buffer contains a 12-bit ARGB value, and goes through potentially 3 states: Uninitialized, holding transparent, opaque, with holding transparent being optional.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Action→Next State&lt;br /&gt;
!Init State&lt;br /&gt;
!Empty Pixel&lt;br /&gt;
!Transparent Pixel&lt;br /&gt;
!Opaque Pixel&lt;br /&gt;
|-&lt;br /&gt;
|Uninit&lt;br /&gt;
|No-op → Uninit&lt;br /&gt;
|Set → Transparent&lt;br /&gt;
|Set → Opaque&lt;br /&gt;
|-&lt;br /&gt;
|Transparent&lt;br /&gt;
|No-op → Transparent&lt;br /&gt;
|Blend (or no-op) → Transparent&lt;br /&gt;
|Blend → Opaque&lt;br /&gt;
|}&lt;br /&gt;
When transitioning to opaque, the pixel is complete. The common case is uninit to opaque, and shouldn&#039;t be done with extra clock cycles, unless the blend is constant and pipelined.&lt;br /&gt;
&lt;br /&gt;
For simplicity, the &#039;alpha&#039; is actually a transparency channel, with 0 = opaque, and 15 = fully transparent. A layer can override transparency, or any individual palette entry can have non-zero transparency. For most cases, a pixel index value of 0 is a skipped pixel and the equivalent of $F000 (fully transparent black).&lt;br /&gt;
&lt;br /&gt;
Individual layers, sprites, can have a transparency override, ignoring the palette alpha value. If they don&#039;t, transparency from the palette per color can still be obeyed. Maybe palette transparency needs to be enabled as well, just using the 12-bit color by default, meaning we can still use 0→f as clear→opaque as standard.&lt;br /&gt;
&lt;br /&gt;
=== Masking Layers ===&lt;br /&gt;
Any layer can be used as a mask, to clip out layers underneath it. Wherever a solid pixel would be drawn, this would cause the pixel rendering to skip down to a layer lower in the stack. RLE layers would probably be the best for this, but any layer can be used this way to stencil out graphics. Instead of just masking out the immediate layer below it, it can choose which layer to skip to, so it can mask out an entire consecutive stack of layers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buffering alpha sprites with no-overdraw is harder, probably needs its own linebuffer. Both the alpha and opaque layers need to track their own layer depth per pixel when merging together, as maybe only the alpha is visible but not the further back opaque sprite. Simplifications would be that alpha sprites don&#039;t show any sprites underneath, only tiles, but that&#039;s lame. Another would be that alpha sprites that overlap other sprites always combine with sprites and can&#039;t have tiles underneath. That is lame as well. The only real solution is to have the f2b trace through the sprite priority layers instead of having a single combined sprite line buffer, or split out sprite transparency into its own line buffer, with each pixel having its own priority number in both sprite line buffers. Or just support alpha transparency in tile/bitmap/rle layers and not sprites. Again lame, but probably the most workable solution. A small bitmap layer basically acts like a sprite anyway.&lt;br /&gt;
&lt;br /&gt;
Oh, I guess we need an alpha mode as well. Averaging, brightening, dimming, threshold, gel, etc.&lt;br /&gt;
&lt;br /&gt;
== Indexed Bit Depth ==&lt;br /&gt;
Currently, everything is 8bpp, which is high bandwidth, more work to create artwork, and doesn&#039;t port as easily from other systems that use multiple palette swaps onscreen.&lt;br /&gt;
&lt;br /&gt;
For tiles, sprites, and bitmaps, choose 1/2/4/8 bpp. Direct color 16-bit bitmaps would be separate from paletted bitmaps.&lt;br /&gt;
&lt;br /&gt;
Each layer can select a CLUT. Each sprite or tile points to either a starting palette entry, or maybe a bitmask to OR into it. Pixels that are affected by local color would have those bits be 0, while static colors have those bits all 1. This can drastically reduce the potential colors available, though. If you have 8 shades of the selected color, that means only 32 static colors in the rest. Very wasteful, but functional.&lt;br /&gt;
&lt;br /&gt;
== Bitmaps ==&lt;br /&gt;
Option to wrap. Else, it shows blank pixels outside its range. Divmod can be done once per line.&lt;br /&gt;
&lt;br /&gt;
Size x/y pixels&lt;br /&gt;
&lt;br /&gt;
Small bitmaps with wrapping could make for easy wipes and parallax effects, covering the entire screen with a pattern.&lt;br /&gt;
&lt;br /&gt;
During render, recompute the starting address to allow raster effects including Y stretch/squash.&lt;br /&gt;
&lt;br /&gt;
1/2/4/8 bpp for indexed bitmaps, option for 4-4-4-4 or 5-5-5-1 for direct color bitmaps.&lt;br /&gt;
&lt;br /&gt;
DDR3 suits bitmaps the best, ensure that gets supported. A 640×480×8bpp (+307,200 $4B000 bytes) single layer mode would also be nice for GUI and PC game ports, especially with blitter support. Scrolling can still be supported, maybe more than 1 layer might be doable as well.&lt;br /&gt;
&lt;br /&gt;
== Tiles ==&lt;br /&gt;
Layer: Base pointer = Tilemap pointer, add tilegfx pointer&lt;br /&gt;
&lt;br /&gt;
Map size x/y tiles&lt;br /&gt;
&lt;br /&gt;
Option to wrap.&lt;br /&gt;
&lt;br /&gt;
By default, tile 0 is assumed empty and no pixels are read, saving bandwidth. Can be used for metadata. Option to have tile 0 non-empty? Maybe it should be tile $ffff (or whatever the max index is, given flip bits?) That would never be in the tileset anyway.&lt;br /&gt;
&lt;br /&gt;
For DDR3 tilemaps, it reads an entire row into a buffer. For SRAM, it fetches each tilemap entry as it becomes visible, then fetches the pixels separately, and caches them.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tile attributes of various platforms&lt;br /&gt;
!&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;12&amp;quot; |Tile (0-4095)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Tile (0-1023)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo attr&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Tile MSB (0-1023)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1 attr&#039;&#039;&#039;&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
Neo Geo and CPS-1 uses 32 bits per tile. 16-bit LSB tile number is excluded, 16-bit attributes (above).&lt;br /&gt;
&lt;br /&gt;
=== Tilegfx ===&lt;br /&gt;
These are self-describing, with a header that takes up tile 0&#039;s pixel space? Having tile $FFFF be transparent actually would be easier for tileset creation, because that would always exist and take no memory or extra flags.&lt;br /&gt;
&lt;br /&gt;
bpp (1,2,4,8), size (8×8, 16×16 (32×32, 64×64?)), bitmap mode, which would give it a stride of 256 bytes no matter the bpp (or take a stride byte/word value, more complex computation but just once per rasterline).&lt;br /&gt;
&lt;br /&gt;
1bpp tiles are interesting, in that we could have transparency modes like text: fg only (direct color selection?), fg/bg (palette index where the 2 start from), fg/bgp (bg0 is always transparent, rest are solid).&lt;br /&gt;
&lt;br /&gt;
I&#039;ve never seen a platform with the Foenix&#039;s notion of multiple tilesets addressable from a single tilemap. I&#039;m not sure that&#039;s really ever used anywhere either. It&#039;s interesting, but not sure how useful it would be to keep, vs the &amp;gt;8bit tile indices above. The only time it would be specifically useful if 2 tile layers share same partial tileset, but have additional differences. I don&#039;t really see a super pressing need for that. I also think that the size, bpp, etc should be part of the tilemap/layer definition, not separated off into its own table of tilesets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Neo Geo has auto-animating tiles/sprites. 4 or 8 tiles in a row in the tileset can be cycled through for animation. (cycling through low 2 or 3 bits of tile index). Global or layer-specific config for how may frames per step.&lt;br /&gt;
&lt;br /&gt;
Meta-tilemap mode, so the tilemap holds entries that are 2×2 or 4×4 hardware tilemap entries.&lt;br /&gt;
&lt;br /&gt;
Priorities aren&#039;t all that often use, but might be a good feature to have, especially to save on tilemap layers and scads of empty entries in those additional layers. Place the &amp;quot;background&amp;quot; in front of the sprite layer, with the tile either high priority drawing, or deferring to the sprite layer below it. If the priority is low, it passes the color to the sprite layer, and if the sprite layer has no pixel, it draws that bg pixel. If the tile pixel is transparent, then transparent behavior applies regardless of priority and nothing is different.&lt;br /&gt;
&lt;br /&gt;
A CPS-1 style priority bit setting (16-bit, priority per color in that tile) might be interesting, but I&#039;d say a half-and-half mode (lower 8 colors are lower priority, higher 8 colors are higher priority), or higher 4 colors etc, might be more compact and useful. It puts more constraints on the colors, but I would think certain foreground objects might have their own colors anyway?&lt;br /&gt;
&lt;br /&gt;
== Sprites ==&lt;br /&gt;
H-flip at the very minimum. If V-flip and 90° (since all sprites/tiles are square sized), then all 8 orientations and flips are possible. Rotation is only available in SRAM.&lt;br /&gt;
&lt;br /&gt;
16-bit sprite image selection from base pointer, based on bpp &amp;amp; size. Flip bits might be at MSBs of the word. 3 flip bits means 8192 sprite images.&lt;br /&gt;
&lt;br /&gt;
Sprite sheet mode (kinda like square for tilesets), with a declared stride.&lt;br /&gt;
&lt;br /&gt;
Color selection, direct for 1bpp, starting palette offset for 2/4bpp. Note that both of these could be expressed by OR&#039;ing a mask on top of the color.&lt;br /&gt;
&lt;br /&gt;
Need to figure out something for 8bpp color, to have palette swaps for limited ranges. The layer could have a color range/mask where all colors less than that use the sprite color. But this can probably be done with just an OR mask (or XOR for fun?). 8bpp sprites would normally have a 0 &#039;color&#039;, palette swaps would leave a range of bits open and use the individual sprite color to set that, but we don&#039;t want that done on all bits, only those that are in &amp;quot;palette range&amp;quot;, hence the layer setting. Maybe also only when the color is nonzero? or non-FF? Or if the color is 0-16, then it has 16 color selections as a 4bpp color? Colors 17-255 would be normal. Use the top bit of the color byte to select this coloring mode.&lt;br /&gt;
&lt;br /&gt;
8×8, 16×16, 32×32, 64×64 sizes (2 bit selection, forget 24×24) TG16 had 64×64 and did interesting pseudo-layer and huge enemy stuff with it.&lt;br /&gt;
&lt;br /&gt;
1,2,4,8 bpp (2 bit selection)&lt;br /&gt;
&lt;br /&gt;
(or should bpp &amp;amp; size be for the layer? might make for simpler implementation, but varying sprite sizes are probably good. Bpp might still be a consideration for layer config&lt;br /&gt;
&lt;br /&gt;
Overdraw avoidance eliminates pulling in unseen pixels, which prevents hardware collision detection, which is fine.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sprite definitions of various platforms&lt;br /&gt;
!&lt;br /&gt;
!VRAM&lt;br /&gt;
!Num&lt;br /&gt;
!Bytes&lt;br /&gt;
!15&lt;br /&gt;
!14&lt;br /&gt;
!13&lt;br /&gt;
!12&lt;br /&gt;
!11&lt;br /&gt;
!10&lt;br /&gt;
!9&lt;br /&gt;
!8&lt;br /&gt;
!7&lt;br /&gt;
!6&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;SNES&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|128&lt;br /&gt;
|4¼&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Tile (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;14&amp;quot; |(packed with other sprite x msb &amp;amp; size)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|Size&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Genesis&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|80&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) -256&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (1-4)×8&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (1-4)×8&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |Link (next sprite in draw order)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511) -128&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;TG16&#039;&#039;&#039;&lt;br /&gt;
|64kB&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-1023) relative&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; |Tile (0-2047), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|VFlip&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (16,32,64)&lt;br /&gt;
|HFlip&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|Width (16,32)&lt;br /&gt;
|Priority&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;F256K&#039;&#039;&#039;&lt;br /&gt;
|2MB&lt;br /&gt;
|64&lt;br /&gt;
|6&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile Address MSB&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Size&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Palette (0-3)&lt;br /&gt;
|Enable&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile Address LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CX16&#039;&#039;&#039;&lt;br /&gt;
|128kB&lt;br /&gt;
|128&lt;br /&gt;
|8&lt;br /&gt;
|8bpp&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;13&amp;quot; |Tile (0-4095), address = tile×32 regardless of sprite size&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |X Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;10&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Height (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Width (8,16,32,64)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Palette (0-15)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Collision mask&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |Priority&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Neo Geo&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|380&lt;br /&gt;
|134&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Palette (0-255)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Tile MSB (0-1,048,575)&lt;br /&gt;
|Auto-anim 3b&lt;br /&gt;
|Auto-anim 2b&lt;br /&gt;
|VFlip&lt;br /&gt;
|HFlip&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |HShrink (15-0)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |VShrink (255-0)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |Y Pos (0-511)&lt;br /&gt;
|Sticky&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; |Height in tiles (0-32, 33 = special wrap mode)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;9&amp;quot; |X Pos (0-511)&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|—&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Commando&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|128&lt;br /&gt;
|4&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Tile MSB (0-2047)&lt;br /&gt;
|X Pos MSB&lt;br /&gt;
|HFlip&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; |Palette (0-7)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Tile LSB&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |X Pos (0-255)&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; |Y Pos (0-255)&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;20&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;CPS-1&#039;&#039;&#039;&lt;br /&gt;
|ROM&lt;br /&gt;
|256&lt;br /&gt;
|8&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |X Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Y Pos (0-65535?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;16&amp;quot; |Tile (0-65535)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Height (in sprites)&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |Width (in sprites)&lt;br /&gt;
|—&lt;br /&gt;
|YFlip&lt;br /&gt;
|XFlip&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; |Palette (0-31)&lt;br /&gt;
|}&lt;br /&gt;
SNES has 2 sprite sizes globally selectable, and the per-sprite bit sets which to use.&lt;br /&gt;
&lt;br /&gt;
One Neo Geo sprite is a tower of up to 32 tiles (first 2 words above), which makes the attribute size that large: 2 words × 32 tiles, plus 3 other attribute/position words. The sticky bit is to place the next sprite immediately to the right of the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ROM is listed for &amp;quot;VRAM&amp;quot; when there&#039;s no RAM for pixel data, and that&#039;s stored in ROM. VRAM tends to describe register tables and the char matrix in these platforms.&lt;br /&gt;
&lt;br /&gt;
CPS-1 sprite tiles are all 16x16 pixels.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rougher ideas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Are all sprites independently defined and layered? Are they all from the same base pointer? Would need multiple layer definitions to give multiple base pointers, and that might be a good idea? Each layer involved could take 64 sprites out of 256, max 4 sprite &amp;quot;layers&amp;quot;. Maybe that&#039;s not something that should be layer-based, but global to the sprite system. 4 base pointers, 4 groups of 64 sprites, 4 hardware elements scanning the sprite registers in parallel.&lt;br /&gt;
&lt;br /&gt;
Unlimited height sprites? fixed width&lt;br /&gt;
&lt;br /&gt;
8bpp color register could be used to bank a subset of colors, maybe a color range (0-7) can be cycled while others are fixed. Think of Age of Empires 1 recoloring for instance. Or just use that to select a CLUT, overriding the layer&#039;s selection.&lt;br /&gt;
&lt;br /&gt;
Select the color to be transparent? If using a fixed smaller palette, like DB16/32, then each sprite could pick a different one. Pico-8 has a 16-bit mask for which colors to include or not, which is interesting.&lt;br /&gt;
&lt;br /&gt;
Cut-out sprites wouldn&#039;t display, but would clear any pixel from sprites above it, allowing sprites below to show through. Or, it could skip the sprite immediately below if it has a pixel, masking a single sprite, which might be easier to implement.&lt;br /&gt;
&lt;br /&gt;
Figure out sprite zooming. No rotation,just scaling, not inverting with this? Can grow or shrink independently in x &amp;amp; y. Maybe bresenham? Probably want sub-pixel accuracy, 16-bit with fixed point? Or full 32-bit fixed? x1/x2/y1/y2 dest rectangle maybe?&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
Layer has a height (width is undefined).&lt;br /&gt;
&lt;br /&gt;
The base pointer points to an array of &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;× 16-bit offsets, one for each line, indexed from the base pointer. Each line is an non-demarcated concatenation of tags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0lllllll cccccccc&amp;lt;/code&amp;gt;length + color pair, color 0 is typically transparent&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1lllllll c...&amp;lt;/code&amp;gt;length + literal pixels.&lt;br /&gt;
&lt;br /&gt;
Uses:&lt;br /&gt;
&lt;br /&gt;
* Wipes&lt;br /&gt;
* Solid color borders&lt;br /&gt;
* Raster bars without interrupts&lt;br /&gt;
* SNES-style explosion or light ray effects (esp with transparency)&lt;br /&gt;
* Compressed cel style images or animations&lt;br /&gt;
* Polygon fiilling, especially with multiple layers instead of merging spans into 1 layer&lt;br /&gt;
* Cheap enough to run in hi-res?&lt;/div&gt;</summary>
		<author><name>WF</name></author>
	</entry>
</feed>