<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://www.iquebrew.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stuckpixel</id>
	<title>iQueBrew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://www.iquebrew.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stuckpixel"/>
	<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Special:Contributions/Stuckpixel"/>
	<updated>2026-08-07T14:35:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1421</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1421"/>
		<updated>2024-03-21T08:07:50Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = AES, 0x100 = RDB, 0x200 = PI_ERR, 0x400 = USB0, 0x800 = USB1, 0x1000 = ??, 0x2000 = MD). Bottom bits appear to mirror MI_INTR_REG.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || PI_ATB_NEXT_CONFIG || takes in configuration info about the next ATB entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_CNT_REG || Control register for the NAND controller&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit&lt;br /&gt;
!Write&lt;br /&gt;
!Read&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Start || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 30-24 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 23-16 || NAND command || ?&lt;br /&gt;
|-&lt;br /&gt;
| 15 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Buffer select. Controls where in PI_EX_DMA_BUF the result is read to.&amp;lt;br /&amp;gt;0: PI_EX_DMA_BUF + 0&amp;lt;br /&amp;gt;1: PI_EX_DMA_BUF + 0x200 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 13-11 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 10 || ? || some kind of error status? After a transfer, bootrom checks this bit and returns an error if it was set&lt;br /&gt;
|-&lt;br /&gt;
| 9-0 || Size to receive to PI_EX_DMA_BUF from NAND, in bytes. || Size to send from PI_EX_DMA_BUF to NAND, in bytes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 * 0xC0 || PI_ATB_ENTRY || Associates a particular page (or pages) in cartridge space with a particular NAND block (or blocks) &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1419</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1419"/>
		<updated>2022-07-29T03:50:04Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND). Bottom bits appear to mirror MI_INTR_REG.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || PI_ATB_NEXT_CONFIG || takes in configuration info about the next ATB entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_CNT_REG || Control register for the NAND controller&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit&lt;br /&gt;
!Write&lt;br /&gt;
!Read&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Start || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 30-24 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 23-16 || NAND command || ?&lt;br /&gt;
|-&lt;br /&gt;
| 15 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Buffer select. Controls where in PI_EX_DMA_BUF the result is read to.&amp;lt;br /&amp;gt;0: PI_EX_DMA_BUF + 0&amp;lt;br /&amp;gt;1: PI_EX_DMA_BUF + 0x200 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 13-11 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 10 || ? || some kind of error status? After a transfer, bootrom checks this bit and returns an error if it was set&lt;br /&gt;
|-&lt;br /&gt;
| 9-0 || Size to receive to PI_EX_DMA_BUF from NAND, in bytes. || Size to send from PI_EX_DMA_BUF to NAND, in bytes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 * 0xC0 || PI_ATB_ENTRY || Associates a particular page (or pages) in cartridge space with a particular NAND block (or blocks) &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1418</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1418"/>
		<updated>2022-07-29T00:43:19Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND). Bottom bits appear to mirror MI_INTR_REG.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || PI_ATB_NEXT_CONFIG || takes in configuration info about the next ATB entry&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_CNT_REG || Control register for the NAND controller&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit&lt;br /&gt;
