<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://xboxdevwiki.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=X86corez</id>
		<title>xboxdevwiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://xboxdevwiki.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=X86corez"/>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/Special:Contributions/X86corez"/>
		<updated>2026-04-26T13:07:03Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6958</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6958"/>
				<updated>2021-05-26T16:50:18Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Add LPC PM address space.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[ACI|ACI (AC97) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x000F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x0021&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O|Super I/O Configuration]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x002E - 0x002F&lt;br /&gt;
|-&lt;br /&gt;
|[[Porting an Operating System to the Xbox HOWTO #Timer Frequency|PIT]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|[[17 Mistakes Microsoft Made in the Xbox Security System #The Xbox Hardware|A20 Gate]] / [[MCPX #Pin L21: PC Speaker|Speaker]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x0073&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00A1&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU Error Control&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00F1&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb {{FIXME|reason=Does XGPU expose I/O ports?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE {{FIXME|reason=Really? This is rather one of FDC ports}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O|Super I/O Serial]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x03F8 - 0x03FF&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI|PCI Configuration]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI #00.01:0 - ISA Bridge|LPC PM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x8000 - 0x80FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[ACI|ACI (AC97)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6957</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6957"/>
				<updated>2021-05-26T16:40:52Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Fixes from AMD-768 Peripheral Bus Controller datasheet.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[ACI|ACI (AC97) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x000F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x0021&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O|Super I/O Configuration]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x002E - 0x002F&lt;br /&gt;
|-&lt;br /&gt;
|[[Porting an Operating System to the Xbox HOWTO #Timer Frequency|PIT]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|[[17 Mistakes Microsoft Made in the Xbox Security System #The Xbox Hardware|A20 Gate]] / [[MCPX #Pin L21: PC Speaker|Speaker]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x0073&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00A1&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU Error Control&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00F1&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb {{FIXME|reason=Does XGPU expose I/O ports?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE {{FIXME|reason=Really? This is rather one of FDC ports}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O|Super I/O Serial]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x03F8 - 0x03FF&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI|PCI Configuration]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[ACI|ACI (AC97)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6956</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6956"/>
				<updated>2021-05-25T15:52:53Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Better descriptions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[ACI|ACI (AC97) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x001F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x0021&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O|Super I/O Configuration]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x002E - 0x002F&lt;br /&gt;
|-&lt;br /&gt;
|[[Porting an Operating System to the Xbox HOWTO #Timer Frequency|PIT]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1 {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0050 - 0x0053&lt;br /&gt;
|-&lt;br /&gt;
|[[17 Mistakes Microsoft Made in the Xbox Security System #The Xbox Hardware|A20 Gate]] / [[MCPX #Pin L21: PC Speaker|Speaker]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x007F&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00A1&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00FF&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb {{FIXME|reason=Does XGPU expose I/O ports?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE {{FIXME|reason=Really? This is rather one of FDC ports}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O|Super I/O Serial]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x03F8 - 0x03FF&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI|PCI Configuration]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[ACI|ACI (AC97)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6955</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6955"/>
				<updated>2021-05-25T15:16:34Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Add Super I/O and Serial ports.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[ACI|ACI (AC97) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x001F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x0021&lt;br /&gt;
|-&lt;br /&gt;
|[[Super I/O]]&lt;br /&gt;
|N/A&lt;br /&gt;
|0x002E - 0x002F&lt;br /&gt;
|-&lt;br /&gt;
|[[Porting an Operating System to the Xbox HOWTO #Timer Frequency|PIT]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1 {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0050 - 0x0053&lt;br /&gt;
|-&lt;br /&gt;
|[[17 Mistakes Microsoft Made in the Xbox Security System #The Xbox Hardware|A20 Gate]] / [[MCPX #Pin L21: PC Speaker|Speaker]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x007F&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00A1&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00FF&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb {{FIXME|reason=Does XGPU expose I/O ports?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE {{FIXME|reason=Really? This is rather one of FDC ports}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|Serial (COM1)&lt;br /&gt;
|N/A&lt;br /&gt;
|0x03F8 - 0x03FF&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI|PCI Configuration Space]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[ACI|ACI (AC97)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6954</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6954"/>
				<updated>2021-05-25T15:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Fix PIC ports.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[ACI|ACI (AC97) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x001F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x0021&lt;br /&gt;
|-&lt;br /&gt;
|[[Porting an Operating System to the Xbox HOWTO #Timer Frequency|PIT]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1 {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0050 - 0x0053&lt;br /&gt;
|-&lt;br /&gt;
|[[17 Mistakes Microsoft Made in the Xbox Security System #The Xbox Hardware|A20 Gate]] / [[MCPX #Pin L21: PC Speaker|Speaker]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x007F&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00A1&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00FF&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb {{FIXME|reason=Does XGPU expose I/O ports?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE {{FIXME|reason=Really? This is rather one of FDC ports}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI|PCI Configuration Space]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[ACI|ACI (AC97)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6953</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6953"/>
				<updated>2021-05-25T15:06:13Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: Add relevant links. Mark questionable I/O ports.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[ACI|ACI (AC97) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x001F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x003F&lt;br /&gt;
|-&lt;br /&gt;
|[[Porting an Operating System to the Xbox HOWTO #Timer Frequency|PIT]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1 {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0050 - 0x0053&lt;br /&gt;
|-&lt;br /&gt;
|[[17 Mistakes Microsoft Made in the Xbox Security System #The Xbox Hardware|A20 Gate]] / [[MCPX #Pin L21: PC Speaker|Speaker]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x007F&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00BF&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU {{FIXME|reason=What is this?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00FF&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb {{FIXME|reason=Does XGPU expose I/O ports?}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE {{FIXME|reason=Really? This is rather one of FDC ports}}&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|[[PCI|PCI Configuration Space]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[SMBus|SMBus (I2C)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[ACI|ACI (AC97)]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6952</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6952"/>
				<updated>2021-05-25T14:38:20Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Convert to the same table format as memory map.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|ACI (AC97) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Device&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 0-3&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0000 - 0x001F&lt;br /&gt;
|-&lt;br /&gt;
|Master PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0020 - 0x003F&lt;br /&gt;
|-&lt;br /&gt;
|Timer 0&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0040 - 0x0043&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0050 - 0x0053&lt;br /&gt;
|-&lt;br /&gt;
|A20 Gate / Speaker&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0060 - 0x006F&lt;br /&gt;
|-&lt;br /&gt;
|CMOS / RTC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0070 - 0x007F&lt;br /&gt;
|-&lt;br /&gt;
|DMA Page Address&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0080 - 0x008F&lt;br /&gt;
|-&lt;br /&gt;
|Slave PIC&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00A0 - 0x00BF&lt;br /&gt;
|-&lt;br /&gt;
|DMA Channels 4-7&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00C0 - 0x00DF&lt;br /&gt;
|-&lt;br /&gt;
|FPU&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x00F0 - 0x00FF&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x01F0 - 0x01F7&lt;br /&gt;
|-&lt;br /&gt;
|vesafb&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03C0 - 0x03DF&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x03F6 - 0x03F6&lt;br /&gt;
|-&lt;br /&gt;
|PCI Configuration Space&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x0CF8 - 0x0CFF&lt;br /&gt;
|-&lt;br /&gt;
|SMBus (I2C)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1000 - 0x100F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|Modem (MC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1080 - 0x10FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0x1400 - 0x14FF&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|SMBus (I2C)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC000 - 0xC00F&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xC200 - 0xC21F&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|ACI (AC97)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD000 - 0xD0FF&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xD200 - 0xD27F&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet)&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xE000 - 0xE007&lt;br /&gt;
|-&lt;br /&gt;
|IDE&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF60 - 0xFF6F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6951</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6951"/>
				<updated>2021-05-24T23:54:12Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: /* I/O port map */ Remove overlapping ide0, minor corrections.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|ACI (AC97) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ports || Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 0000-001f || dma1&lt;br /&gt;
|-&lt;br /&gt;
| 0020-003f || pic1&lt;br /&gt;
|-&lt;br /&gt;
| 0040-0043 || timer0&lt;br /&gt;
|-&lt;br /&gt;
| 0050-0053 || timer1&lt;br /&gt;
|-&lt;br /&gt;
| 0060-006f || keyboard&lt;br /&gt;
|-&lt;br /&gt;
| 0070-007f || rtc&lt;br /&gt;
|-&lt;br /&gt;
| 0080-008f || dma page reg&lt;br /&gt;
|-&lt;br /&gt;
| 00a0-00bf || pic2&lt;br /&gt;
|-&lt;br /&gt;
| 00c0-00df || dma2&lt;br /&gt;
|-&lt;br /&gt;
| 00f0-00ff || fpu&lt;br /&gt;
|-&lt;br /&gt;
| 01f0-01f7 || ide0&lt;br /&gt;
|-&lt;br /&gt;
| 03c0-03df || vesafb&lt;br /&gt;
|-&lt;br /&gt;
| 03f6-03f6 || ide0&lt;br /&gt;
|-&lt;br /&gt;
| 0cf8-0cff || PCI conf1&lt;br /&gt;
|-&lt;br /&gt;
| 1000-100f || nVidia Corporation nForce PCI System Management&lt;br /&gt;
|-&lt;br /&gt;
| 1080-10ff || nVidia Corporation nForce MC'97 Modem (Intel 537)&lt;br /&gt;
|-&lt;br /&gt;
| 1400-14ff || nVidia Corporation nForce MC'97 Modem (Intel 537)&lt;br /&gt;
|-&lt;br /&gt;
| c000-c00f || nVidia Corporation nForce PCI System Management (amd756-smbus)&lt;br /&gt;
|-&lt;br /&gt;
| c200-c21f || nVidia Corporation nForce PCI System Management&lt;br /&gt;
|-&lt;br /&gt;
| d000-d0ff || nVidia Corporation nForce AC'97 Audio&lt;br /&gt;
|-&lt;br /&gt;
| d200-d27f || nVidia Corporation nForce AC'97 Audio&lt;br /&gt;
|-&lt;br /&gt;
| e000-e007 || nVidia Corporation nForce Ethernet Controller&lt;br /&gt;
|-&lt;br /&gt;
| ff60-ff6f || nVidia Corporation nForce IDE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=I/O&amp;diff=6950</id>
		<title>I/O</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=I/O&amp;diff=6950"/>
				<updated>2021-05-24T23:37:04Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: Create a redirect. No pages link to this page actually.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Memory]]&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6949</id>
		<title>Memory</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=Memory&amp;diff=6949"/>
				<updated>2021-05-24T23:36:44Z</updated>
		
		<summary type="html">&lt;p&gt;X86corez: Add sections and move ports from I/O page here.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Xbox has 64MB Memory. This could be expanded to 128MB of memory on boards of revision 1.0-1.4 (Boards of revision 1.0-1.4 have empty spots for the extra memory, but they were later removed on 1.6 boards) but no games took advantage of it. The debug Xbox and the Chihiro both contained 128MB Memory.&lt;br /&gt;
&lt;br /&gt;
The memory was shared between the CPU and GPU. On the retail Xbox, the [[Flash ROM]] and [[MCPX ROM]] are also mapped to memory at the top 16 MiB and the top 512 Bytes respectively. However on Debug Xboxes and Chihiro, only the Flash is mapped as they don't contain an MCPX ROM.&lt;br /&gt;
&lt;br /&gt;
= Memory map =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! Memory Type&lt;br /&gt;
! Retail Xbox Range&lt;br /&gt;
! Debug/Chihiro Range&lt;br /&gt;
|-&lt;br /&gt;
|Main Memory&lt;br /&gt;
|0x00000000 - 0x03FFFFFF&lt;br /&gt;
|0x00000000 - 0x07FFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[GPU|GPU (NV2A) Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFD000000 - 0xFDFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[APU|APU Registers]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFE800000 - 0xFE87FFFF&lt;br /&gt;
|-&lt;br /&gt;
|ACI (AC97) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEC00000 - 0xFEC00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 0 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED00000 - 0xFED00FFF&lt;br /&gt;
|-&lt;br /&gt;
|USB 1 Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFED08000 - 0xFED08FFF&lt;br /&gt;
|-&lt;br /&gt;
|NIC (NVNet) Registers&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFEF00000 - 0xFEF003FF&lt;br /&gt;
|-&lt;br /&gt;
|[[Flash ROM]]&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|0xFF000000 - 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
|[[MCPX ROM]]&lt;br /&gt;
|0xFFFFFE00 - 0xFFFFFFFF&lt;br /&gt;
|N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= I/O port map =&lt;br /&gt;
{{FIXME|reason=Taken from the KVMBOX memorymap.txt, not confirmed}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ports || Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 0000-001f || dma1&lt;br /&gt;
|-&lt;br /&gt;
| 0020-003f || pic1&lt;br /&gt;
|-&lt;br /&gt;
| 0040-0043 || timer0&lt;br /&gt;
|-&lt;br /&gt;
| 0050-0053 || timer1&lt;br /&gt;
|-&lt;br /&gt;
| 0060-006f || keyboard&lt;br /&gt;
|-&lt;br /&gt;
| 0070-007f || rtc&lt;br /&gt;
|-&lt;br /&gt;
| 0080-008f || dma page reg&lt;br /&gt;
|-&lt;br /&gt;
| 00a0-00bf || pic2&lt;br /&gt;
|-&lt;br /&gt;
| 00c0-00df || dma2&lt;br /&gt;
|-&lt;br /&gt;
| 00f0-00ff || fpu&lt;br /&gt;
|-&lt;br /&gt;
| 01f0-01f7 || ide0&lt;br /&gt;
|-&lt;br /&gt;
| 03c0-03df || vesafb&lt;br /&gt;
|-&lt;br /&gt;
| 03f6-03f6 || ide0&lt;br /&gt;
|-&lt;br /&gt;
| 0cf8-0cff || PCI conf1&lt;br /&gt;
|-&lt;br /&gt;
| 1000-100f || nVidia Corporation nForce PCI System Management&lt;br /&gt;
|-&lt;br /&gt;
| 1080-10ff || nVidia Corporation Intel 537 [nForce MC97 Modem]&lt;br /&gt;
|-&lt;br /&gt;
| 1400-14ff || nVidia Corporation Intel 537 [nForce MC97 Modem]&lt;br /&gt;
|-&lt;br /&gt;
| c000-c00f || nVidia Corporation nForce PCI System Management (amd756-smbus)&lt;br /&gt;
|-&lt;br /&gt;
| c200-c21f || nVidia Corporation nForce PCI System Management&lt;br /&gt;
|-&lt;br /&gt;
| d000-d0ff || nVidia Corporation nForce Audio&lt;br /&gt;
|-&lt;br /&gt;
| d200-d27f || nVidia Corporation nForce Audio&lt;br /&gt;
|-&lt;br /&gt;
| e000-e007 || nVidia Corporation nForce Ethernet Controller&lt;br /&gt;
|-&lt;br /&gt;
| ff60-ff6f || nVidia Corporation nForce IDE&lt;br /&gt;
|-&lt;br /&gt;
|  ff60-ff67 || ide0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Emulation =&lt;br /&gt;
Code for emulating the memory might consist of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG || CHIHIRO&lt;br /&gt;
#define MEMORY_SIZE 128 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 0;&lt;br /&gt;
#else&lt;br /&gt;
#define MEMORY_SIZE 64 * 1024 * 1024&lt;br /&gt;
int mcpx_active = 1;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#define FLASH_SIZE 256 * 1024&lt;br /&gt;
#define FLASH_MAP_SIZE 16 * 1024 * 1024&lt;br /&gt;
#define FLASH_MAP_ADDRESS (0xFFFFFFFF - FLASH_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
#define MCPX_SIZE   0x200&lt;br /&gt;
#define MCPX_MAP_ADDRESS (0xFFFFFFFF - MCPX_MAP_SIZE + 1)&lt;br /&gt;
&lt;br /&gt;
uint8_t memory[MEMORY_SIZE] = {0};&lt;br /&gt;
uint8_t flash[FLASH_SIZE] = {0};&lt;br /&gt;
uint8_t mcpx[MCPX_SIZE] = {0};&lt;br /&gt;
&lt;br /&gt;
uint8_t get_memory_byte(uint32_t location) {&lt;br /&gt;
    if (location &amp;lt; MEMORY_SIZE) {&lt;br /&gt;
        return memory[location];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mcpx_active &amp;amp;&amp;amp; location &amp;gt;= MCPX_MAP_ADDRESS) {&lt;br /&gt;
        return mcpx[location - MCPX_MAP_ADDRESS];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (location &amp;gt;= FLASH_MAP_ADDRESS) {&lt;br /&gt;
        return flash[(location - FLASH_MAP_ADDRESS) % FLASH_SIZE];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Memory in unspecified range: %08X\n&amp;quot;, location);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint16_t get_memory_word(uint32_t location) {&lt;br /&gt;
    return get_memory_byte(location + 1) &amp;lt;&amp;lt; 8 | get_memory_byte(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t get_memory_dword(uint32_t location) {&lt;br /&gt;
    return get_memory_word(location + 2) &amp;lt;&amp;lt; 16 | get_memory_word(location);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void deactivate_mcpx() {&lt;br /&gt;
    mcpx_active = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>X86corez</name></author>	</entry>

	</feed>