123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606 |
- ----------------------------------------------------------------------------
- |rwd2?|Address|Title & Explanation |
- ||||||-----------------------------------------------------------------------|
- |||||| |
- ||||||__ ?: Don't know what the statistics on this register are |
- |||||____ 2: 2 byte (1 word) length register |
- ||||_____ d: Double-byte write required when writing to this register |
- |||______ w: Writable register |
- ||_______ r: Readable register |
- | |
- |Words in brackets ( [] ) are the official "names" of the registers |
- |Words in braces ( {} ) are different from the "real" SNES manual |
- |Bits define 1 as "ON/ENABLE" and 0 as "OFF/DISABLE," unless otherwise stated|
- |Registers without any bits/defined-data can be assumed to be 8 bits in size |
- |and should only be read once. |
- |----------------------------------------------------------------------------|
- |NOTE! I have renamed all occurances of "Plane {x}" to "BG{x+1}." This means |
- |stuff like "Plane 2" is now referred to as "BG3" - This is how it is done |
- |(so i'm told) in the official SNES documentation, so for compatibility and |
- |comprehension, i've renamed everything. |
- | |
- |I have also renamed "Sprites" to "OBJ", "objects," or "OAM" for the same |
- |reason that I renamed "Plane" to "BG." |
- |----------------------------------------------------------------------------|
- |rwd2?|Address|Title & Explanation |
- |----------------------------------------------------------------------------|
- | w |$2100 |Screen display register [INIDISP] |
- | | |x000bbbb x: 0 = Screen on. |
- | | | 1 = Screen off. |
- | | | bbbb: Brightness ($0-$F). |
- | | | |
- | | | |
- | w |$2101 |OAM size register [OBSEL] |
- | | |sssnnbbb s: 000 = 8x8 or 16x16. |
- | | | 001 = 8x8 or 32x32. |
- | | | 010 = 8x8 or 64x64. |
- | | | 011 = 16x16 or 32x32. |
- | | | 100 = 16x16 or 64x64. |
- | | | 101 = 32x32 or 64x64. |
- | | | n: Name selection (upper 4k word addr). |
- | | | b: Base selection (8k word seg. addr). |
- | | | |
- | | | |
- | w 2 |$2102 |OAM address register [OAMADDL/OAMADDH] |
- | | |aaaaaaaa r000000m a: OAM address. |
- | | | r: OAM priority rotation. |
- | | | m: OAM address MSB. |
- | | | |
- | | | |
- | wd |$2104 |OAM data register [OAMDATA] |
- | | |???????? ???????? |
- | | | |
- | | | |
- | w |$2105 |Screen mode register [BGMODE] |
- | | |abcdefff a: BG4 tile size (0=8x8, 1=16x16). |
- | | | b: BG3 tile size (0=8x8, 1=16x16). |
- | | | c: BG2 tile size (0=8x8, 1=16x16). |
- | | | d: BG1 tile size (0=8x8, 1=16x16). |
- | | | e: Highest priority for BG3 in MODE 1. |
- | | | f: MODE definition. |
- | | | |
- | | | |
- | w |$2106 |Screen pixelation register [MOSAIC] |
- | | |xxxxabcd x: Pixel size (0=Smallest, $F=Largest). |
- | | | a: Affect BG4. |
- | | | b: Affect BG3. |
- | | | c: Affect BG2. |
- | | | d: Affect BG1. |
- | | | |
- | | | |
- | w |$2107 |BG1 VRAM location register [BG1SC] |
- | | |xxxxxxab x: Base address |
- | | | ab: SC size |
- | | | |
- | | | |
- | w |$2108 |BG2 VRAM location register [BG2SC] -| |
- | w |$2109 |BG3 VRAM location register [BG3SC] |- Same as $2107. |
- | w |$210A |BG4 VRAM location register [BG4SC] -| |
- | | | |
- | | | |
- | w |$210B |BG1 & BG2 VRAM location register [BG12NBA] |
- | | |aaaabbbb a: Base address for BG2. |
- | | | b: Base address for BG1. |
- | | | |
- | | | |
- | w |$210C |BG3 & BG4 VRAM location register [BG34NBA] |
- | | |aaaabbbb a: Base address for BG4. |
- | | | b: Base address for BG3. |
- | | | |
- | | | |
- | wd |$210D |BG1 horizontal scroll register [BG1HOFS] |
- | | |mmmmmaaa aaaaaaaa a: Horizontal offset. |
- | | | m: Only set with MODE 7. |
- | | | |
- | | |This is an intruiging register. Like the types define, it has |
- | | |to be written to twice: The first byte holds the first 8 bits,|
- | | |and the second byte holds the last 3 bits. This makes a total |
- | | |of 11 bits for information. This only proves true for MODes |
- | | |0 to 6. MODE 7 uses 13 bits instead of 11. As long as you're |
- | | |not in MODE 7, you can store $00 in the 2nd byte for a smooth |
- | | |scrolling background. |
- | | | |
- | | | |
- | wd |$210E |BG1 vertical scroll register [BG1VOFS] -| |
- | wd |$210F |BG2 horizontal scroll register [BG2HOFS] | |
- | wd |$2110 |BG3 vertical scroll register [BG2VOFS] | |
- | wd |$2111 |BG3 horizontal scroll register [BG3HOFS] |- Same as $210D. |
- | wd |$2112 |BG3 vertical scroll register [BG3VOFS] | |
- | wd |$2113 |BG4 horizontal scroll register [BG4HOFS] | |
- | wd |$2114 |BG4 vertical scroll register [BG4VOFS] -| |
- | | | |
- | | | |
- | w |$2115 |Video port control [VMAIN] |
- | | |i000abcd i: 0 = Addr-inc after writing to $2118 |
- | | | or reading from $2139. |
- | | | 1 = Addr-inc after writing to $2119 |
- | | | or reading from $213A. |
- | | | ab: Full graphic (see table below). |
- | | | cd: SC increment (see table below). |
- | | |abcd|Result |
- | | |----|---------------------------------------------------------|
- | | |0100|Increment by 8 for 32 times (2-bit formation). |
- | | |1000|Increment by 8 for 64 times (4-bit formation). |
- | | |1100|Increment by 8 for 128 times (8-bit formation). |
- | | |0000|Address increments 1x1. |
- | | |0001|Address increments 32x32. |
- | | |0010|Address increments 64x64. |
- | | |0011|Address increments 128x128. |
- | | |----|---------------------------------------------------------|
- | | | |
- | | | |
- | w 2 |$2116 |Video port address [VMADDL/VMADDH] |
- | | |???????? ???????? |
- | | | |
- | | | |
- | w 2 |$2118 |Video port data [VMDATAL/VMDATAH] |
- | | |???????? ???????? |
- | | | |
- | | |According to bit 7 of $2115, the data can be stored as: |
- | | | |
- | | |Bit 7|Register |Result |
- | | |-----|---------------------------|----------------------------|
- | | | 0 |Write to $2118 only. |Lower 8-bits written then |
- | | | | |address is increased. |
- | | | 0 |Write to $2119 then $2118. |Address increased when both |
- | | | | |are written to (in order). |
- | | | 1 |Write to $2119 only. |Upper 8-bits written, then |
- | | | | |address is increased. |
- | | | 1 |Write to $2118 then $2119. |Address increased when both |
- | | | | |are written to (in order). |
- | | |-----|---------------------------|----------------------------|
- | | | |
- | | | |
- | w |$211A |MODE7 settings register [M7SEL] |
- | | |ab0000yx ab: (see table below). |
- | | | y: Vertical screen flip (1=flip). |
- | | | x: Horizontal screen flip (1=flip). |
- | | | |
- | | |ab|Result |
- | | |--|-----------------------------------------------------------|
- | | |00|Screen repetition if outside of screen area. |
- | | |10|Character 0x00 repetition if outside of screen area. |
- | | |11|Outside of screen area is back-drop screen in 1 colour. |
- | | |--|-----------------------------------------------------------|
- | | | |
- | | | |
- | w |$211B |COS (COSINE) rotate angle / X Expansion [M7A] |
- | w |$211C |SIN (SIN) rotate angle / X Expansion [M7B] |
- | w |$211D |SIN (SIN) rotate angle / Y Expansion [M7C] |
- | w |$211E |COS (COSINE) rotate angle / Y Expansion [M7D] |
- | wd |$211F |Center position X (13-bit data only) [M7X] |
- | wd |$2120 |Center position Y (13-bit data only) [M7Y] |
- | | | |
- | | |MODE 7 formulae for rotation/enlargement/reduction: |
- | | | |
- | | |X2 = AB * X1-X0 + X0 |
- | | |Y2 = CD * Y1-Y0 + Y0 |
- | | | |
- | | |A = COS(GAMMA)*(1/ALPHA) B = SIN(GAMMA)*(1/ALPHA) |
- | | |C = SIN(GAMMA)*(1/BETA) D = COS(GAMMA)*(1/BETA) |
- | | | |
- | | | GAMMA: Rotation angle. |
- | | | ALPHA: Reduction rates for X (horizontal). |
- | | | BETA: Reduction rates for Y (vertical). |
- | | |X0 & Y0: Center coordinate. |
- | | |X1 & Y1: Display coordinate. |
- | | |X2 & Y2: Coordinate before calculation. |
- | | | |
- | | | |
- | w |$2121 |Colour # (or pallete) selection register [CGADD] |
- | | |xxxxxxxx x: Address (color #). |
- | | | |
- | | | |
- | wd |$2122 |Colour data register [CGDATA] |
- | | |xxxxxxxx x: Value of colour. |
- | | | |
- | | |SNES colour is 15 bit; 5 bits for red, green, and blue. The |
- | | |order isn't RGB though: It's BGR (RGB reversed!). |
- | | | |
- | | | |
- | w |$2123 |Window mask settings register [W12SEL] |
- | | |abcdefgh a: Disable/enable BG2 Window 2. |
- | | | b: BG2 Window 2 I/O (0=IN). |
- | | | c: Disable/enable BG2 Window 1. |
- | | | d: BG2 Window 1 I/O (0=IN). |
- | | | e: Disable/enable BG1 Window 2. |
- | | | f: BG1 Window 2 I/O (0=IN). |
- | | | g: Disable/enable BG1 Window 1. |
- | | | h: BG1 Window 1 I/O (0=IN). |
- | | | |
- | | | |
- | w |$2124 |Window mask settings register [W34SEL] |
- | | |abcdefgh a: Disable/enable BG4 Window 2. |
- | | | b: BG4 Window 2 I/O (0=IN). |
- | | | c: Disable/enable BG4 Window 1. |
- | | | d: BG4 Window 1 I/O (0=IN). |
- | | | e: Disable/enable BG3 Window 2. |
- | | | f: BG3 Window 2 I/O (0=IN). |
- | | | g: Disable/enable BG3 Window 1. |
- | | | h: BG3 Window 1 I/O (0=IN). |
- | | | |
- | | | |
- | w |$2125 |Window mask settings register [WOBJSEL] |
- | | |abcdefgh a: Disable/enable colour Window 2. |
- | | | b: Colour Window 2 I/O (0=IN). |
- | | | c: Disable/enable colour Window 1. |
- | | | d: Colour Window 1 I/O (0=IN). |
- | | | e: Disable/enable OBJ Window 2. |
- | | | f: OBJ Window 2 I/O (0=IN). |
- | | | g: Disable/enable OBJ Window 1. |
- | | | h: OBJ Window 1 I/O (0=IN). |
- | | | |
- | | | |
- | w |$2126 |Window 1 left position register [WH0] |
- | | |aaaaaaaa a: Position. |
- | | | |
- | | | |
- | w |$2127 |Window 1 right position register [WH1] -| |
- | w |$2128 |Window 2 left position register [WH2] |- Same as $2126. |
- | w |$2129 |Window 2 right position register [WH3] -| |
- | | | |
- | | |I may have the Window numbers reversed; as in, $2126 may be |
- | | |for Window 2, not Window 1; $2127 may be for Window 2, not |
- | | |Window 1... and so on... |
- | | | |
- | | | |
- | w |$212A |Mask logic settings for Window 1 & 2 per screen [WBGLOG] |
- | | |aabbccdd a: BG4 parms -| |
- | | | b: BG3 parms |- See table in $212B. |
- | | | c: BG2 parms | |
- | | | d: BG1 parms -| |
- | | | |
- | | | |
- | w |$212B |Mask logic settings for Colour Windows & OBJ Windows [WOBJLOG]|
- | | |0000aabb a: Colour Window parms (see table below)|
- | | | b: OBJ Window parms (see table below). |
- | | | |
- | | |Hi-bit|Lo-bit|Logic |
- | | |------|------|------------------------------------------------|
- | | | 0 | 0 |OR |
- | | | 0 | 1 |AND |
- | | | 1 | 0 |XOR |
- | | | 1 | 1 |XNOR |
- | | |------|------|------------------------------------------------|
- | | | |
- | | | |
- | w |$212C |Main screen designation [TM] |
- | | |000abcde a: OBJ/OAM disable/enable. |
- | | | b: Disable/enable BG4. |
- | | | c: Disable/enable BG3. |
- | | | d: Disable/enable BG2. |
- | | | e: Disable/enable BG1. |
- | | | |
- | | | |
- | w |$212D |Sub-screen designation [TD] |
- | | |*** Same as $212C, but for the sub-screens, not the main. |
- | | | |
- | | |Remember: When screen addition/subtraction is enabled, the |
- | | |sub screen is added/subtracted against the main screen. |
- | | | |
- | | | |
- | w |$212E |Window mask main screen designation register [TMW] |
- | | |*** Same as $212C, but for window-masks. |
- | | | |
- | w |$212F |Window mask sub screen designation register [TSW] |
- | | |*** Same as $212E, but for the sub screen. |
- | | | |
- | | | |
- | w |$2130 |Fixed color addition or screen addition register [CGWSEL] |
- | | |abcd00ef ab: Main (see table below). |
- | | | cd: Sub (see table below). |
- | | | e: 0 = Enable +/- for fixed colour. |
- | | | 1 = Enable +/- for sub screen. |
- | | | f: Colour & char-data = direct color |
- | | | data (MODE 3, 4 & 7 only). |
- | | | |
- | | |ab|Result |
- | | |--|-----------------------------------------------------------|
- | | |00|All the time. |
- | | |01|Inside window only. |
- | | |10|Outside window only. |
- | | |11|All the time. |
- | | |--|-----------------------------------------------------------|
- | | | |
- | w |$2131 |Addition/subtraction for screens, BGs, & OBJs [CGADSUB] |
- | | |mrgsabcd m: 0 = Enable + colour-data mode. |
- | | | 1 = Enable - colour-data mode. |
- | | | r: See below for more info. |
- | | | g: Affect back-area. |
- | | | s: Affect OBJs. |
- | | | a: Affect BG4. |
- | | | b: Affect BG3. |
- | | | c: Affect BG2. |
- | | | d: Affect BG1. |
- | | | |
- | | |*** 'r' is some sort-of "1/2 of colour data" on/off bit. When |
- | | | the colour constant +/- or screen +/- is performed, desig-|
- | | | nate whether the RGB result in the +/- area should be 1/2 |
- | | | or not; the back-area is not affected. |
- | | | |
- | | | |
- | w |$2132 |Fixed colour data for fixed colour +/- [COLDATA] |
- | | |bgrdddddd b: Set to change blue. |
- | | | g: Set to change green. |
- | | | r: Set to change red. |
- | | | d: Set colour constant data for +/-. |
- | | | |
- | | | |
- | w |$2133 |Screen mode/video select register [SETINI] |
- | | |sn00pvshi |
- | | | s: Super-impose SFX graphics over ex- |
- | | | ternal video (usually 0). |
- | | | n: External mode (screen expand). When |
- | | | sing MODE 7, enable. |
- | | | p: 0 = 256 resolution. |
- | | | 1 = 512 sub screen resolution. |
- | | | v: 0 = 224 vertical resolution. |
- | | | 1 = 239 vertical resolution. |
- | | | s: See below for more info. |
- | | | i: 0 = No interlace. |
- | | | 1 = Interlaced display. |
- | | | |
- | | |*** When in interlace mode, select either the 1-dot per line |
- | | | mode or the 1-dot repeated every 2-lines mode. If '1' is |
- | | | set in this bit, the OBJ seems to be reduced vertically |
- | | | by 1/2. |
- | | | |
- | | |*** Interlaced mode is used in the SNES test cartridge. It |
- | | | does flicker, but it gives a FULL 480 vertical resolution.|
- | | | |
- | | | |
- |r |$2134 |Multiplication result register (low) [MPYL] |
- |r |$2135 |Multiplication result register (middle) [MPYM] |
- |r |$2136 |Multiplication result register (high) [MPYH] |
- | | |*** Result is 8 bits long for $2134, $2135, and $2136. |
- | | | |
- | | | |
- |r |$2137 |Software latch for horizontal/vertical counter [SLHV] |
- | | |aaaaaaaa a: Result. |
- | | | |
- | | |The counter value at the point when $2137 is read can be |
- | | |latched. Data read is meaningless. |
- | | | |
- | | | |
- |r |$2138 |Read data from OAM {OAMDATAREAD} |
- |r 2 |$2139 |Read data from VRAM {VMDATALREAD/VMDATAHREAD} |
- |r |$213B |Read data from CG-RAM (colour) {CGDATAREAD} |
- |r d |$213C |Horizontal scanline location [OPHCT] |
- |r d |$213D |Vertical scanline location [OPVCT] |
- | | |*** Registers $213C and $213D are 9-bits in length. |
- | | | |
- | | | |
- |r |$213E |PPU status flag & version number [STAT77] |
- | | |trm0vvvv t: Time over (see below). |
- | | | r: Range over (see below). |
- | | | m: Master/slave mode select. Usually 0. |
- | | | v: Version # ($5C77 (???)). |
- | | | |
- | | |*** Range: When the quantity of the OBJ (size is non-relevant)|
- | | | becomes 33 pieces or more, '1' is set. |
- | | | Time: When the quantity of the OBJ which is converted to |
- | | | 8x8 is 35 pieces or more, '1' will be set. |
- | | | |
- | | | |
- |r |$213F |PPU status flag & version number [STAT78] |
- | | |fl0mvvvv f: Field # scanned in int. mode (0=1st).|
- | | | l: Set if external signal (light pen, |
- | | | etc.) is installed/applied. |
- | | | m: NTSC/PAL mode (0=NTSC, 1=PAL). |
- | | | v: Version # ($5C78 (???)). |
- | | | |
- | | | |
- |rw |$2140 |[APUI00] -| |
- |rw |$2141 |[APUI01] |- Audio registers. See sound.doc and sid-spc.src. |
- |rw |$2142 |[APUI02] | |
- |rw |$2143 |[APUI03] -| |
- | | | |
- | | | |
- |rw |$2180 |Read/write WRAM register [WMDATA] |
- |rw |$2181 |WRAM data register (low byte) [WMADDL] |
- |rw |$2182 |WRAM data register (middle byte) [WMADDM] |
- |rw |$2183 |WRAM data register (high byte) [WMADDH] |
- | | | |
- | | | |
- | w |$4200 |Counter enable [NMITIMEN] |
- | | |a0yx000b a: NMI/VBlank interrupt. |
- | | | y: Vertical counter. |
- | | | x: Horizontal counter. |
- | | | b: Joypad read-enable. |
- | | | |
- | | | |
- | w |$4201 |Programmable I/O port (out-port) [WRIO] |
- | | | |
- | | | |
- | w |$4202 |Multiplicand 'A' [WRMPYA] |
- | w |$4203 |Multiplier 'B' [WRMPYB] |
- | | |*** Absolute multiplication used when using the two above reg-|
- | | | isters. Formulae is: 'A (8-bit) * B (8-bit) = C (16-bit)'.|
- | | | Result can be read from $4216. |
- | | | |
- | | | |
- | w 2 |$4204 |Dividend C [WRDIVL/WRDIVH] |
- | w |$4205 |Divisor B [WRDIVB] |
- | | |*** Absolute division used when using the two above registers.|
- | | | Formulae is 'C (16-bit) / B (8-bit) = A (16-bit)'. |
- | | | Result can be read from $4214, and the remainder read from|
- | | | $4216. |
- | | |*** Operation will start when $4205 is set, and will be com- |
- | | | pleted after 16 machine cycles. |
- | | | |
- | | | |
- | w 2 |$4207 |Video horizontal IRQ beam position/pointer [HTIMEL/HTIMEH] |
- | | |0000000x xxxxxxxx x: Beam position. |
- | | | |
- | | |Valid values for x range from 0 to 339, due to overscan. The |
- | | |timer is reset every scanline, so unless it's disabled, you'll|
- | | |receive an interrupt every time the beam hits the value given.|
- | | | |
- | | | |
- | w 2 |$4209 |Video vertical IRQ beam position/pointer [VTIMEL/VTIMEH] |
- | | |0000000y yyyyyyyy y: Beam position. |
- | | | |
- | | |Same as $4207, but valid values for y are 0 to 261 (based from|
- | | |overscan at the top of the screen). |
- | | | |
- | | | |
- | w |$420B |DMA enable register [MDMAEN] |
- | | |abcdefgh a: DMA channel #7. |
- | | | b: DMA channel #6. |
- | | | c: DMA channel #5. |
- | | | d: DMA channel #4. |
- | | | e: DMA channel #3. |
- | | | f: DMA channel #2. |
- | | | g: DMA channel #1. |
- | | | h: DMA channel #0. |
- | | | |
- | | | |
- | w |$420C |HDMA enable register. |
- | | |*** Same as $420B, virtually. |
- | | | |
- | | | |
- | w |$420D |Cycle speed register [MEMSEL] |
- | | |0000000x x: 0 = Normal (2.68MHz). |
- | | | 1 = Fast (3.58MHz). |
- | | | |
- | | |Note that using the fast mode requires 120ns or faster EPROMs.|
- | | | |
- | | | |
- |r |$4210 |NMI register [RDNMI] |
- | | |x000vvvv x: Disable/enable NMI. |
- | | | v: Version # ($5A22 (???)) |
- | | | |
- | | |Bit 7 can be reset to 0 by reading this register. |
- | | | |
- | | | |
- |rw |$4211 |Video IRQ register [TIMEUP] |
- | | |i0000000 i: 0 = IRQ is not enabled. |
- | | | 1 = IRQ is enabled. |
- | | | |
- | | |This location MUST be read to clear a horizontal or vertical |
- | | |raster interrupt. It's all relative to $4200. If the horiz- |
- | | |ontal timer interrupt (bit 4, $4200) is set then the interrupt|
- | | |will be generated according to the position in $4207. Same |
- | | |thing is for vertical timing (bit 5, $4200) but the position |
- | | |will be read from $4209, not $4207. |
- | | | |
- | | | |
- |rw |$4212 |Status register [HVBJOY] |
- | | |xy00000a x: 0 = Not in VBlank state. |
- | | | 1 = In VBlank state. |
- | | | y: 0 = Not in HBlank state. |
- | | | 1 = In HBlank state. |
- | | | a: 0 = Joypad not ready. |
- | | | 1 = Joypad ready. |
- | | | |
- | | | |
- |r |$4213 |Programmable I/O port (in-port) [RDIO] |
- | | | |
- | | | |
- |r 2 |$4214 |Quotient of divide result [RDDIVL/RDDIVH] |
- | | | |
- | | | |
- |r 2 |$4216 |Multiplication or divide result [RDMPYL/RDMPYH] |
- | | | |
- | | | |
- |r |$4218 |Joypad #1 status register [JOY1L] |
- | | |abcd0000 a: A button (1=pressed). |
- | | | b: X button (1=pressed). |
- | | | c: Top-Left (1=pressed). |
- | | | d: Top-Rght (1=pressed). |
- | | | |
- |r |$4219 |Joypad #1 status register [JOY1H] |
- | | |abcdefgh a: B button (1=pressed). |
- | | | b: Y button (1=pressed). |
- | | | c: Select (1=pressed). |
- | | | d: Start (1=pressed). |
- | | | e: Up (1=pressed). |
- | | | f: Down (1=pressed). |
- | | | g: Left (1=pressed). |
- | | | h: Right (1=pressed). |
- | | | |
- |r |$421A |Joypad #2 status register [JOY2L] -| |
- |r |$421B |Joypad #2 status register [JOY2H] | |
- |r |$421C |Joypad #3 status register [JOY3L] |- Same as $4218 & $4219. |
- |r |$421D |Joypad #3 status register [JOY3H] | |
- |r |$421E |Joypad #4 status register [JOY4L] | |
- |r |$421F |Joypad #4 status register [JOY4H] -| |
- | | |*** Joypad registers can be read w/ a 16-bit accum/X/Y and |
- | | | both the high and low bytes will received valid data. |
- | | | |
- | | | |
- |----------------------------------------------------------------------------|
- |The following data is for DMA-transfers. 'x' represents the DMA channel #, |
- |which ranges from 0 to 7. So, the following would represent each section: |
- |DMA #0: $4300-$4305. |
- |DMA #1: $4310-$4315. |
- |.................... |
- |DMA #7: $4370-$4375. |
- |----------------------------------------------------------------------------|
- | w |$43x0 |DMA Control register [DMAPX] |
- | | |vh0cbaaa v: 0 = CPU memory -> PPU. |
- | | | 1 = PPU -> CPU memory. |
- | | | h: For HDMA only: |
- | | | 0 = Absolute addressing. |
- | | | 1 = Indirect addressing. |
- | | | c: 0 = Auto address inc/decrement. |
- | | | 1 = Fixed address (for VRAM, etc.). |
- | | | b: 0 = Automatic increment. |
- | | | 1 = Automatic decrement. |
- | | | a: Transfer type:
- | | | 000 = 1 address write twice: LH. |
- | | | 001 = 2 addresses: LH. |
- | | | 010 = 1 address write once. |
- | | | 011 = 2 addresses write twice: LLHH |
- | | | 100 = 4 addresses: LHLH |
- | | | |
- | | | |
- | w |$43x1 |DMA Destination register [BBADX] |
- | | |xxxxxxxx x: Low-byte address. |
- | | | |
- | | |*** The upper-byte address is assumed to be $21, making your |
- | | | access addresses $2100 to $21FF. |
- | | | |
- | | | |
- | w 2 |$43x2 |Source address [A1TXL/A1TXH] |
- | w |$43x4 |Source bank address [A1BX] |
- | w 2 |$43x5 |DMA transfer size & HDMA address register [DASXL/DASXH] |
- | | |*** When using DMA, $43x5 defines the # of bytes to be trans- |
- | | | ferred via DMA itself. When using HDMA, $43x5 defines the |
- | | | data address ($43x5 = low byte, $43x6 = hi byte). |
- | | | |
- | | | |
- | w |$43xA |Number of lines for HDMA transfer [NTRLX] |
- | | |cxxxxxxx c: Continue (0=yes, 1=no (???)). |
- | | | x: # of lines to transfer. |
- |----------------------------------------------------------------------------|
- |Additional information follows. |
- |Most of the following information is for SMC files, and where the header |
- |info is kept in memory, etc. etc. etc... |
- |----------------------------------------------------------------------------|
- |rw |$FEED |UNDOCUMENTED REGISTER: Felon's banana register [FBNANACNT] |
- | | |rcnnnnnn r: Ripe bit (0=ripe, 1=rotten). |
- | | | c: Colour bit (0=yellow, 1=green). |
- | | | n: Number of bananas. |
- | | | |
- | | |*** This register counts the number of bananas Felon currently|
- | | | has in his possession... (Who the hell is Felon?!). |
- | | | |
- | | |*** According to numerous sources, this register can be used |
- | | | to calculate pi to the 5-billionth digit in 20 clock |
- | | | cycles. The number of cycles corresponds to Felon's age, |
- | | | increasing by 1 every 365 days (1 year). It is increased |
- | | | by 2 every leap year. |
- | | | |
- | | | |
- |rw |$FFC0 |Cartridge title. |
- |rw |$FFD6 |ROM/RAM information on cart. |
- |rw |$FFD7 |ROM size. |
- |rw |$FFD8 |RAM size. |
- |rw |$FFD9 |Developer ID code. |
- |rw |$FFDB |Version number. |
- |rw |$FFDC |Checksum complement. |
- |rw |$FFDE |Checksum. |
- |rw |$FFEA |NMI vector/VBL interrupt. |
- |rw |$FFEC |Reset vector. |
- ----------------------------------------------------------------------------
|