!Write&lt;br /&gt;
!Read&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Start || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 30-24 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 23-16 || NAND command || ?&lt;br /&gt;
|-&lt;br /&gt;
| 15 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Buffer select. Controls where in PI_EX_DMA_BUF the result is read to.&amp;lt;br /&amp;gt;0: PI_EX_DMA_BUF + 0&amp;lt;br /&amp;gt;1: PI_EX_DMA_BUF + 0x200 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 13-10 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 9-0 || Size to receive to PI_EX_DMA_BUF from NAND, in bytes. || Size to send from PI_EX_DMA_BUF to NAND, in bytes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 * 0xC0 || PI_ATB_ENTRY || Associates a particular page (or pages) in cartridge space with a particular NAND block (or blocks) &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1412</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1412"/>
		<updated>2021-08-11T17:15:34Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: /* MI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND). Bottom bits appear to mirror MI_INTR_REG.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_CNT_REG || Control register for the NAND controller&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit&lt;br /&gt;
!Write&lt;br /&gt;
!Read&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Start || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 30-24 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 23-16 || NAND command || ?&lt;br /&gt;
|-&lt;br /&gt;
| 15 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Buffer select. Controls where in PI_EX_DMA_BUF the result is read to.&amp;lt;br /&amp;gt;0: PI_EX_DMA_BUF + 0&amp;lt;br /&amp;gt;1: PI_EX_DMA_BUF + 0x200 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 13-10 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 9-0 || Size to receive to PI_EX_DMA_BUF from NAND, in bytes. || Size to send from PI_EX_DMA_BUF to NAND, in bytes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1411</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1411"/>
		<updated>2021-08-08T07:32:50Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: /* PI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x10 = PI EX DMA, 0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_CNT_REG || Control register for the NAND controller&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Bit&lt;br /&gt;
!Write&lt;br /&gt;
!Read&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Start || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 30-24 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 23-16 || NAND command || ?&lt;br /&gt;
|-&lt;br /&gt;
| 15 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 14 || Buffer select. Controls where in PI_EX_DMA_BUF the result is read to.&amp;lt;br /&amp;gt;0: PI_EX_DMA_BUF + 0&amp;lt;br /&amp;gt;1: PI_EX_DMA_BUF + 0x200 || ?&lt;br /&gt;
|-&lt;br /&gt;
| 13-10 || ? || ?&lt;br /&gt;
|-&lt;br /&gt;
| 9-0 || Size to receive to PI_EX_DMA_BUF from NAND, in bytes. || Size to send from PI_EX_DMA_BUF to NAND, in bytes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1410</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1410"/>
		<updated>2021-08-06T18:44:34Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: /* PI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x10 = PI EX DMA, 0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_CNT_REG || Control register for the NAND controller.&amp;lt;br /&amp;gt;&lt;br /&gt;
Bit 31: [W] Start [R] Busy&amp;lt;br /&amp;gt;&lt;br /&gt;
Bit 23-16: [W] NAND command; can be obtained from the datasheet for the NAND. [R] ?&amp;lt;br /&amp;gt;&lt;br /&gt;
Bit 15: [W] ? [R] ?&amp;lt;br /&amp;gt;&lt;br /&gt;
Bit 14: [W] Buffer select. Controls where in PI_EX_DMA_BUF the result is read to. 0: PI_EX_DMA_BUF + 0 1: PI_EX_DMA_BUF + 0x200 [R] ?&amp;lt;br /&amp;gt;&lt;br /&gt;
Bit 13-10: [W] ? [R] ?&amp;lt;br /&amp;gt;&lt;br /&gt;
Bit 9-0: [W]/[R] Size to send/receive to/from PI_EX_DMA_BUF to NAND, in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1409</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1409"/>
		<updated>2021-08-04T03:09:08Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x10 = PI EX DMA, 0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1408</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1408"/>
		<updated>2021-08-04T03:08:48Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x10, = PI EX DMA, 0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1407</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1407"/>
		<updated>2021-08-04T02:58:28Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_BUF || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IQue_Card&amp;diff=1406</id>
		<title>IQue Card</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IQue_Card&amp;diff=1406"/>
		<updated>2021-07-19T05:42:42Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:iQue Card}}&lt;br /&gt;
[[File:IQue_card_disassembled.jpg|thumb|A disassembled &amp;#039;&amp;#039;&amp;#039;iQue Card&amp;#039;&amp;#039;&amp;#039;.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;iQue Card&amp;#039;&amp;#039;&amp;#039; (Chinese: 神游卡) is a removable memory card of the [[iQue Player]], used to store [[games]] and the [[SKSA|&amp;quot;Upgradeable Operating System&amp;quot;]]. It is located on the bottom of every unit.&lt;br /&gt;
&lt;br /&gt;
The iQue Card is housed in a plastic shell, which contains a Samsung K9F1208U0M-YCB0 NAND chip on a special PCB codenamed &amp;quot;DOOKIE&amp;quot;. The contents of the NAND are documented on the [[NAND]] page.&lt;br /&gt;
&lt;br /&gt;
Datasheet: [http://www.reinerziegler.de/ique/ds_k9f1208u0m.pdf]&lt;br /&gt;
&lt;br /&gt;
== DOOKIE ==&lt;br /&gt;
The DOOKIE board is very basic, and it contains the NAND flash, a few capacitors, and an edge connector to connect with an [[iQue Player]]. The connector has a 1.1mm pitch and seems to be custom made. No other commonly-available connector appears to fit in it except the MicroSD.&lt;br /&gt;
&lt;br /&gt;
== Pinout ==&lt;br /&gt;
[[File:Card_pin_numbers.png|thumb|Pin numbers for the &amp;#039;&amp;#039;&amp;#039;iQue Card&amp;#039;&amp;#039;&amp;#039;.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Pin #&lt;br /&gt;
! Name&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || Power&lt;br /&gt;
|-&lt;br /&gt;
| 2 || /WP || Write Protect&lt;br /&gt;
|-&lt;br /&gt;
| 3 || /WE || Write Enable&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ALE || Address Latch Enable&lt;br /&gt;
|-&lt;br /&gt;
| 5 || CLE || Command Latch Enable&lt;br /&gt;
|-&lt;br /&gt;
| 6 || VCC || Power (3.3v)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || /CE || Chip Enable&lt;br /&gt;
|-&lt;br /&gt;
| 8 || /RE || Read Enable&lt;br /&gt;
|-&lt;br /&gt;
| 9 || R/B || Read/Busy&lt;br /&gt;
|-&lt;br /&gt;
| 10 || N/C || Not Connected&lt;br /&gt;
|-&lt;br /&gt;
| 11 || N/C || Not Connected&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IO7 || Data Input/Output 7&lt;br /&gt;
|-&lt;br /&gt;
| 13 || IO6 || Data Input/Output 6&lt;br /&gt;
|-&lt;br /&gt;
| 14 || IO5 || Data Input/Output 5&lt;br /&gt;
|-&lt;br /&gt;
| 15 || IO4 || Data Input/Output 4&lt;br /&gt;
|-&lt;br /&gt;
| 16 || GND || Power&lt;br /&gt;
|-&lt;br /&gt;
| 17 || VCC || Power (3.3v)&lt;br /&gt;
|-&lt;br /&gt;
| 18 || IO3 || Data Input/Output 3&lt;br /&gt;
|-&lt;br /&gt;
| 19 || IO2 || Data Input/Output 2&lt;br /&gt;
|-&lt;br /&gt;
| 20 || IO1 || Data Input/Output 1&lt;br /&gt;
|-&lt;br /&gt;
| 21 || IO0 || Data Input/Output 0&lt;br /&gt;
|-&lt;br /&gt;
| 22 || GND || Power&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=File:Card_pin_numbers.png&amp;diff=1405</id>
		<title>File:Card pin numbers.png</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=File:Card_pin_numbers.png&amp;diff=1405"/>
		<updated>2021-07-19T05:27:28Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: iQue card edge pin numbers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
iQue card edge pin numbers&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1404</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1404"/>
		<updated>2021-07-08T05:44:53Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_OUT || output of current PI DMA operation; used for NAND, AES and the PI_EX_READ\WRITE operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1403</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1403"/>
		<updated>2021-07-07T17:09:27Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: PI_AES_DATA_OUT -&amp;gt; PI_EX_DMA_OUT&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x400 || PI_EX_DMA_OUT || output of current PI DMA operation; used for NAND, AES and the PI_EX_(READ|WRITE) operations&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1402</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1402"/>
		<updated>2021-07-07T17:07:09Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the bottom 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1401</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1401"/>
		<updated>2021-07-07T17:03:45Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: /* PI_ALLOWED_IO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]. Only the first 8 bits of this field are used for this register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1400</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1400"/>
		<updated>2021-07-07T17:01:14Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: /* PI_ALLOWED_IO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || PI_ALLOWED_IO || Allows/disallows access to new PI features. This register is set by SK using the hwAccessRights field of the [[CMD]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1399</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1399"/>
		<updated>2021-07-04T03:03:00Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA busy.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || || Feature bitmask? &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1398</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1398"/>
		<updated>2021-07-04T03:00:14Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || bit 31: NAND (maybe other sources?) DMA complete.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || || Feature bitmask? &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=Memory_Map&amp;diff=1397</id>
		<title>Memory Map</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Memory_Map&amp;diff=1397"/>
		<updated>2021-06-27T23:45:27Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Create Memory Map&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000000&lt;br /&gt;
| 0x00800000&lt;br /&gt;
| DRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x9FC00000&lt;br /&gt;
|?&lt;br /&gt;
| Secure RAM&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000&lt;br /&gt;
| ?&lt;br /&gt;
| [[IO]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xBFC20000&lt;br /&gt;
| 0x00002000&lt;br /&gt;
| [[bootrom]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xBFC80000&lt;br /&gt;
| ?&lt;br /&gt;
| Virage 0 [[Virage0-1]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xBFC90000&lt;br /&gt;
| ?&lt;br /&gt;
| Virage 1 [[Virage0-1]]&lt;br /&gt;
|-&lt;br /&gt;
| 0xBFCA0000&lt;br /&gt;
| 0x00000100&lt;br /&gt;
| [[Virage2]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=Main_Page&amp;diff=1376</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Main_Page&amp;diff=1376"/>
		<updated>2020-02-02T21:22:00Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Reverted edits by Helloitsme (talk) to last revision by Normmatt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{:Main Page/Header}}&lt;br /&gt;
{{:Main Page/Navigation}}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1151</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1151"/>
		<updated>2020-01-30T04:50:19Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: this isn&amp;#039;t just a status bit, it&amp;#039;s a control bit.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || || Feature bitmask? &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power control&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=Libultra_Boot_Parameters&amp;diff=1134</id>
		<title>Libultra Boot Parameters</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Libultra_Boot_Parameters&amp;diff=1134"/>
		<updated>2020-01-29T18:12:01Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: fix inverted condition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Parameters set by the SA before booting a game. BB&amp;#039;s modified libultra uses these values at runtime.&lt;br /&gt;
&lt;br /&gt;
= Used by both N64 and BB =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0x800001a0|| 4 || leoBootID || not used on iQue, related to 64DD (which has codename Leo)&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000300|| 4 || osTvType || 0: PAL, 1: NTSC, 2: MPAL&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000304|| 4 || osRomType|| Determines if cartridge boot, or 64DD boot&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000308|| 4 || osRomBase || Base uncached address of cartridge (PI) region&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000030c || 4 || osResetType || Whether the system was cold-booted (0) or warm-resetted NMI (1). &amp;lt;br&amp;gt;On iQue, this may be fixed one way or the another because all games are soft-booted.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000310|| 4 || osCicId || Contains result of PIF&amp;lt;&amp;gt;CIC interaction. Value on iQue is not yet known. Rareware games like to check this value. &amp;lt;br&amp;gt;Depending on the CIC it may have the decimal number of CIC used, such as 0x17D9 (6105).&amp;lt;br&amp;gt;Note that 6106 games will use the value 6104 (on N64).&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000314|| 4 || osVersion || Some version info created in N64 boot process. Unknown on iQue.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000318 || 4 || osMemSize || Contains number of bytes of physical memory installed. Games that check for expansion pak look at this value.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000031c|| 64 || osAppNMIBuffer || Buffer where application can put persistent information that is guaranteed not to be disturbed by a warm reset. &amp;lt;br&amp;gt;Unknown behavior on iQue.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Used only by BB =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000035c || 4 || __osBbEepromAddress || &lt;br /&gt;
|-&lt;br /&gt;
| 0x80000360 || 4 || __osBbEepromSize ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000364 || 4 || __osBbFlashAddress ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000368 || 4 || __osBbFlashSize ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000036c || 4 || __osBbSramAddress ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000370 || 4 || __osBbSramSize ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000374 || 16 || __osBbPakAddress || Array of 4 u32 pointers&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000384 || 4 || __osBbPakSize ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000388 || 4 || __osBbIsBb || Can be used to determine if running on vanilla N64, or BB.&amp;lt;br&amp;gt;&lt;br /&gt;
0: if (*0xa430003c &amp;amp; 0x140)==0&amp;lt;br&amp;gt;&lt;br /&gt;
1: if (*0xa430003c &amp;amp; 0x140)!=0&amp;lt;br&amp;gt;&lt;br /&gt;
2: if ((*0xa430003c &amp;amp; 0x140)!=0) &amp;amp;&amp;amp; ((*0xa4600060) &amp;amp; 0xc0000000)!=0&lt;br /&gt;
|-&lt;br /&gt;
| 0x8000038c || 4 || __osBbHackFlags  ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000390 || 4 || __osBbStashMagic ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000394 || 16 || __osBbPakBindings || Array of 4 u32 pointers&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003a4 || 16 || __osBbStateName ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003b4 || 4 || __osBbStateDirty ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x800003b8 || 4 || __osBbAuxDataLimit ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1005</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1005"/>
		<updated>2020-01-23T17:40:02Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Add AES engine info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || PI_AES_CNT(?) || Seems to be used for controlling the AES hardware. Bit31: start/busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || || Feature bitmask? &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 0x200 || PI_AES_DATA_OUT || output of current AES operation&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 0xB0 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 0x10 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power status (on or off)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=Virage0-1&amp;diff=1004</id>
		<title>Virage0-1</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Virage0-1&amp;diff=1004"/>
		<updated>2019-10-16T07:31:03Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Virage0 and Virage1 are two 4K EEPROM banks located inside the SoC that can only be read in secure mode.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0x01 || tsCrlVersion || Seems to be always 0x00&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 0x01 || caCrlVersion || Seems to be always 0x00&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 0x01 || cpCrlVersion || Seems to be always 0x01&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || 0x01 || contentRlVersion || Seems to be always 0x00&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0x02 || ticketRlVersion || Seems to be always 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || 0x02 || tidWindow || Seems to be always 0x001A&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || 0x2 * 0x1A || cc || Play-time (600 minutes = 0x0258)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C || 0x02 || seq || CRC&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E || 0x02 || sum || CRC&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1003</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1003"/>
		<updated>2019-10-13T02:08:22Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within non-secure mode causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || || Feature bitmask? &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power status (on or off)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=1002</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=1002"/>
		<updated>2019-10-13T02:06:45Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Memory mapped registers available on the iQue Player.&lt;br /&gt;
&lt;br /&gt;
= MI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300000 || 4 || MI_INIT_MODE_REG/MI_MODE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300004 || 4 || MI_VERSION_REG/MI_NOOP_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300008 || 4 || MI_INTR_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430000C || 4 || MI_INTR_MASK_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4 || MI_SK_EXCEPTION_REG || Reading from this address within game code causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = Watchdog Timer timeout, bit 2 = SKC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300018 || 4 || MI_SK_WATCHDOG_TIMER || Set to 0x7530c800 by SK to start or reset the timer. The bottom 16 bits appear to be the number of timer ticks to wait before an interrupt is fired, and bit 3 of MI_SK_EXCEPTION_REG is set. When reading from this register while the timer is ticking, the top 16 bits appear to be the remaining number of ticks until the interrupt fires. This is mainly used by SK to deal with trial/demo games. The timer is reset by SK when skKeepAlive is called. Depending on the trial type (timed vs number of launches), this timer is either used to detect a game crash or other event which would cause skKeepAlive calls to stop being made, or for timed trials, to keep track of the remaining time on the trial. One tick appears to happen every 1.220703 milliseconds with the configuration SK sets. Other tick rates and behaviors maybe be configurable, but it is unknown at this time if that is the case.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300028 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4 || MI_HW_INTR_REG || Hardware interrupts (0x40 = NAND DMA, 0x80 = MD, 0x100 = RDB, 0x200 = AES, 0x400 = PI_ERR, 0x800 = USB0, 0x1000 = USB1, 0x2000 = NAND).&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4 || MI_HW_INTR_MASK_REG || Hardware interrupt mask.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= VI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4 || VI_STATUS_REG/VI_CONTROL_REG || If bit 13 is set (normally documented as unused/reserved), the console will display corrupted graphics. N64 games usually (always?) have this bit set, which is the cause of corrupted graphics seen when vanilla N64 games are played on an iQue Player.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400004 || 4 || VI_ORIGIN_REG/VI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400008 || 4 || VI_WIDTH_REG/VI_H_WIDTH_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440000C || 4 || VI_INTR_REG/VI_V_INTR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400010 || 4 || VI_CURRENT_REG/VI_V_CURRENT_LINE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400014 || 4 || VI_BURST_REG/VI_TIMING_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400018 || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA440001C || 4 || VI_V_SYNC_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400020 || 4 || VI_LEAP_REG/VI_H_SYNC_LEAP_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400024 || 4 || VI_H_START_REG/VI_H_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400028 || 4 || VI_V_START_REG/VI_V_VIDEO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA440002C || 4 || VI_V_BURST_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400030 || 4 || VI_X_SCALE_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400034 || 4 || VI_Y_SCALE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500000 || 4 || AI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500004 || 4 || AI_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4 || AI_CONTROL_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA450000C || 4 || AI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500010 || 4 || AI_DACRATE_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500014 || 4 || AI_BITRATE_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= PI =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600000 || 4 || PI_DRAM_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600004 || 4 || PI_CART_ADDR_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600008 || 4 || PI_RD_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460000C || 4 || PI_WR_LEN_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4 || PI_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4 || PI_BSD_DOM1_LAT_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4 || PI_BSD_DOM1_PWD_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4 || PI_BSD_DOM1_PGS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4 || PI_BSD_DOM1_RLS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4 || PI_BSD_DOM2_LAT_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4 || PI_BSD_DOM2_PWD_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4 || PI_BSD_DOM2_PGS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4 || PI_BSD_DOM2_RLS_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600038 || 4 || PI_CARD_STATUS_REG || Tells if the NAND card is present or not&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4 || PI_CARD_ADDR_REG || Takes the device buffer address for RAM&amp;lt;-&amp;gt;NAND DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460004C || 4 || PI_CARD_CONFIG_REG || Takes configuration parameters for the NAND card&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4 || || Feature bitmask? &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600058 || 4 || PI_EX_RD_LEN_REG || Enhanced PI read length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460005C || 4 || PI_EX_WR_LEN_REG || Enhanced PI write length register&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#PI_MISC_REG|PI_MISC_REG]] || This register is used for RTC, error led, power and more&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4 || PI_CARD_BLK_OFFSET_REG || Takes the NAND card block offset for reading/writing&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4 || || ATB?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4620000 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0000 || 2 || PI_RDB_REQ_HI_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0002 || 2 || PI_RDB_REQ_LO_REG ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0004 || 2 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0402 || 2 || || RDB related&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E8000 || 2 || PI_RDB_STATUS_REG ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PI_MISC_REG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 31-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 6-7 || RTC mask&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Error led mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Power mask (always 0x01)&lt;br /&gt;
|-&lt;br /&gt;
| 2-3 || RTC status&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Power status (on or off)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= USB =&lt;br /&gt;
The iQue Player has support for two USB controllers, one mapped at 0xA4900000 and another at 0xA4A00000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4900000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4 || USB0_STATUS_REG || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A00000 || 4 || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4 || USB1_STATUS_REG || &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=CMD&amp;diff=964</id>
		<title>CMD</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=CMD&amp;diff=964"/>
		<updated>2019-02-04T09:32:00Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Actually link to IA8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;content metadata&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;CMD&amp;#039;&amp;#039;&amp;#039; is a file or structure used to store data about an iQue app, such as encryption keys, its access to secure kernel calls, and its access to various hardware. It is used on its own in [[SKSA]] (where SA1 and SA2 both have their own attached CMD) and also contained as part of every [[ticket]]. &lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
A CMD consists of two parts: &amp;#039;&amp;#039;&amp;#039;contentDesc&amp;#039;&amp;#039;&amp;#039;, an optional 0x2800-byte long structure containing information about a game such as its save type, title, and thumbnail image; and &amp;#039;&amp;#039;&amp;#039;BbContentMetaDataHead&amp;#039;&amp;#039;&amp;#039;. The former is not used in the content metadata for SAs.&lt;br /&gt;
&lt;br /&gt;
=== contentDesc ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Information&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| EEPROM RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| EEPROM size (either 0x200 or 0x800)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Flash RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Flash size (0x20000 if used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| SRAM RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| SRAM size (0x8000 if used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 0 RDRAM location (could be 0x807C0000 or 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 1 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 2 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 3 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak size (0x8000 when used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osRomBase (always 0xB0000000?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osTvType (always 1? which is for NTSC)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osMemSize (always 0x400000? for no expansion pak)&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Unknown, possibly another libultra boot param&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Unknown, possibly another libultra boot param&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x03&lt;br /&gt;
| chars&lt;br /&gt;
| &amp;quot;CAM&amp;quot;, unknown purpose&lt;br /&gt;
|-&lt;br /&gt;
| 0x43&lt;br /&gt;
| 0x01&lt;br /&gt;
| byte&lt;br /&gt;
| Number of &amp;quot;.u0x&amp;quot; files for this game?&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x02&lt;br /&gt;
| uint16&lt;br /&gt;
| Thumb image length (can&amp;#039;t be more than 0x4000, decompressed size must be exactly 0x1880)&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| 0x02&lt;br /&gt;
| uint16&lt;br /&gt;
| Title image length (can&amp;#039;t be more than 0x10000, how exactly would that even fit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039;&lt;br /&gt;
| bytes&lt;br /&gt;
| DEFLATE-compressed thumb image, stored as RGBA5551 (56w * 56h)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 + &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;Title image length&amp;#039;&amp;#039;&lt;br /&gt;
| bytes&lt;br /&gt;
| DEFLATE-compressed title image, stored as [http://wiki.tockdom.com/wiki/Image_Formats#IA8 IA8] (184w * 24h)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 + &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039; + &amp;#039;&amp;#039;Title image length&amp;#039;&amp;#039;&lt;br /&gt;
| 0x27B8 - image lengths&lt;br /&gt;
| chars&lt;br /&gt;
| Title name + ISBN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BbContentMetaDataHead ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
! Information&lt;br /&gt;
|-&lt;br /&gt;
| 0x2800&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| unusedPadding&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x2804&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| caCrlVersion&lt;br /&gt;
| Certificate Authority(?) CRL version&lt;br /&gt;
|-&lt;br /&gt;
| 0x2808&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| cpCrlVersion&lt;br /&gt;
| Content Protection(?) CRL version&lt;br /&gt;
|-&lt;br /&gt;
| 0x280C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| size&lt;br /&gt;
| Size (in bytes) of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x2810&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| descFlags&lt;br /&gt;
| Seemingly unused/unchecked; bit 0 set if the associated app is SA  &lt;br /&gt;
|-&lt;br /&gt;
| 0x2814&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| commonCmdIv&lt;br /&gt;
| titlekey_iv; IV used to encrypt title key (with common key)                &lt;br /&gt;
|-&lt;br /&gt;
| 0x2824&lt;br /&gt;
| 0x14&lt;br /&gt;
| uint8[20]&lt;br /&gt;
| hash&lt;br /&gt;
| SHA-1 hash of the plaintext of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x2838&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| iv&lt;br /&gt;
| content_iv; IV used to encrypt content&lt;br /&gt;
|-&lt;br /&gt;
| 0x2848&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| execFlags&lt;br /&gt;
| Despite the name, only one use/flag is known: if bit 1 is set (the &amp;quot;recrypt flag&amp;quot;), the associated app will be re-encrypted on first launch&lt;br /&gt;
|-&lt;br /&gt;
| 0x284C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| hwAccessRights&lt;br /&gt;
| bitfield, each bit enables access to some MMIO regs new to iQue Player:&lt;br /&gt;
* bits 0-7: new PI stuff              &lt;br /&gt;
* bit 0: PI buffer used for aes/NAND read output and PI DMA (1KB at PI_BASE+0x10000)    &lt;br /&gt;
* bit 1: NAND flash regs in PI        &lt;br /&gt;
* bit 2: memory mapper for old PI dma &lt;br /&gt;
* bit 3: hardware AES-engine in PI&lt;br /&gt;
* bit 4: new PI dma engine, DMAs  from/to PI buffer&lt;br /&gt;
* bit 5: new GPIO; power + LED&lt;br /&gt;
* bit 6: external IO bus stuff (debug?)&lt;br /&gt;
* bit 7: new PI error stuff&lt;br /&gt;
* bit 8: enables access to USB regs&lt;br /&gt;
* bit 9: enables access to internal ram used for SK stack  &lt;br /&gt;
(0x0000 for games except for Animal Forest which is 0x0033, 0x0013 for iQue Club, 0x01F7/0x01B3 for SA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2850&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| secureKernelRights&lt;br /&gt;
| Which [[SKC|secure kernel calls]] the associated app can use, one bit per syscall: bit 0 allows SKC 0, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2854&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| bbid&lt;br /&gt;
| If not zero, can only be run on the specified console (used for SAs, not games) &lt;br /&gt;
|-&lt;br /&gt;
| 0x2858&lt;br /&gt;
| 0x40&lt;br /&gt;
| uint8[64]&lt;br /&gt;
| issuer&lt;br /&gt;
| Certificate used to sign the cmd&lt;br /&gt;
|-&lt;br /&gt;
| 0x2898&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| id&lt;br /&gt;
| Content ID of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x289C&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| key&lt;br /&gt;
| The associated app&amp;#039;s title key. It is encrypted once with the common key. If the associated app is not an SA, then it is encrypted &amp;#039;&amp;#039;again&amp;#039;&amp;#039; with a key derived using the result of ECDH with the console&amp;#039;s private key in the Virage2 and the public key in the app&amp;#039;s ticket.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28AC&lt;br /&gt;
| 0x100&lt;br /&gt;
| uint8[256]&lt;br /&gt;
| contentMetaDataSign&lt;br /&gt;
| RSA-2048 signature over all of the above, but before the title key is encrypted a second time.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:File formats]]&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=CMD&amp;diff=963</id>
		<title>CMD</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=CMD&amp;diff=963"/>
		<updated>2019-02-04T09:30:23Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Link to IA8 format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;content metadata&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;CMD&amp;#039;&amp;#039;&amp;#039; is a file or structure used to store data about an iQue app, such as encryption keys, its access to secure kernel calls, and its access to various hardware. It is used on its own in [[SKSA]] (where SA1 and SA2 both have their own attached CMD) and also contained as part of every [[ticket]]. &lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
A CMD consists of two parts: &amp;#039;&amp;#039;&amp;#039;contentDesc&amp;#039;&amp;#039;&amp;#039;, an optional 0x2800-byte long structure containing information about a game such as its save type, title, and thumbnail image; and &amp;#039;&amp;#039;&amp;#039;BbContentMetaDataHead&amp;#039;&amp;#039;&amp;#039;. The former is not used in the content metadata for SAs.&lt;br /&gt;
&lt;br /&gt;
=== contentDesc ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Information&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| EEPROM RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| EEPROM size (either 0x200 or 0x800)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Flash RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Flash size (0x20000 if used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| SRAM RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| SRAM size (0x8000 if used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 0 RDRAM location (could be 0x807C0000 or 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 1 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 2 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 3 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak size (0x8000 when used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osRomBase (always 0xB0000000?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osTvType (always 1? which is for NTSC)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osMemSize (always 0x400000? for no expansion pak)&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Unknown, possibly another libultra boot param&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Unknown, possibly another libultra boot param&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x03&lt;br /&gt;
| chars&lt;br /&gt;
| &amp;quot;CAM&amp;quot;, unknown purpose&lt;br /&gt;
|-&lt;br /&gt;
| 0x43&lt;br /&gt;
| 0x01&lt;br /&gt;
| byte&lt;br /&gt;
| Number of &amp;quot;.u0x&amp;quot; files for this game?&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x02&lt;br /&gt;
| uint16&lt;br /&gt;
| Thumb image length (can&amp;#039;t be more than 0x4000, decompressed size must be exactly 0x1880)&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| 0x02&lt;br /&gt;
| uint16&lt;br /&gt;
| Title image length (can&amp;#039;t be more than 0x10000, how exactly would that even fit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039;&lt;br /&gt;
| bytes&lt;br /&gt;
| DEFLATE-compressed thumb image, stored as RGBA5551 (56w * 56h)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 + &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;Title image length&amp;#039;&amp;#039;&lt;br /&gt;
| bytes&lt;br /&gt;
| DEFLATE-compressed title image, stored as [http://wiki.tockdom.com/wiki/Image_Formats#I8 IA8] (184w * 24h)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 + &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039; + &amp;#039;&amp;#039;Title image length&amp;#039;&amp;#039;&lt;br /&gt;
| 0x27B8 - image lengths&lt;br /&gt;
| chars&lt;br /&gt;
| Title name + ISBN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BbContentMetaDataHead ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
! Information&lt;br /&gt;
|-&lt;br /&gt;
| 0x2800&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| unusedPadding&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x2804&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| caCrlVersion&lt;br /&gt;
| Certificate Authority(?) CRL version&lt;br /&gt;
|-&lt;br /&gt;
| 0x2808&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| cpCrlVersion&lt;br /&gt;
| Content Protection(?) CRL version&lt;br /&gt;
|-&lt;br /&gt;
| 0x280C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| size&lt;br /&gt;
| Size (in bytes) of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x2810&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| descFlags&lt;br /&gt;
| Seemingly unused/unchecked; bit 0 set if the associated app is SA  &lt;br /&gt;
|-&lt;br /&gt;
| 0x2814&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| commonCmdIv&lt;br /&gt;
| titlekey_iv; IV used to encrypt title key (with common key)                &lt;br /&gt;
|-&lt;br /&gt;
| 0x2824&lt;br /&gt;
| 0x14&lt;br /&gt;
| uint8[20]&lt;br /&gt;
| hash&lt;br /&gt;
| SHA-1 hash of the plaintext of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x2838&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| iv&lt;br /&gt;
| content_iv; IV used to encrypt content&lt;br /&gt;
|-&lt;br /&gt;
| 0x2848&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| execFlags&lt;br /&gt;
| Despite the name, only one use/flag is known: if bit 1 is set (the &amp;quot;recrypt flag&amp;quot;), the associated app will be re-encrypted on first launch&lt;br /&gt;
|-&lt;br /&gt;
| 0x284C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| hwAccessRights&lt;br /&gt;
| bitfield, each bit enables access to some MMIO regs new to iQue Player:&lt;br /&gt;
* bits 0-7: new PI stuff              &lt;br /&gt;
* bit 0: PI buffer used for aes/NAND read output and PI DMA (1KB at PI_BASE+0x10000)    &lt;br /&gt;
* bit 1: NAND flash regs in PI        &lt;br /&gt;
* bit 2: memory mapper for old PI dma &lt;br /&gt;
* bit 3: hardware AES-engine in PI&lt;br /&gt;
* bit 4: new PI dma engine, DMAs  from/to PI buffer&lt;br /&gt;
* bit 5: new GPIO; power + LED&lt;br /&gt;
* bit 6: external IO bus stuff (debug?)&lt;br /&gt;
* bit 7: new PI error stuff&lt;br /&gt;
* bit 8: enables access to USB regs&lt;br /&gt;
* bit 9: enables access to internal ram used for SK stack  &lt;br /&gt;
(0x0000 for games except for Animal Forest which is 0x0033, 0x0013 for iQue Club, 0x01F7/0x01B3 for SA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2850&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| secureKernelRights&lt;br /&gt;
| Which [[SKC|secure kernel calls]] the associated app can use, one bit per syscall: bit 0 allows SKC 0, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2854&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| bbid&lt;br /&gt;
| If not zero, can only be run on the specified console (used for SAs, not games) &lt;br /&gt;
|-&lt;br /&gt;
| 0x2858&lt;br /&gt;
| 0x40&lt;br /&gt;
| uint8[64]&lt;br /&gt;
| issuer&lt;br /&gt;
| Certificate used to sign the cmd&lt;br /&gt;
|-&lt;br /&gt;
| 0x2898&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| id&lt;br /&gt;
| Content ID of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x289C&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| key&lt;br /&gt;
| The associated app&amp;#039;s title key. It is encrypted once with the common key. If the associated app is not an SA, then it is encrypted &amp;#039;&amp;#039;again&amp;#039;&amp;#039; with a key derived using the result of ECDH with the console&amp;#039;s private key in the Virage2 and the public key in the app&amp;#039;s ticket.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28AC&lt;br /&gt;
| 0x100&lt;br /&gt;
| uint8[256]&lt;br /&gt;
| contentMetaDataSign&lt;br /&gt;
| RSA-2048 signature over all of the above, but before the title key is encrypted a second time.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:File formats]]&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=CMD&amp;diff=961</id>
		<title>CMD</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=CMD&amp;diff=961"/>
		<updated>2019-02-04T08:27:12Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: proper image format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;content metadata&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;CMD&amp;#039;&amp;#039;&amp;#039; is a file or structure used to store data about an iQue app, such as encryption keys, its access to secure kernel calls, and its access to various hardware. It is used on its own in [[SKSA]] (where SA1 and SA2 both have their own attached CMD) and also contained as part of every [[ticket]]. &lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
A CMD consists of two parts: &amp;#039;&amp;#039;&amp;#039;contentDesc&amp;#039;&amp;#039;&amp;#039;, an optional 0x2800-byte long structure containing information about a game such as its save type, title, and thumbnail image; and &amp;#039;&amp;#039;&amp;#039;BbContentMetaDataHead&amp;#039;&amp;#039;&amp;#039;. The former is not used in the content metadata for SAs.&lt;br /&gt;
&lt;br /&gt;
=== contentDesc ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Information&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| EEPROM RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| EEPROM size (either 0x200 or 0x800)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Flash RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Flash size (0x20000 if used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| SRAM RDRAM location (typically 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| SRAM size (0x8000 if used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 0 RDRAM location (could be 0x807C0000 or 0x807C0000, 0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 1 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 2 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak 3 RDRAM location (0 if unused)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Controller Pak size (0x8000 when used)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osRomBase (always 0xB0000000?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osTvType (always 1? which is for NTSC)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Probably osMemSize (always 0x400000? for no expansion pak)&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Unknown, possibly another libultra boot param&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| Unknown, possibly another libultra boot param&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 0x03&lt;br /&gt;
| chars&lt;br /&gt;
| &amp;quot;CAM&amp;quot;, unknown purpose&lt;br /&gt;
|-&lt;br /&gt;
| 0x43&lt;br /&gt;
| 0x01&lt;br /&gt;
| byte&lt;br /&gt;
| Number of &amp;quot;.u0x&amp;quot; files for this game?&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| 0x02&lt;br /&gt;
| uint16&lt;br /&gt;
| Thumb image length (can&amp;#039;t be more than 0x4000, decompressed size must be exactly 0x1880)&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| 0x02&lt;br /&gt;
| uint16&lt;br /&gt;
| Title image length (can&amp;#039;t be more than 0x10000, how exactly would that even fit?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039;&lt;br /&gt;
| bytes&lt;br /&gt;
| DEFLATE-compressed thumb image RGBA5551 (56px * 56px)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 + &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;Title image length&amp;#039;&amp;#039;&lt;br /&gt;
| bytes&lt;br /&gt;
| DEFLATE-compressed title image IA8 (184px * 24px)&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 + &amp;#039;&amp;#039;Thumb image length&amp;#039;&amp;#039; + &amp;#039;&amp;#039;Title image length&amp;#039;&amp;#039;&lt;br /&gt;
| 0x27B8 - image lengths&lt;br /&gt;
| chars&lt;br /&gt;
| Title name + ISBN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== BbContentMetaDataHead ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
! Information&lt;br /&gt;
|-&lt;br /&gt;
| 0x2800&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| unusedPadding&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| 0x2804&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| caCrlVersion&lt;br /&gt;
| Certificate Authority(?) CRL version&lt;br /&gt;
|-&lt;br /&gt;
| 0x2808&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| cpCrlVersion&lt;br /&gt;
| Content Protection(?) CRL version&lt;br /&gt;
|-&lt;br /&gt;
| 0x280C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| size&lt;br /&gt;
| Size (in bytes) of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x2810&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| descFlags&lt;br /&gt;
| Seemingly unused/unchecked; bit 0 set if the associated app is SA  &lt;br /&gt;
|-&lt;br /&gt;
| 0x2814&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| commonCmdIv&lt;br /&gt;
| titlekey_iv; IV used to encrypt title key (with common key)                &lt;br /&gt;
|-&lt;br /&gt;
| 0x2824&lt;br /&gt;
| 0x14&lt;br /&gt;
| uint8[20]&lt;br /&gt;
| hash&lt;br /&gt;
| SHA-1 hash of the plaintext of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x2838&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| iv&lt;br /&gt;
| content_iv; IV used to encrypt content&lt;br /&gt;
|-&lt;br /&gt;
| 0x2848&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| execFlags&lt;br /&gt;
| Despite the name, only one use/flag is known: if bit 1 is set (the &amp;quot;recrypt flag&amp;quot;), the associated app will be re-encrypted on first launch&lt;br /&gt;
|-&lt;br /&gt;
| 0x284C&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| hwAccessRights&lt;br /&gt;
| bitfield, each bit enables access to some MMIO regs new to iQue Player:&lt;br /&gt;
* bits 0-7: new PI stuff              &lt;br /&gt;
* bit 0: PI buffer used for aes/NAND read output and PI DMA (1KB at PI_BASE+0x10000)    &lt;br /&gt;
* bit 1: NAND flash regs in PI        &lt;br /&gt;
* bit 2: memory mapper for old PI dma &lt;br /&gt;
* bit 3: hardware AES-engine in PI&lt;br /&gt;
* bit 4: new PI dma engine, DMAs  from/to PI buffer&lt;br /&gt;
* bit 5: new GPIO; power + LED&lt;br /&gt;
* bit 6: external IO bus stuff (debug?)&lt;br /&gt;
* bit 7: new PI error stuff&lt;br /&gt;
* bit 8: enables access to USB regs&lt;br /&gt;
* bit 9: enables access to internal ram used for SK stack  &lt;br /&gt;
(0x0000 for games except for Animal Forest which is 0x0033, 0x0013 for iQue Club, 0x01F7/0x01B3 for SA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2850&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| secureKernelRights&lt;br /&gt;
| Which [[SKC|secure kernel calls]] the associated app can use, one bit per syscall: bit 0 allows SKC 0, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2854&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| bbid&lt;br /&gt;
| If not zero, can only be run on the specified console (used for SAs, not games) &lt;br /&gt;
|-&lt;br /&gt;
| 0x2858&lt;br /&gt;
| 0x40&lt;br /&gt;
| uint8[64]&lt;br /&gt;
| issuer&lt;br /&gt;
| Certificate used to sign the cmd&lt;br /&gt;
|-&lt;br /&gt;
| 0x2898&lt;br /&gt;
| 0x04&lt;br /&gt;
| uint32&lt;br /&gt;
| id&lt;br /&gt;
| Content ID of the associated app&lt;br /&gt;
|-&lt;br /&gt;
| 0x289C&lt;br /&gt;
| 0x10&lt;br /&gt;
| uint8[16]&lt;br /&gt;
| key&lt;br /&gt;
| The associated app&amp;#039;s title key. It is encrypted once with the common key. If the associated app is not an SA, then it is encrypted &amp;#039;&amp;#039;again&amp;#039;&amp;#039; with a key derived using the result of ECDH with the console&amp;#039;s private key in the Virage2 and the public key in the app&amp;#039;s ticket.&lt;br /&gt;
|-&lt;br /&gt;
| 0x28AC&lt;br /&gt;
| 0x100&lt;br /&gt;
| uint8[256]&lt;br /&gt;
| contentMetaDataSign&lt;br /&gt;
| RSA-2048 signature over all of the above, but before the title key is encrypted a second time.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:File formats]]&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=SKC&amp;diff=898</id>
		<title>SKC</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=SKC&amp;diff=898"/>
		<updated>2018-07-10T06:58:03Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: /* Secure Kernel calls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Secure Kernel calls =&lt;br /&gt;
All secure kernel calls return a s32 error code in $v0. 0 means success, below zero means error.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || Arguments&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || skGetId || $a0=u32* out_bbid&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || skLaunchSetup || $a0=[[Ticket|BbTicket]]** ticket, $a1=???, $a2=u8* recrypt_list&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || skLaunch || $a0=u8* decrypted_content&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || skRecryptListValid || $a0=u8* recrypt_list&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || skRecryptBegin || $a0=???, $a1=???, $a2=???&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || skRecryptData || $a0=u8* buf, $a1=u32 size&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || skRecryptComputeState || $a0=u8* buf, $a1=u32 size&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || skRecryptEnd || $a0=u8* buf&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || skSignHash || $a0=u8* sha1hash, $a1=u8* out_signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || skVerifyHash || $a0=u8* sha1hash, $a1=u8* signature, $a2=certificate** certificate_chain, $a3=crl** crls?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || skGetConsumption || $a0=u8* out_size_buf, $a1=u8* out_buf&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || skAdvanceTicketWindow || void&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || skSetLimit || $a0=u16 limit_low?, $a1=u16 limit_high?&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || skExit || void&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || skKeepAlive || void&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=Bootrom&amp;diff=895</id>
		<title>Bootrom</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Bootrom&amp;diff=895"/>
		<updated>2018-07-04T02:20:05Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Created page with &amp;quot;{{DISPLAYTITLE:Bootrom}} The bootrom is located at 0xBFC20000 and is 0x2000 bytes large. The bootrom is largely made up of NAND reading, aes decryption and sha1 hashing code....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Bootrom}}&lt;br /&gt;
The bootrom is located at 0xBFC20000 and is 0x2000 bytes large. The bootrom is largely made up of NAND reading, aes decryption and sha1 hashing code. Its primary function is to load the Secure Kernel from NAND, decrypt it, hash it and compare the hash, before jumping to it. It compares the hash against the hash stored in [[Virage2]]. The key and IV used to decrypt SK are located within the bootrom, the key being at offset 0x1460 and the IV being at 0x1470.&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=SKC&amp;diff=889</id>
		<title>SKC</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=SKC&amp;diff=889"/>
		<updated>2018-06-17T05:26:57Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: oops&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Secure Kernel calls =&lt;br /&gt;
All secure kernel calls return a s32 error code in $v0. 0 means success, below zero means error.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || Arguments&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || skGetId || $a0=u32* out_bbid&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || skLaunchSetup || $a0=[[Ticket|BbTicket]]** ticket, $a1=???, $a2=???&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || skLaunch || $a0=u8* decrypted_content&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || skRecryptListValid || $a0=u8* recrypt_list&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || skRecryptBegin || $a0=???, $a1=???, $a2=???&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || skRecryptData || $a0=u8* buf, $a1=u32 size&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || skRecryptComputeState || $a0=u8* buf, $a1=u32 size&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || skRecryptEnd || $a0=u8* buf&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || skSignHash || $a0=u8* sha1hash, $a1=u8* out_signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || skVerifyHash || $a0=u8* sha1hash, $a1=u8* signature, $a2=certificate** certificate_chain, $a3=crl** crls?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || skGetConsumption || $a0=u8* out_size_buf, $a1=u8* out_buf&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || skAdvanceTicketWindow || void&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || skSetLimit || $a0=u16 limit_low?, $a1=u16 limit_high?&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || skExit || void&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || skKeepAlive || void&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=SKC&amp;diff=888</id>
		<title>SKC</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=SKC&amp;diff=888"/>
		<updated>2018-06-17T05:05:01Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Secure Kernel calls =&lt;br /&gt;
All secure kernel calls return a s32 error code in $v0. 0 means success, below zero means error.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || Arguments&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || skGetId || $a0=u32* out_bbid&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || skLaunchSetup || $a0=[[Ticket|BbTicket]]* ticket, $a1=???, $a2=???&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || skLaunch || $a0=u8* decrypted_content&lt;br /&gt;
|-&lt;br /&gt;
| 0x3 || skRecryptListValid || $a0=u8* recrypt_list&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || skRecryptBegin || $a0=???, $a1=???, $a2=???&lt;br /&gt;
|-&lt;br /&gt;
| 0x5 || skRecryptData || $a0=u8* buf, $a1=u32 size&lt;br /&gt;
|-&lt;br /&gt;
| 0x6 || skRecryptComputeState || $a0=u8* buf, $a1=u32 size&lt;br /&gt;
|-&lt;br /&gt;
| 0x7 || skRecryptEnd || $a0=u8* buf&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || skSignHash || $a0=u8* sha1hash, $a1=u8* out_signature&lt;br /&gt;
|-&lt;br /&gt;
| 0x9 || skVerifyHash || $a0=u8* sha1hash, $a1=u8* signature, $a2=certificate** certificate_chain, $a3=crl** crls?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || skGetConsumption || $a0=u8* out_size_buf, $a1=u8* out_buf&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || skAdvanceTicketWindow || void&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || skSetLimit || $a0=u16 limit_low?, $a1=u16 limit_high?&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || skExit || void&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || skKeepAlive || void&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IQue_Player_System_Flaws&amp;diff=817</id>
		<title>IQue Player System Flaws</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IQue_Player_System_Flaws&amp;diff=817"/>
		<updated>2018-05-03T20:53:12Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: fix small typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:iQue Player System Flaws}}&lt;br /&gt;
==Hardware==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| No known hardware exploits &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Secure Kernel==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| psychic paper: Secure Kernel could incorrectly consider a self-signed certificate chain as valid&lt;br /&gt;
| The function for verifying certificate chains at &amp;lt;tt&amp;gt;0x9FC028BC&amp;lt;/tt&amp;gt; is passed an array of pointers to certificates.&lt;br /&gt;
For the first 5 elements, it checks to see if the certificate was issued by &amp;lt;tt&amp;gt;Root&amp;lt;/tt&amp;gt;, if so it checks if the certificate was signed by the hardcoded &amp;lt;tt&amp;gt;Root&amp;lt;/tt&amp;gt; public key (and returns immediately with the result).&lt;br /&gt;
&lt;br /&gt;
If the certificate wasn&amp;#039;t signed by &amp;lt;tt&amp;gt;Root&amp;lt;/tt&amp;gt;, it checks if the certificate was signed by the public key of the next certificate in the array.&lt;br /&gt;
&lt;br /&gt;
If all 5 certificates verified correctly, the function will return success.&lt;br /&gt;
| Assuming this function can be called with an attacker-controlled array of certificates (this is possible, thanks to other (below) issues), self-signing of certificates (and thus, arbitrary code execution, with full non-Secure Mode privileges)&lt;br /&gt;
(This is not the case for Secure Applications, the code in SK for verifying those sets up a hardcoded array on the stack for the certificate verification function)&lt;br /&gt;
| April 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| skLaunchSetup and skRecryptBegin leave CMD in memory if its signature does not verify&lt;br /&gt;
| The function called by skLaunchSetup (and skRecryptBegin) at &amp;lt;tt&amp;gt;0x9FC00BAC&amp;lt;/tt&amp;gt; verifies ticket and CMD, and decrypts the titlekey.&lt;br /&gt;
After verifying the ticket signature, it copies the CMD to another place in memory, derives the titlekey encryption key, decrypts the titlekey with the titlekek, then verifies the CMD signature.&lt;br /&gt;
&lt;br /&gt;
If the CMD signature does not verify successfully, the function just returns an error, leaving the unsigned CMD in place.&lt;br /&gt;
&lt;br /&gt;
Most of the code that uses a CMD in SK uses the CMD in that place in memory that this function copies the CMD to, and trusts that whatever data is there has been verified already.&lt;br /&gt;
&lt;br /&gt;
The entire CMD is covered by the ticket signature anyway, so this isn&amp;#039;t that useful really, besides potentially making psychic paper easier to exploit.&lt;br /&gt;
| With existing code execution with access to skLaunchSetup or skRecryptBegin and some other SKC that uses SK&amp;#039;s internal CMD copy (only non-test SAs have this level of access), and the ability to sign a ticket but not a CMD:&lt;br /&gt;
Allowing the use of an unsigned CMD by SK, potentially leading to privilege escalation (by specifying arbitrary allowed hardware access/allowed SKCs).&lt;br /&gt;
| April 26, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| skLaunch does not check content hash if recrypt flag is set in CMD&lt;br /&gt;
| skLaunch calculates the SHA1 hash of the content and compares it to the value in the CMD, returning an error if the hash doesn&amp;#039;t match. This entire block of code is jumped over if the recrypt flag is set in the CMD.&lt;br /&gt;
| With plaintext of an application with the recrypt flag set in its CMD, arbitrary code execution (via, for example, implementation of the attack described in pocorgtfo17)&lt;br /&gt;
| Early 2018?&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
| skVerifyHash signature pointer not validated&lt;br /&gt;
| skVerifyHash takes in a u8 pointer to a signature to verify, but does not actually validate this pointer is valid before treating the memory it points to as an RSA/ECC signature.&lt;br /&gt;
| Causing the Secure Kernel to data abort -- possibly usable as an infoleak, depending on the provided cert chain&lt;br /&gt;
| April 29, 2018&lt;br /&gt;
| [[User:SciresM|SciresM]]&lt;br /&gt;
|-&lt;br /&gt;
| SK&amp;#039;s ECDH implementation does no validation of the other party&amp;#039;s public key&lt;br /&gt;
| When deriving the titlekek using ECDH, SK does no validation whatsoever of the public key, which comes from the ticket. Because ECDH is just multiplication, passing in an all-zero public key would lead to an all-zero titlekek being used.&lt;br /&gt;
| With the ability to sign a ticket and CMD (for example, psychic paper): causing SK to use a constant titlekek; no need to know a console&amp;#039;s ECC keypair.&lt;br /&gt;
| April 29, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| skRecryptData insufficient checks&lt;br /&gt;
| skRecryptData allows for NULL to be passed in as a pointer, for supporting some alternate mode controlled by a u32 in SK .data.&lt;br /&gt;
However, if this u32 is 0 (which is the default), no further checks are done and recrypt operations are done starting from NULL with provided length (in 0x400 chunks).&lt;br /&gt;
&lt;br /&gt;
Also, if skRecryptBegin wasn&amp;#039;t called, the recrypt operation is done by decrypting using the current hardware AES engine state, then re-encrypting with a completely zero internal state (which is invalid, so nothing will be done).&lt;br /&gt;
&lt;br /&gt;
If skRecryptBegin was called, the re-encryption will succeed as the internal state would have been set, and re-encrypted data would be written to the same area that the original data was read from. (To get to the SK code area with this, though, requires overwriting all of DRAM)&lt;br /&gt;
| Possible infoleak into the PI buffer. (without recrypt state set)&lt;br /&gt;
Possible secure mode code execution. (with recrypt state set)&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| SK&amp;#039;s CRL checking function will not check a ticket CRL at all if the ticket CRL version in the ticket (as s32) is &amp;lt; 0&lt;br /&gt;
| The function in SK that checks provided CRLs at &amp;lt;tt&amp;gt;0x9FC02CB4&amp;lt;/tt&amp;gt; checks the provided ticket CRL version first (which comes from the ticket.) If it&amp;#039;s less than 0 as s32, it will not be checked at all, that call will be jumped over.&lt;br /&gt;
&lt;br /&gt;
The first CRL in the list is the ticket CRL; thus this could provide a favourable situation for exploiting psychic paper.&lt;br /&gt;
&lt;br /&gt;
Additionally, the required elements to craft a CRL such that SA believes it to be valid with the public key in the correct place for psychic paper do not overlap.&lt;br /&gt;
&lt;br /&gt;
Furthermore, libultra function osBbSaGamePrelaunch (which calls skLaunchSetup/skRecryptBegin/etc), which is called by SA when launching a game, stores the CRL structure for those two SKCs directly after the ticket bundle structure in .data. This, plus other flaws (below) lead directly to the successful exploitation of psychic paper.&lt;br /&gt;
| Exploitation of psychic paper&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| eSKape: bad SKC table bounds check&lt;br /&gt;
| SK&amp;#039;s Secure Kernel Call handler bounds check uses a signed comparison when checking the SKC number that&amp;#039;s being called to make sure it is within the bounds of the table, leading to the ability to have SK take the SKC function pointer from non-secure RAM, and thus, arbitrary code execution in secure mode.&lt;br /&gt;
| Secure mode code execution.&lt;br /&gt;
| May 1, 2018&lt;br /&gt;
| [[User:Stuckpixel|Stuckpixel]] and [[User:Riley|Riley]] (complementary)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==System Applications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Exploitable System Applications&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| libultra _osBbSaVerifyTickets gets an entire ticket bundle then just uses skVerifyHash with the ticket cert-chain ptr&lt;br /&gt;
| _osBbVerifyTickets is called by osBbSaMetaGetTickets if argument 2 is not 0. (osBbSaMetaGetTickets, in turn, is called by a function in SA that appears to get the data for the game menu?)&lt;br /&gt;
This function calls osBbSaBundleTicket, which gets a &amp;quot;ticket bundle&amp;quot; (struct containing ticket + ticket+CMD cert chain + CRL pointers, pointer to which is used as an argument for skLaunchSetup and skRecryptBegin), then proceeds to call skVerifyHash passing a pointer to the ticket cert-chain pointer array from that structure.&lt;br /&gt;
&lt;br /&gt;
Given that the CMD cert chain pointer array is directly after the ticket cert-chain pointer array in that structure, this gives a favourable situation for exploitation of psychic paper.&lt;br /&gt;
| Exploitation of psychic paper and self-signing tickets such that non-test SAs believe them to be valid.&lt;br /&gt;
| All non-test SAs?&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| libultra osBbSaCertCreateChain only uses the endmost certificate&amp;#039;s issuer&lt;br /&gt;
| osBbSaCertCreateChain parses cert.sys to create a cert chain array for SK (first element points to the object&amp;#039;s signer, second element points to its signer, etc.).&lt;br /&gt;
This function only uses the issuer of the endmost certificate (object&amp;#039;s signer), to get a list of certificate names to obtain.&lt;br /&gt;
&lt;br /&gt;
The rest of the certificates only have their name compared against the one currently being searched for. There are no checks that the chain being created ends in Root. This gives a favourable situation for exploitation of psychic paper.&lt;br /&gt;
| Exploitation of psychic paper&lt;br /&gt;
| All non-test SAs?&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=804</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=804"/>
		<updated>2018-05-03T07:33:50Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Add some NAND info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4  || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || || Reading from this address within game code causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = ?, bit 2 = SKC, the other bits seem unused. bit 9 = execute related? (isBb?), bit 8 = execute related?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA430002C || 1 || MI_RANDOM_BIT || Hardware RNG? Seems to return 1 bit of randomness, SK function at &amp;lt;tt&amp;gt;0x9FC03410&amp;lt;/tt&amp;gt; gets lots of entropy from this then hashes it with SHA1 (several times?), this function is used to get randomness used when ECC signing, and when creating key material for recrypt.sys.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Writes to this address seem to indicate the address to read data into RAM from the NAND&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=Virage2&amp;diff=745</id>
		<title>Virage2</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=Virage2&amp;diff=745"/>
		<updated>2018-05-02T22:22:59Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OTP is a One Time Programmable 256 (0xFF) Byte memory region located inside the SoC. It seems to be called &amp;quot;virage2&amp;quot; in the SDK code. It can only be read in secure mode, and is mapped to &amp;lt;tt&amp;gt;0xBFCA0000&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0x14  || SK Hash || common&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 0x10 x 4 || ROM Patch || common&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || 0x20  || EccPublicKey || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || 0x04  || bbId || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || 0x40  || EccPrivateKey || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0xB8 || 0x10  || bootAppKey - COMMON KEY || common&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8 || 0x10  || recryptListKey || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8 || 0x10  || appStateKey || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8 || 0x10  || selfMsgKey || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8 || 0x04  || csumAdjust || per-console&lt;br /&gt;
|-&lt;br /&gt;
| 0xFC || 0x04  || jtagEnable || common&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IQue_Player_System_Flaws&amp;diff=728</id>
		<title>IQue Player System Flaws</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IQue_Player_System_Flaws&amp;diff=728"/>
		<updated>2018-05-02T00:40:02Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: document eSKape&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:iQue Player System Flaws}}&lt;br /&gt;
==Hardware==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| No known hardware exploits &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Secure Kernel==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| psychic paper: Secure Kernel could incorrectly consider a self-signed certificate chain as valid&lt;br /&gt;
| The function for verifying certificate chains at &amp;lt;tt&amp;gt;0x9FC028BC&amp;lt;/tt&amp;gt; is passed an array of pointers to certificates.&lt;br /&gt;
For the first 5 elements, it checks to see if the certificate was issued by &amp;lt;tt&amp;gt;Root&amp;lt;/tt&amp;gt;, if so it checks if the certificate was signed by the hardcoded &amp;lt;tt&amp;gt;Root&amp;lt;/tt&amp;gt; public key (and returns immediately with the result).&lt;br /&gt;
&lt;br /&gt;
If the certificate wasn&amp;#039;t signed by &amp;lt;tt&amp;gt;Root&amp;lt;/tt&amp;gt;, it checks if the certificate was signed by the public key of the next certificate in the array.&lt;br /&gt;
&lt;br /&gt;
If all 5 certificates verified correctly, the function will return success.&lt;br /&gt;
| Assuming this function can be called with an attacker-controlled array of certificates (this is possible, thanks to other (below) issues), self-signing of certificates (and thus, arbitrary code execution, with full non-Secure Mode privileges)&lt;br /&gt;
(This is not the case for Secure Applications, the code in SK for verifying those sets up a hardcoded array on the stack for the certificate verification function)&lt;br /&gt;
| April 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| skLaunchSetup and skRecryptBegin leave CMD in memory if its signature does not verify&lt;br /&gt;
| The function called by skLaunchSetup (and skRecryptBegin) at &amp;lt;tt&amp;gt;0x9FC00BAC&amp;lt;/tt&amp;gt; verifies ticket and CMD, and decrypts the titlekey.&lt;br /&gt;
After verifying the ticket signature, it copies the CMD to another place in memory, derives the titlekey encryption key, decrypts the titlekey with the titlekek, then verifies the CMD signature.&lt;br /&gt;
&lt;br /&gt;
If the CMD signature does not verify successfully, the function just returns an error, leaving the unsigned CMD in place.&lt;br /&gt;
&lt;br /&gt;
Most of the code that uses a CMD in SK uses the CMD in that place in memory that this function copies the CMD to, and trusts that whatever data is there has been verified already.&lt;br /&gt;
&lt;br /&gt;
The entire CMD is covered by the ticket signature anyway, so this isn&amp;#039;t that useful really, besides potentially making psychic paper easier to exploit.&lt;br /&gt;
| With existing code execution with access to skLaunchSetup or skRecryptBegin and some other SKC that uses SK&amp;#039;s internal CMD copy (only non-test SAs have this level of access), and the ability to sign a ticket but not a CMD:&lt;br /&gt;
Allowing the use of an unsigned CMD by SK, potentially leading to privilege escalation (by specifying arbitrary allowed hardware access/allowed SKCs).&lt;br /&gt;
| April 26, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| skLaunch does not check content hash if recrypt flag is set in CMD&lt;br /&gt;
| skLaunch calculates the SHA1 hash of the content and compares it to the value in the CMD, returning an error if the hash doesn&amp;#039;t match. This entire block of code is jumped over if the recrypt flag is set in the CMD.&lt;br /&gt;
| With plaintext of an application with the recrypt flag set in its CMD, arbitrary code execution (via, for example, implementation of the attack described in pocorgtfo17)&lt;br /&gt;
| Early 2018?&lt;br /&gt;
| Everyone&lt;br /&gt;
|-&lt;br /&gt;
| skVerifyHash signature pointer not validated&lt;br /&gt;
| skVerifyHash takes in a u8 pointer to a signature to verify, but does not actually validate this pointer is valid before treating the memory it points to as an RSA/ECC signature.&lt;br /&gt;
| Causing the Secure Kernel to data abort -- possibly usable as an infoleak, depending on the provided cert chain&lt;br /&gt;
| April 29, 2018&lt;br /&gt;
| [[User:SciresM|SciresM]]&lt;br /&gt;
|-&lt;br /&gt;
| SK&amp;#039;s ECDH implementation does no validation of the other party&amp;#039;s public key&lt;br /&gt;
| When deriving the titlekek using ECDH, SK does no validation whatsoever of the public key, which comes from the ticket. Because ECDH is just multiplication, passing in an all-zero public key would lead to an all-zero titlekek being used.&lt;br /&gt;
| With the ability to sign a ticket and CMD (for example, psychic paper): causing SK to use a constant titlekek; no need to know a console&amp;#039;s ECC keypair.&lt;br /&gt;
| April 29, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| skRecryptData insufficient checks&lt;br /&gt;
| skRecryptData allows for NULL to be passed in as a pointer, for supporting some alternate mode controlled by a u32 in SK .data.&lt;br /&gt;
However, if this u32 is 0 (which is the default), no further checks are done and recrypt operations are done starting from NULL with provided length (in 0x400 chunks).&lt;br /&gt;
&lt;br /&gt;
Also, if skRecryptBegin wasn&amp;#039;t called, the recrypt operation is done by decrypting using the current hardware AES engine state, then re-encrypting with a completely zero internal state (which is invalid, so nothing will be done).&lt;br /&gt;
&lt;br /&gt;
If skRecryptBegin was called, the re-encryption will succeed as the internal state would have been set, and re-encrypted data would be written to the same area that the original data was read from. (To get to the SK code area with this, though, requires overwriting all of DRAM)&lt;br /&gt;
| Possible infoleak into the PI buffer. (without recrypt state set)&lt;br /&gt;
Possible secure mode code execution. (with recrypt state set)&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| SK&amp;#039;s CRL checking function will not check a ticket CRL at all if the ticket CRL version in the ticket (as s32) is &amp;lt; 0&lt;br /&gt;
| The function in SK that checks provided CRLs at &amp;lt;tt&amp;gt;0x9FC02CB4&amp;lt;/tt&amp;gt; checks the provided ticket CRL version first (which comes from the ticket.) If it&amp;#039;s less than 0 as s32, it will not be checked at all, that call will be jumped over.&lt;br /&gt;
&lt;br /&gt;
The first CRL in the list is the ticket CRL; thus this could provide a favourable situation for exploiting psychic paper.&lt;br /&gt;
&lt;br /&gt;
Additionally, the required elements to craft a CRL such that SA believes it to be valid with the public key in the correct place for psychic paper do not overlap.&lt;br /&gt;
&lt;br /&gt;
Furthermore, libultra function osBbSaGamePrelaunch (which calls skLaunchSetup/skRecryptBegin/etc), which is called by SA when launching a game, stores the CRL structure for those two SKCs directly after the ticket bundle structure in .data. This, plus other flaws (below) lead directly to the successful exploitation of psychic paper.&lt;br /&gt;
| Exploitation of psychic paper&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| eSKape: bad SKC table bounds check&lt;br /&gt;
| SK&amp;#039;s Secure Kernel Call handler bounds checks uses a signed comparison when checking the SKC number that&amp;#039;s being called to make sure it is within the bounds of the table, leading to the ability to have SK take the SKC function pointer from non-secure RAM, and thus, arbitrary code execution in secure mode.&lt;br /&gt;
| Secure mode code execution.&lt;br /&gt;
| May 1, 2018&lt;br /&gt;
| [[User:Stuckpixel|Stuckpixel]] and [[User:Riley|Riley]] (complementary)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==System Applications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Summary&lt;br /&gt;
!  Description&lt;br /&gt;
!  Successful exploitation result&lt;br /&gt;
!  Exploitable System Applications&lt;br /&gt;
!  Timeframe this was discovered&lt;br /&gt;
!  Discovered by&lt;br /&gt;
|-&lt;br /&gt;
| libultra _osBbSaVerifyTickets gets an entire ticket bundle then just uses skVerifyHash with the ticket cert-chain ptr&lt;br /&gt;
| _osBbVerifyTickets is called by osBbSaMetaGetTickets if argument 2 is not 0. (osBbSaMetaGetTickets, in turn, is called by a function in SA that appears to get the data for the game menu?)&lt;br /&gt;
This function calls osBbSaBundleTicket, which gets a &amp;quot;ticket bundle&amp;quot; (struct containing ticket + ticket+CMD cert chain + CRL pointers, pointer to which is used as an argument for skLaunchSetup and skRecryptBegin), then proceeds to call skVerifyHash passing a pointer to the ticket cert-chain pointer array from that structure.&lt;br /&gt;
&lt;br /&gt;
Given that the CMD cert chain pointer array is directly after the ticket cert-chain pointer array in that structure, this gives a favourable situation for exploitation of psychic paper.&lt;br /&gt;
| Exploitation of psychic paper and self-signing tickets such that non-test SAs believe them to be valid.&lt;br /&gt;
| All non-test SAs?&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|-&lt;br /&gt;
| libultra osBbSaCertCreateChain only uses the endmost certificate&amp;#039;s issuer&lt;br /&gt;
| osBbSaCertCreateChain parses cert.sys to create a cert chain array for SK (first element points to the object&amp;#039;s signer, second element points to its signer, etc.).&lt;br /&gt;
This function only uses the issuer of the endmost certificate (object&amp;#039;s signer), to get a list of certificate names to obtain.&lt;br /&gt;
&lt;br /&gt;
The rest of the certificates only have their name compared against the one currently being searched for. There are no checks that the chain being created ends in Root. This gives a favourable situation for exploitation of psychic paper.&lt;br /&gt;
| Exploitation of psychic paper&lt;br /&gt;
| All non-test SAs?&lt;br /&gt;
| April 30, 2018&lt;br /&gt;
| [[User:Riley|Riley]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=727</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=727"/>
		<updated>2018-05-01T22:56:47Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4  || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || || Reading from this address within game code causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = ?, bit 2 = SKC, the other bits seem unused&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Many times used for read/write actions. (card data access register???)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=726</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=726"/>
		<updated>2018-05-01T22:52:43Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4  || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || || Reading from the address within game code causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value: bits 7-4 = ?, bit 3 = ?, bit 2 = SKC, the other bits seem unused&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Many times used for read/write actions. (card data access register???)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=725</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=725"/>
		<updated>2018-05-01T22:16:53Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: clarify&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4  || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || || Reading from the address within game code causes an exception; SK exception handler checks this address as well, and makes some decisions based on the value&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Many times used for read/write actions. (card data access register???)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=724</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=724"/>
		<updated>2018-05-01T22:16:22Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4  || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || || Reading from the address within game code causes an exception; SK checks this address as well, and makes some decisions based on the value&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Many times used for read/write actions. (card data access register???)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=722</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=722"/>
		<updated>2018-05-01T20:39:04Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Add address SK refers to&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300010 || 4  || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Many times used for read/write actions. (card data access register???)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IO&amp;diff=721</id>
		<title>IO</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IO&amp;diff=721"/>
		<updated>2018-05-01T19:30:02Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: the card only contains NAND&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Custom registers.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
! Note&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300014 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4300038 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA430003C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4400000 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4500008 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600010 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600014 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600018 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA460001C || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600020 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600024 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600028 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA460002C || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600030 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600040 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600044 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600048 || 4? || || Many times used for read/write actions. (card data access register???)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600050 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600054 || 4? || ||  &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600060 || 4 || [[#StatusField| StatusField]] || This register is used for RTC, error led and other things... (probably status register?, made-up name)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4600070 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610000 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610200 || 4? || || &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610420 || 176 || PI_AES_EXPANDED_KEY || AES-128 expanded key for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46104D0 || 16 || PI_AES_IV || AES-128-CBC initialisation vector for hardware AES engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610500 || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4610504 || 4? || || atb? (virtual address?)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA46E0400 || 4? or 2? || || rdb?&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4940010 || 4? || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4A40010 || 4? || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= StatusField = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit(s)&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| ?-15 || Box Id&lt;br /&gt;
|-&lt;br /&gt;
| 27 || Power (on and off)&lt;br /&gt;
|-&lt;br /&gt;
| 28 || RTC related?&lt;br /&gt;
|-&lt;br /&gt;
| 29 || Unknown bit&lt;br /&gt;
|-&lt;br /&gt;
| 30 || Error led&lt;br /&gt;
|-&lt;br /&gt;
| 31 || Power (only on)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
&lt;br /&gt;
The iQue Player has a custom RTC functionality. The Nintendo 64 doesn&amp;#039;t have a RTC, except the Nintendo 64 version of Animal Crossing which uses a special custom RTC chip instead of a built-in RTC. The RTC functionality is heavly used in the game [[Animal_Crossing| Animal Crossing]]. The RTC can be accessed through 0xA4600060. (unknown how)&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=IQue_Card&amp;diff=709</id>
		<title>IQue Card</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=IQue_Card&amp;diff=709"/>
		<updated>2018-04-30T22:37:14Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: Add NAND datasheet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:iQue Card}}&lt;br /&gt;
[[File:IQue_card_disassembled.jpg|thumb|A disassembled &amp;#039;&amp;#039;&amp;#039;iQue Card&amp;#039;&amp;#039;&amp;#039;.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;iQue Card&amp;#039;&amp;#039;&amp;#039; (Chinese: 神游卡) is a removable memory card of the [[iQue Player]], used to store [[games]] and the [[SKSA|&amp;quot;Upgradeable Operating System&amp;quot;]]. It is located on the bottom of every unit.&lt;br /&gt;
&lt;br /&gt;
The iQue Card is housed in a plastic shell, which contains a Samsung K9F1208U0M-YCB0 NAND chip on a special PCB codenamed &amp;quot;DOOKIE&amp;quot;. The contents of the NAND are documented on the [[NAND]] page.&lt;br /&gt;
&lt;br /&gt;
Datasheet: [http://www.reinerziegler.de/ique/ds_k9f1208u0m.pdf]&lt;br /&gt;
&lt;br /&gt;
== DOOKIE ==&lt;br /&gt;
The DOOKIE board is very basic, and it contains the NAND flash, a few resistors, and an edge connector to connect with an [[iQue Player]]. The connector has a 1.1mm pitch and seems to be custom made. No other commonly-available connector appears to fit in it except the MicroSD.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
	<entry>
		<id>http://www.iquebrew.org/index.php?title=SKC&amp;diff=691</id>
		<title>SKC</title>
		<link rel="alternate" type="text/html" href="http://www.iquebrew.org/index.php?title=SKC&amp;diff=691"/>
		<updated>2018-04-29T07:45:23Z</updated>

		<summary type="html">&lt;p&gt;Stuckpixel: add skcKeepAlive&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Secure Kernel calls =&lt;br /&gt;
&lt;br /&gt;
All secure kernel calls return a s32 error code in $v0. 0 means success, below zero means error.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In&lt;br /&gt;
|-&lt;br /&gt;
|  0x0 || skcGetBBID || $a0=u32* out_bbid&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || skcPrepareCMDAndTik || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || skcStartContent || $a0=address where decrypted content has been loaded&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || skcVerifyRecryptSys || $a0=address of recrypt.sys contents&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || skcECCSignSHA1Hash || $a0=u8* sha1hash, $a1=u8* out_signature&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || skcVerifySignature || $a0=u8* sha1hash, $a1=u8* signature, $a2=certificate** certificate_chain, $a3=crl** crls?&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0xB || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || skcReboot || void&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || skcKeepAlive || void&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stuckpixel</name></author>
	</entry>
</feed>