<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.neogeodev.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Furrtek</id>
	<title>NeoGeo Development Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.neogeodev.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Furrtek"/>
	<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php/Special:Contributions/Furrtek"/>
	<updated>2026-10-06T23:44:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Playing_sound_samples&amp;diff=9354</id>
		<title>Playing sound samples</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Playing_sound_samples&amp;diff=9354"/>
		<updated>2026-10-04T01:29:45Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* ADPCM-A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[ADPCM]]-A==&lt;br /&gt;
&lt;br /&gt;
Definitions of [[YM2610_registers#ADPCM-A part|ADPCM-A registers]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
;ADPCM-A register defines (YM2610 port B: address $06, data $07)&lt;br /&gt;
PA_CTRL:	EQU $00		;bit 7: 0 = key on, 1 = dump (key off). Bits 0-5: channel mask&lt;br /&gt;
PA_MVOL:	EQU $01		;master volume, 0-$3F ($3F = loudest)&lt;br /&gt;
PA_CVOL:	EQU $08		;+channel: bit 7 = left, bit 6 = right, bits 0-4 = volume 0-$1F&lt;br /&gt;
PA_STARTL:	EQU $10		;+channel: start address bits 8-15&lt;br /&gt;
PA_STARTH:	EQU $18		;+channel: start address bits 16-23&lt;br /&gt;
PA_ENDL:	EQU $20		;+channel: end address bits 8-15&lt;br /&gt;
PA_ENDH:	EQU $28		;+channel: end address bits 16-23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Full list of defines [[YM2610 ASM defines|here]])&lt;br /&gt;
&lt;br /&gt;
Registers marked &amp;quot;+channel&amp;quot; exist once per channel: add the channel number (0-5) to the base address. For example, the start address low register of CH3 is PA_STARTL+2 = $12. In PA_CTRL, bit 0 is CH1 and bit 5 is CH6, so several channels can be keyed on or off with a single write.&lt;br /&gt;
&lt;br /&gt;
===Writing to the YM2610===&lt;br /&gt;
The real YM2610 requires a minimum delay between writes, see [[Z80/YM2610 interface]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
	ORG	$0018&lt;br /&gt;
	jp	WritePortB		;RST $18 vector (only 8 bytes available here, so jump)&lt;br /&gt;
&lt;br /&gt;
;Write E to YM2610 port B register D (ADPCM-A, FM channels 3-4)&lt;br /&gt;
;Destroys: nothing&lt;br /&gt;
WritePortB:&lt;br /&gt;
	push	af&lt;br /&gt;
WPB_wait1:&lt;br /&gt;
	in	a,($04)			;status 0&lt;br /&gt;
	rlca				;busy flag -&amp;gt; carry&lt;br /&gt;
	jr	c,WPB_wait1&lt;br /&gt;
	ld	a,d&lt;br /&gt;
	out	($06),a			;register number&lt;br /&gt;
WPB_wait2:&lt;br /&gt;
	in	a,($04)&lt;br /&gt;
	rlca&lt;br /&gt;
	jr	c,WPB_wait2&lt;br /&gt;
	ld	a,e&lt;br /&gt;
	out	($07),a			;value&lt;br /&gt;
	pop	af&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
;Write E to YM2610 port A register D (SSG, ADPCM-B, FM channels 1-2, flag control)&lt;br /&gt;
WritePortA:&lt;br /&gt;
	push	af&lt;br /&gt;
WPA_wait1:&lt;br /&gt;
	in	a,($04)&lt;br /&gt;
	rlca&lt;br /&gt;
	jr	c,WPA_wait1&lt;br /&gt;
	ld	a,d&lt;br /&gt;
	out	($04),a&lt;br /&gt;
WPA_wait2:&lt;br /&gt;
	in	a,($04)&lt;br /&gt;
	rlca&lt;br /&gt;
	jr	c,WPA_wait2&lt;br /&gt;
	ld	a,e&lt;br /&gt;
	out	($05),a&lt;br /&gt;
	pop	af&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Playing a sample===&lt;br /&gt;
Example: play V ROM $000000-$00FFFF on CH1, centered, at maximum volume. The start and end addresses must be written before the channel is keyed on. The master volume is global, so it usually only needs to be set once, at driver initialization.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
;playback parameters&lt;br /&gt;
CH:		EQU 0			;channel 0-5 (0 = CH1)&lt;br /&gt;
MVOL:		EQU $3F			;master volume&lt;br /&gt;
CVOL:		EQU $C0+$1F		;left + right, channel volume $1F&lt;br /&gt;
START_ADDR:	EQU $000000		;first byte of the sample in V ROM&lt;br /&gt;
END_ADDR:	EQU $00FFFF		;last byte of the sample (inclusive)&lt;br /&gt;
&lt;br /&gt;
PlayADPCMA:&lt;br /&gt;
	ld	de,(PA_MVOL&amp;lt;&amp;lt;8)+MVOL&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ld	de,((PA_CVOL+CH)&amp;lt;&amp;lt;8)+CVOL&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ld	de,((PA_STARTL+CH)&amp;lt;&amp;lt;8)+((START_ADDR&amp;gt;&amp;gt;8)&amp;amp;$FF)&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ld	de,((PA_STARTH+CH)&amp;lt;&amp;lt;8)+((START_ADDR&amp;gt;&amp;gt;16)&amp;amp;$FF)&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ld	de,((PA_ENDL+CH)&amp;lt;&amp;lt;8)+((END_ADDR&amp;gt;&amp;gt;8)&amp;amp;$FF)&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ld	de,((PA_ENDH+CH)&amp;lt;&amp;lt;8)+((END_ADDR&amp;gt;&amp;gt;16)&amp;amp;$FF)&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ld	de,(PA_CTRL&amp;lt;&amp;lt;8)+(1&amp;lt;&amp;lt;CH)	;key on&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keying on a channel that is already playing restarts it from its start address. When the channel reaches its end address it stops on its own and sets its end flag; there is no looping.&lt;br /&gt;
&lt;br /&gt;
===Stopping a sample===&lt;br /&gt;
Writing PA_CTRL with bit 7 set stops (dumps) the channels selected in bits 0-5:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
StopADPCMA:&lt;br /&gt;
	ld	de,(PA_CTRL&amp;lt;&amp;lt;8)+$80+(1&amp;lt;&amp;lt;CH)	;dump CH&lt;br /&gt;
	rst	$18&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Writing $BF stops all six channels.&lt;br /&gt;
&lt;br /&gt;
===End flags===&lt;br /&gt;
The end flags of the ADPCM-A channels can be read in bits 0-5 of status 1 (port $06); bit 7 is the ADPCM-B end flag. A flag stays set until it is cleared through the flag control register $1C on port A. Writing 1 to a bit clears and masks that flag, and writing 0 unmasks it again so it can be set by the next sample end.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
;Z flag clear on return if CH has finished playing&lt;br /&gt;
CheckADPCMAEnd:&lt;br /&gt;
	in	a,($06)			;status 1&lt;br /&gt;
	and	1&amp;lt;&amp;lt;CH&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
;Clear the end flag of CH&lt;br /&gt;
ClearADPCMAEnd:&lt;br /&gt;
	ld	de,($1C&amp;lt;&amp;lt;8)+(1&amp;lt;&amp;lt;CH)	;clear and mask&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,($1C&amp;lt;&amp;lt;8)+$00		;unmask&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ADPCM-B==&lt;br /&gt;
The YM2610 has one ADPCM-B channel. It plays 4-bit ADPCM samples at a variable rate, from about 1.85 kHz to 55.5 kHz, and can loop. This makes it suited to music, longer ambience and voice. Like ADPCM-A, samples are addressed in 256-byte units with an inclusive end address. Depending on the cartridge board, ADPCM-B samples are read from the same V ROM as ADPCM-A or from a separate ROM.&lt;br /&gt;
&lt;br /&gt;
The ADPCM-B registers are on YM2610 &#039;&#039;&#039;port A&#039;&#039;&#039;: the Z80 writes the register number to port &#039;&#039;&#039;$04&#039;&#039;&#039; and the value to port &#039;&#039;&#039;$05&#039;&#039;&#039; (see WritePortA above).&lt;br /&gt;
&lt;br /&gt;
Definitions of [[YM2610_registers#ADPCM-B part|ADPCM-B registers]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
;ADPCM-B register defines (YM2610 port A: address $04, data $05)&lt;br /&gt;
PB_CTRL1:	EQU $10		;bit 7 = start, bit 4 = repeat, bit 0 = reset&lt;br /&gt;
PB_CTRL2:	EQU $11		;bit 7 = left, bit 6 = right&lt;br /&gt;
PB_STARTL:	EQU $12		;start address bits 8-15&lt;br /&gt;
PB_STARTH:	EQU $13		;start address bits 16-23&lt;br /&gt;
PB_ENDL:	EQU $14		;end address bits 8-15&lt;br /&gt;
PB_ENDH:	EQU $15		;end address bits 16-23&lt;br /&gt;
PB_DELTAL:	EQU $19		;Delta-N (playback rate) low byte&lt;br /&gt;
PB_DELTAH:	EQU $1A		;Delta-N high byte&lt;br /&gt;
PB_VOL:		EQU $1B		;volume, 0-$FF ($FF = loudest)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Playback rate===&lt;br /&gt;
The playback rate is set by the 16-bit Delta-N value:&lt;br /&gt;
&lt;br /&gt;
 rate = 55.5 kHz × Delta-N / 65536&lt;br /&gt;
 Delta-N = rate × 65536 / 55555&lt;br /&gt;
&lt;br /&gt;
For example, a sample recorded at 22050 Hz needs Delta-N = 26011 ($659B), and one at 11025 Hz needs 13006 ($32CE). Changing Delta-N while the sample plays changes its pitch, which can be used to play one sample at different notes.&lt;br /&gt;
&lt;br /&gt;
===Playing a sample===&lt;br /&gt;
Example: play V ROM $100000-$13FFFF on ADPCM-B at 22050 Hz, centred, at maximum volume. All parameters must be written before the start bit is set. The pan bits in PB_CTRL2 must be set, otherwise nothing is heard.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
;playback parameters&lt;br /&gt;
B_START:	EQU $100000		;first byte of the sample in V ROM&lt;br /&gt;
B_END:		EQU $13FFFF		;last byte of the sample (inclusive)&lt;br /&gt;
B_DELTA:	EQU $659B		;22050 Hz&lt;br /&gt;
B_VOL:		EQU $FF&lt;br /&gt;
B_PAN:		EQU $C0			;left + right&lt;br /&gt;
&lt;br /&gt;
PlayADPCMB:&lt;br /&gt;
	ld	de,(PB_CTRL1&amp;lt;&amp;lt;8)+$01	;reset, in case a sample is playing&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_CTRL1&amp;lt;&amp;lt;8)+$00&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_CTRL2&amp;lt;&amp;lt;8)+B_PAN&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_STARTL&amp;lt;&amp;lt;8)+((B_START&amp;gt;&amp;gt;8)&amp;amp;$FF)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_STARTH&amp;lt;&amp;lt;8)+((B_START&amp;gt;&amp;gt;16)&amp;amp;$FF)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_ENDL&amp;lt;&amp;lt;8)+((B_END&amp;gt;&amp;gt;8)&amp;amp;$FF)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_ENDH&amp;lt;&amp;lt;8)+((B_END&amp;gt;&amp;gt;16)&amp;amp;$FF)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_DELTAL&amp;lt;&amp;lt;8)+(B_DELTA&amp;amp;$FF)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_DELTAH&amp;lt;&amp;lt;8)+(B_DELTA&amp;gt;&amp;gt;8)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_VOL&amp;lt;&amp;lt;8)+B_VOL&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_CTRL1&amp;lt;&amp;lt;8)+$80	;start ($90 = start with repeat)&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the repeat bit set ($90), the sample loops from its end address back to its start address until it is stopped. Only the whole start-to-end range can loop; there is no separate loop point.&lt;br /&gt;
&lt;br /&gt;
===Stopping a sample===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
StopADPCMB:&lt;br /&gt;
	ld	de,(PB_CTRL1&amp;lt;&amp;lt;8)+$01	;reset&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,(PB_CTRL1&amp;lt;&amp;lt;8)+$00&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===End flag===&lt;br /&gt;
The ADPCM-B end flag is bit 7 of status 1 (port $06), and it is cleared through bit 7 of the flag control register $1C on port A, the same way as the ADPCM-A flags:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;z80&amp;quot;&amp;gt;&lt;br /&gt;
;Z flag clear on return if ADPCM-B has finished playing&lt;br /&gt;
CheckADPCMBEnd:&lt;br /&gt;
	in	a,($06)			;status 1&lt;br /&gt;
	and	$80&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
ClearADPCMBEnd:&lt;br /&gt;
	ld	de,($1C&amp;lt;&amp;lt;8)+$80		;clear and mask&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ld	de,($1C&amp;lt;&amp;lt;8)+$00		;unmask&lt;br /&gt;
	call	WritePortA&lt;br /&gt;
	ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ADPCM-A demo==&lt;br /&gt;
&lt;br /&gt;
An interactive demo with source files can be found [http://smkdan.eludevisibility.org/neo/adpcma_demo2.zip here].&lt;br /&gt;
&lt;br /&gt;
[[Category:Code]]&lt;br /&gt;
[[Category:Sound Code]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Making_scrollable_backgrounds&amp;diff=9353</id>
		<title>Making scrollable backgrounds</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Making_scrollable_backgrounds&amp;diff=9353"/>
		<updated>2026-10-04T01:17:50Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Unslop, note about possible methods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrolling backgrounds are formed by a set of [[sprites]] positioned directly next to each other. A full-size sprite is only 16 pixels wide, so 20 are needed to fill the [[frame_size|active display]] horizontally, with a 21st one used to fill the gap that would be present on an edge when scrolling by less than 16 pixels at a time. The [[sticky bit]] can be used to make this simpler and avoid the overhead of updating the position of so many sprites.&lt;br /&gt;
&lt;br /&gt;
It is possible to take advantage of the 512 pixel wrapping property of sprite positions to set up a layer made of 32 sprites, and update the tiles of individual sprites just before they appear on screen. However all 32 sprites would count in the sprites-per-line limit of 96, which is very wasteful.&lt;br /&gt;
&lt;br /&gt;
A better method is to &amp;quot;rotate&amp;quot; a set of 21 sprites and dynamically chaining and unchaining them.&lt;br /&gt;
&lt;br /&gt;
==Demos==&lt;br /&gt;
Interactive demos with source can be found [http://smkdan.eludevisibility.org/neo/scroll_02.zip here].&lt;br /&gt;
&lt;br /&gt;
(todo: clean it up, make scroll3, finish documenting it here)&lt;br /&gt;
&lt;br /&gt;
[[Category:Code]]&lt;br /&gt;
[[Category:Graphics Code]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Making_scrollable_backgrounds&amp;diff=9352</id>
		<title>Making scrollable backgrounds</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Making_scrollable_backgrounds&amp;diff=9352"/>
		<updated>2026-10-04T01:01:03Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Reverted edits by Eaglesoftware777 (talk) to last revision by Freem&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrolling backgrounds are formed using a set of [[sprites]] positioned directly next to each other. A sprite is only 16 pixels wide, so many are needed to fill the screen horizontally. The [[Sticky bit]] is often used to make this simpler. A set of 21 chained sprites can be used to make a single full-screen scrolling background layer.&lt;br /&gt;
&lt;br /&gt;
==Updating VRAM==&lt;br /&gt;
(todo)&lt;br /&gt;
&lt;br /&gt;
==Demos==&lt;br /&gt;
Interactive demos with source can be found [http://smkdan.eludevisibility.org/neo/scroll_02.zip here].&lt;br /&gt;
&lt;br /&gt;
(todo: clean it up, make scroll3, finish documenting it here)&lt;br /&gt;
&lt;br /&gt;
[[Category:Code]]&lt;br /&gt;
[[Category:Graphics Code]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Development_tools&amp;diff=9347</id>
		<title>Development tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Development_tools&amp;diff=9347"/>
		<updated>2026-09-29T02:49:42Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Reverted edits by Eaglesoftware777 (talk) to last revision by Defalt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==68000==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Assemblers&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [http://john.ccac.rwth-aachen.de:8000/as/ AS] || Alfred Arnold, et al || Multi-target assembler || (multiple) || Provided as source code and binaries (Windows, DOS) || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://sun.hasenbraten.de/vasm/ vasm] || Volker Barthelmann, et al || Multi-target assembler || (multiple) || Provided as source code&amp;lt;br/&amp;gt;&amp;quot;official&amp;quot; binaries are for older versions || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| JAS || Charles Doty, Paul Lee, Michael Hope || Modified version of AS || Windows || (base AS version unknown; binary is circa 1999/12/30) || [[File:JAS.zip]]&lt;br /&gt;
|-&lt;br /&gt;
| Maccer || Michael Hope || Pre-processor for AS-series assemblers || (multiple) || Provided as source code and Windows binary || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://gendev.spritesmind.net/page-macX.html MaccerX] || Kaneda || Updated version of Maccer || (multiple) || Provided as source code and Windows binary; added support for XGCC (gcc) and comments || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| SNASM68K || S.N. Systems || 680x0 assembler || Windows || &amp;amp;nbsp; || [http://segaretro.org/SNASM68K SNASM68K at Sega Retro]&amp;lt;br/&amp;gt;&amp;lt;small&amp;gt;(Modified version by Nemesis)&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Compilers&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| NeoDev kit || Fabrice Martinez, Jeff Kurtz, et al || GCC compiler and library || (multiple) || &amp;amp;nbsp; || [[File:NeoDev001.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Disassemblers&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| IRA || Tim Ruehsen, ported by Antirad || Intelligent ReAssembler for M680x0 || (multiple) || PC port of an Amiga app; provided as source (&amp;quot;PC&amp;quot;) and binary (Windows) || [[File:Ira.zip]]&lt;br /&gt;
|-&lt;br /&gt;
| unidasm || MAMEdev || Universal Disassembler || (multiple) || Included with the Windows MAME distribution; can be built from source || &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Z80==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Assemblers&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [http://john.ccac.rwth-aachen.de:8000/as/ AS] || Alfred Arnold, et al || Multi-target assembler || (multiple) || Provided as source code and binaries (Windows, DOS) || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://sun.hasenbraten.de/vasm/ vasm] || Volker Barthelmann, et al || Multi-target assembler || (multiple) || Provided as source code&amp;lt;br/&amp;gt;&amp;quot;official&amp;quot; binaries are for older versions || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/vhelin/wla-dx WLA DX] || Ville Helin, et al || Multi-target assembler || (multiple) || Provided as source code || [http://www.niksula.cs.hut.fi/~tursas/wla/wladx_binaries_20040822.zip WLA-DX 9.2 Win32 binaries]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.nongnu.org/z80asm/ z80asm] || Bas Wijnen (and others?) || Z80 assembler || (multiple) || Provided as source code || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Compilers&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| ZCC || Ken Yap, et al || Z80 development package with C compiler || (multiple) || Provided as source code and binaries (Windows); circa January 1996 || [[File:zcc096.zip]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://sdcc.sourceforge.net/ SDCC] || Sandeep Dutta, et al || &amp;quot;Small Device C Compiler&amp;quot; || (multiple) || Provided as source code and binaries (various platforms) || [http://sdcc.sourceforge.net/snap.php Snapshot Builds]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.z88dk.org/forum/ z88dk] || (many people) || z80 C cross compiler with assembler/linker || (multiple) || Provided as source code and binaries (Windows, Mac) || [http://nightly.z88dk.org/?C=M;O=D Nightly Builds]&amp;lt;br/&amp;gt;&amp;lt;small&amp;gt;(Hit escape as soon as you see the links for &amp;quot;latest&amp;quot;)&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Disassemblers&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| DASM || Charles Doty || Z80 disassembler || DOS || Source code and binary included. || [[File:dasmz80.zip]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.inkland.org.uk/dz80/ DZ80] || Inkland || Z80 disassembler || (multiple) || Provided as source code (command line version) and binaries (DOS command line, Windows GUI) || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| unidasm || MAMEdev || Universal Disassembler || (multiple) || Included with the Windows MAME distribution; can be built from source || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| Z80DASM || ? || Z80 disassembler || Windows || Binary || http://trd.speccy.cz/sbor/Z80DASM.ZIP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Source Editors==&lt;br /&gt;
There are a lot of source code editors out there... Use whatever you&#039;re comfortable with (hopefully one with 68000 and Z80 syntax highlighting).&lt;br /&gt;
&lt;br /&gt;
==Sound and Music==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Music Drivers and Tools&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [[MVSTracker]] || Ivan Mackintosh || FM tracker || Windows || [http://www.archaic.fr/interviews/interview-jeff-kurtz-repond-a-nos-questions/3/ Z80 driver does not work on hardware] || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://gendev.spritesmind.net/page-mvst.html MVSTracker Suite] || Pascal Bosquet, Kaneda || Modified version of MVSTracker || Windows || supports Mega Drive as well. Neo-Geo driver still doesn&#039;t work on hardware. || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Sound Editors&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.goldwave.com/release.php GoldWave] || GoldWave Inc. || commercial sound editor || Windows || &amp;amp;nbsp; || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.sonycreativesoftware.com/soundforgesoftware Sound Forge] || Sony || commercial sound editor || Windows, Mac || &amp;amp;nbsp; || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://audacity.sourceforge.net/ Audacity] || Audacity developers || open-source sound editor || (multiple) || &amp;amp;nbsp; || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Sound Encoders&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/freem/adpcma ADPCM-A encoder] || freem || Command-line ADPCM-A encoder || (multiple) || Provided as source code and binary (Windows) || &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.smspower.org/forums/11965-VGMLoggingWithOtherEmulators?start=200#66597 ADPCM-B encoder] || ValleyBell and Fred/FRONT || Command-line ADPCM-B encoder || (multiple) || Provided as source code and binary (Windows) || [[File:ADPCM_Encode.zip]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Neo Sound Builder]] || Jeff Kurtz/Neobitz || GUI V ROM/PCM file creator || Windows || ADPCM-A only || [https://www.facebook.com/Neobitz/photos/a.462349983789893.110879.221161891242038/1093044660720419/?type=3 announcement post]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Graphics Viewers and Editors&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [[YY-CHR]] || YY || multi-format tile editor || Windows || FIX files require plugin (YY-CHR.NET only, see below); Sprites need conversion (see tools below) || [http://www.romhacking.net/utils/119/ YY-CHR 0.99]&lt;br /&gt;
|-&lt;br /&gt;
| NGFX || blastar || Fix, Sprite, TITLE_*.SYS viewer/editor; LOGO_*.SYS viewer || Windows || WIP; not yet released. || [https://www.romhacking.net/download/utilities/1175/]&lt;br /&gt;
|-&lt;br /&gt;
| neospriteviewer || Matt Greer || S and C ROM tile viewer || Web || &amp;amp;nbsp; || [https://neospriteviewer.mattgreer.dev site]&lt;br /&gt;
|-&lt;br /&gt;
!colspan=6 style=&amp;quot;background-color:#ccc&amp;quot;|Graphics Converters and Tools&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| [[DATLib]] graphics tools || HPMAN || Tools used to process and display graphics on Neo-Geo. || Windows || Animator, BuildChar, CharSplit, Framer || [https://www.dropbox.com/s/wqviye5xxzktr6y/DATlib_0.3.rar?dl=0 download]&lt;br /&gt;
|-&lt;br /&gt;
| [[NGGTool|NeoGeo Graphics ToolSuite]] || evo || Tool to convert between SNES/SFC and Neo-Geo graphics. || Windows  || Fix conversion is botched (see page for details) || [http://furrtek.free.fr/noclass/neogeo/nggts.zip NGGTS]&lt;br /&gt;
|-&lt;br /&gt;
| Sprite graphics converter || IQ || Converts MVS graphics (.c*) to CD graphics (.SPR). || Windows || &amp;amp;nbsp; || [http://furrtek.free.fr/noclass/neogeo/gfxmvstocd.zip MVS to CD sprite converter]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/freem/NeoSpriteConv Neo-Geo Sprite Converter] || freem || Convert 4BPP SMS/GG/WSC graphics to Neo-Geo format. || (multiple) || Provided as source code and binary (Windows)&amp;lt;br/&amp;gt;&amp;lt;small&amp;gt;Further work required for converting to Cart (split files by words (2 bytes)) and CD (byteswap file)-usable files.&amp;lt;/small&amp;gt; || [http://ajworld.net/neogeodev/utils/neosprconv.zip main download]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/Kannagi/Neoconvert Neoconvert] || Kannagi || Convert PNG to rom Cx with map, palette and HiColor. || Windows,Linux ||  || [https://github.com/Kannagi/Neoconvert download]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/Kannagi/Neoextract Neoextract] || Kannagi || extract rom Cx or s1 to bmp. || Windows,Linux ||  || [https://github.com/Kannagi/Neoextract download]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/city41/sromcrom sromcrom] || Matt Greer || Generate S and C ROMs from images, generates corresponding source code as well || cross platform ||  || [https://github.com/city41/sromcrom download]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [https://neo-source.com/index.php?topic=4180.msg37936 buildobj] || iq_132 || Compress / Decompress NeoGeo CD OBJ files || Windows || || [https://neo-source.com/index.php?topic=4180.msg37936 buildobj]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Other Tools==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Name !! Author(s) !! Description !! Platform(s) !! Notes !! Download&lt;br /&gt;
|-&lt;br /&gt;
| MemCardTool || Fabrice Martinez || Memory card manager || Windows || &amp;amp;nbsp; || [[File:memcardtool.zip]]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/freem/romwak ROMwak] || Jeff Kurtz, ported by freem || Binary image manipulation tool || (multiple) || Provided as source code and binary (Windows) || &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Code]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=User_talk:Eaglesoftware777&amp;diff=9344</id>
		<title>User talk:Eaglesoftware777</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=User_talk:Eaglesoftware777&amp;diff=9344"/>
		<updated>2026-09-28T15:36:35Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;NeoGeo Development Wiki&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Furrtek|Furrtek]] ([[User talk:Furrtek|talk]]) 11:42, 23 September 2026 (CEST)&lt;br /&gt;
&lt;br /&gt;
Hello. I need to know if your edits are AI-generated, and/or if you allow AI agents to make edits on your behalf through your account.&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=USER_subroutine&amp;diff=9337</id>
		<title>USER subroutine</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=USER_subroutine&amp;diff=9337"/>
		<updated>2026-09-27T00:58:54Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Command 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The USER subroutine (not called, always jumped to by the [[system ROM]]) is required [[68k]] code which needs to perform actions according to the command value set in {{BR|BIOS_USER_REQUEST}}.&lt;br /&gt;
&lt;br /&gt;
At the end of the routine, a jump to [[SYSTEM_RETURN|BIOSF_SYSTEM_RETURN]] is needed to give back control to the BIOS.&lt;br /&gt;
&lt;br /&gt;
=Handling code=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
JT_User:&lt;br /&gt;
    dc.l   StartupInit&lt;br /&gt;
    dc.l   EyeCatcher&lt;br /&gt;
    dc.l   Game&lt;br /&gt;
    dc.l   Title&lt;br /&gt;
&lt;br /&gt;
User:&lt;br /&gt;
    move.b  d0,REG_DIPSW&lt;br /&gt;
    clr.l   d0&lt;br /&gt;
    move.b  BIOS_USER_REQUEST,d0&lt;br /&gt;
    lsl.b   #2,d0&lt;br /&gt;
    lea     JT_User,a0&lt;br /&gt;
    movea.l (a0,d0),a0&lt;br /&gt;
    jsr     (a0)&lt;br /&gt;
    jmp     BIOSF_SYSTEM_RETURN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=USER_REQUEST values=&lt;br /&gt;
&lt;br /&gt;
==Command 0==&lt;br /&gt;
Initialize the backup RAM data (default highscores, rankings, etc).&lt;br /&gt;
&lt;br /&gt;
On MVS, requested only once when the game is started for the first time on the system (the [[system ROM]] doesn&#039;t find the game&#039;s NGH number in the [[backup RAM]]).&lt;br /&gt;
On AES, always requested on startup.&lt;br /&gt;
&lt;br /&gt;
Set {{BR|BIOS_USER_MODE}} to 0 during operations, and don&#039;t forget to kick the watchdog as interrupts are disabled.&lt;br /&gt;
&lt;br /&gt;
[[Viewpoint]], which has its backup RAM save pointer set to $100000 ([[68k program header]] $10E) and game save size set to $0200 (header $112) does this:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
	move.b	#$00,BIOS_USER_MODE&lt;br /&gt;
	lea	    $100000,a0	; Start of game save block&lt;br /&gt;
	move	#$001F,d1	; 32*4 longword writes = 512 bytes&lt;br /&gt;
	moveq	#0,d0&lt;br /&gt;
.cl:&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	dbf	    d1,.cl&lt;br /&gt;
	move.b	d0,REG_WATCHDOG&lt;br /&gt;
...&lt;br /&gt;
    jmp     BIOSF_SYSTEM_RETURN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit by jumping to SYSTEM_RETURN.&lt;br /&gt;
&lt;br /&gt;
==Command 1==&lt;br /&gt;
Show the game&#039;s own boot logo animation (when [[68k program header|$114]] = 1).&lt;br /&gt;
&lt;br /&gt;
This command by default is only called on AES and not on the [[MVS]]. It is called once only at system start (before attract mode) and not again.&lt;br /&gt;
&lt;br /&gt;
Later games by SNK trick the MVS bios into calling this subroutine. They do this by first moving and then executing code from RAM during their command 2 routine. This code determines the games SLOT location and then stores this location to address 0xD00058 (See routine from 0xA910E in KOF99).&lt;br /&gt;
&lt;br /&gt;
A side affect is the new eye catcher does not display right away, at least one attract mode sequence must be completed first. SNK appear to have done this with the aim of updating the original spinning logo with their new version and thus this method is not advised if you want an eye catcher to show on MVS hardware. Instead it is advised to call your own the eye catcher routine from within command 2 (attract mode) only. See Aero Fighters 2 as an example, it has both the Neo Geo eye catcher and a VideoSystem eye catcher.&lt;br /&gt;
&lt;br /&gt;
==Command 2==&lt;br /&gt;
Show the game&#039;s demo, this means anything related to attract mode. (the recommended duration is ?). Jump to SYSTEM_RETURN if the game wasn&#039;t started, or after a game over.&lt;br /&gt;
&lt;br /&gt;
On AES systems the system ROM only comes this far and never proceeds further.&lt;br /&gt;
&lt;br /&gt;
==Command 3==&lt;br /&gt;
Show the game&#039;s title screen. This is called when a coin is inserted on [[MVS]] only and is never called on AES systems. {{BR|BIOS_COMPULSION_TIMER}} is used as a count-down timer for auto-start.&lt;br /&gt;
&lt;br /&gt;
Some games write 0x01 to 0x10FEC5 in this routine. It stops the bios calling command 3 twice after game over if credits are already in the system (attract mode skipped). When 0x00 the bios will initiate another command 3 a few frames after the first. This causes the title page to draw twice. This could be a bios bug which SNK fixed by adding this variable in a later bios revision (needs confirming).&lt;br /&gt;
&lt;br /&gt;
To see an example compare Art or Fighting to Art of Fighting 2 after game over.&lt;br /&gt;
&lt;br /&gt;
[[Category:Code]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=USER_subroutine&amp;diff=9336</id>
		<title>USER subroutine</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=USER_subroutine&amp;diff=9336"/>
		<updated>2026-09-27T00:53:40Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Command 0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The USER subroutine (not called, always jumped to by the [[system ROM]]) is required [[68k]] code which needs to perform actions according to the command value set in {{BR|BIOS_USER_REQUEST}}.&lt;br /&gt;
&lt;br /&gt;
At the end of the routine, a jump to [[SYSTEM_RETURN|BIOSF_SYSTEM_RETURN]] is needed to give back control to the BIOS.&lt;br /&gt;
&lt;br /&gt;
=Handling code=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
JT_User:&lt;br /&gt;
    dc.l   StartupInit&lt;br /&gt;
    dc.l   EyeCatcher&lt;br /&gt;
    dc.l   Game&lt;br /&gt;
    dc.l   Title&lt;br /&gt;
&lt;br /&gt;
User:&lt;br /&gt;
    move.b  d0,REG_DIPSW&lt;br /&gt;
    clr.l   d0&lt;br /&gt;
    move.b  BIOS_USER_REQUEST,d0&lt;br /&gt;
    lsl.b   #2,d0&lt;br /&gt;
    lea     JT_User,a0&lt;br /&gt;
    movea.l (a0,d0),a0&lt;br /&gt;
    jsr     (a0)&lt;br /&gt;
    jmp     BIOSF_SYSTEM_RETURN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=USER_REQUEST values=&lt;br /&gt;
&lt;br /&gt;
==Command 0==&lt;br /&gt;
Initialize the backup RAM data (default highscores, rankings, etc).&lt;br /&gt;
&lt;br /&gt;
On MVS, requested only once when the game is started for the first time on the system (the [[system ROM]] doesn&#039;t find the game&#039;s NGH number in the [[backup RAM]]).&lt;br /&gt;
On AES, always requested on startup.&lt;br /&gt;
&lt;br /&gt;
Set {{BR|BIOS_USER_MODE}} to 0 during operations, and don&#039;t forget to kick the watchdog as interrupts are disabled.&lt;br /&gt;
&lt;br /&gt;
[[Viewpoint]], which has its backup RAM save pointer set to $100000 ([[68k program header]] $10E) and game save size set to $0200 (header $112) does this:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
	move.b	#$00,BIOS_USER_MODE&lt;br /&gt;
	lea	    $100000,a0	; Start of game save block&lt;br /&gt;
	move	#$001F,d1	; 32*4 longword writes = 512 bytes&lt;br /&gt;
	moveq	#0,d0&lt;br /&gt;
.cl:&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	move.l	d0,(a0)+&lt;br /&gt;
	dbf	    d1,.cl&lt;br /&gt;
	move.b	d0,REG_WATCHDOG&lt;br /&gt;
...&lt;br /&gt;
    jmp     BIOSF_SYSTEM_RETURN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit by jumping to SYSTEM_RETURN.&lt;br /&gt;
&lt;br /&gt;
==Command 1==&lt;br /&gt;
Show the game&#039;s own boot logo animation (when [[68k program header|$114]] = 1).&lt;br /&gt;
&lt;br /&gt;
This command by default is only called on AES and not on the [[MVS]]. It is called once only at system start (before attract mode) and not again.&lt;br /&gt;
&lt;br /&gt;
Later games by SNK trick the MVS bios into calling this subroutine. They do this by first moving and then executing code from RAM during their command 2 routine. This code determines the games SLOT location and then stores this location to address 0xD00058 (See routine from 0xA910E in KOF99).&lt;br /&gt;
&lt;br /&gt;
A side affect is the new eye catcher does not display right away, at least one attract mode sequence must be completed first. SNK appear to have done this with the aim of updating the original spinning logo with their new version and thus this method is not advised if you want an eye catcher to show on MVS hardware. Instead it is advised to call your own the eye catcher routine from within command 2 (attract mode) only. See Aero Fighters 2 as an example, it has both the Neo Geo eye catcher and a VideoSystem eye catcher.&lt;br /&gt;
&lt;br /&gt;
==Command 2==&lt;br /&gt;
Show the game&#039;s demo, this means anything related to attract mode. (the recommended duration is ?).&lt;br /&gt;
&lt;br /&gt;
On AES systems the bios only comes this far and never calls command 3, if title page is required it must be done here.&lt;br /&gt;
&lt;br /&gt;
==Command 3==&lt;br /&gt;
Show the game&#039;s title screen. This is called when a coin is inserted on [[MVS]] only and is never called on AES systems. {{BR|BIOS_COMPULSION_TIMER}} is used as a count-down timer for auto-start.&lt;br /&gt;
&lt;br /&gt;
Some games write 0x01 to 0x10FEC5 in this routine. It stops the bios calling command 3 twice after game over if credits are already in the system (attract mode skipped). When 0x00 the bios will initiate another command 3 a few frames after the first. This causes the title page to draw twice. This could be a bios bug which SNK fixed by adding this variable in a later bios revision (needs confirming).&lt;br /&gt;
&lt;br /&gt;
To see an example compare Art or Fighting to Art of Fighting 2 after game over.&lt;br /&gt;
&lt;br /&gt;
[[Category:Code]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=System_self-test&amp;diff=9335</id>
		<title>System self-test</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=System_self-test&amp;diff=9335"/>
		<updated>2026-09-26T23:57:27Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory tests are done by writing and reading back 55, AA and incrementing values.&lt;br /&gt;
&lt;br /&gt;
Some information by Channelmaniac.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Error&#039;&#039;&#039;&lt;br /&gt;
|No game&lt;br /&gt;
|[[WORK RAM ERROR]]&lt;br /&gt;
|[[COLOR RAM ERROR]]&lt;br /&gt;
|[[VIDEO RAM ERROR]]&lt;br /&gt;
|[[SYSTEM ROM ERROR]]&lt;br /&gt;
|[[MEMORY CARD ERROR]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;AES&#039;&#039;&#039;&lt;br /&gt;
|[[File:aes_sc_blue.png]]&lt;br /&gt;
|[[File:aes_sc_red.png]]&lt;br /&gt;
|[[File:aes_sc_green.png]]&lt;br /&gt;
|[[File:aes_sc_yellow.png]]&lt;br /&gt;
|[[File:aes_sc_pink.png]]&lt;br /&gt;
|[[File:aes_sc_cyan.png]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;MVS&#039;&#039;&#039;&lt;br /&gt;
|[[File:crosshatch.png|160px]] [[Crosshatch]]&lt;br /&gt;
|[[File:error_wram.png|160px]]&lt;br /&gt;
|[[File:error_color0.png|160px]]&lt;br /&gt;
|[[File:error_vram.png|160px]]&lt;br /&gt;
|[[File:error_sysrom.png|160px]]&lt;br /&gt;
|Screenshot needed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Meaning&#039;&#039;&#039;&lt;br /&gt;
|All tests passed (AES does not test the {{Chipname|Z80}}). Cartridge not detected.&lt;br /&gt;
|[[68k user RAM]] R/W error&lt;br /&gt;
|[[Palette RAM]] R/W error&lt;br /&gt;
|[[VRAM]] R/W error&lt;br /&gt;
|[[system ROM error|System ROM checksum mismatch]]&lt;br /&gt;
|[[Memory card]] R/W error (only tested if card present and blank)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=AES=&lt;br /&gt;
The AES only performs checks when no game is detected. They&#039;re done in the following order:&lt;br /&gt;
# [[68k user RAM]]&lt;br /&gt;
# [[Palette RAM]] bank 0&lt;br /&gt;
# Palette RAM bank 1&lt;br /&gt;
# Lower [[VRAM]]&lt;br /&gt;
# Upper VRAM&lt;br /&gt;
# [[System ROM]] checksum&lt;br /&gt;
&lt;br /&gt;
==MVS==&lt;br /&gt;
&lt;br /&gt;
Additionnal checks are performed on MVS systems. The SP-S2 [[system ROM]] does them in the following order:&lt;br /&gt;
&lt;br /&gt;
# [[68k user RAM]]&lt;br /&gt;
# Backup RAM&lt;br /&gt;
# [[Palette RAM]] bank 0&lt;br /&gt;
# Palette RAM bank 1&lt;br /&gt;
# Lower [[VRAM]]&lt;br /&gt;
# Upper VRAM&lt;br /&gt;
# [[RTC]]&lt;br /&gt;
# [[System ROM]] checksum&lt;br /&gt;
# [[Z80]]&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Error&#039;&#039;&#039;&lt;br /&gt;
|[[BACKUP RAM ERROR]]&lt;br /&gt;
|[[Calendar freeze]]&lt;br /&gt;
|[[CALENDAR ERROR]]&lt;br /&gt;
|[[Z80 ERROR]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Display&#039;&#039;&#039;&lt;br /&gt;
|[[File:error_bram.png|160px]]&lt;br /&gt;
|[[File:calendar_freeze.png|160px]]&lt;br /&gt;
|[[File:error_calendar.png|160px]]&lt;br /&gt;
|[[File:error_z80.png|160px]]&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Meaning&#039;&#039;&#039;&lt;br /&gt;
|[[Backup RAM]] R/W error&lt;br /&gt;
|[[RTC]] isn&#039;t giving Time Pulse&lt;br /&gt;
|[[RTC]] ran to slow or too fast&lt;br /&gt;
|[[Z80]] didn&#039;t reply to command&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When a MVS board is powered up without cartridges inserted, the border color around the edges of the crosshatch screen indicates the system ROM region:&lt;br /&gt;
&lt;br /&gt;
* Red: Japanese, SPJ2&lt;br /&gt;
* Cyan: USA, SPU2&lt;br /&gt;
* Blue: Korean/Spanish, SPS2&lt;br /&gt;
* Yellow: European&lt;br /&gt;
* Green: 6 slot (ROM name ?)&lt;br /&gt;
&lt;br /&gt;
=UniBios tests=&lt;br /&gt;
&lt;br /&gt;
The [[Universe BIOS]] does not use the above color codes to indicate errors.&lt;br /&gt;
&lt;br /&gt;
[[Category:Base system]]&lt;br /&gt;
[[Category:Repairs]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-PCM2&amp;diff=9334</id>
		<title>NEO-PCM2</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-PCM2&amp;diff=9334"/>
		<updated>2026-09-26T17:50:43Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* SNK version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=brd_pcm2.jpg&lt;br /&gt;
|pkg=QFP120&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1999, 2002&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on=[[Cartridges]], [[ROM-Only boards]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Second version of {{Chipname|PCM}} which confusingly exists in two forms under the same name. [[V ROM]] demultiplexer, decryption and [[P ROM]] banking chip.&lt;br /&gt;
&lt;br /&gt;
The demultiplexing logic is exactly the same as the one found in PCM.&lt;br /&gt;
&lt;br /&gt;
=Jumpers=&lt;br /&gt;
&lt;br /&gt;
The ROM and mapping configuration for a given game is set by external jumpers. There are 3 for the V ROMs (JV1 to JV3) and 4 for the P ROMs (J1 to J4).&lt;br /&gt;
These do not appear to affect security functions.&lt;br /&gt;
&lt;br /&gt;
V ROM mapping uses address bits 20 to 23. There are 4 chip select outputs.&lt;br /&gt;
&lt;br /&gt;
=Security=&lt;br /&gt;
&lt;br /&gt;
The security function of the 1999 SNK branded version only performs address descrambling on V ROMs. The Playmore version which came out in 2002 adds a data decryption layer on top, which means both are not interchangeable.&lt;br /&gt;
&lt;br /&gt;
The decryption algorithm used by emulators currently isn&#039;t perfectly exact, which explains the presence of a few corrupt bytes in decrypted romsets causing minor audio glitches (Samurai Shodown V &amp;quot;Basara&amp;quot; sample).&lt;br /&gt;
&lt;br /&gt;
==SNK version==&lt;br /&gt;
&lt;br /&gt;
P ROM bank selection is done by writing the 3 lower bits of the [[68k memory map|port zone]] with A19 high to not affect the V ROM setting. ie. $280000 (word) or $280001 (even) with mirrors up to $2FFFFF.&lt;br /&gt;
Metal Slug 4 for example writes words to $2FFFF0. Todo: how does the bank number map to an address.&lt;br /&gt;
&lt;br /&gt;
V ROM address scrambling is only done on the 4 lower bits by selectively inverting them depending on the configuration set by the [[68k]] CPU. Bits 4 to 23 go straight through.&lt;br /&gt;
&lt;br /&gt;
This is set by first writing 7 to the [[68k memory map|port zone]], the same way P bank 7 would be selected. And then writing the 3 bit configuration value with A19 low.&lt;br /&gt;
Metal Slug 4 for example writes words on startup to the bogus addresses $200000, $208000 and $220000.&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! V configuration !! VA3 !! VA2 !! VA1 !! VA0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || invert || invert || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 1 || invert || invert || normal || invert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || normal || invert || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 3 || invert || invert || normal || invert&lt;br /&gt;
|-&lt;br /&gt;
| 4 || invert || invert || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || invert || invert || normal || normal&lt;br /&gt;
|-&lt;br /&gt;
| 6 || invert || normal || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 7 || invert || invert || normal || invert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Playmore version==&lt;br /&gt;
&lt;br /&gt;
Todo.&lt;br /&gt;
&lt;br /&gt;
=Games=&lt;br /&gt;
&lt;br /&gt;
Used by:&lt;br /&gt;
* [[Matrimelee]] (Playmore)&lt;br /&gt;
* [[Metal Slug 4]] (SNK)&lt;br /&gt;
* [[Metal Slug 5]] (Playmore)&lt;br /&gt;
* [[Pochi and Nyaa]] (SNK)&lt;br /&gt;
* [[Rage of the Dragons]] (SNK)&lt;br /&gt;
* [[Samurai Shodown V]] (Playmore)&lt;br /&gt;
* [[Samurai Shodown V Special]] (Playmore)&lt;br /&gt;
* [[SNK vs. Capcom - SVC Chaos]] (Playmore)&lt;br /&gt;
* [[The King of Fighters 2001]] (SNK)&lt;br /&gt;
* [[The King of Fighters 2002]] (Playmore)&lt;br /&gt;
* [[The King of Fighters 2003]] (Playmore)&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Neo-pcm2_pinout.png|800px]]&lt;br /&gt;
&lt;br /&gt;
OpenOffice Draw file: [[File:neo-pcm2.odg]]&lt;br /&gt;
&lt;br /&gt;
Does the Playmore version have the same pinout ?&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=User_talk:RetroArcadeTech&amp;diff=9332</id>
		<title>User talk:RetroArcadeTech</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=User_talk:RetroArcadeTech&amp;diff=9332"/>
		<updated>2026-09-23T09:42:42Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;NeoGeo Development Wiki&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Furrtek|Furrtek]] ([[User talk:Furrtek|talk]]) 11:42, 23 September 2026 (CEST)&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=User_talk:NeoGeoChronicler&amp;diff=9331</id>
		<title>User talk:NeoGeoChronicler</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=User_talk:NeoGeoChronicler&amp;diff=9331"/>
		<updated>2026-09-23T09:42:38Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;NeoGeo Development Wiki&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Furrtek|Furrtek]] ([[User talk:Furrtek|talk]]) 11:42, 23 September 2026 (CEST)&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=User_talk:Eaglesoftware777&amp;diff=9330</id>
		<title>User talk:Eaglesoftware777</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=User_talk:Eaglesoftware777&amp;diff=9330"/>
		<updated>2026-09-23T09:42:10Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;NeoGeo Development Wiki&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Furrtek|Furrtek]] ([[User talk:Furrtek|talk]]) 11:42, 23 September 2026 (CEST)&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=User_talk:SYNgularity1&amp;diff=9329</id>
		<title>User talk:SYNgularity1</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=User_talk:SYNgularity1&amp;diff=9329"/>
		<updated>2026-09-23T09:40:57Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;NeoGeo Development Wiki&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Furrtek|Furrtek]] ([[User talk:Furrtek|talk]]) 11:40, 23 September 2026 (CEST)&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9328</id>
		<title>Memory card</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9328"/>
		<updated>2026-09-14T11:34:33Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* FAT 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:snkmemcard.jpg|thumb|SRAM memory card, showing the SRAM chip and voltage detection circuit. Picture by [[User:HPMAN|HPMAN]]]]&lt;br /&gt;
&lt;br /&gt;
[[File:NEO-IC8_front.jpg|thumb|NEO-IC8, original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
[[File:NEO-IC8_back.jpg|thumb|NEO-IC8, back of original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo home console and some [[MVS hardware|MVS]] cabs can use [[JEIDA V3]] memory cards to store game saves and/or high scores, allowing players to save their progress and continue on any system running the same game.&lt;br /&gt;
&lt;br /&gt;
Even if the memory card [[68k memory map|address space]] can be freely used, games should only perform memory card operations through the [[CARD]] system ROM call to avoid data corruption.&lt;br /&gt;
&lt;br /&gt;
=Supported card types=&lt;br /&gt;
&lt;br /&gt;
The SP-S2 [[system ROM]] (and probably all the others) can handle 8 memory card sizes from 2KiB up to 16KiB, in 2KiB steps:&lt;br /&gt;
*2KiB&lt;br /&gt;
*4KiB&lt;br /&gt;
*6KiB&lt;br /&gt;
*8KiB&lt;br /&gt;
*10KiB&lt;br /&gt;
*14KiB&lt;br /&gt;
*16KiB&lt;br /&gt;
&lt;br /&gt;
And 4 different card types:&lt;br /&gt;
*8 bits wide&lt;br /&gt;
*16 bits wide&lt;br /&gt;
*16 bits wide &amp;quot;doubled&amp;quot;&lt;br /&gt;
*&amp;quot;SNK ROM&amp;quot; cards&lt;br /&gt;
&lt;br /&gt;
For 8-bit cards (all official SNK cards ?) only the lower byte is used, but accesses must &#039;&#039;&#039;always&#039;&#039;&#039; be done in words. This is because memory card accesses are only enabled for word or upper byte operations (/UDS 68k signal).&lt;br /&gt;
&lt;br /&gt;
=Original SNK card=&lt;br /&gt;
&lt;br /&gt;
The original SNK-branded memory card was a [[:File:CR2016_battery.jpg|battery-backed]] 8-bit wide 2KiB card using a [[LH5116|LH5116 SRAM chip]] and voltage switching circuitry.&lt;br /&gt;
&lt;br /&gt;
Since it uses a battery, it may be prone to data loss if the voltage drops below 2V. Unlike the MVS [[backup RAM]] battery, the memory card one isn&#039;t rechargeable.&lt;br /&gt;
&lt;br /&gt;
There are at least 2 known versions of the original SNK Memory Card, each with its individual design and circuit-board:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:NEO-IC8_versions.png|640px]]&lt;br /&gt;
&lt;br /&gt;
The first version has the [[C10075-X2-2]] while the later one hase the [[EZ866]] board.&lt;br /&gt;
&lt;br /&gt;
=CD systems=&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;virtual&amp;quot; memory card is embedded in [[CD systems]] as a 8KiB battery-backed SRAM chip.&lt;br /&gt;
&lt;br /&gt;
=Data format=&lt;br /&gt;
&lt;br /&gt;
All cards use the same format regardless of capacity, only regions sizes differ. Since the JEIDA data bus is 16-bits wide, make sure to double the address for 8-bit cards if you choose to access their memory directly.&lt;br /&gt;
&lt;br /&gt;
The data is referred to as &amp;quot;blocks&amp;quot;, one block being 64 bytes. Whatever the game save size is, it is rounded up to a multiple of 64 bytes.&lt;br /&gt;
&lt;br /&gt;
The data is split into 5 regions:&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
&lt;br /&gt;
Always occupies the first block.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0~$9&lt;br /&gt;
|&lt;br /&gt;
|10 bytes&lt;br /&gt;
|Zeros or &amp;quot;SNK ROM &amp;quot; (development unit ?)&lt;br /&gt;
&lt;br /&gt;
For 16 bits &amp;quot;doubled&amp;quot; cards, $6 is set to $0001&lt;br /&gt;
|-&lt;br /&gt;
|$A&lt;br /&gt;
|CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|Address space used by the memory card. Eg. A 2KiB 8-bit card is $1000.&lt;br /&gt;
|-&lt;br /&gt;
|$C&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|$D&lt;br /&gt;
|CARD_FAT_1_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 1&lt;br /&gt;
|-&lt;br /&gt;
|$E&lt;br /&gt;
|CARD_FAT_2_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 2&lt;br /&gt;
|-&lt;br /&gt;
|$F&lt;br /&gt;
|CARD_USERNAME_AVAILABLE&lt;br /&gt;
|byte&lt;br /&gt;
|0 : Username unavailable, !0 : Username available&lt;br /&gt;
|-&lt;br /&gt;
|$10&lt;br /&gt;
|CARD_USERNAME&lt;br /&gt;
|16 bytes&lt;br /&gt;
|Card holder&#039;s username&lt;br /&gt;
|-&lt;br /&gt;
|$20&lt;br /&gt;
|CARD_MAGIC&lt;br /&gt;
|16 bytes&lt;br /&gt;
|$4E $XX $45 $XX $4F $XX $2D $XX $47 $XX $45 $XX $4F $XX $80 $XX (&amp;quot;NEO-GEO&amp;quot;, $80)&lt;br /&gt;
|-&lt;br /&gt;
|$30&lt;br /&gt;
|CARD_REGION&lt;br /&gt;
|byte&lt;br /&gt;
|Region of the system that formated the card, 0 = Japan, 1 = USA, 2 = Europe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Directory==&lt;br /&gt;
&lt;br /&gt;
Always starts at the 2nd block.&lt;br /&gt;
&lt;br /&gt;
List of available saves. Can store from 32 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Note that since the header and directory occupy at least 1 + 2 blocks for the smallest 2KiB cards, there will always be at least 3 unused directory entries.&lt;br /&gt;
&lt;br /&gt;
Each entry is 4 bytes, with the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0&lt;br /&gt;
|byte&lt;br /&gt;
|Save sub-number (CARD_SUB), 0 to 15. $FF if entry is free.&lt;br /&gt;
|-&lt;br /&gt;
|$1&lt;br /&gt;
|word&lt;br /&gt;
|Game&#039;s [[NGH number]]&lt;br /&gt;
|-&lt;br /&gt;
|$3&lt;br /&gt;
|byte&lt;br /&gt;
|FAT entry index (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FAT 1==&lt;br /&gt;
&lt;br /&gt;
List of block indices entries used to reconstruct linear save data from possibly fragmented blocks. 64 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Each entry is a byte representing a block.&lt;br /&gt;
&lt;br /&gt;
* $00 is a free block&lt;br /&gt;
* $01 is the last block used by a save&lt;br /&gt;
* $02 is a block reserved by the system ROM (at least 1 header + 2 directory + 2 FAT = 5 used at beginning)&lt;br /&gt;
* Any other value indicates the next block in the chain&lt;br /&gt;
&lt;br /&gt;
For example a directory entry has a start block of 5. If the FAT entry for block 5 is $01, then the save is only a single block in size.&lt;br /&gt;
If the FAT entries are $06 $09 $01, then the save is 3 blocks in size: $05, $06 and $09.&lt;br /&gt;
&lt;br /&gt;
==FAT 2==&lt;br /&gt;
&lt;br /&gt;
FAT 2 is simply a mirror of FAT 1.&lt;br /&gt;
&lt;br /&gt;
If any of the FAT tables checksum is bad, the correct table is written over the other one. If both checksums are bad, the system ROM displays an error.&lt;br /&gt;
&lt;br /&gt;
==Game Data==&lt;br /&gt;
&lt;br /&gt;
Many games use only one block, but some may use more.&lt;br /&gt;
&lt;br /&gt;
The first 20 bytes contain the data title (usually the game and stage name).&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
* Write is enabled if {{Reg|REG_CRDUNLOCK1}} and {{Reg|REG_CRDUNLOCK2}} are written to&lt;br /&gt;
* The WP (Write Protect) pin is read through bit 6 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD1 (Card Detect 1) is read through bit 4 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD2 (Card Detect 2) is read through bit 5 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
** Both must be 0 if the card is inserted correctly&lt;br /&gt;
* Attribute memory is selected if {{Reg|REG_CRDREGSEL}} is written to, never used ?&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
See [[Memory card pinout]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9327</id>
		<title>Memory card</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9327"/>
		<updated>2026-09-14T11:31:45Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Data format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:snkmemcard.jpg|thumb|SRAM memory card, showing the SRAM chip and voltage detection circuit. Picture by [[User:HPMAN|HPMAN]]]]&lt;br /&gt;
&lt;br /&gt;
[[File:NEO-IC8_front.jpg|thumb|NEO-IC8, original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
[[File:NEO-IC8_back.jpg|thumb|NEO-IC8, back of original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo home console and some [[MVS hardware|MVS]] cabs can use [[JEIDA V3]] memory cards to store game saves and/or high scores, allowing players to save their progress and continue on any system running the same game.&lt;br /&gt;
&lt;br /&gt;
Even if the memory card [[68k memory map|address space]] can be freely used, games should only perform memory card operations through the [[CARD]] system ROM call to avoid data corruption.&lt;br /&gt;
&lt;br /&gt;
=Supported card types=&lt;br /&gt;
&lt;br /&gt;
The SP-S2 [[system ROM]] (and probably all the others) can handle 8 memory card sizes from 2KiB up to 16KiB, in 2KiB steps:&lt;br /&gt;
*2KiB&lt;br /&gt;
*4KiB&lt;br /&gt;
*6KiB&lt;br /&gt;
*8KiB&lt;br /&gt;
*10KiB&lt;br /&gt;
*14KiB&lt;br /&gt;
*16KiB&lt;br /&gt;
&lt;br /&gt;
And 4 different card types:&lt;br /&gt;
*8 bits wide&lt;br /&gt;
*16 bits wide&lt;br /&gt;
*16 bits wide &amp;quot;doubled&amp;quot;&lt;br /&gt;
*&amp;quot;SNK ROM&amp;quot; cards&lt;br /&gt;
&lt;br /&gt;
For 8-bit cards (all official SNK cards ?) only the lower byte is used, but accesses must &#039;&#039;&#039;always&#039;&#039;&#039; be done in words. This is because memory card accesses are only enabled for word or upper byte operations (/UDS 68k signal).&lt;br /&gt;
&lt;br /&gt;
=Original SNK card=&lt;br /&gt;
&lt;br /&gt;
The original SNK-branded memory card was a [[:File:CR2016_battery.jpg|battery-backed]] 8-bit wide 2KiB card using a [[LH5116|LH5116 SRAM chip]] and voltage switching circuitry.&lt;br /&gt;
&lt;br /&gt;
Since it uses a battery, it may be prone to data loss if the voltage drops below 2V. Unlike the MVS [[backup RAM]] battery, the memory card one isn&#039;t rechargeable.&lt;br /&gt;
&lt;br /&gt;
There are at least 2 known versions of the original SNK Memory Card, each with its individual design and circuit-board:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:NEO-IC8_versions.png|640px]]&lt;br /&gt;
&lt;br /&gt;
The first version has the [[C10075-X2-2]] while the later one hase the [[EZ866]] board.&lt;br /&gt;
&lt;br /&gt;
=CD systems=&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;virtual&amp;quot; memory card is embedded in [[CD systems]] as a 8KiB battery-backed SRAM chip.&lt;br /&gt;
&lt;br /&gt;
=Data format=&lt;br /&gt;
&lt;br /&gt;
All cards use the same format regardless of capacity, only regions sizes differ. Since the JEIDA data bus is 16-bits wide, make sure to double the address for 8-bit cards if you choose to access their memory directly.&lt;br /&gt;
&lt;br /&gt;
The data is referred to as &amp;quot;blocks&amp;quot;, one block being 64 bytes. Whatever the game save size is, it is rounded up to a multiple of 64 bytes.&lt;br /&gt;
&lt;br /&gt;
The data is split into 5 regions:&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
&lt;br /&gt;
Always occupies the first block.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0~$9&lt;br /&gt;
|&lt;br /&gt;
|10 bytes&lt;br /&gt;
|Zeros or &amp;quot;SNK ROM &amp;quot; (development unit ?)&lt;br /&gt;
&lt;br /&gt;
For 16 bits &amp;quot;doubled&amp;quot; cards, $6 is set to $0001&lt;br /&gt;
|-&lt;br /&gt;
|$A&lt;br /&gt;
|CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|Address space used by the memory card. Eg. A 2KiB 8-bit card is $1000.&lt;br /&gt;
|-&lt;br /&gt;
|$C&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|$D&lt;br /&gt;
|CARD_FAT_1_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 1&lt;br /&gt;
|-&lt;br /&gt;
|$E&lt;br /&gt;
|CARD_FAT_2_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 2&lt;br /&gt;
|-&lt;br /&gt;
|$F&lt;br /&gt;
|CARD_USERNAME_AVAILABLE&lt;br /&gt;
|byte&lt;br /&gt;
|0 : Username unavailable, !0 : Username available&lt;br /&gt;
|-&lt;br /&gt;
|$10&lt;br /&gt;
|CARD_USERNAME&lt;br /&gt;
|16 bytes&lt;br /&gt;
|Card holder&#039;s username&lt;br /&gt;
|-&lt;br /&gt;
|$20&lt;br /&gt;
|CARD_MAGIC&lt;br /&gt;
|16 bytes&lt;br /&gt;
|$4E $XX $45 $XX $4F $XX $2D $XX $47 $XX $45 $XX $4F $XX $80 $XX (&amp;quot;NEO-GEO&amp;quot;, $80)&lt;br /&gt;
|-&lt;br /&gt;
|$30&lt;br /&gt;
|CARD_REGION&lt;br /&gt;
|byte&lt;br /&gt;
|Region of the system that formated the card, 0 = Japan, 1 = USA, 2 = Europe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Directory==&lt;br /&gt;
&lt;br /&gt;
Always starts at the 2nd block.&lt;br /&gt;
&lt;br /&gt;
List of available saves. Can store from 32 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Note that since the header and directory occupy at least 1 + 2 blocks for the smallest 2KiB cards, there will always be at least 3 unused directory entries.&lt;br /&gt;
&lt;br /&gt;
Each entry is 4 bytes, with the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0&lt;br /&gt;
|byte&lt;br /&gt;
|Save sub-number (CARD_SUB), 0 to 15. $FF if entry is free.&lt;br /&gt;
|-&lt;br /&gt;
|$1&lt;br /&gt;
|word&lt;br /&gt;
|Game&#039;s [[NGH number]]&lt;br /&gt;
|-&lt;br /&gt;
|$3&lt;br /&gt;
|byte&lt;br /&gt;
|FAT entry index (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FAT 1==&lt;br /&gt;
&lt;br /&gt;
List of block indices entries used to reconstruct linear save data from possibly fragmented blocks. 64 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Each entry is a byte representing a block.&lt;br /&gt;
&lt;br /&gt;
* $00 is a free block&lt;br /&gt;
* $01 is the last block used by a save&lt;br /&gt;
* $02 is a block reserved by the system ROM (at least 1 header + 2 directory + 2 FAT = 5 used at beginning)&lt;br /&gt;
* Any other value indicates the next block in the chain&lt;br /&gt;
&lt;br /&gt;
==FAT 2==&lt;br /&gt;
&lt;br /&gt;
FAT 2 is simply a mirror of FAT 1.&lt;br /&gt;
&lt;br /&gt;
If any of the FAT tables checksum is bad, the correct table is written over the other one. If both checksums are bad, the system ROM displays an error.&lt;br /&gt;
&lt;br /&gt;
==Game Data==&lt;br /&gt;
&lt;br /&gt;
Many games use only one block, but some may use more.&lt;br /&gt;
&lt;br /&gt;
The first 20 bytes contain the data title (usually the game and stage name).&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
* Write is enabled if {{Reg|REG_CRDUNLOCK1}} and {{Reg|REG_CRDUNLOCK2}} are written to&lt;br /&gt;
* The WP (Write Protect) pin is read through bit 6 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD1 (Card Detect 1) is read through bit 4 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD2 (Card Detect 2) is read through bit 5 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
** Both must be 0 if the card is inserted correctly&lt;br /&gt;
* Attribute memory is selected if {{Reg|REG_CRDREGSEL}} is written to, never used ?&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
See [[Memory card pinout]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9326</id>
		<title>Memory card</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9326"/>
		<updated>2026-09-14T11:30:16Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* FAT 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:snkmemcard.jpg|thumb|SRAM memory card, showing the SRAM chip and voltage detection circuit. Picture by [[User:HPMAN|HPMAN]]]]&lt;br /&gt;
&lt;br /&gt;
[[File:NEO-IC8_front.jpg|thumb|NEO-IC8, original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
[[File:NEO-IC8_back.jpg|thumb|NEO-IC8, back of original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo home console and some [[MVS hardware|MVS]] cabs can use [[JEIDA V3]] memory cards to store game saves and/or high scores, allowing players to save their progress and continue on any system running the same game.&lt;br /&gt;
&lt;br /&gt;
Even if the memory card [[68k memory map|address space]] can be freely used, games should only perform memory card operations through the [[CARD]] system ROM call to avoid data corruption.&lt;br /&gt;
&lt;br /&gt;
=Supported card types=&lt;br /&gt;
&lt;br /&gt;
The SP-S2 [[system ROM]] (and probably all the others) can handle 8 memory card sizes from 2KiB up to 16KiB, in 2KiB steps:&lt;br /&gt;
*2KiB&lt;br /&gt;
*4KiB&lt;br /&gt;
*6KiB&lt;br /&gt;
*8KiB&lt;br /&gt;
*10KiB&lt;br /&gt;
*14KiB&lt;br /&gt;
*16KiB&lt;br /&gt;
&lt;br /&gt;
And 4 different card types:&lt;br /&gt;
*8 bits wide&lt;br /&gt;
*16 bits wide&lt;br /&gt;
*16 bits wide &amp;quot;doubled&amp;quot;&lt;br /&gt;
*&amp;quot;SNK ROM&amp;quot; cards&lt;br /&gt;
&lt;br /&gt;
For 8-bit cards (all official SNK cards ?) only the lower byte is used, but accesses must &#039;&#039;&#039;always&#039;&#039;&#039; be done in words. This is because memory card accesses are only enabled for word or upper byte operations (/UDS 68k signal).&lt;br /&gt;
&lt;br /&gt;
=Original SNK card=&lt;br /&gt;
&lt;br /&gt;
The original SNK-branded memory card was a [[:File:CR2016_battery.jpg|battery-backed]] 8-bit wide 2KiB card using a [[LH5116|LH5116 SRAM chip]] and voltage switching circuitry.&lt;br /&gt;
&lt;br /&gt;
Since it uses a battery, it may be prone to data loss if the voltage drops below 2V. Unlike the MVS [[backup RAM]] battery, the memory card one isn&#039;t rechargeable.&lt;br /&gt;
&lt;br /&gt;
There are at least 2 known versions of the original SNK Memory Card, each with its individual design and circuit-board:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:NEO-IC8_versions.png|640px]]&lt;br /&gt;
&lt;br /&gt;
The first version has the [[C10075-X2-2]] while the later one hase the [[EZ866]] board.&lt;br /&gt;
&lt;br /&gt;
=CD systems=&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;virtual&amp;quot; memory card is embedded in [[CD systems]] as a 8KiB battery-backed SRAM chip.&lt;br /&gt;
&lt;br /&gt;
=Data format=&lt;br /&gt;
&lt;br /&gt;
All cards use the same format regardless of capacity, only regions sizes differ. Since the JEIDA data bus is 16-bits wide, make sure to double the address for 8-bit cards if you choose to access their memory directly.&lt;br /&gt;
&lt;br /&gt;
The data is referred to as &amp;quot;blocks&amp;quot;, one block being 64 bytes. The header always occupies the first block. Eg. A 2KiB card can hold (2048/64)-1 = 31 blocks.&lt;br /&gt;
&lt;br /&gt;
The data is split into 5 regions:&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
&lt;br /&gt;
Always occupies the first block.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0~$9&lt;br /&gt;
|&lt;br /&gt;
|10 bytes&lt;br /&gt;
|Zeros or &amp;quot;SNK ROM &amp;quot; (development unit ?)&lt;br /&gt;
&lt;br /&gt;
For 16 bits &amp;quot;doubled&amp;quot; cards, $6 is set to $0001&lt;br /&gt;
|-&lt;br /&gt;
|$A&lt;br /&gt;
|CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|Address space used by the memory card. Eg. A 2KiB 8-bit card is $1000.&lt;br /&gt;
|-&lt;br /&gt;
|$C&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|$D&lt;br /&gt;
|CARD_FAT_1_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 1&lt;br /&gt;
|-&lt;br /&gt;
|$E&lt;br /&gt;
|CARD_FAT_2_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 2&lt;br /&gt;
|-&lt;br /&gt;
|$F&lt;br /&gt;
|CARD_USERNAME_AVAILABLE&lt;br /&gt;
|byte&lt;br /&gt;
|0 : Username unavailable, !0 : Username available&lt;br /&gt;
|-&lt;br /&gt;
|$10&lt;br /&gt;
|CARD_USERNAME&lt;br /&gt;
|16 bytes&lt;br /&gt;
|Card holder&#039;s username&lt;br /&gt;
|-&lt;br /&gt;
|$20&lt;br /&gt;
|CARD_MAGIC&lt;br /&gt;
|16 bytes&lt;br /&gt;
|$4E $XX $45 $XX $4F $XX $2D $XX $47 $XX $45 $XX $4F $XX $80 $XX (&amp;quot;NEO-GEO&amp;quot;, $80)&lt;br /&gt;
|-&lt;br /&gt;
|$30&lt;br /&gt;
|CARD_REGION&lt;br /&gt;
|byte&lt;br /&gt;
|Region of the system that formated the card, 0 = Japan, 1 = USA, 2 = Europe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Directory==&lt;br /&gt;
&lt;br /&gt;
Always starts at the 2nd block.&lt;br /&gt;
&lt;br /&gt;
List of available saves. Can store from 32 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Note that since the header and directory occupy at least 1 + 2 blocks for the smallest 2KiB cards, there will always be at least 3 unused directory entries.&lt;br /&gt;
&lt;br /&gt;
Each entry is 4 bytes, with the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0&lt;br /&gt;
|byte&lt;br /&gt;
|Save sub-number (CARD_SUB), 0 to 15. $FF if entry is free.&lt;br /&gt;
|-&lt;br /&gt;
|$1&lt;br /&gt;
|word&lt;br /&gt;
|Game&#039;s [[NGH number]]&lt;br /&gt;
|-&lt;br /&gt;
|$3&lt;br /&gt;
|byte&lt;br /&gt;
|FAT entry index (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FAT 1==&lt;br /&gt;
&lt;br /&gt;
List of block indices entries used to reconstruct linear save data from possibly fragmented blocks. 64 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Each entry is a byte representing a block.&lt;br /&gt;
&lt;br /&gt;
* $00 is a free block&lt;br /&gt;
* $01 is the last block used by a save&lt;br /&gt;
* $02 is a block reserved by the system ROM (at least 1 header + 2 directory + 2 FAT = 5 used at beginning)&lt;br /&gt;
* Any other value indicates the next block in the chain&lt;br /&gt;
&lt;br /&gt;
==FAT 2==&lt;br /&gt;
&lt;br /&gt;
FAT 2 is simply a mirror of FAT 1.&lt;br /&gt;
&lt;br /&gt;
If any of the FAT tables checksum is bad, the correct table is written over the other one. If both checksums are bad, the system ROM displays an error.&lt;br /&gt;
&lt;br /&gt;
==Game Data==&lt;br /&gt;
&lt;br /&gt;
Many games use only one block, but some may use more.&lt;br /&gt;
&lt;br /&gt;
The first 20 bytes contain the data title (usually the game and stage name).&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
* Write is enabled if {{Reg|REG_CRDUNLOCK1}} and {{Reg|REG_CRDUNLOCK2}} are written to&lt;br /&gt;
* The WP (Write Protect) pin is read through bit 6 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD1 (Card Detect 1) is read through bit 4 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD2 (Card Detect 2) is read through bit 5 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
** Both must be 0 if the card is inserted correctly&lt;br /&gt;
* Attribute memory is selected if {{Reg|REG_CRDREGSEL}} is written to, never used ?&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
See [[Memory card pinout]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9325</id>
		<title>Memory card</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9325"/>
		<updated>2026-09-14T11:25:56Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Directory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:snkmemcard.jpg|thumb|SRAM memory card, showing the SRAM chip and voltage detection circuit. Picture by [[User:HPMAN|HPMAN]]]]&lt;br /&gt;
&lt;br /&gt;
[[File:NEO-IC8_front.jpg|thumb|NEO-IC8, original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
[[File:NEO-IC8_back.jpg|thumb|NEO-IC8, back of original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo home console and some [[MVS hardware|MVS]] cabs can use [[JEIDA V3]] memory cards to store game saves and/or high scores, allowing players to save their progress and continue on any system running the same game.&lt;br /&gt;
&lt;br /&gt;
Even if the memory card [[68k memory map|address space]] can be freely used, games should only perform memory card operations through the [[CARD]] system ROM call to avoid data corruption.&lt;br /&gt;
&lt;br /&gt;
=Supported card types=&lt;br /&gt;
&lt;br /&gt;
The SP-S2 [[system ROM]] (and probably all the others) can handle 8 memory card sizes from 2KiB up to 16KiB, in 2KiB steps:&lt;br /&gt;
*2KiB&lt;br /&gt;
*4KiB&lt;br /&gt;
*6KiB&lt;br /&gt;
*8KiB&lt;br /&gt;
*10KiB&lt;br /&gt;
*14KiB&lt;br /&gt;
*16KiB&lt;br /&gt;
&lt;br /&gt;
And 4 different card types:&lt;br /&gt;
*8 bits wide&lt;br /&gt;
*16 bits wide&lt;br /&gt;
*16 bits wide &amp;quot;doubled&amp;quot;&lt;br /&gt;
*&amp;quot;SNK ROM&amp;quot; cards&lt;br /&gt;
&lt;br /&gt;
For 8-bit cards (all official SNK cards ?) only the lower byte is used, but accesses must &#039;&#039;&#039;always&#039;&#039;&#039; be done in words. This is because memory card accesses are only enabled for word or upper byte operations (/UDS 68k signal).&lt;br /&gt;
&lt;br /&gt;
=Original SNK card=&lt;br /&gt;
&lt;br /&gt;
The original SNK-branded memory card was a [[:File:CR2016_battery.jpg|battery-backed]] 8-bit wide 2KiB card using a [[LH5116|LH5116 SRAM chip]] and voltage switching circuitry.&lt;br /&gt;
&lt;br /&gt;
Since it uses a battery, it may be prone to data loss if the voltage drops below 2V. Unlike the MVS [[backup RAM]] battery, the memory card one isn&#039;t rechargeable.&lt;br /&gt;
&lt;br /&gt;
There are at least 2 known versions of the original SNK Memory Card, each with its individual design and circuit-board:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:NEO-IC8_versions.png|640px]]&lt;br /&gt;
&lt;br /&gt;
The first version has the [[C10075-X2-2]] while the later one hase the [[EZ866]] board.&lt;br /&gt;
&lt;br /&gt;
=CD systems=&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;virtual&amp;quot; memory card is embedded in [[CD systems]] as a 8KiB battery-backed SRAM chip.&lt;br /&gt;
&lt;br /&gt;
=Data format=&lt;br /&gt;
&lt;br /&gt;
All cards use the same format regardless of capacity, only regions sizes differ. Since the JEIDA data bus is 16-bits wide, make sure to double the address for 8-bit cards if you choose to access their memory directly.&lt;br /&gt;
&lt;br /&gt;
The data is referred to as &amp;quot;blocks&amp;quot;, one block being 64 bytes. The header always occupies the first block. Eg. A 2KiB card can hold (2048/64)-1 = 31 blocks.&lt;br /&gt;
&lt;br /&gt;
The data is split into 5 regions:&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
&lt;br /&gt;
Always occupies the first block.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0~$9&lt;br /&gt;
|&lt;br /&gt;
|10 bytes&lt;br /&gt;
|Zeros or &amp;quot;SNK ROM &amp;quot; (development unit ?)&lt;br /&gt;
&lt;br /&gt;
For 16 bits &amp;quot;doubled&amp;quot; cards, $6 is set to $0001&lt;br /&gt;
|-&lt;br /&gt;
|$A&lt;br /&gt;
|CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|Address space used by the memory card. Eg. A 2KiB 8-bit card is $1000.&lt;br /&gt;
|-&lt;br /&gt;
|$C&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|$D&lt;br /&gt;
|CARD_FAT_1_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 1&lt;br /&gt;
|-&lt;br /&gt;
|$E&lt;br /&gt;
|CARD_FAT_2_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 2&lt;br /&gt;
|-&lt;br /&gt;
|$F&lt;br /&gt;
|CARD_USERNAME_AVAILABLE&lt;br /&gt;
|byte&lt;br /&gt;
|0 : Username unavailable, !0 : Username available&lt;br /&gt;
|-&lt;br /&gt;
|$10&lt;br /&gt;
|CARD_USERNAME&lt;br /&gt;
|16 bytes&lt;br /&gt;
|Card holder&#039;s username&lt;br /&gt;
|-&lt;br /&gt;
|$20&lt;br /&gt;
|CARD_MAGIC&lt;br /&gt;
|16 bytes&lt;br /&gt;
|$4E $XX $45 $XX $4F $XX $2D $XX $47 $XX $45 $XX $4F $XX $80 $XX (&amp;quot;NEO-GEO&amp;quot;, $80)&lt;br /&gt;
|-&lt;br /&gt;
|$30&lt;br /&gt;
|CARD_REGION&lt;br /&gt;
|byte&lt;br /&gt;
|Region of the system that formated the card, 0 = Japan, 1 = USA, 2 = Europe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Directory==&lt;br /&gt;
&lt;br /&gt;
Always starts at the 2nd block.&lt;br /&gt;
&lt;br /&gt;
List of available saves. Can store from 32 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Note that since the header and directory occupy at least 1 + 2 blocks for the smallest 2KiB cards, there will always be at least 3 unused directory entries.&lt;br /&gt;
&lt;br /&gt;
Each entry is 4 bytes, with the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0&lt;br /&gt;
|byte&lt;br /&gt;
|Save sub-number (CARD_SUB), 0 to 15. $FF if entry is free.&lt;br /&gt;
|-&lt;br /&gt;
|$1&lt;br /&gt;
|word&lt;br /&gt;
|Game&#039;s [[NGH number]]&lt;br /&gt;
|-&lt;br /&gt;
|$3&lt;br /&gt;
|byte&lt;br /&gt;
|FAT entry index (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FAT 1==&lt;br /&gt;
&lt;br /&gt;
List of used blocks of 64, 128, 192, or 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
* $02 is a block reserved by the system ROM&lt;br /&gt;
* $01 is a block used by a game&lt;br /&gt;
* $00 is a free block&lt;br /&gt;
&lt;br /&gt;
==FAT 2==&lt;br /&gt;
&lt;br /&gt;
FAT 2 is simply a mirror of FAT 1.&lt;br /&gt;
&lt;br /&gt;
If any of the FAT tables checksum is bad, the correct table is written over the other one. If both checksums are bad, the system ROM displays an error.&lt;br /&gt;
&lt;br /&gt;
==Game Data==&lt;br /&gt;
&lt;br /&gt;
Many games use only one block, but some may use more.&lt;br /&gt;
&lt;br /&gt;
The first 20 bytes contain the data title (usually the game and stage name).&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
* Write is enabled if {{Reg|REG_CRDUNLOCK1}} and {{Reg|REG_CRDUNLOCK2}} are written to&lt;br /&gt;
* The WP (Write Protect) pin is read through bit 6 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD1 (Card Detect 1) is read through bit 4 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD2 (Card Detect 2) is read through bit 5 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
** Both must be 0 if the card is inserted correctly&lt;br /&gt;
* Attribute memory is selected if {{Reg|REG_CRDREGSEL}} is written to, never used ?&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
See [[Memory card pinout]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9324</id>
		<title>Memory card</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9324"/>
		<updated>2026-09-14T11:25:43Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Directory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:snkmemcard.jpg|thumb|SRAM memory card, showing the SRAM chip and voltage detection circuit. Picture by [[User:HPMAN|HPMAN]]]]&lt;br /&gt;
&lt;br /&gt;
[[File:NEO-IC8_front.jpg|thumb|NEO-IC8, original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
[[File:NEO-IC8_back.jpg|thumb|NEO-IC8, back of original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo home console and some [[MVS hardware|MVS]] cabs can use [[JEIDA V3]] memory cards to store game saves and/or high scores, allowing players to save their progress and continue on any system running the same game.&lt;br /&gt;
&lt;br /&gt;
Even if the memory card [[68k memory map|address space]] can be freely used, games should only perform memory card operations through the [[CARD]] system ROM call to avoid data corruption.&lt;br /&gt;
&lt;br /&gt;
=Supported card types=&lt;br /&gt;
&lt;br /&gt;
The SP-S2 [[system ROM]] (and probably all the others) can handle 8 memory card sizes from 2KiB up to 16KiB, in 2KiB steps:&lt;br /&gt;
*2KiB&lt;br /&gt;
*4KiB&lt;br /&gt;
*6KiB&lt;br /&gt;
*8KiB&lt;br /&gt;
*10KiB&lt;br /&gt;
*14KiB&lt;br /&gt;
*16KiB&lt;br /&gt;
&lt;br /&gt;
And 4 different card types:&lt;br /&gt;
*8 bits wide&lt;br /&gt;
*16 bits wide&lt;br /&gt;
*16 bits wide &amp;quot;doubled&amp;quot;&lt;br /&gt;
*&amp;quot;SNK ROM&amp;quot; cards&lt;br /&gt;
&lt;br /&gt;
For 8-bit cards (all official SNK cards ?) only the lower byte is used, but accesses must &#039;&#039;&#039;always&#039;&#039;&#039; be done in words. This is because memory card accesses are only enabled for word or upper byte operations (/UDS 68k signal).&lt;br /&gt;
&lt;br /&gt;
=Original SNK card=&lt;br /&gt;
&lt;br /&gt;
The original SNK-branded memory card was a [[:File:CR2016_battery.jpg|battery-backed]] 8-bit wide 2KiB card using a [[LH5116|LH5116 SRAM chip]] and voltage switching circuitry.&lt;br /&gt;
&lt;br /&gt;
Since it uses a battery, it may be prone to data loss if the voltage drops below 2V. Unlike the MVS [[backup RAM]] battery, the memory card one isn&#039;t rechargeable.&lt;br /&gt;
&lt;br /&gt;
There are at least 2 known versions of the original SNK Memory Card, each with its individual design and circuit-board:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:NEO-IC8_versions.png|640px]]&lt;br /&gt;
&lt;br /&gt;
The first version has the [[C10075-X2-2]] while the later one hase the [[EZ866]] board.&lt;br /&gt;
&lt;br /&gt;
=CD systems=&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;virtual&amp;quot; memory card is embedded in [[CD systems]] as a 8KiB battery-backed SRAM chip.&lt;br /&gt;
&lt;br /&gt;
=Data format=&lt;br /&gt;
&lt;br /&gt;
All cards use the same format regardless of capacity, only regions sizes differ. Since the JEIDA data bus is 16-bits wide, make sure to double the address for 8-bit cards if you choose to access their memory directly.&lt;br /&gt;
&lt;br /&gt;
The data is referred to as &amp;quot;blocks&amp;quot;, one block being 64 bytes. The header always occupies the first block. Eg. A 2KiB card can hold (2048/64)-1 = 31 blocks.&lt;br /&gt;
&lt;br /&gt;
The data is split into 5 regions:&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
&lt;br /&gt;
Always occupies the first block.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0~$9&lt;br /&gt;
|&lt;br /&gt;
|10 bytes&lt;br /&gt;
|Zeros or &amp;quot;SNK ROM &amp;quot; (development unit ?)&lt;br /&gt;
&lt;br /&gt;
For 16 bits &amp;quot;doubled&amp;quot; cards, $6 is set to $0001&lt;br /&gt;
|-&lt;br /&gt;
|$A&lt;br /&gt;
|CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|Address space used by the memory card. Eg. A 2KiB 8-bit card is $1000.&lt;br /&gt;
|-&lt;br /&gt;
|$C&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|$D&lt;br /&gt;
|CARD_FAT_1_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 1&lt;br /&gt;
|-&lt;br /&gt;
|$E&lt;br /&gt;
|CARD_FAT_2_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 2&lt;br /&gt;
|-&lt;br /&gt;
|$F&lt;br /&gt;
|CARD_USERNAME_AVAILABLE&lt;br /&gt;
|byte&lt;br /&gt;
|0 : Username unavailable, !0 : Username available&lt;br /&gt;
|-&lt;br /&gt;
|$10&lt;br /&gt;
|CARD_USERNAME&lt;br /&gt;
|16 bytes&lt;br /&gt;
|Card holder&#039;s username&lt;br /&gt;
|-&lt;br /&gt;
|$20&lt;br /&gt;
|CARD_MAGIC&lt;br /&gt;
|16 bytes&lt;br /&gt;
|$4E $XX $45 $XX $4F $XX $2D $XX $47 $XX $45 $XX $4F $XX $80 $XX (&amp;quot;NEO-GEO&amp;quot;, $80)&lt;br /&gt;
|-&lt;br /&gt;
|$30&lt;br /&gt;
|CARD_REGION&lt;br /&gt;
|byte&lt;br /&gt;
|Region of the system that formated the card, 0 = Japan, 1 = USA, 2 = Europe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Directory==&lt;br /&gt;
&lt;br /&gt;
Always occupies the 2nd block.&lt;br /&gt;
&lt;br /&gt;
List of available saves. Can store from 32 to 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Note that since the header and directory occupy at least 1 + 2 blocks for the smallest 2KiB cards, there will always be at least 3 unused directory entries.&lt;br /&gt;
&lt;br /&gt;
Each entry is 4 bytes, with the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0&lt;br /&gt;
|byte&lt;br /&gt;
|Save sub-number (CARD_SUB), 0 to 15. $FF if entry is free.&lt;br /&gt;
|-&lt;br /&gt;
|$1&lt;br /&gt;
|word&lt;br /&gt;
|Game&#039;s [[NGH number]]&lt;br /&gt;
|-&lt;br /&gt;
|$3&lt;br /&gt;
|byte&lt;br /&gt;
|FAT entry index (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FAT 1==&lt;br /&gt;
&lt;br /&gt;
List of used blocks of 64, 128, 192, or 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
* $02 is a block reserved by the system ROM&lt;br /&gt;
* $01 is a block used by a game&lt;br /&gt;
* $00 is a free block&lt;br /&gt;
&lt;br /&gt;
==FAT 2==&lt;br /&gt;
&lt;br /&gt;
FAT 2 is simply a mirror of FAT 1.&lt;br /&gt;
&lt;br /&gt;
If any of the FAT tables checksum is bad, the correct table is written over the other one. If both checksums are bad, the system ROM displays an error.&lt;br /&gt;
&lt;br /&gt;
==Game Data==&lt;br /&gt;
&lt;br /&gt;
Many games use only one block, but some may use more.&lt;br /&gt;
&lt;br /&gt;
The first 20 bytes contain the data title (usually the game and stage name).&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
* Write is enabled if {{Reg|REG_CRDUNLOCK1}} and {{Reg|REG_CRDUNLOCK2}} are written to&lt;br /&gt;
* The WP (Write Protect) pin is read through bit 6 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD1 (Card Detect 1) is read through bit 4 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD2 (Card Detect 2) is read through bit 5 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
** Both must be 0 if the card is inserted correctly&lt;br /&gt;
* Attribute memory is selected if {{Reg|REG_CRDREGSEL}} is written to, never used ?&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
See [[Memory card pinout]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9323</id>
		<title>Memory card</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Memory_card&amp;diff=9323"/>
		<updated>2026-09-14T11:19:56Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:snkmemcard.jpg|thumb|SRAM memory card, showing the SRAM chip and voltage detection circuit. Picture by [[User:HPMAN|HPMAN]]]]&lt;br /&gt;
&lt;br /&gt;
[[File:NEO-IC8_front.jpg|thumb|NEO-IC8, original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
[[File:NEO-IC8_back.jpg|thumb|NEO-IC8, back of original SNK card. Picture by [[User:ArcadeTV|ArcadeTV]]]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo home console and some [[MVS hardware|MVS]] cabs can use [[JEIDA V3]] memory cards to store game saves and/or high scores, allowing players to save their progress and continue on any system running the same game.&lt;br /&gt;
&lt;br /&gt;
Even if the memory card [[68k memory map|address space]] can be freely used, games should only perform memory card operations through the [[CARD]] system ROM call to avoid data corruption.&lt;br /&gt;
&lt;br /&gt;
=Supported card types=&lt;br /&gt;
&lt;br /&gt;
The SP-S2 [[system ROM]] (and probably all the others) can handle 8 memory card sizes from 2KiB up to 16KiB, in 2KiB steps:&lt;br /&gt;
*2KiB&lt;br /&gt;
*4KiB&lt;br /&gt;
*6KiB&lt;br /&gt;
*8KiB&lt;br /&gt;
*10KiB&lt;br /&gt;
*14KiB&lt;br /&gt;
*16KiB&lt;br /&gt;
&lt;br /&gt;
And 4 different card types:&lt;br /&gt;
*8 bits wide&lt;br /&gt;
*16 bits wide&lt;br /&gt;
*16 bits wide &amp;quot;doubled&amp;quot;&lt;br /&gt;
*&amp;quot;SNK ROM&amp;quot; cards&lt;br /&gt;
&lt;br /&gt;
For 8-bit cards (all official SNK cards ?) only the lower byte is used, but accesses must &#039;&#039;&#039;always&#039;&#039;&#039; be done in words. This is because memory card accesses are only enabled for word or upper byte operations (/UDS 68k signal).&lt;br /&gt;
&lt;br /&gt;
=Original SNK card=&lt;br /&gt;
&lt;br /&gt;
The original SNK-branded memory card was a [[:File:CR2016_battery.jpg|battery-backed]] 8-bit wide 2KiB card using a [[LH5116|LH5116 SRAM chip]] and voltage switching circuitry.&lt;br /&gt;
&lt;br /&gt;
Since it uses a battery, it may be prone to data loss if the voltage drops below 2V. Unlike the MVS [[backup RAM]] battery, the memory card one isn&#039;t rechargeable.&lt;br /&gt;
&lt;br /&gt;
There are at least 2 known versions of the original SNK Memory Card, each with its individual design and circuit-board:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:NEO-IC8_versions.png|640px]]&lt;br /&gt;
&lt;br /&gt;
The first version has the [[C10075-X2-2]] while the later one hase the [[EZ866]] board.&lt;br /&gt;
&lt;br /&gt;
=CD systems=&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;virtual&amp;quot; memory card is embedded in [[CD systems]] as a 8KiB battery-backed SRAM chip.&lt;br /&gt;
&lt;br /&gt;
=Data format=&lt;br /&gt;
&lt;br /&gt;
All cards use the same format regardless of capacity, only regions sizes differ. Since the JEIDA data bus is 16-bits wide, make sure to double the address for 8-bit cards if you choose to access their memory directly.&lt;br /&gt;
&lt;br /&gt;
The data is referred to as &amp;quot;blocks&amp;quot;, one block being 64 bytes. The header always occupies the first block. Eg. A 2KiB card can hold (2048/64)-1 = 31 blocks.&lt;br /&gt;
&lt;br /&gt;
The data is split into 5 regions:&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
&lt;br /&gt;
Always occupies the first block.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0~$9&lt;br /&gt;
|&lt;br /&gt;
|10 bytes&lt;br /&gt;
|Zeros or &amp;quot;SNK ROM &amp;quot; (development unit ?)&lt;br /&gt;
&lt;br /&gt;
For 16 bits &amp;quot;doubled&amp;quot; cards, $6 is set to $0001&lt;br /&gt;
|-&lt;br /&gt;
|$A&lt;br /&gt;
|CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|Address space used by the memory card. Eg. A 2KiB 8-bit card is $1000.&lt;br /&gt;
|-&lt;br /&gt;
|$C&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|$D&lt;br /&gt;
|CARD_FAT_1_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 1&lt;br /&gt;
|-&lt;br /&gt;
|$E&lt;br /&gt;
|CARD_FAT_2_CHKSUM&lt;br /&gt;
|byte&lt;br /&gt;
|Checksum of FAT 2&lt;br /&gt;
|-&lt;br /&gt;
|$F&lt;br /&gt;
|CARD_USERNAME_AVAILABLE&lt;br /&gt;
|byte&lt;br /&gt;
|0 : Username unavailable, !0 : Username available&lt;br /&gt;
|-&lt;br /&gt;
|$10&lt;br /&gt;
|CARD_USERNAME&lt;br /&gt;
|16 bytes&lt;br /&gt;
|Card holder&#039;s username&lt;br /&gt;
|-&lt;br /&gt;
|$20&lt;br /&gt;
|CARD_MAGIC&lt;br /&gt;
|16 bytes&lt;br /&gt;
|$4E $XX $45 $XX $4F $XX $2D $XX $47 $XX $45 $XX $4F $XX $80 $XX (&amp;quot;NEO-GEO&amp;quot;, $80)&lt;br /&gt;
|-&lt;br /&gt;
|$30&lt;br /&gt;
|CARD_REGION&lt;br /&gt;
|byte&lt;br /&gt;
|Region of the system that formated the card, 0 = Japan, 1 = USA, 2 = Europe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Directory==&lt;br /&gt;
&lt;br /&gt;
List of saves of 32, 64, 96, 128, 160, 192, 224 or 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
&lt;br /&gt;
Note that since the header occupies the first block, there will always be at least one unused directory entry.&lt;br /&gt;
&lt;br /&gt;
Each entry is 4 bytes, with the following format:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0&lt;br /&gt;
|byte&lt;br /&gt;
|Save sub-number (CARD_SUB), 0 to 15. $FF if entry is free.&lt;br /&gt;
|-&lt;br /&gt;
|$1&lt;br /&gt;
|word&lt;br /&gt;
|Game&#039;s [[NGH number]]&lt;br /&gt;
|-&lt;br /&gt;
|$3&lt;br /&gt;
|byte&lt;br /&gt;
|FAT entry index (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==FAT 1==&lt;br /&gt;
&lt;br /&gt;
List of used blocks of 64, 128, 192, or 256 entries. The size depends on the card&#039;s capacity.&lt;br /&gt;
* $02 is a block reserved by the system ROM&lt;br /&gt;
* $01 is a block used by a game&lt;br /&gt;
* $00 is a free block&lt;br /&gt;
&lt;br /&gt;
==FAT 2==&lt;br /&gt;
&lt;br /&gt;
FAT 2 is simply a mirror of FAT 1.&lt;br /&gt;
&lt;br /&gt;
If any of the FAT tables checksum is bad, the correct table is written over the other one. If both checksums are bad, the system ROM displays an error.&lt;br /&gt;
&lt;br /&gt;
==Game Data==&lt;br /&gt;
&lt;br /&gt;
Many games use only one block, but some may use more.&lt;br /&gt;
&lt;br /&gt;
The first 20 bytes contain the data title (usually the game and stage name).&lt;br /&gt;
&lt;br /&gt;
=Registers=&lt;br /&gt;
&lt;br /&gt;
* Write is enabled if {{Reg|REG_CRDUNLOCK1}} and {{Reg|REG_CRDUNLOCK2}} are written to&lt;br /&gt;
* The WP (Write Protect) pin is read through bit 6 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD1 (Card Detect 1) is read through bit 4 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
* CD2 (Card Detect 2) is read through bit 5 of {{Reg|REG_STATUS_B}}&lt;br /&gt;
** Both must be 0 if the card is inserted correctly&lt;br /&gt;
* Attribute memory is selected if {{Reg|REG_CRDREGSEL}} is written to, never used ?&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
See [[Memory card pinout]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=CREDIT_CHECK&amp;diff=9322</id>
		<title>CREDIT CHECK</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=CREDIT_CHECK&amp;diff=9322"/>
		<updated>2026-09-12T12:54:39Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CREDIT_CHECK ($C00450) ==&lt;br /&gt;
&lt;br /&gt;
[[System ROM]] routine called to check if there&#039;s enough credits for a player.&lt;br /&gt;
&lt;br /&gt;
Input: Credits necessary in {{BR|BIOS_CREDIT_DEC1}} for player 1, and {{BR|BIOS_CREDIT_DEC2}} for player 2.&lt;br /&gt;
Those locations are set to 0 if there aren&#039;t enough credits.&lt;br /&gt;
&lt;br /&gt;
Call [[CREDIT_DOWN]] after.&lt;br /&gt;
&lt;br /&gt;
Credits count are located in [[backup RAM]] at $D00034 and $D00035.&lt;br /&gt;
&lt;br /&gt;
[[Category:BIOS calls]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=BIOS_RAM_locations&amp;diff=9321</id>
		<title>BIOS RAM locations</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=BIOS_RAM_locations&amp;diff=9321"/>
		<updated>2026-09-08T08:43:23Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Game Related */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The locations are (?) guaranteed to be identical accross all [[system ROM]] versions so that games can use them regardless of the system type.&lt;br /&gt;
&lt;br /&gt;
=Game Related=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FD84~$10FD93&lt;br /&gt;
|BIOS_GAME_DIP&lt;br /&gt;
|16 bytes&lt;br /&gt;
|BIOS&lt;br /&gt;
|[[Software DIPs]] values (game configuration)&lt;br /&gt;
|-&lt;br /&gt;
|$10FDAE&lt;br /&gt;
|BIOS_USER_REQUEST&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Request code for the [[USER subroutine]]. 0:Init, 1:Boot animation, 2:Demo, 3:Title&lt;br /&gt;
|-&lt;br /&gt;
|$10FDAF&lt;br /&gt;
|BIOS_USER_MODE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS/Game&lt;br /&gt;
|Used by the game to tell what it&#039;s doing: 0:Init/Boot animation, 1:Title/Demo, 2:Game&lt;br /&gt;
[[Game selection]] can only be done on MVS systems when this byte is &amp;lt; 2&lt;br /&gt;
|-&lt;br /&gt;
|$10FDB0&lt;br /&gt;
|BIOS_CREDIT_DEC&lt;br /&gt;
|4 bytes&lt;br /&gt;
|Game&lt;br /&gt;
|Credit decrement value for each player (1, 2, 3, 4) when calling [[CREDIT DOWN]].&lt;br /&gt;
|-&lt;br /&gt;
|$10FDB4&lt;br /&gt;
|BIOS_START_FLAG&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Used when calling the [[PLAYER START subroutine]]. The 4 LSBs correspond to the player who pushed start.&lt;br /&gt;
|-&lt;br /&gt;
|$10FDB6&lt;br /&gt;
|BIOS_PLAYER_MOD1&lt;br /&gt;
|byte&lt;br /&gt;
|Game&lt;br /&gt;
|rowspan=&amp;quot;4|Sets player status. 0:Never played, 1:Playing, 2:Continue option being displayed, 3:Game over&lt;br /&gt;
|-&lt;br /&gt;
|$10FDB7&lt;br /&gt;
|BIOS_PLAYER_MOD2&lt;br /&gt;
|byte&lt;br /&gt;
|Game&lt;br /&gt;
|-&lt;br /&gt;
|$10FDB8&lt;br /&gt;
|BIOS_PLAYER_MOD3&lt;br /&gt;
|byte&lt;br /&gt;
|Game&lt;br /&gt;
|-&lt;br /&gt;
|$10FDB9&lt;br /&gt;
|BIOS_PLAYER_MOD4&lt;br /&gt;
|byte&lt;br /&gt;
|Game&lt;br /&gt;
|-&lt;br /&gt;
|$10FE00&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Developer mode credits for player 1&lt;br /&gt;
|-&lt;br /&gt;
|$10FE01&lt;br /&gt;
|&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Developer mode credits for player 2&lt;br /&gt;
|-&lt;br /&gt;
|$10FEC5&lt;br /&gt;
|BIOS_TITLE_MODE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS/Game&lt;br /&gt;
|Newer games set this to 1 in their command 3 [[USER subroutine]]. It prevents the system ROM from calling command 3 twice after game over if credits are already in the system.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=System Related=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FD80&lt;br /&gt;
|BIOS_SYSTEM_MODE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|0:BIOS wants vblank (system mode), $80:Ok to use vblank (game mode)&lt;br /&gt;
|-&lt;br /&gt;
|$10FD81&lt;br /&gt;
|BIOS_SYSRET_STATUS&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Internal value which stores the function code that [[SYSTEM_RETURN]] will call.&lt;br /&gt;
*0 : Init bram/select valid game for eye-catcher&lt;br /&gt;
*1 : Set the EL-LED to the correct value&lt;br /&gt;
*2 : Switch to the next slot, relaunch eye-catcher&lt;br /&gt;
*3 : After a gameover, save the playtime for bookeeping, switch to DEMO mode, reset the workbackup ram&lt;br /&gt;
*4 : Switch next slot (select p1 pressed)&lt;br /&gt;
*5 : Switch to previous slot (select p2 pressed)&lt;br /&gt;
*6 : Called after a coin deposit, does nothing&lt;br /&gt;
|-&lt;br /&gt;
|$10FD82&lt;br /&gt;
|BIOS_MVS_FLAG&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|System type. 0:AES, 0x80:MVS&lt;br /&gt;
|-&lt;br /&gt;
|$10FD83&lt;br /&gt;
|BIOS_COUNTRY_CODE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|0:Japan, 1:USA, 2:Europe&lt;br /&gt;
|-&lt;br /&gt;
|$10FE80&lt;br /&gt;
|BIOS_DEVMODE&lt;br /&gt;
|8 bytes&lt;br /&gt;
|BIOS&lt;br /&gt;
|All set to 0x00 in normal mode. Set to &amp;quot;1streset&amp;quot; string in developer mode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Joypad Related=&lt;br /&gt;
&lt;br /&gt;
These values are updated by calling [[SYSTEM_IO]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FD94&lt;br /&gt;
|BIOS_P1STATUS&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|0:No connection, 1:Normal joypad, 2:Expanded joypad, 3:Mahjong controller, 4:Keyboard&lt;br /&gt;
|-&lt;br /&gt;
|$10FD95&lt;br /&gt;
|BIOS_P1PREVIOUS&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Inputs on previous frame [DCBA Right Left Down Up] (positive logic).&lt;br /&gt;
|-&lt;br /&gt;
|$10FD96&lt;br /&gt;
|BIOS_P1CURRENT&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Inputs on current frame [DCBA Right Left Down Up] (positive logic).&lt;br /&gt;
|-&lt;br /&gt;
|$10FD97&lt;br /&gt;
|BIOS_P1CHANGE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Buttons just pressed, active edge [DCBA Right Left Down Up] (positive logic).&lt;br /&gt;
|-&lt;br /&gt;
|$10FD98&lt;br /&gt;
|BIOS_P1REPEAT&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Active edge + repeat every 8 frames after 16 frames. [DCBA Right Left Down Up] (positive logic).&lt;br /&gt;
|-&lt;br /&gt;
|$10FD99&lt;br /&gt;
|BIOS_P1TIMER&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Repeat timer (counts down from 8 to 0).&lt;br /&gt;
|-&lt;br /&gt;
|$10FD9A~$10FD9F&lt;br /&gt;
|Same for P2&lt;br /&gt;
|6 bytes&lt;br /&gt;
|BIOS&lt;br /&gt;
|See above&lt;br /&gt;
|-&lt;br /&gt;
|$10FDA0~$10FDA6&lt;br /&gt;
|Same for P3&lt;br /&gt;
|6 bytes&lt;br /&gt;
|BIOS&lt;br /&gt;
|See above&lt;br /&gt;
|-&lt;br /&gt;
|$10FDA7~$10FDAB&lt;br /&gt;
|Same for P4&lt;br /&gt;
|6 bytes&lt;br /&gt;
|BIOS&lt;br /&gt;
|See above&lt;br /&gt;
|-&lt;br /&gt;
|$10FDAC&lt;br /&gt;
|BIOS_STATCURNT&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Select P4, Start P4, Select P3, Start P3, Select P2, Start P2, Select P1, Start P1 (positive logic)&lt;br /&gt;
&lt;br /&gt;
On MVS the select bits are always read as 0.&lt;br /&gt;
|-&lt;br /&gt;
|$10FDAD&lt;br /&gt;
|BIOS_STATCHANGE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Select P4, Start P4, Select P3, Start P3, Select P2, Start P2, Select P1, Start P1 (positive logic)&lt;br /&gt;
&lt;br /&gt;
On MVS the select bits are always read as 0.&lt;br /&gt;
|-&lt;br /&gt;
|$10FEDC&lt;br /&gt;
|BIOS_STATCURNT_RAW&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Select P4, Start P4, Select P3, Start P3, Select P2, Start P2, Select P1, Start P1 (positive logic)&lt;br /&gt;
|-&lt;br /&gt;
|$10FEDD&lt;br /&gt;
|BIOS_STATCHANGE_RAW&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Select P4, Start P4, Select P3, Start P3, Select P2, Start P2, Select P1, Start P1 (positive logic)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Memory Card Related=&lt;br /&gt;
&lt;br /&gt;
See [[CARD]] for more details on those variables.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FDC4&lt;br /&gt;
|BIOS_CARD_COMMAND&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS or Game&lt;br /&gt;
|Command to execute&lt;br /&gt;
|-&lt;br /&gt;
|$10FDC5&lt;br /&gt;
|BIOS_CARD_MODE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS?&lt;br /&gt;
|Internal use?&lt;br /&gt;
|-&lt;br /&gt;
|$10FDC6&lt;br /&gt;
|BIOS_CARD_ANSWER&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Answer code for the command&lt;br /&gt;
|-&lt;br /&gt;
|$10FDC8&lt;br /&gt;
|BIOS_CARD_START&lt;br /&gt;
|longword&lt;br /&gt;
|BIOS or Game&lt;br /&gt;
|Pointer to data&lt;br /&gt;
|-&lt;br /&gt;
|$10FDCC&lt;br /&gt;
|BIOS_CARD_SIZE&lt;br /&gt;
|word&lt;br /&gt;
|BIOS or Game&lt;br /&gt;
|Size of data&lt;br /&gt;
|-&lt;br /&gt;
|$10FDCE&lt;br /&gt;
|BIOS_CARD_FCB&lt;br /&gt;
|word&lt;br /&gt;
|BIOS or Game&lt;br /&gt;
|Game NGH number&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD0&lt;br /&gt;
|BIOS_CARD_SUB&lt;br /&gt;
|byte or word&lt;br /&gt;
|BIOS or Game&lt;br /&gt;
|Game Subnumber&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=MESS OUT Related=&lt;br /&gt;
&lt;br /&gt;
See [[MESS_OUT]] to know how to use this routine.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FDBE&lt;br /&gt;
|BIOS_MESS_POINT&lt;br /&gt;
|longword&lt;br /&gt;
|Game&lt;br /&gt;
|Buffer pointer&lt;br /&gt;
|-&lt;br /&gt;
|$10FDC2&lt;br /&gt;
|BIOS_MESS_BUSY&lt;br /&gt;
|byte&lt;br /&gt;
|Game&lt;br /&gt;
|0:Allow MESS_OUT, 1:Skip MESS_OUT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Calendar Related=&lt;br /&gt;
&lt;br /&gt;
Those value are updated when [[READ_CALENDAR]] is called&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD2&lt;br /&gt;
|BIOS_YEAR&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current year&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD3&lt;br /&gt;
|BIOS_MONTH&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current month&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD4&lt;br /&gt;
|BIOS_DAY&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current day&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD5&lt;br /&gt;
|BIOS_WEEKDAY&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current weekday (Sunday = 00, Monday = 01 ... Saturday = 06)&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD6&lt;br /&gt;
|BIOS_HOUR&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current hour (24h format)&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD7&lt;br /&gt;
|BIOS_MINUTE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current minute&lt;br /&gt;
|-&lt;br /&gt;
|$10FDD8&lt;br /&gt;
|BIOS_SECOND&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Current minute&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Internal=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FCEF&lt;br /&gt;
|BIOS_SLOTCHECK&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|[[Slot check]] passed if non-zero&lt;br /&gt;
|-&lt;br /&gt;
|$10FDDA&lt;br /&gt;
|BIOS_COMPULSION_TIMER&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Timer for the game compulsion start feature, in seconds. BCD format.&lt;br /&gt;
|-&lt;br /&gt;
|$10FDDB&lt;br /&gt;
|BIOS_COMPULSION_FRAME_TIMER&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Frame-based timer for the game compulsion start feature.&lt;br /&gt;
&lt;br /&gt;
When it underflows, the timer is reset to 59 and START_COMPULSION_TIMER is decremented.&lt;br /&gt;
|-&lt;br /&gt;
|$10FE88&lt;br /&gt;
|BIOS_FRAME_COUNTER&lt;br /&gt;
|longword&lt;br /&gt;
|BIOS&lt;br /&gt;
|Frame counter, updated by SYSTEM_IO.&lt;br /&gt;
|-&lt;br /&gt;
|$10FEBF&lt;br /&gt;
|BIOS_BRAM_USED&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|0:[[Backup RAM]] not currently used, 1:Currently used&lt;br /&gt;
|-&lt;br /&gt;
|$10FEE1&lt;br /&gt;
|BIOS_FRAME_SKIP&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Number of frames to skip in the routine which checks demo_end or if the player has pressed start.&lt;br /&gt;
&lt;br /&gt;
Decremented in [[SYSTEM_IO]].&lt;br /&gt;
|-&lt;br /&gt;
|$10FEE3&lt;br /&gt;
|BIOS_INT1_SKIP&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Only used in [[SYSTEM_INT1]]. If non-zero, will only do the [[RTC]] check during INT1.&lt;br /&gt;
|-&lt;br /&gt;
|$10FEE4&lt;br /&gt;
|BIOS_INT1_FRAME_COUNTER&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Frame counter, only used in [[SYSTEM_INT1]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=4P mode related=&lt;br /&gt;
&lt;br /&gt;
Thoses will be valid on a 4P compatible bios only&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FEF8&lt;br /&gt;
|BIOS_4P_REQUESTED&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Keeps a local copy of hard dip 2 status on bootup.&lt;br /&gt;
&lt;br /&gt;
0: dip2 wasn&#039;t set&lt;br /&gt;
&lt;br /&gt;
$2: dip 2 was on.&lt;br /&gt;
|-&lt;br /&gt;
|$10FEFA&lt;br /&gt;
|BIOS_4P_MODE&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|Main 4P flag, is set when hard dip 2 is on and 4P board is found.&lt;br /&gt;
&lt;br /&gt;
0: regular play&lt;br /&gt;
&lt;br /&gt;
$FF: 4P mode game&lt;br /&gt;
|-&lt;br /&gt;
|$10FEFB&lt;br /&gt;
|BIOS_4P_PLUGGED&lt;br /&gt;
|byte&lt;br /&gt;
|BIOS&lt;br /&gt;
|0: 4P board not found&lt;br /&gt;
&lt;br /&gt;
$FF: 4P board plugged&lt;br /&gt;
&lt;br /&gt;
4P compatible bios will check for 4P board regardless of dip2 switch status.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=CD only=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FEF4&lt;br /&gt;
|BIOS_UPDEST&lt;br /&gt;
|Long&lt;br /&gt;
|Game&lt;br /&gt;
|Copy destination address&lt;br /&gt;
|-&lt;br /&gt;
|$10FEF8&lt;br /&gt;
|BIOS_UPSRC&lt;br /&gt;
|Long&lt;br /&gt;
|Game&lt;br /&gt;
|Copy source address&lt;br /&gt;
|-&lt;br /&gt;
|$10FEFC&lt;br /&gt;
|BIOS_UPSIZE&lt;br /&gt;
|Long&lt;br /&gt;
|Game&lt;br /&gt;
|Copy data size&lt;br /&gt;
|-&lt;br /&gt;
|$10FEDA&lt;br /&gt;
|BIOS_UPZONE&lt;br /&gt;
|Byte&lt;br /&gt;
|Game&lt;br /&gt;
|Copy zone (0=PRG, 1=FIX, 2=SPR, 3=Z80, 4=PCM, 5=PAT, 7=OBJ, 8=A** files)&lt;br /&gt;
|-&lt;br /&gt;
|$10FEDB&lt;br /&gt;
|BIOS_UPBANK&lt;br /&gt;
|Byte&lt;br /&gt;
|Game&lt;br /&gt;
|Copy bank&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Others=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;DEF name&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Set by&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$10FCEE&lt;br /&gt;
|?&lt;br /&gt;
|byte&lt;br /&gt;
|GAME&lt;br /&gt;
|Z80/M ROM check pass&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Base system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Magician_Lord&amp;diff=9320</id>
		<title>Magician Lord</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Magician_Lord&amp;diff=9320"/>
		<updated>2026-09-08T05:23:09Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameInfo|right&lt;br /&gt;
|en_title=Magician Lord&lt;br /&gt;
|jp_title=Magician Lord&lt;br /&gt;
|jp_title2=マジシャンロード&lt;br /&gt;
|developer=Alpha Denshi Co.&lt;br /&gt;
|ngh_id=005&lt;br /&gt;
|megcount=46&lt;br /&gt;
|mvs_release=yes&lt;br /&gt;
|mvs_release_en=y&lt;br /&gt;
|mvs_release_jp=y&lt;br /&gt;
|mvs_romset=maglord&lt;br /&gt;
|mvs_date=1990&lt;br /&gt;
|mvs_pchip=&lt;br /&gt;
|mvs_pboard=PROG-EP&lt;br /&gt;
|mvs_cboard=CHA-32&lt;br /&gt;
|aes_release=y&lt;br /&gt;
|aes_release_jp=y&lt;br /&gt;
|aes_release_en=y&lt;br /&gt;
|aes_romset=maglordh&lt;br /&gt;
|aes_date=01/07/91&lt;br /&gt;
|cd_release=y&lt;br /&gt;
|cd_release_jp=y&lt;br /&gt;
|cd_release_en=y&lt;br /&gt;
|cd_date=31/10/94&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Uses no custom chips.&lt;br /&gt;
&lt;br /&gt;
The letter G of the &amp;quot;MAX 330 MEGA&amp;quot; text is slightly fucked up.&lt;br /&gt;
&lt;br /&gt;
[[Category:Games]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-PCM2&amp;diff=9319</id>
		<title>NEO-PCM2</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-PCM2&amp;diff=9319"/>
		<updated>2026-09-05T18:35:46Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=brd_pcm2.jpg&lt;br /&gt;
|pkg=QFP120&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1999, 2002&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on=[[Cartridges]], [[ROM-Only boards]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Second version of {{Chipname|PCM}} which confusingly exists in two forms under the same name. [[V ROM]] demultiplexer, decryption and [[P ROM]] banking chip.&lt;br /&gt;
&lt;br /&gt;
The demultiplexing logic is exactly the same as the one found in PCM.&lt;br /&gt;
&lt;br /&gt;
=Jumpers=&lt;br /&gt;
&lt;br /&gt;
The ROM and mapping configuration for a given game is set by external jumpers. There are 3 for the V ROMs (JV1 to JV3) and 4 for the P ROMs (J1 to J4).&lt;br /&gt;
These do not appear to affect security functions.&lt;br /&gt;
&lt;br /&gt;
V ROM mapping uses address bits 20 to 23. There are 4 chip select outputs.&lt;br /&gt;
&lt;br /&gt;
=Security=&lt;br /&gt;
&lt;br /&gt;
The security function of the 1999 SNK branded version only performs address descrambling on V ROMs. The Playmore version which came out in 2002 adds a data decryption layer on top, which means both are not interchangeable.&lt;br /&gt;
&lt;br /&gt;
The decryption algorithm used by emulators currently isn&#039;t perfectly exact, which explains the presence of a few corrupt bytes in decrypted romsets causing minor audio glitches (Samurai Shodown V &amp;quot;Basara&amp;quot; sample).&lt;br /&gt;
&lt;br /&gt;
==SNK version==&lt;br /&gt;
&lt;br /&gt;
P ROM bank selection is done by writing the 3 lower bits of the [[68k memory map|port zone]] with A19 high to not affect the V ROM setting. ie. $200000 (word) or $200001 (even) with mirrors up to $2FFFFF.&lt;br /&gt;
Metal Slug 4 for example writes words to $2FFFF0. Todo: how does the bank number map to an address.&lt;br /&gt;
&lt;br /&gt;
V ROM address scrambling is only done on the 4 lower bits by selectively inverting them depending on the configuration set by the [[68k]] CPU. Bits 4 to 23 go straight through.&lt;br /&gt;
&lt;br /&gt;
This is set by first writing 7 to the [[68k memory map|port zone]], the same way P bank 7 would be selected. And then writing the 3 bit configuration value with A19 low.&lt;br /&gt;
Metal Slug 4 for example writes words on startup to the bogus addresses $200000, $208000 and $220000.&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! V configuration !! VA3 !! VA2 !! VA1 !! VA0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || invert || invert || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 1 || invert || invert || normal || invert&lt;br /&gt;
|-&lt;br /&gt;
| 2 || normal || invert || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 3 || invert || invert || normal || invert&lt;br /&gt;
|-&lt;br /&gt;
| 4 || invert || invert || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 5 || invert || invert || normal || normal&lt;br /&gt;
|-&lt;br /&gt;
| 6 || invert || normal || invert || invert&lt;br /&gt;
|-&lt;br /&gt;
| 7 || invert || invert || normal || invert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Playmore version==&lt;br /&gt;
&lt;br /&gt;
Todo.&lt;br /&gt;
&lt;br /&gt;
=Games=&lt;br /&gt;
&lt;br /&gt;
Used by:&lt;br /&gt;
* [[Matrimelee]] (Playmore)&lt;br /&gt;
* [[Metal Slug 4]] (SNK)&lt;br /&gt;
* [[Metal Slug 5]] (Playmore)&lt;br /&gt;
* [[Pochi and Nyaa]] (SNK)&lt;br /&gt;
* [[Rage of the Dragons]] (SNK)&lt;br /&gt;
* [[Samurai Shodown V]] (Playmore)&lt;br /&gt;
* [[Samurai Shodown V Special]] (Playmore)&lt;br /&gt;
* [[SNK vs. Capcom - SVC Chaos]] (Playmore)&lt;br /&gt;
* [[The King of Fighters 2001]] (SNK)&lt;br /&gt;
* [[The King of Fighters 2002]] (Playmore)&lt;br /&gt;
* [[The King of Fighters 2003]] (Playmore)&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Neo-pcm2_pinout.png|800px]]&lt;br /&gt;
&lt;br /&gt;
OpenOffice Draw file: [[File:neo-pcm2.odg]]&lt;br /&gt;
&lt;br /&gt;
Does the Playmore version have the same pinout ?&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Main_Page&amp;diff=9318</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Main_Page&amp;diff=9318"/>
		<updated>2026-08-31T21:50:39Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;newhome&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;home-header&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div style=&amp;quot;min-height:110px;&amp;quot;&amp;gt;&lt;br /&gt;
	  [[File:Neo-Geo-AES-Console-Set.png|left|x100px|link=]]&lt;br /&gt;
	  &amp;lt;h2 class=&amp;quot;title&amp;quot;&amp;gt;The NeoGeo Development Wiki&amp;lt;/h2&amp;gt;&lt;br /&gt;
	  &amp;lt;p class=&amp;quot;headline&amp;quot;&amp;gt;This wiki is about every technical aspects of the SNK NeoGeo hardware and software (AES, MVS, CD and CDZ).&amp;lt;br /&amp;gt;Our aim is to provide the most detailed, accurate and up to date information for preservation, homebrew development and repairs.&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;home-left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;home-cat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-base&amp;quot;&amp;gt;[[:Category:Base system|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Base system&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;What&#039;s common to every NeoGeo system: main architecture, data formats...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Base system&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Base system}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-video&amp;quot;&amp;gt;[[:Category:Video system|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Video system&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;How graphics are handled and displayed, from bitplanes and colors to the video output.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Video system&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Video system}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-audio&amp;quot;&amp;gt;[[:Category:Audio system|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Audio system&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Everything related to music and sound effects: The Z80 subsystem, synthesized and sampled sound, CDDA playback...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Audio system&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Audio system}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-repair&amp;quot;&amp;gt;[[:Category:Repairs|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Repairs&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Troubleshooting dead or glitchy MVS boards, CD laser assemblies, cartridges...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Repairs&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Repairs}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-cart&amp;quot;&amp;gt;[[:Category:Cartridge systems|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Cart systems&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Particularities of the AES and MVS systems: ROM types, memory cards, cab I/O, data security... Also [[:Category:Cartridge boards|cartridge boards]] information.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Cartridge systems&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Cartridge systems}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-cd&amp;quot;&amp;gt;[[:Category:CD systems|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;CD systems&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;NeoGeo CD and CDZ specificities: Differences and limitations, new memory functions, CDDA...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=CD systems&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:CD systems}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-code&amp;quot;&amp;gt;[[:Category:Code|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Software&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Code snippets, register definitions, guides on how to display stuff, use the system ROM, play music and sounds, read user input...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Code&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Code}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-chips&amp;quot;&amp;gt;[[:Category:Chips|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Electronics&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;What makes everything work (or not). Schematics, chip pinouts and functions, troubleshooting hardware issues...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Chips&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Chips}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;head cat-games&amp;quot;&amp;gt;[[:Category:Games|&amp;lt;span class=&amp;quot;cattitle&amp;quot;&amp;gt;&amp;lt;span&amp;gt;Games&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Game technical data and oddities such as use of special effects, unusual hardware...&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&#039;&#039;&#039;Last edits&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;forum&amp;gt;&lt;br /&gt;
                category=Games&lt;br /&gt;
                count=3&lt;br /&gt;
            &amp;lt;/forum&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;{{PAGESINCAT:Games}} pages&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;home-right&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
==[[Special:RecentChanges|Recent changes]] (minor edits hidden)==&lt;br /&gt;
{{Special:Recentchanges/4,hideminor}}&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
==About this wiki==&lt;br /&gt;
    &amp;lt;ul style=&amp;quot;list-style:outside none none;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;The wiki has {{NUMBEROFARTICLES}} pages thanks to our [[Special:Userlist|contributors]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Hosting provided by [[User:Furrtek|Furrtek]], previously by [[User:ElBarto|ElBarto]] for 15 years !&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Don&#039;t know where to start ? Try [[How_to_start|here]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Can&#039;t find what you&#039;re looking for ? Try our [[links]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&#039;&#039;&#039;Want to help ? Just [[Join_wiki|register]] &#039;&#039;&#039; !&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;&#039;&#039;&#039;How to edit, guidelines, available templates, suggestions: [[The wiki]]&#039;&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;home-block&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Todo==&lt;br /&gt;
* See [[Special:WantedPages|wanted pages]], [[Special:AncientPages|old pages]], [[Special:ShortPages|short pages]], and [[Todo/Mysteries]].&lt;br /&gt;
* Make subcategories, move/merge &amp;quot;BIOS calls&amp;quot;&lt;br /&gt;
* Better troubleshooting tips&lt;br /&gt;
* Make a downloadable offline capture every few months ?&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-HYCS&amp;diff=9317</id>
		<title>NEO-HYCS</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-HYCS&amp;diff=9317"/>
		<updated>2026-08-24T07:59:48Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:hycs.jpg|thumb]]&lt;br /&gt;
[[File:hycs.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
Original bodge board from SNK to fix [[V ROM]] selection on a few {{PCB|PROGBK2R}} and {{PCB|PROGBK3R}} based carts:&lt;br /&gt;
&lt;br /&gt;
* [[SNK vs. Capcom - SVC Chaos]]&lt;br /&gt;
* [[Samurai Shodown V]]&lt;br /&gt;
&lt;br /&gt;
Apparently used to disable the V1 ROM for a short period at power on, possibly to allow [[NEO-PCM2]] to read the decryption parameters properly. Removing the board causes corrupt sound or games to show a &amp;quot;bank error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
MM311: Mitsumi PST600D reset generator (4.2V threshold). Forces V1 /CS high at startup, then lets the PCM2 signal through.&lt;br /&gt;
&lt;br /&gt;
This fix was implemented in {{PCB|PROGBK3S}} boards.&lt;br /&gt;
&lt;br /&gt;
[[Category:Cartridge systems]]&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Sprite_graphics_format&amp;diff=9316</id>
		<title>Sprite graphics format</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Sprite_graphics_format&amp;diff=9316"/>
		<updated>2026-08-19T00:57:02Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:spritegfx2.png|center]]&lt;br /&gt;
&lt;br /&gt;
The NeoGeo uses 16x16 pixels, 4 bits per pixel tiles for sprites.&lt;br /&gt;
&lt;br /&gt;
They are stored as four 8x8 pixels blocks in the top-right, bottom-right, top-left, bottom-left order. Each row of these 8x8 blocks is stored &#039;&#039;&#039;backwards&#039;&#039;&#039; in a planar organization (each byte represents a bitplane).&lt;br /&gt;
&lt;br /&gt;
* On cartridge systems, bitplanes 0 and 1 go in the odd [[C ROM]]s (C1, C3...), while bitplanes 2 and 3 go in the even ones (C2, C4...).&lt;br /&gt;
* On [[CD systems]], bitplanes follow a 1/0/3/2 order.&lt;br /&gt;
&lt;br /&gt;
=Size=&lt;br /&gt;
&lt;br /&gt;
One tile is 16 * 16 pixels * 4 bits per pixel = 1024 bits = &#039;&#039;&#039;128 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Addressing=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bit # ...543210&lt;br /&gt;
      ...nCLLLL&lt;br /&gt;
&lt;br /&gt;
n: Tile number (multiple bits)&lt;br /&gt;
C: Block column, 0 = blocks 1 &amp;amp; 2, 1 = blocks 3 &amp;amp; 4&lt;br /&gt;
L: Block row # (0~15)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Sig|CA4|CA4}} is &amp;quot;C&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;quot;Consolegfx&amp;quot;-style definition=&lt;br /&gt;
&lt;br /&gt;
Each group represents one byte.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;t&#039;&#039;&#039; is the 8x8 block number (1 to 4) as shown above.&lt;br /&gt;
* &#039;&#039;&#039;r&#039;&#039;&#039; is the row number in the block (0 to 7).&lt;br /&gt;
* &#039;&#039;&#039;bp&#039;&#039;&#039; is the bitplane number (0 to 3).&lt;br /&gt;
&lt;br /&gt;
==Odd C ROMs==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [t1, r0, bp0], [t1, r0, bp1], [t1, r1, bp0], [t1, r1, bp1],&lt;br /&gt;
  [t1, r2, bp0], [t1, r2, bp1], [t1, r3, bp0], [t1, r3, bp1],&lt;br /&gt;
  [t1, r4, bp0], [t1, r4, bp1], [t1, r5, bp0], [t1, r5, bp1],&lt;br /&gt;
  [t1, r6, bp0], [t1, r6, bp1], [t1, r7, bp0], [t1, r7, bp1],&lt;br /&gt;
&lt;br /&gt;
  [t2, r0, bp0], [t2, r0, bp1], [t2, r1, bp0], [t2, r1, bp1],&lt;br /&gt;
  [t2, r2, bp0], [t2, r2, bp1], [t2, r3, bp0], [t2, r3, bp1],&lt;br /&gt;
  [t2, r4, bp0], [t2, r4, bp1], [t2, r5, bp0], [t2, r5, bp1],&lt;br /&gt;
  [t2, r6, bp0], [t2, r6, bp1], [t2, r7, bp0], [t2, r7, bp1]&lt;br /&gt;
&lt;br /&gt;
  [t3, r0, bp0], [t3, r0, bp1], [t3, r1, bp0], [t3, r1, bp1],&lt;br /&gt;
  [t3, r2, bp0], [t3, r2, bp1], [t3, r3, bp0], [t3, r3, bp1],&lt;br /&gt;
  [t3, r4, bp0], [t3, r4, bp1], [t3, r5, bp0], [t3, r5, bp1],&lt;br /&gt;
  [t3, r6, bp0], [t3, r6, bp1], [t3, r7, bp0], [t3, r7, bp1]&lt;br /&gt;
&lt;br /&gt;
  [t4, r0, bp0], [t4, r0, bp1], [t4, r1, bp0], [t4, r1, bp1],&lt;br /&gt;
  [t4, r2, bp0], [t4, r2, bp1], [t4, r3, bp0], [t4, r3, bp1],&lt;br /&gt;
  [t4, r4, bp0], [t4, r4, bp1], [t4, r5, bp0], [t4, r5, bp1],&lt;br /&gt;
  [t4, r6, bp0], [t4, r6, bp1], [t4, r7, bp0], [t4, r7, bp1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Even C ROMs==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [t1, r0, bp2], [t1, r0, bp3], [t1, r1, bp2], [t1, r1, bp3],&lt;br /&gt;
  [t1, r2, bp2], [t1, r2, bp3], [t1, r3, bp2], [t1, r3, bp3],&lt;br /&gt;
  [t1, r4, bp2], [t1, r4, bp3], [t1, r5, bp2], [t1, r5, bp3],&lt;br /&gt;
  [t1, r6, bp2], [t1, r6, bp3], [t1, r7, bp2], [t1, r7, bp3],&lt;br /&gt;
&lt;br /&gt;
  [t2, r0, bp2], [t2, r0, bp3], [t2, r1, bp2], [t2, r1, bp3],&lt;br /&gt;
  [t2, r2, bp2], [t2, r2, bp3], [t2, r3, bp2], [t2, r3, bp3],&lt;br /&gt;
  [t2, r4, bp2], [t2, r4, bp3], [t2, r5, bp2], [t2, r5, bp3],&lt;br /&gt;
  [t2, r6, bp2], [t2, r6, bp3], [t2, r7, bp2], [t2, r7, bp3]&lt;br /&gt;
&lt;br /&gt;
  [t3, r0, bp2], [t3, r0, bp3], [t3, r1, bp2], [t3, r1, bp3],&lt;br /&gt;
  [t3, r2, bp2], [t3, r2, bp3], [t3, r3, bp2], [t3, r3, bp3],&lt;br /&gt;
  [t3, r4, bp2], [t3, r4, bp3], [t3, r5, bp2], [t3, r5, bp3],&lt;br /&gt;
  [t3, r6, bp2], [t3, r6, bp3], [t3, r7, bp2], [t3, r7, bp3]&lt;br /&gt;
&lt;br /&gt;
  [t4, r0, bp2], [t4, r0, bp3], [t4, r1, bp2], [t4, r1, bp3],&lt;br /&gt;
  [t4, r2, bp2], [t4, r2, bp3], [t4, r3, bp2], [t4, r3, bp3],&lt;br /&gt;
  [t4, r4, bp2], [t4, r4, bp3], [t4, r5, bp2], [t4, r5, bp3],&lt;br /&gt;
  [t4, r6, bp2], [t4, r6, bp3], [t4, r7, bp2], [t4, r7, bp3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Decoding=&lt;br /&gt;
&lt;br /&gt;
Pseudocode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block = 0 to 3 {&lt;br /&gt;
    select block {&lt;br /&gt;
        case 0: xOfs = 8: yOfs = 0&lt;br /&gt;
        case 1: xOfs = 8: yOfs = 8&lt;br /&gt;
        case 2: xOfs = 0: yOfs = 0&lt;br /&gt;
        case 3: xOfs = 0: yOfs = 8&lt;br /&gt;
    }&lt;br /&gt;
    for row = 0 to 7 {&lt;br /&gt;
        BitPlane(0) = ReadByte(1)&lt;br /&gt;
        BitPlane(1) = ReadByte(1)&lt;br /&gt;
        BitPlane(2) = ReadByte(2)&lt;br /&gt;
        BitPlane(3) = ReadByte(2)&lt;br /&gt;
        for pixels = 0 to 7 {&lt;br /&gt;
            xPos = pixels + xOfs&lt;br /&gt;
            yPos = row + yOfs&lt;br /&gt;
            ColorIndex = 0&lt;br /&gt;
            for bitplanes = 0 to 3&lt;br /&gt;
                ColorIndex .= GetBit(BitPlane(3 - bitplanes)), 7 - pixels)&lt;br /&gt;
            PixelSet (xPos, yPos), Palette[ColorIndex]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Coding=&lt;br /&gt;
&lt;br /&gt;
[[Category:Video system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Z80_bankswitching&amp;diff=9315</id>
		<title>Z80 bankswitching</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Z80_bankswitching&amp;diff=9315"/>
		<updated>2026-08-18T23:22:21Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Z80]] can only natively address 64kiB of memory at most because of its 16-bit address bus. To overcome this limit, bankswitching is provided in [[cartridges]] to access up to 4MiB of [[M1 ROM]]. [[CD systems]] provide no Z80 bankswitching.&lt;br /&gt;
&lt;br /&gt;
=Operation=&lt;br /&gt;
&lt;br /&gt;
A standard of four bankswitching windows are available. The [[Z80|$0000~$7FFF range]] is fixed to the first 32kiB of ROM, and $F800~$FFFF to [[Z80 RAM]].&lt;br /&gt;
&lt;br /&gt;
All windows allow an 8-bit bank selection.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Z80 port&lt;br /&gt;
!Window address&lt;br /&gt;
!Size&lt;br /&gt;
!Bank range&lt;br /&gt;
|-&lt;br /&gt;
|$08||$F000~$F7FF||2KiB||$000000~$07FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$E000~$EFFF||4KiB||$000000~$0FFFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$C000~$DFFF||8KiB||$000000~$1FFFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$8000~$BFFF||16KiB||$000000~$3FFFFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bank numbers are undefined on startup, the Z80 code must initialize them.&lt;br /&gt;
&lt;br /&gt;
To save pins on bankswitching chips in cartridges such as the {{chipname|NEO-ZMC}}, SNK used a quirk of the Z80 that allows placing data on its address bus. Therefore, to set a bank number, the Z80 port must be &#039;&#039;&#039;read&#039;&#039;&#039; with the bank number in the upper address bits. &lt;br /&gt;
&lt;br /&gt;
For example, this will set the $F000~$F7FF window to bank 25, ie. ROM 25 * 2kiB = $C800~$CFFF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld a,25&lt;br /&gt;
in a,(8)    ; Places 25 on address[15:8] (bank number), 8 on address[7:0] (port number)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, this will set the $8000~$BFFF window to bank 243, ie. ROM 243 * 16kiB = $3CC000~$3CFFFF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld bc,$F30B&lt;br /&gt;
in a,(c)    ; Places $F3 = 243 on address[15:8] (bank number), $0B on address[7:0] (port number)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To set up the banks to map the whole $0000~$F7FF range linearly to the beginning of the M1 ROM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld    a,30&lt;br /&gt;
in    a,($08)    ; Set window $F000~$F7FF at 30*$800 = $F000&lt;br /&gt;
ld    a,14&lt;br /&gt;
in    a,($09)    ; Set window $E000~$EFFF at 14*$1000 = $E000&lt;br /&gt;
ld    a,6&lt;br /&gt;
in    a,($0A)    ; Set window $C000~$DFFF at 6*$2000 = $C000&lt;br /&gt;
ld    a,2&lt;br /&gt;
in    a,($0B)    ; Set window $8000~$BFFF at 2*$4000 = $8000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another example from [[The King of Fighters &#039;97]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Function takes 32KiB bank number in A&lt;br /&gt;
rlca&lt;br /&gt;
rlca&lt;br /&gt;
ld    e,a&lt;br /&gt;
ld    d,$00      ; DE = A * 4 (table entry size)&lt;br /&gt;
ld    hl,$289C   ; Table address, see below&lt;br /&gt;
add   hl,de&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($08)    ; Set window $F000~$F7FF&lt;br /&gt;
inc   hl&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($09)    ; Set window $E000~$EFFF&lt;br /&gt;
inc   hl&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($0A)    ; Set window $C000~$DFFF&lt;br /&gt;
inc   hl&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($0B)    ; Set window $8000~$BFFF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The table at $289C is used to set the 4 windows like an unique $7800-bytes long bank in 32KiB increments, meaning that last $800 bytes are wasted at the end of each range (mapped to [[Z80 RAM]]):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1E 0E 06 02  = F000,  E000,  C000,  8000   &amp;quot;Big bank 0&amp;quot;: $08000~$0F7FF  ($0F800~$0FFFF is wasted)&lt;br /&gt;
2E 16 0A 04  = 17000, 16000, 14000, 10000  &amp;quot;Big bank 1&amp;quot;: $10000~$177FF  ($177FF~$17FFF is wasted)&lt;br /&gt;
3E 1E 0E 06  = 1F000, 1E000, 1C000, 18000  &amp;quot;Big bank 2&amp;quot;: $18000~$1F7FF  ($1F7FF~$1FFFF is wasted)&lt;br /&gt;
4E 26 12 08  = 27000, 26000, 24000, 20000  &amp;quot;Big bank 3&amp;quot;: $20000~$277FF  ($277FF~$27FFF is wasted)&lt;br /&gt;
5E 2E 16 0A  = 2F000, 2E000, 2C000, 28000  &amp;quot;Big bank 4&amp;quot;: $28000~$2F7FF  ($2F7FF~$2FFFF is wasted)&lt;br /&gt;
6E 36 1A 0C  = 37000, 36000, 34000, 30000  &amp;quot;Big bank 5&amp;quot;: $30000~$377FF  ($377FF~$37FFF is wasted)&lt;br /&gt;
7E 3E 1E 0E  = 3F000, 3E000, 3C000, 38000  &amp;quot;Big bank 6&amp;quot;: $38000~$3F7FF  ($3F7FF~$3FFFF is wasted)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the game has a 128KiB [[M1 ROM]], but the table is long enough to map up to 256KiB.&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
&lt;br /&gt;
SDA8~SDA15 are used for the bank number (data), SDA0 and SDA1 for selecting the window.&lt;br /&gt;
&lt;br /&gt;
The write (Z80 read) strobe SDRD0 is [[Z80 port map|port]] address decoded inside the system when SDA[3:2] = 2 (ports $8~$B).&lt;br /&gt;
&lt;br /&gt;
Internal logic: [https://github.com/furrtek/Neogeo_MiSTer_old/blob/master/io/zmc.v zmc.v (verilog)]&lt;br /&gt;
&lt;br /&gt;
SDRD0 must be high before configuring banks.&lt;br /&gt;
&lt;br /&gt;
To configure a bank with NEO-ZMC:&lt;br /&gt;
* Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated ?)&lt;br /&gt;
* Set SDA[15:0] = &#039;&#039;&#039;$050B&#039;&#039;&#039;, bank 5 in $8000~$BFFF window&lt;br /&gt;
* Set SDRD0 high (latch bank)&lt;br /&gt;
* Now when the Z80 reads the &#039;&#039;&#039;$8000~BFFF&#039;&#039;&#039; range, it will be mapped to M1 ROM &#039;&#039;&#039;$14000~$17FFF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Audio system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Z80&amp;diff=9314</id>
		<title>Z80</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Z80&amp;diff=9314"/>
		<updated>2026-08-18T23:14:58Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Cartridge systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:cd2_z80.jpg|right|thumb|Z80 in a surface mount package, as found on some MVS and CD boards.]]&lt;br /&gt;
&lt;br /&gt;
The Z80 is a 8-bit little-endian CPU designed by Zilog.&lt;br /&gt;
&lt;br /&gt;
It is used in NeoGeo systems as a sub-CPU to handle sound and music playback. It runs at [[clock|4MHz]] and only has access to the {{Chipname|YM2610}}, the {{Chipname|M1 ROM}} (or [[Z80 file]]s), and its [[Z80 RAM|own RAM]]. It communicates with the {{Chipname|68k}} CPU via a [[68k/Z80 communication|single-byte channel]].&lt;br /&gt;
&lt;br /&gt;
Because it doesn&#039;t share a RAM area with the 68k CPU like on the Sega Genesis, it can&#039;t be used efficiently to offload game computation tasks from the main CPU.&lt;br /&gt;
&lt;br /&gt;
Also see:&lt;br /&gt;
* [[Z80 port map]]&lt;br /&gt;
* [[Z80 bankswitching]]&lt;br /&gt;
&lt;br /&gt;
[[File:aes_z80.jpg|right|thumb|Z80 in DIP package, as found on AES boards.]]&lt;br /&gt;
&lt;br /&gt;
=Interrupts=&lt;br /&gt;
&lt;br /&gt;
* IRQs (address $38) are triggered by the YM2610 timers, if enabled.&lt;br /&gt;
* An NMI (address $66) is triggered when the 68k sends a command byte, if enabled (see [[Z80 port map]]).&lt;br /&gt;
&lt;br /&gt;
=Memory map=&lt;br /&gt;
&lt;br /&gt;
[[File:Z80mmap.png|thumb|Visualization of the Z80&#039;s memory map (proportional areas).]]&lt;br /&gt;
&lt;br /&gt;
==Cartridge systems==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;End&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|$7FFF&lt;br /&gt;
|32KiB&lt;br /&gt;
|Static main code bank (start of the [[M1 ROM]])&lt;br /&gt;
|-&lt;br /&gt;
|$8000&lt;br /&gt;
|$BFFF&lt;br /&gt;
|16KiB&lt;br /&gt;
|[[Z80 bankswitching|Bankswitching window 3]]&lt;br /&gt;
|-&lt;br /&gt;
|$C000&lt;br /&gt;
|$DFFF&lt;br /&gt;
|8KiB&lt;br /&gt;
|Bankswitching window 2&lt;br /&gt;
|-&lt;br /&gt;
|$E000&lt;br /&gt;
|$EFFF&lt;br /&gt;
|4KiB&lt;br /&gt;
|Bankswitching window 1&lt;br /&gt;
|-&lt;br /&gt;
|$F000&lt;br /&gt;
|$F7FF&lt;br /&gt;
|2KiB&lt;br /&gt;
|Bankswitching window 0&lt;br /&gt;
|-&lt;br /&gt;
|$F800&lt;br /&gt;
|$FFFF&lt;br /&gt;
|2KiB&lt;br /&gt;
|[[Z80 RAM|Work RAM]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==CD systems==&lt;br /&gt;
&lt;br /&gt;
CD systems only have 64KiB of RAM dedicated to the {{Chipname|Z80}}. There&#039;s no bankswitching.&lt;br /&gt;
&lt;br /&gt;
It seems that {{Chipname|NEO-SUD}} allows loading [[Z80 file]]s accross the whole range, and locks $0000~$F7FF as read-only to simulate ROM during execution.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Z80_pinout.png|640px]]&lt;br /&gt;
&lt;br /&gt;
=Datasheet=&lt;br /&gt;
&lt;br /&gt;
Z8400 datasheet: [[http://www.datasheetcatalog.org/datasheets/restul/285906_DS.pdf]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;br /&gt;
[[Category:Audio system]]&lt;br /&gt;
[[Category:Base system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Z80&amp;diff=9313</id>
		<title>Z80</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Z80&amp;diff=9313"/>
		<updated>2026-08-18T23:11:41Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Interrupts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:cd2_z80.jpg|right|thumb|Z80 in a surface mount package, as found on some MVS and CD boards.]]&lt;br /&gt;
&lt;br /&gt;
The Z80 is a 8-bit little-endian CPU designed by Zilog.&lt;br /&gt;
&lt;br /&gt;
It is used in NeoGeo systems as a sub-CPU to handle sound and music playback. It runs at [[clock|4MHz]] and only has access to the {{Chipname|YM2610}}, the {{Chipname|M1 ROM}} (or [[Z80 file]]s), and its [[Z80 RAM|own RAM]]. It communicates with the {{Chipname|68k}} CPU via a [[68k/Z80 communication|single-byte channel]].&lt;br /&gt;
&lt;br /&gt;
Because it doesn&#039;t share a RAM area with the 68k CPU like on the Sega Genesis, it can&#039;t be used efficiently to offload game computation tasks from the main CPU.&lt;br /&gt;
&lt;br /&gt;
Also see:&lt;br /&gt;
* [[Z80 port map]]&lt;br /&gt;
* [[Z80 bankswitching]]&lt;br /&gt;
&lt;br /&gt;
[[File:aes_z80.jpg|right|thumb|Z80 in DIP package, as found on AES boards.]]&lt;br /&gt;
&lt;br /&gt;
=Interrupts=&lt;br /&gt;
&lt;br /&gt;
* IRQs (address $38) are triggered by the YM2610 timers, if enabled.&lt;br /&gt;
* An NMI (address $66) is triggered when the 68k sends a command byte, if enabled (see [[Z80 port map]]).&lt;br /&gt;
&lt;br /&gt;
=Memory map=&lt;br /&gt;
&lt;br /&gt;
[[File:Z80mmap.png|thumb|Visualization of the Z80&#039;s memory map (proportional areas).]]&lt;br /&gt;
&lt;br /&gt;
==Cartridge systems==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;regdef&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Start&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;End&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|$0000&lt;br /&gt;
|$7FFF&lt;br /&gt;
|32KiB&lt;br /&gt;
|Static main code bank (start of the [[M1 ROM]])&lt;br /&gt;
|-&lt;br /&gt;
|$8000&lt;br /&gt;
|$BFFF&lt;br /&gt;
|16KiB&lt;br /&gt;
|Switching window 3&lt;br /&gt;
|-&lt;br /&gt;
|$C000&lt;br /&gt;
|$DFFF&lt;br /&gt;
|8KiB&lt;br /&gt;
|Switching window 2&lt;br /&gt;
|-&lt;br /&gt;
|$E000&lt;br /&gt;
|$EFFF&lt;br /&gt;
|4KiB&lt;br /&gt;
|Switching window 1&lt;br /&gt;
|-&lt;br /&gt;
|$F000&lt;br /&gt;
|$F7FF&lt;br /&gt;
|2KiB&lt;br /&gt;
|Switching window 0&lt;br /&gt;
|-&lt;br /&gt;
|$F800&lt;br /&gt;
|$FFFF&lt;br /&gt;
|2KiB&lt;br /&gt;
|[[Z80 RAM|Work RAM]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Having a 16-bit address bus, the {{Chipname|Z80}} CPU allows access to 64KiB of memory at most. In NeoGeo [[cartridges]], the {{Chipname|NEO-ZMC}} or {{Chipname|NEO-ZMC2}} chips provide a way to access more memory for [[M1 ROM]]s up to 4MiB. Four different switchable zones (&amp;quot;windows&amp;quot;) are available.&lt;br /&gt;
&lt;br /&gt;
The bank that appear in these windows are configured by &#039;&#039;&#039;reading&#039;&#039;&#039; from 4 of the Z80&#039;s [[Z80 port map|ports]] (see page for explanation).&lt;br /&gt;
&lt;br /&gt;
Bank offsets numbering depend on the window sizes:&lt;br /&gt;
&lt;br /&gt;
* Window 0 counts in 2KiB increments&lt;br /&gt;
* Window 1 in 4KiB&lt;br /&gt;
* Window 2 in 8KiB&lt;br /&gt;
* Window 3 in 16KiB&lt;br /&gt;
&lt;br /&gt;
On cartridge systems, all windows are initialized to 0 (verified on hardware). Many [[sound driver]]s start up by initializing the windows properly like indicated above.&lt;br /&gt;
&lt;br /&gt;
For example, this code simply maps the Z80 $0000~$F7FF address range to M1 ROM $0000~$F7FF linearly, with no gaps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld    a,$1E&lt;br /&gt;
in    a,($08)    ; Set window 0 at $1E*$800 = $F000&lt;br /&gt;
ld    a,$0E&lt;br /&gt;
in    a,($09)    ; Set window 1 at $E*$1000 = $E000&lt;br /&gt;
ld    a,$06&lt;br /&gt;
in    a,($0A)    ; Set window 2 at $6*$2000 = $C000&lt;br /&gt;
ld    a,$02&lt;br /&gt;
in    a,($0B)    ; Set window 3 at $2*$4000 = $8000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Bank selection===&lt;br /&gt;
&lt;br /&gt;
[[The King of Fighters &#039;97]] does this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; 32KiB bank number in A&lt;br /&gt;
rlca&lt;br /&gt;
rlca&lt;br /&gt;
ld    e,a&lt;br /&gt;
ld    d,$00      ; DE = A * 4 (table entry size)&lt;br /&gt;
ld    hl,$289C   ; Table address, see below&lt;br /&gt;
add   hl,de&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($08)    ; Set zone 0&lt;br /&gt;
inc   hl&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($09)    ; Set zone 1&lt;br /&gt;
inc   hl&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($0A)    ; Set zone 2&lt;br /&gt;
inc   hl&lt;br /&gt;
ld    a,(hl)&lt;br /&gt;
in    a,($0B)    ; Set zone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The table at $289C is used to set the 4 zones like an unique $7800-bytes long one in 32KiB increments, meaning that $800 bytes are wasted at the end of each range (mapped to [[Z80 RAM]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Data at $289C:&lt;br /&gt;
&lt;br /&gt;
1E 0E 06 02  = F000,  E000,  C000,  8000   &amp;quot;Big bank 0&amp;quot;: $8000~ $F7FF   ($F800~ $FFFF  is wasted)&lt;br /&gt;
2E 16 0A 04  = 17000, 16000, 14000, 10000  &amp;quot;Big bank 1&amp;quot;: $10000~$177FF  ($177FF~$17FFF is wasted)&lt;br /&gt;
3E 1E 0E 06  = 1F000, 1E000, 1C000, 18000  &amp;quot;Big bank 2&amp;quot;: $18000~$1F7FF  ($1F7FF~$1FFFF is wasted)&lt;br /&gt;
4E 26 12 08  = 27000, 26000, 24000, 20000  &amp;quot;Big bank 3&amp;quot;: $20000~$277FF  ($277FF~$27FFF is wasted)&lt;br /&gt;
5E 2E 16 0A  = 2F000, 2E000, 2C000, 28000  &amp;quot;Big bank 4&amp;quot;: $28000~$2F7FF  ($2F7FF~$2FFFF is wasted)&lt;br /&gt;
6E 36 1A 0C  = 37000, 36000, 34000, 30000  &amp;quot;Big bank 5&amp;quot;: $30000~$377FF  ($377FF~$37FFF is wasted)&lt;br /&gt;
7E 3E 1E 0E  = 3F000, 3E000, 3C000, 38000  &amp;quot;Big bank 6&amp;quot;: $38000~$3F7FF  ($3F7FF~$3FFFF is wasted)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the game has a 128KiB [[M1 ROM]], but the table is long enough to map up to 256KiB.&lt;br /&gt;
&lt;br /&gt;
==CD systems==&lt;br /&gt;
&lt;br /&gt;
CD systems only have 64KiB of RAM dedicated to the {{Chipname|Z80}}. There&#039;s no bankswitching.&lt;br /&gt;
&lt;br /&gt;
It seems that {{Chipname|NEO-SUD}} allows loading [[Z80 file]]s accross the whole range, and locks $0000~$F7FF as read-only to simulate ROM during execution.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Z80_pinout.png|640px]]&lt;br /&gt;
&lt;br /&gt;
=Datasheet=&lt;br /&gt;
&lt;br /&gt;
Z8400 datasheet: [[http://www.datasheetcatalog.org/datasheets/restul/285906_DS.pdf]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;br /&gt;
[[Category:Audio system]]&lt;br /&gt;
[[Category:Base system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Z80_bankswitching&amp;diff=9312</id>
		<title>Z80 bankswitching</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Z80_bankswitching&amp;diff=9312"/>
		<updated>2026-08-18T23:09:36Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Z80]] can only natively address 64kiB of memory because of its 16-bit address bus. To overcome this limit, bankswitching is provided in [[cartridges]] and [[CD systems]] to access up to 4MiB of [[M1 ROM]].&lt;br /&gt;
&lt;br /&gt;
=Operation=&lt;br /&gt;
&lt;br /&gt;
A standard of four bankswitching windows are available. The $0000 to $7FFF range is fixed to the first 32kiB of ROM, and $F800~$FFFF to [[Z80 RAM]].&lt;br /&gt;
&lt;br /&gt;
All windows allow an 8-bit bank selection.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Z80 port&lt;br /&gt;
!Window address&lt;br /&gt;
!Size&lt;br /&gt;
!Bank range&lt;br /&gt;
|-&lt;br /&gt;
|$08||$F000~$F7FF||2KiB||$000000~$07FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$E000~$EFFF||4KiB||$000000~$0FFFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$C000~$DFFF||8KiB||$000000~$1FFFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$8000~$BFFF||16KiB||$000000~$3FFFFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bank numbers are undefined on startup, the Z80 code must initialize them.&lt;br /&gt;
&lt;br /&gt;
To save pins on bankswitching chips in cartridges such as the {{chipname|NEO-ZMC}}, SNK used a quirk of the Z80 that allows placing data on its address bus. Therefore, to set a bank number, the Z80 port must be &#039;&#039;&#039;read&#039;&#039;&#039; with the bank number in the upper address bits. &lt;br /&gt;
&lt;br /&gt;
For example, this will set the $F000~$F7FF window to bank 25, ie. ROM 25 * 2kiB = $C800~$CFFF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld a,25&lt;br /&gt;
in a,(8)    ; Places 25 on address[15:8] (bank number), 8 on address[7:0] (port number)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, this will set the $8000~$BFFF window to bank 243, ie. ROM 243 * 16kiB = $3CC000~$3CFFFF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld bc,$F30B&lt;br /&gt;
in a,(c)    ; Places $F3 = 243 on address[15:8] (bank number), $0B on address[7:0] (port number)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
&lt;br /&gt;
SDA8~SDA15 are used for the bank number (data), SDA0 and SDA1 for selecting the window.&lt;br /&gt;
&lt;br /&gt;
The write (Z80 read) strobe SDRD0 is [[Z80 port map|port]] address decoded inside the system when SDA[3:2] = 2 (ports $8~$B).&lt;br /&gt;
&lt;br /&gt;
Internal logic: [https://github.com/furrtek/Neogeo_MiSTer_old/blob/master/io/zmc.v zmc.v (verilog)]&lt;br /&gt;
&lt;br /&gt;
SDRD0 must be high before configuring banks.&lt;br /&gt;
&lt;br /&gt;
To configure a bank with NEO-ZMC:&lt;br /&gt;
* Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated ?)&lt;br /&gt;
* Set SDA[15:0] = &#039;&#039;&#039;$050B&#039;&#039;&#039;, bank 5 in $8000~$BFFF window&lt;br /&gt;
* Set SDRD0 high (latch bank)&lt;br /&gt;
* Now when the Z80 reads the &#039;&#039;&#039;$8000~BFFF&#039;&#039;&#039; range, it will be mapped to M1 ROM &#039;&#039;&#039;$14000~$17FFF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Audio system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-ZMC2&amp;diff=9311</id>
		<title>NEO-ZMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-ZMC2&amp;diff=9311"/>
		<updated>2026-08-18T23:09:13Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=mvs_zmc2.jpg&lt;br /&gt;
|pkg=QFP80R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1990&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|MV1FZS}} [[Cartridges]]...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Chipname|NEO-ZMC}} ([[Z80 bankswitching]]) and {{Chipname|PRO-CT0}} (sprite graphics serializer) in one package.&lt;br /&gt;
&lt;br /&gt;
Found in second revision [[MVS hardware|MVS]] boards (for the PRO-CT0 logic only), and AES cartridges.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-ZMC2|640px}}&lt;br /&gt;
&lt;br /&gt;
NEO-ZMC part:&lt;br /&gt;
*SDA0,SDA1,SDA8~SDA15: [[Z80]] address bus &lt;br /&gt;
*MA11~MA21: M ROM address outputs &lt;br /&gt;
&lt;br /&gt;
Serializer part, inputs:&lt;br /&gt;
*12M: 12MHz clock, outputs next pixel on falling edge.&lt;br /&gt;
*C0~C31: C ROM data bus (2*16 bits). Gives all the pixel data needed for a 8 pixel line.&lt;br /&gt;
*H: When high, reverse bit order of pixels shifted out (used for [[sprites]] horizontal flipping)&lt;br /&gt;
*EVEN: Swap A/B pixel outputs&lt;br /&gt;
*LOAD: Latch C ROM data on falling edge of 12M&lt;br /&gt;
*CSDOT: Active low DOTA/DOTB output enable&lt;br /&gt;
*CS: Active low GADx/GBDx output enable&lt;br /&gt;
Outputs:&lt;br /&gt;
*DOTA: High when pixel A is opaque (color &amp;gt; 0)&lt;br /&gt;
*DOTB: High when pixel B is opaque (color &amp;gt; 0)&lt;br /&gt;
*GAD0~GAD3: Pixel A color index&lt;br /&gt;
*GBD0~GBD3: Pixel B color index&lt;br /&gt;
&lt;br /&gt;
=Signals=&lt;br /&gt;
&lt;br /&gt;
[[File:Spr signals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Z80_bankswitching&amp;diff=9310</id>
		<title>Z80 bankswitching</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Z80_bankswitching&amp;diff=9310"/>
		<updated>2026-08-18T23:08:20Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Created page with &amp;quot;The Z80 can only natively address 64kiB of memory because of its 16-bit address bus. To overcome this limit, bankswitching is provided in cartridges and CD systems.  =Operation=  A standard of four bankswitching windows are available. The $0000 to $7FFF range is fixed to the first 32kiB of M1 ROM, and $F800~$FFFF to Z80 RAM.  All windows allow an 8-bit bank selection.  {|class=&amp;quot;wikitable&amp;quot; !Z80 port !Window address !Size !Bank range |- |$08||$F000~$F7F...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Z80]] can only natively address 64kiB of memory because of its 16-bit address bus. To overcome this limit, bankswitching is provided in [[cartridges]] and [[CD systems]].&lt;br /&gt;
&lt;br /&gt;
=Operation=&lt;br /&gt;
&lt;br /&gt;
A standard of four bankswitching windows are available. The $0000 to $7FFF range is fixed to the first 32kiB of [[M1 ROM]], and $F800~$FFFF to [[Z80 RAM]].&lt;br /&gt;
&lt;br /&gt;
All windows allow an 8-bit bank selection.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Z80 port&lt;br /&gt;
!Window address&lt;br /&gt;
!Size&lt;br /&gt;
!Bank range&lt;br /&gt;
|-&lt;br /&gt;
|$08||$F000~$F7FF||2KiB||$000000~$07FFFF&lt;br /&gt;
|-&lt;br /&gt;
|$09||$E000~$EFFF||4KiB||$000000~$0FFFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0A||$C000~$DFFF||8KiB||$000000~$1FFFFF&lt;br /&gt;
|-&lt;br /&gt;
|$0B||$8000~$BFFF||16KiB||$000000~$3FFFFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bank numbers are undefined on startup, the Z80 code must initialize them.&lt;br /&gt;
&lt;br /&gt;
To save pins on bankswitching chips in cartridges such as the {{chipname|NEO-ZMC}}, SNK used a quirk of the Z80 that allows placing data on its address bus. Therefore, to set a bank number, the Z80 port must be &#039;&#039;&#039;read&#039;&#039;&#039; with the bank number in the upper address bits. &lt;br /&gt;
&lt;br /&gt;
For example, this will set the $F000~$F7FF window to bank 25, ie. ROM 25 * 2kiB = $C800~$CFFF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld a,25&lt;br /&gt;
in a,(8)    ; Places 25 on address[15:8] (bank number), 8 on address[7:0] (port number)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, this will set the $8000~$BFFF window to bank 243, ie. ROM 243 * 16kiB = $3CC000~$3CFFFF&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld bc,$F30B&lt;br /&gt;
in a,(c)    ; Places $F3 = 243 on address[15:8] (bank number), $0B on address[7:0] (port number)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
&lt;br /&gt;
SDA8~SDA15 are used for the bank number (data), SDA0 and SDA1 for selecting the window.&lt;br /&gt;
&lt;br /&gt;
The write (Z80 read) strobe SDRD0 is [[Z80 port map|port]] address decoded inside the system when SDA[3:2] = 2 (ports $8~$B).&lt;br /&gt;
&lt;br /&gt;
Internal logic: [https://github.com/furrtek/Neogeo_MiSTer_old/blob/master/io/zmc.v zmc.v (verilog)]&lt;br /&gt;
&lt;br /&gt;
SDRD0 must be high before configuring banks.&lt;br /&gt;
&lt;br /&gt;
To configure a bank with NEO-ZMC:&lt;br /&gt;
* Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated ?)&lt;br /&gt;
* Set SDA[15:0] = &#039;&#039;&#039;$050B&#039;&#039;&#039;, bank 5 in $8000~$BFFF window&lt;br /&gt;
* Set SDRD0 high (latch bank)&lt;br /&gt;
* Now when the Z80 reads the &#039;&#039;&#039;$8000~BFFF&#039;&#039;&#039; range, it will be mapped to M1 ROM &#039;&#039;&#039;$14000~$17FFF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Audio system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-ZMC&amp;diff=9309</id>
		<title>NEO-ZMC</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-ZMC&amp;diff=9309"/>
		<updated>2026-08-18T22:39:15Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=crt_zmc.jpg&lt;br /&gt;
|pkg=SOIC24&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1991 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on=[[cartridges]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Chipname|Z80}} &#039;&#039;&#039;M&#039;&#039;&#039;emory &#039;&#039;&#039;C&#039;&#039;&#039;ontroller. Handles [[Z80 bankswitching]] in cartridges allowing [[M1 ROM]]s up to 512KiB (possibly 4MiB ?). Later evolved into {{Chipname|NEO-ZMC2}}.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-ZMC|512}}&lt;br /&gt;
&lt;br /&gt;
Pins 10, 11, 12 may be M1 A19, A20 and A21. This would match pins available on NEO-ZMC2.&lt;br /&gt;
&lt;br /&gt;
[[File:Neo-zmz_operation.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
* SDA0, SDA1, SDA8~15: Z80 address bus&lt;br /&gt;
* M1 A11~M1 A18: [[M1 ROM]] address lines&lt;br /&gt;
* SDRD0: Decoded write signal from {{Chipname|NEO-D0}} (latch on rising edge)&lt;br /&gt;
&lt;br /&gt;
[[Category:Audio system]]&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-ZMC&amp;diff=9308</id>
		<title>NEO-ZMC</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-ZMC&amp;diff=9308"/>
		<updated>2026-08-18T22:32:30Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=crt_zmc.jpg&lt;br /&gt;
|pkg=SOIC24&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1991 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on=[[cartridges]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Chipname|Z80}} &#039;&#039;&#039;M&#039;&#039;&#039;emory &#039;&#039;&#039;C&#039;&#039;&#039;ontroller. Handles [[Z80 bankswitching]] in cartridges allowing [[M1 ROM]]s up to 512KiB (possibly 4MiB ?). Later evolved into {{Chipname|NEO-ZMC2}}.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-ZMC|512}}&lt;br /&gt;
&lt;br /&gt;
Pins 10, 11, 12 may be M1 A19, A20 and A21. This would match pins available on NEO-ZMC2.&lt;br /&gt;
&lt;br /&gt;
* SDA0, SDA1, SDA8~15: Z80 address bus&lt;br /&gt;
* M1 A11~M1 A18: [[M1 ROM]] address lines&lt;br /&gt;
* SDRD0: Decoded write signal from {{Chipname|NEO-D0}} (latch on rising edge)&lt;br /&gt;
&lt;br /&gt;
[[Category:Audio system]]&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-ZMC&amp;diff=9307</id>
		<title>NEO-ZMC</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-ZMC&amp;diff=9307"/>
		<updated>2026-08-18T22:24:20Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=crt_zmc.jpg&lt;br /&gt;
|pkg=SOIC24&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1991 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on=[[cartridges]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Chipname|Z80}} &#039;&#039;&#039;M&#039;&#039;&#039;emory &#039;&#039;&#039;C&#039;&#039;&#039;ontroller. Handles [[Z80]] bankswitching in cartridges allowing [[M1 ROM]]s up to 512KiB. To save pins, the Z80&#039;s upper address line are also used as data input. The chip&#039;s write strobe SDRD0 is [[Z80 port map|port]] address decoded inside the system when SDA[3:2] = 2 (ports $8~$B).&lt;br /&gt;
&lt;br /&gt;
Internal logic: [https://github.com/furrtek/Neogeo_MiSTer_old/blob/master/io/zmc.v zmc.v (verilog)]&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-ZMC|512}}&lt;br /&gt;
&lt;br /&gt;
Pins 10, 11, 12 may be M1 A19, A20 and A21. This would match pins available on NEO-ZMC2.&lt;br /&gt;
&lt;br /&gt;
* SDA0, SDA1, SDA8~15: Z80 address bus&lt;br /&gt;
* M1 A11~M1 A18: [[M1 ROM]] address lines&lt;br /&gt;
* SDRD0: Decoded write signal from {{Chipname|NEO-D0}} (latch on rising edge)&lt;br /&gt;
&lt;br /&gt;
=Operation=&lt;br /&gt;
&lt;br /&gt;
SDA8~SDA15 are used for the bank number (data), SDA0 and SDA1 for selecting the window.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!SDA1&lt;br /&gt;
!SDA0&lt;br /&gt;
!Z80 port&lt;br /&gt;
!Window&lt;br /&gt;
!Address range&lt;br /&gt;
!Size&lt;br /&gt;
!Latch size&lt;br /&gt;
|-&lt;br /&gt;
|0||0||$08||0||$F000~$F7FF||2KiB||8 bits&lt;br /&gt;
|-&lt;br /&gt;
|0||1||$09||1||$E000~$EFFF||4KiB||7 bits&lt;br /&gt;
|-&lt;br /&gt;
|1||0||$0A||2||$C000~$DFFF||8KiB||6 bits&lt;br /&gt;
|-&lt;br /&gt;
|1||1||$0B||3||$8000~$BFFF||16KiB||5 bits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Since the chip doesn&#039;t receive a reset signal, bank numbers are undefined on startup. The Z80 code must initialize them.&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
[[File:Neo-zmz_operation.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
SDRD0 must be high before configuring banks.&lt;br /&gt;
&lt;br /&gt;
To configure a bank to be accessed (e.g. bank 1 in the $8000~$BFFF range):&lt;br /&gt;
* Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)&lt;br /&gt;
* Set SDA0~15 = &#039;&#039;&#039;$810B&#039;&#039;&#039;, select 16KiB bank 1 in window 3 (Why $810B and not just $010B ?)&lt;br /&gt;
* Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)&lt;br /&gt;
* Now, when the Z80 reads the &#039;&#039;&#039;$8000~BFFF&#039;&#039;&#039; range, NEO-ZMC will map this to the M1 ROM zone &#039;&#039;&#039;$04000~$07FFF&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Audio system]]&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-ZMC2&amp;diff=9306</id>
		<title>NEO-ZMC2</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-ZMC2&amp;diff=9306"/>
		<updated>2026-08-18T03:59:04Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=mvs_zmc2.jpg&lt;br /&gt;
|pkg=QFP80R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1990&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|MV1FZS}} [[Cartridges]]...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Chipname|NEO-ZMC}} and {{Chipname|PRO-CT0}} in one package.&lt;br /&gt;
&lt;br /&gt;
Can address up to 4MiB of [[M1 ROM]].&lt;br /&gt;
&lt;br /&gt;
Found in second revision [[MVS hardware|MVS]] boards (for the PRO-CT0 logic only), and AES cartridges.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-ZMC2|640px}}&lt;br /&gt;
&lt;br /&gt;
NEO-ZMC part:&lt;br /&gt;
*SDA0,SDA1,SDA8~SDA15: [[Z80]] address bus &lt;br /&gt;
*MA11~MA21: M ROM address outputs &lt;br /&gt;
&lt;br /&gt;
Serializer part, inputs:&lt;br /&gt;
*12M: 12MHz clock, outputs next pixel on falling edge.&lt;br /&gt;
*C0~C31: C ROM data bus (2*16 bits). Gives all the pixel data needed for a 8 pixel line.&lt;br /&gt;
*H: When high, reverse bit order of pixels shifted out (used for [[sprites]] horizontal flipping)&lt;br /&gt;
*EVEN: Swap A/B pixel outputs&lt;br /&gt;
*LOAD: Latch C ROM data on falling edge of 12M&lt;br /&gt;
*CSDOT: Active low DOTA/DOTB output enable&lt;br /&gt;
*CS: Active low GADx/GBDx output enable&lt;br /&gt;
Outputs:&lt;br /&gt;
*DOTA: High when pixel A is opaque (color &amp;gt; 0)&lt;br /&gt;
*DOTB: High when pixel B is opaque (color &amp;gt; 0)&lt;br /&gt;
*GAD0~GAD3: Pixel A color index&lt;br /&gt;
*GBD0~GBD3: Pixel B color index&lt;br /&gt;
&lt;br /&gt;
=Signals=&lt;br /&gt;
&lt;br /&gt;
[[File:Spr signals.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Clock&amp;diff=9305</id>
		<title>Clock</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Clock&amp;diff=9305"/>
		<updated>2026-08-17T20:09:58Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* In cartridge systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Not to be confused with the [[RTC|real time clock]] (RTC), which is a time-keeping system used in the [[MVS]] and clocked independently from the rest of the system.&lt;br /&gt;
&lt;br /&gt;
[[File:Clkdistribution.png|frame]]&lt;br /&gt;
&lt;br /&gt;
=In cartridge systems=&lt;br /&gt;
&lt;br /&gt;
The main system clock (often called &#039;&#039;&#039;mclk&#039;&#039;&#039;) is either 24MHz (MVS) or 24.167829MHz (AES). It is generated from a crystal oscillator and divided down by {{Chipname|NEO-D0}} (or other later chips), to provide the 12MHz clock for {{Chipname|NEO-ZMC2}}, the 6MHz pixel clock for [[video DAC|video output]] and many others.&lt;br /&gt;
&lt;br /&gt;
{{Chipname|LSPC2-A2}} (or other later chips) divides it by 3 and 6 to provide the 8MHz clock for the {{Chipname|YM2610}} and the 4MHz one for the {{Chipname|Z80}}.&lt;br /&gt;
&lt;br /&gt;
The cartridge connector provides the 24MHz, 12MHz, 8MHz and 4MHz inverted clock signals.&lt;br /&gt;
&lt;br /&gt;
A second quartz oscillator is used in the AES for generating the color burst needed by composite video, for the [[video encoder]]s.&lt;br /&gt;
&lt;br /&gt;
The value changes depending on the region of the system, 4.43361875Mhz for PAL systems and 3.579545Mhz for NTSC systems.&lt;br /&gt;
&lt;br /&gt;
A third 32.768KHz quartz oscillator is present in the MVS used for the [[RTC|real time clock]].&lt;br /&gt;
&lt;br /&gt;
[[File:clock.png]]&lt;br /&gt;
&lt;br /&gt;
==Phase relations==&lt;br /&gt;
&lt;br /&gt;
To do: 8M is 33high/66low, not 50/50&lt;br /&gt;
&lt;br /&gt;
[[File:Clockphases.png]]&lt;br /&gt;
&lt;br /&gt;
==Signals==&lt;br /&gt;
&lt;br /&gt;
{{Sig|24M|24M}} (~24MHz), {{Sig|12M|12M}} (12MHz), {{Sig|68KCLK|68KCLK}} (12MHz), {{Sig|68KCLKB|68KCLKB}} (12MHz), {{Sig|8M|8M}} (8MHz), {{Sig|6MB|6MB}} (6MHz), {{Sig|4M|4M}} (12MHz), {{Sig|4MB|4MB}} (4MHz), {{Sig|1MB|1MB}} (&#039;&#039;&#039;3MHz&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=In CD systems=&lt;br /&gt;
&lt;br /&gt;
[[File:Cd2_quartz.jpg|thumb|System clock and [[video PLL]] circuit on a CDM3-2 board.]]&lt;br /&gt;
&lt;br /&gt;
{{Chipname|NEO-GRC}} ?&lt;br /&gt;
&lt;br /&gt;
[[Category:Base system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Clock&amp;diff=9304</id>
		<title>Clock</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Clock&amp;diff=9304"/>
		<updated>2026-08-17T20:07:07Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Not to be confused with the [[RTC|real time clock]] (RTC), which is a time-keeping system used in the [[MVS]] and clocked independently from the rest of the system.&lt;br /&gt;
&lt;br /&gt;
[[File:Clkdistribution.png|frame]]&lt;br /&gt;
&lt;br /&gt;
=In cartridge systems=&lt;br /&gt;
&lt;br /&gt;
The main system clock (often called &#039;&#039;&#039;mclk&#039;&#039;&#039;) is either 24MHz (MVS) or 24.167829MHz (AES). It is generated and divided by 2, 4 and 8 by {{Chipname|NEO-D0}} from a crystal oscillator, to provide the 12MHz clock for {{Chipname|NEO-ZMC2}}, the inverted 6MHz one for [[video DAC|video output]] and also the 3MHz one for {{Chipname|NEO-B1}}.&lt;br /&gt;
&lt;br /&gt;
{{Chipname|LSPC2-A2}} divides it by 3 and 6 to provide the 8MHz clock for the {{Chipname|YM2610}} and the 4MHz one for the {{Chipname|Z80}}.&lt;br /&gt;
&lt;br /&gt;
The cartridge connector provides the 24MHz, 12MHz, 8MHz and 4MHz inverted clock signals.&lt;br /&gt;
&lt;br /&gt;
A second quartz oscillator is used in the AES for generating the color burst needed by composite video, for the [[video encoder]]s.&lt;br /&gt;
&lt;br /&gt;
The value changes depending on the region of the system, 4.43361875Mhz for PAL systems and 3.579545Mhz for NTSC systems.&lt;br /&gt;
&lt;br /&gt;
A third 32.768KHz quartz oscillator is present in the MVS used for the [[RTC|real time clock]].&lt;br /&gt;
&lt;br /&gt;
[[File:clock.png]]&lt;br /&gt;
&lt;br /&gt;
==Phase relations==&lt;br /&gt;
&lt;br /&gt;
To do: 8M is 33high/66low, not 50/50&lt;br /&gt;
&lt;br /&gt;
[[File:Clockphases.png]]&lt;br /&gt;
&lt;br /&gt;
==Signals==&lt;br /&gt;
&lt;br /&gt;
{{Sig|24M|24M}} (~24MHz), {{Sig|12M|12M}} (12MHz), {{Sig|68KCLK|68KCLK}} (12MHz), {{Sig|68KCLKB|68KCLKB}} (12MHz), {{Sig|8M|8M}} (8MHz), {{Sig|6MB|6MB}} (6MHz), {{Sig|4M|4M}} (12MHz), {{Sig|4MB|4MB}} (4MHz), {{Sig|1MB|1MB}} (&#039;&#039;&#039;3MHz&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=In CD systems=&lt;br /&gt;
&lt;br /&gt;
[[File:Cd2_quartz.jpg|thumb|System clock and [[video PLL]] circuit on a CDM3-2 board.]]&lt;br /&gt;
&lt;br /&gt;
{{Chipname|NEO-GRC}} ?&lt;br /&gt;
&lt;br /&gt;
[[Category:Base system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-PCM2&amp;diff=9303</id>
		<title>NEO-PCM2</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-PCM2&amp;diff=9303"/>
		<updated>2026-08-16T19:01:10Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=brd_pcm2.jpg&lt;br /&gt;
|pkg=QFP120&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=2001 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on=[[Cartridges]], [[ROM-Only boards]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Second version of {{Chipname|PCM}}. [[V ROM]] (de)multiplexer, decryption and [[P ROM]] banking chip.&lt;br /&gt;
&lt;br /&gt;
The decryption algorithm used by emulators may not be perfectly exact, this could be a possible cause of incorrect data in decrypted romsets causing minor audio glitches (Samurai Shodown V &amp;quot;Basara&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Used by:&lt;br /&gt;
&lt;br /&gt;
* [[Matrimelee]]&lt;br /&gt;
* [[Metal Slug 4]]&lt;br /&gt;
* [[Metal Slug 5]]&lt;br /&gt;
* [[Pochi and Nyaa]]&lt;br /&gt;
* [[Rage of the Dragons]]&lt;br /&gt;
* [[Samurai Shodown V]]&lt;br /&gt;
* [[Samurai Shodown V Special]]&lt;br /&gt;
* [[SNK vs. Capcom - SVC Chaos]]&lt;br /&gt;
* [[The King of Fighters 2001]]&lt;br /&gt;
* [[The King of Fighters 2002]]&lt;br /&gt;
* [[The King of Fighters 2003]]&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Neo-pcm2_pinout.png|800px]]&lt;br /&gt;
&lt;br /&gt;
OpenOffice Draw file: [[File:neo-pcm2.odg]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-244&amp;diff=9302</id>
		<title>NEO-244</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-244&amp;diff=9302"/>
		<updated>2026-08-15T23:59:55Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=Neo-244.jpg&lt;br /&gt;
|pkg=QFP64R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1992 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|SLOT4F}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Just a bunch of buffers for second revision 4-slot MVS boards. 18 inputs to 2 x 18 always enabled outputs. See MV4F schematics. &lt;br /&gt;
&lt;br /&gt;
=Pinouts=&lt;br /&gt;
&lt;br /&gt;
==Generic==&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-244|640}}&lt;br /&gt;
&lt;br /&gt;
==SLOT4F==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:NEO-244_mv4f_a1_pinout.png|A1: Buffers for 68k address lines&lt;br /&gt;
File:NEO-244_mv4f_a2_pinout.png|A2: Buffers for control lines&lt;br /&gt;
File:NEO-244_mv4ft_b2_pinout.png|B2: Buffers for Z80 address lines&lt;br /&gt;
File:NEO-244_mv4ft_c2_pinout.png|C2: Buffers for P bus lines&lt;br /&gt;
File:NEO-244_mv4ft_d2_pinout.png|D2: Buffers for P bus and other lines&lt;br /&gt;
File:NEO-244_mv4ft_e2_pinout.png|E2: Buffers for ADPCM lines&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-244&amp;diff=9301</id>
		<title>NEO-244</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-244&amp;diff=9301"/>
		<updated>2026-08-15T23:59:39Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Pinouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=Neo-244.jpg&lt;br /&gt;
|pkg=QFP64R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1992 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|SLOT4F}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Just a bunch of buffers for second revision 4-slot MVS boards.&lt;br /&gt;
&lt;br /&gt;
=Pinouts=&lt;br /&gt;
&lt;br /&gt;
==Generic==&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-244|640}}&lt;br /&gt;
&lt;br /&gt;
==SLOT4F==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:NEO-244_mv4f_a1_pinout.png|A1: Buffers for 68k address lines&lt;br /&gt;
File:NEO-244_mv4f_a2_pinout.png|A2: Buffers for control lines&lt;br /&gt;
File:NEO-244_mv4ft_b2_pinout.png|B2: Buffers for Z80 address lines&lt;br /&gt;
File:NEO-244_mv4ft_c2_pinout.png|C2: Buffers for P bus lines&lt;br /&gt;
File:NEO-244_mv4ft_d2_pinout.png|D2: Buffers for P bus and other lines&lt;br /&gt;
File:NEO-244_mv4ft_e2_pinout.png|E2: Buffers for ADPCM lines&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=File:NEO-244_pinout.png&amp;diff=9300</id>
		<title>File:NEO-244 pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=File:NEO-244_pinout.png&amp;diff=9300"/>
		<updated>2026-08-15T23:58:48Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Furrtek uploaded a new version of File:NEO-244 pinout.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-253&amp;diff=9299</id>
		<title>NEO-253</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-253&amp;diff=9299"/>
		<updated>2026-08-15T23:58:11Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=Neo-253.jpg&lt;br /&gt;
|pkg=QFP64R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1992 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|SLOT4F}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Quintuple 74HC253 4-to-1 multiplexers with common select lines, making ten 4-to-1 switches in one chip. Used to switch read-only buses. The inputs are named according to the related slot: A is slot #1, B is slot #2...&lt;br /&gt;
&lt;br /&gt;
Only (?) used on second revision 4-slot MVS systems. Not to be confused with the more common {{Chipname|NEO-273}}.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Neo-253_pinout.png|512px]]&lt;br /&gt;
&lt;br /&gt;
Select signals come from {{Chipname|NEO-F0}} SLOTA and SLOTB.&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5E==&lt;br /&gt;
&lt;br /&gt;
Cartridge [[wait cycle]] configuration and [[Z80]] bus.&lt;br /&gt;
&lt;br /&gt;
*Mux 1: PWAIT0&lt;br /&gt;
*Mux 2: PWAIT1&lt;br /&gt;
*Mux 10~3: SDD7~SDD0&lt;br /&gt;
&lt;br /&gt;
Outputs go to CN9.&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5D==&lt;br /&gt;
&lt;br /&gt;
[[Sprites]] and [[fix layer]] graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 1: CR30&lt;br /&gt;
*Mux 2: CR31&lt;br /&gt;
*Mux 10~3: FIXD7~FIXD0&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5C==&lt;br /&gt;
&lt;br /&gt;
Sprite graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 10~1: CR29~CR20&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5B==&lt;br /&gt;
&lt;br /&gt;
Sprite graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 10~1: CR19~CR10&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5A==&lt;br /&gt;
&lt;br /&gt;
Sprite graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 10~1: CR9~CR0&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=File:Neo-253_pinout.png&amp;diff=9298</id>
		<title>File:Neo-253 pinout.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=File:Neo-253_pinout.png&amp;diff=9298"/>
		<updated>2026-08-15T23:57:20Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: Furrtek uploaded a new version of File:Neo-253 pinout.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-244&amp;diff=9297</id>
		<title>NEO-244</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-244&amp;diff=9297"/>
		<updated>2026-08-15T23:37:21Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Pinouts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=Neo-244.jpg&lt;br /&gt;
|pkg=QFP64R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1992 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|SLOT4F}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Just a bunch of buffers for second revision 4-slot MVS boards.&lt;br /&gt;
&lt;br /&gt;
=Pinouts=&lt;br /&gt;
&lt;br /&gt;
To fix on diagram:&lt;br /&gt;
Pin 18 input, output 15, 21.&lt;br /&gt;
Pin 50 not an /OE, regular input, output 47, 53. Never used on any board ?&lt;br /&gt;
Outputs are always enabled. See MV4F schematics. Simple 18 inputs to 2x18 outputs.&lt;br /&gt;
&lt;br /&gt;
==Generic==&lt;br /&gt;
&lt;br /&gt;
{{Pinout|NEO-244|640}}&lt;br /&gt;
&lt;br /&gt;
==SLOT4F==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:NEO-244_mv4f_a1_pinout.png|A1: Buffers for 68k address lines&lt;br /&gt;
File:NEO-244_mv4f_a2_pinout.png|A2: Buffers for control lines&lt;br /&gt;
File:NEO-244_mv4ft_b2_pinout.png|B2: Buffers for Z80 address lines&lt;br /&gt;
File:NEO-244_mv4ft_c2_pinout.png|C2: Buffers for P bus lines&lt;br /&gt;
File:NEO-244_mv4ft_d2_pinout.png|D2: Buffers for P bus and other lines&lt;br /&gt;
File:NEO-244_mv4ft_e2_pinout.png|E2: Buffers for ADPCM lines&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=NEO-253&amp;diff=9296</id>
		<title>NEO-253</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=NEO-253&amp;diff=9296"/>
		<updated>2026-08-15T23:31:20Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ChipInfo&lt;br /&gt;
|picture=Neo-253.jpg&lt;br /&gt;
|pkg=QFP64R&lt;br /&gt;
|manu=fujitsu&lt;br /&gt;
|date=1992 ?&lt;br /&gt;
|gates=&lt;br /&gt;
|used_on={{PCB|SLOT4F}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Quintuple 74HC253 4-to-1 multiplexers with common select lines, making ten 4-to-1 switches in one chip. Used to switch read-only buses. The inputs are named according to the related slot: A is slot #1, B is slot #2...&lt;br /&gt;
&lt;br /&gt;
Only (?) used on second revision 4-slot MVS systems. Not to be confused with the more common {{Chipname|NEO-273}}.&lt;br /&gt;
&lt;br /&gt;
=Pinout=&lt;br /&gt;
&lt;br /&gt;
[[File:Neo-253_pinout.png|512px]]&lt;br /&gt;
&lt;br /&gt;
OpenOffice Draw file: [[File:neo-253.odg]]&lt;br /&gt;
&lt;br /&gt;
Pin 56 is a general /OE.&lt;br /&gt;
&lt;br /&gt;
Select signals come from {{Chipname|NEO-F0}} SLOTA and SLOTB.&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5E==&lt;br /&gt;
&lt;br /&gt;
Cartridge [[wait cycle]] configuration and [[Z80]] bus.&lt;br /&gt;
&lt;br /&gt;
*Mux 1: PWAIT0&lt;br /&gt;
*Mux 2: PWAIT1&lt;br /&gt;
*Mux 10~3: SDD7~SDD0&lt;br /&gt;
&lt;br /&gt;
Outputs go to CN9.&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5D==&lt;br /&gt;
&lt;br /&gt;
[[Sprites]] and [[fix layer]] graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 1: CR30&lt;br /&gt;
*Mux 2: CR31&lt;br /&gt;
*Mux 10~3: FIXD7~FIXD0&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5C==&lt;br /&gt;
&lt;br /&gt;
Sprite graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 10~1: CR29~CR20&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5B==&lt;br /&gt;
&lt;br /&gt;
Sprite graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 10~1: CR19~CR10&lt;br /&gt;
&lt;br /&gt;
==SLOT4F @ 5A==&lt;br /&gt;
&lt;br /&gt;
Sprite graphics.&lt;br /&gt;
&lt;br /&gt;
*Mux 10~1: CR9~CR0&lt;br /&gt;
&lt;br /&gt;
[[Category:Chips]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Wait_cycle&amp;diff=9295</id>
		<title>Wait cycle</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Wait_cycle&amp;diff=9295"/>
		<updated>2026-08-15T17:49:34Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: /* Cartridge configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[68k]] is able to wait for data by using wait cycles during bus access. This allows the use of slow, cheaper memories in cartridges and memory cards.&lt;br /&gt;
&lt;br /&gt;
The NeoGeo has wait state generation for 3 [[68k memory map|memory zones]]:&lt;br /&gt;
&lt;br /&gt;
* 000000~0FFFFF: ROM zone ([[P ROM]]) - Configurable, 0 or 1 cycle&lt;br /&gt;
* 200000~2FFFFF: PORT zone ([[P ROM]] or special chips) - Configurable, 0, 1, 2 or more cycles&lt;br /&gt;
* 800000~BFFFFF: [[Memory card]] - Fixed, 2 cycles&lt;br /&gt;
&lt;br /&gt;
=Cartridge configuration=&lt;br /&gt;
&lt;br /&gt;
Configuration is done by setting the levels of the following [[pinouts|cartridge pins]]. &#039;1&#039; means pulled to 5V, &#039;0&#039; means pulled to ground. All signals are active low.&lt;br /&gt;
&lt;br /&gt;
Many cartridges have all these pins tied to 5V to select full speed for both memory areas.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ROMWAIT||ROM zone wait&lt;br /&gt;
|-&lt;br /&gt;
|1||Full speed&lt;br /&gt;
|-&lt;br /&gt;
|0||1 cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!PWAIT1||PWAIT0||PORT zone wait&lt;br /&gt;
|-&lt;br /&gt;
|1||1||Full speed&lt;br /&gt;
|-&lt;br /&gt;
|1||0||1 cycle&lt;br /&gt;
|-&lt;br /&gt;
|0||1||2 cycles&lt;br /&gt;
|-&lt;br /&gt;
|0||0||As long as PDTACK is high&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Use cases=&lt;br /&gt;
&lt;br /&gt;
Some games rely on wait cycles to perform sufficiently spaced [[VRAM]] accesses. Disabling the wait on those cartridges causes the accesses to become too close to each other and results in graphics corruption.&lt;br /&gt;
&lt;br /&gt;
No originally released cartridges are known to use PDTACK.&lt;br /&gt;
&lt;br /&gt;
[[Category:Base system]]&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Template:BR&amp;diff=9294</id>
		<title>Template:BR</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Template:BR&amp;diff=9294"/>
		<updated>2026-08-15T14:51:11Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;background: #ADD; padding:2px; font-size:8pt;&amp;quot;&amp;gt;&#039;&#039;&#039;[[BIOS_RAM_locations#{{{1}}}|{{{1}}}]]&#039;&#039;&#039; ({{ #ifeq: {{{1|}}} | BIOS_GAME_DIP | $10FD84+}}{{ #ifeq: {{{1|}}} | BIOS_USER_REQUEST | $10FDAE}}{{ #ifeq: {{{1|}}} | BIOS_USER_MODE | $10FDAF}}{{ #ifeq: {{{1|}}} | BIOS_UPSRC | $10FEF8}}{{ #ifeq: {{{1|}}} | BIOS_UPDEST | $10FEF4}}{{ #ifeq: {{{1|}}} | BIOS_UPSIZE | $10FEFC}}{{ #ifeq: {{{1|}}} | BIOS_UPZONE | $10FEDA}}{{ #ifeq: {{{1|}}} | BIOS_UPBANK | $10FEDB}}{{ #ifeq: {{{1|}}} | BIOS_DEVMODE | $10FE80}}{{ #ifeq: {{{1|}}} | BIOS_COMPULSION_TIMER | $10FDDA}}{{ #ifeq: {{{1|}}} | BIOS_GAME_DIP | $10FD84}}{{ #ifeq: {{{1|}}} | BIOS_CREDIT_DEC1 | $10FDB0}}{{ #ifeq: {{{1|}}} | BIOS_CREDIT_DEC2 | $10FDB1}}{{ #ifeq: {{{1|}}} | BIOS_START_FLAG | $10FDB4}}{{ #ifeq: {{{1|}}} | BIOS_PLAYER_MOD | $10FDB6}}{{ #ifeq: {{{1|}}} | BIOS_P1STATUS | $10FD94}}{{ #ifeq: {{{1|}}} | BIOS_MONTH | $10FDD3}}{{ #ifeq: {{{1|}}} | BIOS_MVS_FLAG | $10FD82}})&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Template:BR&amp;diff=9293</id>
		<title>Template:BR</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Template:BR&amp;diff=9293"/>
		<updated>2026-08-15T14:50:49Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;background: #ADD; padding:2px; font-size:8pt;&amp;quot;&amp;gt;&#039;&#039;&#039;[[BIOS_RAM_locations#{{{1}}}|{{{1}}}]]&#039;&#039;&#039; ({{ #ifeq: {{{1|}}} | BIOS_GAME_DIP | $10FD84+}}{{ #ifeq: {{{1|}}} | BIOS_USER_REQUEST | $10FDAE}}{{ #ifeq: {{{1|}}} | BIOS_USER_MODE | $10FDAF}}{{ #ifeq: {{{1|}}} | BIOS_UPSRC | $10FEF8}}{{ #ifeq: {{{1|}}} | BIOS_UPDEST | $10FEF4}}{{ #ifeq: {{{1|}}} | BIOS_UPSIZE | $10FEFC}}{{ #ifeq: {{{1|}}} | BIOS_UPZONE | $10FEDA}}{{ #ifeq: {{{1|}}} | BIOS_UPBANK | $10FEDB}}{{ #ifeq: {{{1|}}} | BIOS_DEVMODE | $10FE80}}{{ #ifeq: {{{1|}}} | BIOS_COMPULSION_TIMER | $10FDDA}}&lt;br /&gt;
{{ #ifeq: {{{1|}}} | BIOS_GAME_DIP | $10FD84}}{{ #ifeq: {{{1|}}} | BIOS_CREDIT_DEC1 | $10FDB0}}{{ #ifeq: {{{1|}}} | BIOS_CREDIT_DEC2 | $10FDB1}}{{ #ifeq: {{{1|}}} | BIOS_START_FLAG | $10FDB4}}{{ #ifeq: {{{1|}}} | BIOS_PLAYER_MOD | $10FDB6}}{{ #ifeq: {{{1|}}} | BIOS_P1STATUS | $10FD94}}{{ #ifeq: {{{1|}}} | BIOS_MONTH | $10FDD3}}{{ #ifeq: {{{1|}}} | BIOS_MVS_FLAG | $10FD82}})&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
	<entry>
		<id>https://wiki.neogeodev.org//index.php?title=Template:BR&amp;diff=9292</id>
		<title>Template:BR</title>
		<link rel="alternate" type="text/html" href="https://wiki.neogeodev.org//index.php?title=Template:BR&amp;diff=9292"/>
		<updated>2026-08-15T14:50:20Z</updated>

		<summary type="html">&lt;p&gt;Furrtek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;background: #ADD; padding:2px; font-size:8pt;&amp;quot;&amp;gt;&#039;&#039;&#039;[[BIOS_RAM_locations#{{{1}}}|{{{1}}}]] &#039;&#039;&#039;&lt;br /&gt;
({{ #ifeq: {{{1|}}} | BIOS_GAME_DIP | $10FD84+}}{{ #ifeq: {{{1|}}} | BIOS_USER_REQUEST | $10FDAE}}{{ #ifeq: {{{1|}}} | BIOS_USER_MODE | $10FDAF}}{{ #ifeq: {{{1|}}} | BIOS_UPSRC | $10FEF8}}{{ #ifeq: {{{1|}}} | BIOS_UPDEST | $10FEF4}}{{ #ifeq: {{{1|}}} | BIOS_UPSIZE | $10FEFC}}{{ #ifeq: {{{1|}}} | BIOS_UPZONE | $10FEDA}}{{ #ifeq: {{{1|}}} | BIOS_UPBANK | $10FEDB}}{{ #ifeq: {{{1|}}} | BIOS_DEVMODE | $10FE80}}{{ #ifeq: {{{1|}}} | BIOS_COMPULSION_TIMER | $10FDDA}}&lt;br /&gt;
{{ #ifeq: {{{1|}}} | BIOS_GAME_DIP | $10FD84}}{{ #ifeq: {{{1|}}} | BIOS_CREDIT_DEC1 | $10FDB0}}{{ #ifeq: {{{1|}}} | BIOS_CREDIT_DEC2 | $10FDB1}}{{ #ifeq: {{{1|}}} | BIOS_START_FLAG | $10FDB4}}{{ #ifeq: {{{1|}}} | BIOS_PLAYER_MOD | $10FDB6}}{{ #ifeq: {{{1|}}} | BIOS_P1STATUS | $10FD94}}{{ #ifeq: {{{1|}}} | BIOS_MONTH | $10FDD3}}{{ #ifeq: {{{1|}}} | BIOS_MVS_FLAG | $10FD82}})&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Furrtek</name></author>
	</entry>
</feed>