395 lines
30 KiB
Groff
395 lines
30 KiB
Groff
----------------------------------------------------------------------------
|
|
|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. |
|
|
| |
|
|
|----------------------------------------------------------------------------|
|
|
|rwd2?|Address|Title & Explanation |
|
|
|----------------------------------------------------------------------------|
|
|
| w |$2100 |Screen display register. |
|
|
| | |x000bbbb x: 0 = Screen on. |
|
|
| | | 1 = Screen off. |
|
|
| | | bbbb: Brightness ($0-$F) |
|
|
| | | |
|
|
| | |Incrementing $2100 up to $xF will result in a screen fade. |
|
|
| | |Do this only during the VBL period, the screen goes silly. |
|
|
| | | |
|
|
| | | |
|
|
| w |$2101 |OAM (Sprite) size register. |
|
|
| | |sssnnbbb s: 000 = 8x8 or 16x16 > Size. |
|
|
| | | 001 = 8x8 or 32x32 / |
|
|
| | | n: Name selection (upper 4k word adr). |
|
|
| | | b: Base selection (8k word segment adr).|
|
|
| | | |
|
|
| | | |
|
|
| w 2 |$2102 |OAM (Sprite) address register. |
|
|
| | |???????? ???????? |
|
|
| | | |
|
|
| | | |
|
|
| wd |$2104 |OAM (Sprite) data register. |
|
|
| | |???????? |
|
|
| | | |
|
|
| | | |
|
|
| w |$2105 |Screen mode register. |
|
|
| | |abcdefff a: Plane 3 tile size > 0 = 8x8. |
|
|
| | | b: Plane 2 tile size / 1 = 16x16. |
|
|
| | | c: Plane 1 tile size / |
|
|
| | | d: Plane 0 tile size / |
|
|
| | | e: Make Plane 2 take highest priority. |
|
|
| | | f: MODE definition. |
|
|
| | | |
|
|
| | | |
|
|
| w |$2106 |Screen pixelation (aka. MOSAIC) register. |
|
|
| | |xxxxabcd x: Pixel size ($0-$F). |
|
|
| | | a: Affect Plane 3. |
|
|
| | | b: Affect Plane 2. |
|
|
| | | c: Affect Plane 1. |
|
|
| | | d: Affect Plane 0. |
|
|
| | | |
|
|
| | | |
|
|
| w |$2107 |Plane 0 VRAM location register. |
|
|
| | |xxxxxxab x: Address of VRAM location. |
|
|
| | | ab: Virtual screen size selection. |
|
|
| | | |
|
|
| | |The virtual screen size goes from 32x32 to 32x64 to 64x32 to |
|
|
| | |64x64. Visually, you only see 32x32(x25) at once unless you |
|
|
| | |change the ACTUAL screen size. |
|
|
| | | |
|
|
| | | |
|
|
| w |$2108 |Plane 1 VRAM location register. > Same setup as $2107. |
|
|
| w |$2108 |Plane 2 VRAM location register. / |
|
|
| w |$2108 |Plane 3 VRAM location register. / |
|
|
| | | |
|
|
| | | |
|
|
| w |$210B |Tile VRAM location register (Planes 0 & 1). |
|
|
| | |aaaabbbb a: Location of tiles for Plane 1. |
|
|
| | | b: Location of tiles for Plane 0. |
|
|
| | | |
|
|
| | |Since you only have a nibble to work with for your tile mem- |
|
|
| | |ory location, you cannot have an address such as $5F91 or |
|
|
| | |$1C4A. You must have something like $D000 or $3000. |
|
|
| | | |
|
|
| | | |
|
|
| w |$210C |Tile VRAM location register (Planes 2 & 3). > Same as $210B. |
|
|
| | | |
|
|
| | | |
|
|
| wd |$210D |Plane 0 X-Scroll register. |
|
|
| | |aaaaaaaa a: Plane 0 "location". |
|
|
| | | |
|
|
| | |This is an intruiging register. Like the types define, it has |
|
|
| | |to be written to twice: The first time holds the first 8 bits,|
|
|
| | |and the second time holds the last 3 bits. This makes a total |
|
|
| | |of 11 bits for information. I guess you could look at it this |
|
|
| | |way: a: Location/info. 1st byte 2nd byte |
|
|
| | | aaaaaaaa -----aaa |
|
|
| | | |
|
|
| | |Here's some example code: |
|
|
| | |*** This moves Plane 0 to the left. |
|
|
| | | |
|
|
| | | LDA Plane0X ; Byte variable; we need to keep track |
|
|
| | | DEC ; of where the plane is, since the |
|
|
| | | STA Plane0X ; register itself isn't readable. :-( |
|
|
| | | STA $210D ; Store data (1st byte) |
|
|
| | | STZ $210D ; Store zeros (2nd byte) |
|
|
| | | |
|
|
| | |As you can see, I store zeros for the 2nd byte; this is bad, |
|
|
| | |since MODE 7 uses 13 bits of the above, while the rest use 10.|
|
|
| | |I'm not taking care of the MSB. :-( But, the results for other|
|
|
| | |MODEs is a smooth scrolling background :-) |
|
|
| | | |
|
|
| | | |
|
|
| wd |$210E |Plane 0 Y-Scroll register. > Same setup as $210D. |
|
|
| wd |$210F |Plane 1 X-Scroll register. / |
|
|
| wd |$2110 |Plane 1 Y-Scroll register. / |
|
|
| wd |$2111 |Plane 2 X-Scroll register. / |
|
|
| wd |$2112 |Plane 2 Y-Scroll register. / |
|
|
| wd |$2113 |Plane 3 X-Scroll register. / |
|
|
| wd |$2114 |Plane 3 Y-Scroll register. / |
|
|
| | | |
|
|
| | | |
|
|
| w |$2115 |Video port control. |
|
|
| | |???????? |
|
|
| | | |
|
|
| | |If $80 (#128) is stored here, the "...H/L is incremented which|
|
|
| | |determines if the address will be incremented after it reads |
|
|
| | |or writes to/from $2118 and $2139, or $2119 and $213A." |
|
|
| | | |
|
|
| | | |
|
|
| w 2 |$2116 |Video port address. |
|
|
| | |???????? ???????? |
|
|
| | | |
|
|
| | | |
|
|
| w 2 |$2118 |Video port data. |
|
|
| | |???????? ???????? |
|
|
| | | |
|
|
| | | |
|
|
| w |$211A |MODE7 Information register. |
|
|
| | |xy????ab a: Horizontal or Vertical flip. |
|
|
| | | b: Horizontal or Vertical flip. |
|
|
| | | x: Landscape repeat type. |
|
|
| | | y: Landscape repeat type. |
|
|
| | | |
|
|
| | |I have no idea what the original author means!!! HELP ME! |
|
|
| | | |
|
|
| | | |
|
|
| w |$211B |COS (COSIN) rotate angle / X Expansion. |
|
|
| w |$211C |SIN (SIN) rotate angle / X Expansion. |
|
|
| w |$211D |SIN (SIN) rotate angle / Y Expansion. |
|
|
| w |$211E |COS (COSIN) rotate angle / Y Expansion. |
|
|
| wd |$211F |"13 bit address for the center of Rotate X." |
|
|
| wd |$2120 |"13 bit address for the center of Rotate Y." |
|
|
| | | |
|
|
| | | |
|
|
| w |$2121 |Colour # (or pallete) selection register. |
|
|
| | |xxxxxxxx x: Colour # ($00-$FF). |
|
|
| | | |
|
|
| | | |
|
|
| | |Simply store the # of the colour you want to change/modify |
|
|
| | |here, before you write to $2122 (Colour data register). This |
|
|
| | |register is AUTO INCREMENTING! So, you do not have to tech- |
|
|
| | |nically do a "LDA #$00, STA $2121...LDA #$01, STA $2121... |
|
|
| | |LDA #$03, STA $2121..." and so on. |
|
|
| | | |
|
|
| | |Here's some example code: |
|
|
| | |*** Stores colour-values in colour #0, #1, and #2. |
|
|
| | | |
|
|
| | | STZ $2121 ; Start at colour #0. |
|
|
| | | STZ $2122 ; Color #0 = $0000 (black). |
|
|
| | | STZ $2122 |
|
|
| | | LDA #$FF ; Color #1 = $7FFF (white). |
|
|
| | | STA $2122 |
|
|
| | | LDA #$7F |
|
|
| | | STA $2122 |
|
|
| | | LDA #$1F ; Color #2 = $001F (red). |
|
|
| | | STA $2122 |
|
|
| | | STZ $2122 |
|
|
| | | |
|
|
| | | |
|
|
| wd |$2122 |Colour data register. |
|
|
| | |xxxxxxxx x: Value of colour. |
|
|
| | | |
|
|
| | |SNES colour is really "strange" from what i'm used to. It's 5 |
|
|
| | |bit, not like the normal 4 bit i'm used to on the IIGS, or the|
|
|
| | |8 bit i'm used to on the PC. Make sure you check the code I |
|
|
| | |gave in register $2121. Make SURE to check Section #2 on how |
|
|
| | |SNES colour works, and for tile-setup, check Section 4! |
|
|
| | | |
|
|
| | | |
|
|
| w |$212C |Plane-enable/sprite-enable register. |
|
|
| | |abcdefgh a: Enable Plane 3 sprites. |
|
|
| | | b: Enable Plane 2 sprites. |
|
|
| | | c: Enable Plane 1 sprites. |
|
|
| | | d: Enable Plane 0 sprites. |
|
|
| | | e: Enable Plane 3. |
|
|
| | | f: Enable Plane 2. |
|
|
| | | g: Enable Plane 1. |
|
|
| | | h: Enable Plane 0. |
|
|
| | | |
|
|
| | |This register allows you to enable which Planes you want to |
|
|
| | |put sprites on (to move, or etc.) and to scroll, or other neat|
|
|
| | |thing... If you want to use all 4 Planes, but no sprites, put |
|
|
| | |a $0F into this register. If you want to use all the Planes, |
|
|
| | |but only put sprites on Planes 1 and 3, you would put an $AF |
|
|
| | |in this register. Very self explanatory, eh? :-) |
|
|
| | | |
|
|
| | | |
|
|
| w |$2133 |Screen mode register. |
|
|
| | |????ab?c a: Interlace Y. |
|
|
| | | b: Overscan. |
|
|
| | | c: Interlace X. |
|
|
| | | |
|
|
| | | |
|
|
|r 2 |$2139 |VRAM port data (reading). |
|
|
| w 2 |$213A |VRAM port data (writing). |
|
|
|r d |$213C |Horizontal scan-line location. |
|
|
|r d |$213D |Vertical scan-line location. |
|
|
| | |- I have no idea how these are setup, other than they're sup- |
|
|
| | | posedly 9 bits in length... Sound fishy to me. I guess these|
|
|
| | | can be used for getting a random-# seed. :-) |
|
|
| | | |
|
|
| | | |
|
|
|rw |$2140 |< These are the infamous audio registers which interact with |
|
|
|rw |$2141 | \the SPC700 sound co-CPU. Check the document included in |
|
|
|rw |$2142 | /this archive called 'sound.doc' for more information. |
|
|
|rw |$2143 |< |
|
|
| | | |
|
|
| | | |
|
|
| w |$4200 |Counter enable. |
|
|
| | |a?yx???b a: 0 = NMI/VBlank interrupt not enabled.|
|
|
| | | 1 = NMI/VBlank interrupt enabled. |
|
|
| | | b: 0 = Joypad counter not enabled. |
|
|
| | | 1 = Joypad counter enabled. |
|
|
| | | x: 0 = Horizontal counter not enabled. |
|
|
| | | 1 = Horizontal counter enabled. |
|
|
| | | y: 0 = Vertical counter not enabled. |
|
|
| | | 1 = Vertical counter enabled. |
|
|
| | | |
|
|
| | | |
|
|
| w |$4201 |8-bit parallel data. > Expansion port for the Famicom!!! |
|
|
| | | |
|
|
| | | |
|
|
| w |$420B |DMA enable register. |
|
|
| | |abcdefgh a: DMA #7. |
|
|
| | | b: DMA #6. |
|
|
| | | c: DMA #5. |
|
|
| | | d: DMA #4. |
|
|
| | | e: DMA #3. |
|
|
| | | f: DMA #2. |
|
|
| | | g: DMA #1. |
|
|
| | | h: DMA #0. |
|
|
| | | |
|
|
| w |$420C |HDMA enable register. -> Same as $420B. |
|
|
| | | |
|
|
| w |$420D |Cycle speed register. |
|
|
| | |???????x x: 0 = Normal (2.68MHz). |
|
|
| | | 1 = Fast (3.58MHz). |
|
|
| | | |
|
|
| | | |
|
|
|r |$4210 |NMI register. |
|
|
| | |x??????? x: 0 = NMI disabled. |
|
|
| | | 1 = NMI enabled. |
|
|
| | | |
|
|
| | | |
|
|
| ?|$4211 |???. |
|
|
| | |x??????? x: 0 = IRQ is not enabled. |
|
|
| | | 1 = IRQ is enabled. |
|
|
| | | |
|
|
| | |Arrrrgh! Where's the description for this register!!! :-( :-( |
|
|
| | | |
|
|
| | | |
|
|
|rw |$4212 |Status register. |
|
|
| | |xy?????a 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. |
|
|
| | | |
|
|
| | |Here's some example code for joypad-input: |
|
|
| | |*** Wait for the ready-state bit to become ready. |
|
|
| | | |
|
|
| | |- LDA $4212 |
|
|
| | | AND #$01 |
|
|
| | | BNE - |
|
|
| | | |
|
|
| | | |
|
|
|rw |$4218 |Joypad #0 register (1 out of 2). |
|
|
| | |abcd0000 a: 0 = 'A' not pressed. |
|
|
| | | 1 = 'A' pressed. |
|
|
| | | b: 0 = 'X' not pressed. |
|
|
| | | 1 = 'X' pressed. |
|
|
| | | c: 0 = TOP-LEFT not pressed. |
|
|
| | | 1 = TOP-LEFT pressed. |
|
|
| | | d: 0 = TOP-RIGHT not pressed. |
|
|
| | | 1 = TOP-RIGHT pressed. |
|
|
| | | |
|
|
| | |Here's some example code: |
|
|
| | |*** Check for the 'A' button and the TOP-RIGHT button. |
|
|
| | | |
|
|
| | | LDA $4218 ; Get status register. |
|
|
| | | BIT #$80 ; Is the 'A' button pressed? |
|
|
| | | BNE YesA ; 1 = Yes, so go to label 'YesA'. |
|
|
| | | BIT #$10 ; Is the TOP-RIGHT button pressed? |
|
|
| | | BNE YesTR ; 1 = Yes, so go label 'YesTR'. |
|
|
| | | |
|
|
| | |*** NOTE: The Corsair & Dax document was *WRONG*. It took me |
|
|
| | | a good hour or two to figure this out, so I decided |
|
|
| | | i'd better write down the correct info! :-) |
|
|
| | | |
|
|
| | | |
|
|
|rw |$4219 |Joypad #0 register (2 out of 2). |
|
|
| | |abcdefgh a: 0 = 'B' not pressed. |
|
|
| | | 1 = 'B' pressed. |
|
|
| | | b: 0 = 'Y' not pressed. |
|
|
| | | 1 = 'Y' pressed. |
|
|
| | | c: 0 = SELECT not pressed. |
|
|
| | | 1 = SELECT pressed. |
|
|
| | | d: 0 = START not pressed. |
|
|
| | | 1 = START pressed. |
|
|
| | | e: 0 = UP not pressed. |
|
|
| | | 1 = UP pressed. |
|
|
| | | f: 0 = DOWN not pressed. |
|
|
| | | 1 = DOWN pressed. |
|
|
| | | g: 0 = LEFT not pressed. |
|
|
| | | 1 = LEFT pressed. |
|
|
| | | h: 0 = RIGHT not pressed. |
|
|
| | | 1 = RIGHT pressed. |
|
|
| | | |
|
|
| | | |
|
|
|rw |$421A |Joypad #1 register (1 out of 2). > Same setup as $4218 |
|
|
|rw |$421B |Joypad #1 register (2 out of 2). / and $4219. |
|
|
|rw |$421C |Joypad #2 register (1 out of 2). / |
|
|
|rw |$421D |Joypad #2 register (2 out of 2). / |
|
|
|rw |$421E |Joypad #3 register (2 out of 2). / |
|
|
|rw |$421F |Joypad #3 register (2 out of 2). / |
|
|
| | | |
|
|
|****************************************************************************|
|
|
|***** The following data is for DMA-transfers. |
|
|
|***** The 'x' represents the DMA #, which ranges from 0 to 7. |
|
|
|***** So, the following would represent each DMA-memory section. |
|
|
|***** DMA #0: $4300-$4305. |
|
|
|***** DMA #1: $4310-$4315. |
|
|
|***** .................... |
|
|
|***** DMA #7: $4370-$4375. |
|
|
|****************************************************************************|
|
|
| | | |
|
|
| w |$43x0 |DMA Control register. |
|
|
| | |vh0cbaaa a: Transfer type. |
|
|
| | | 001 = 2 addresses: LH. |
|
|
| | | 010 = 1 address. |
|
|
| | | 011 = 2 addresses write twice: LLHH |
|
|
| | | 100 = 4 addresses: LHLH |
|
|
| | | b: 0 = Address inc/decrement on. |
|
|
| | | 1 = Fixed address (used for clearing |
|
|
| | | VRAM and etc.) |
|
|
| | | c: 0 = Increment. |
|
|
| | | 1 = Decrement. |
|
|
| | | h: For HDMA only: |
|
|
| | | 0 = Absolute addressing. |
|
|
| | | 1 = Indirect addressing. |
|
|
| | | v: 0 = RAM ----> VRAM. |
|
|
| | | 1 = VRAM ---> RAM. |
|
|
| | | |
|
|
| w |$43x1 |DMA Destination register. |
|
|
| | | I'm pretty sure that what you tell this register is the |
|
|
| | | lower-byte of the address of where you want to access, |
|
|
| | | the upper ALWAYS (?????) being $21. |
|
|
| | |Example: |
|
|
| | | LDA #$04 ; Access $2104 |
|
|
| | | STA $4301 ; Use DMA #0 |
|
|
| | |or: |
|
|
| | | LDA #$22 ; Access $2122 |
|
|
| | | STA $4321 ; Use DMA #2 |
|
|
| | | |
|
|
| w 2 |$43x2 |Source address. |
|
|
| w |$43x4 |Source bank address. |
|
|
| w 2 |$43x5 |Transfer size register. |
|
|
| w |$43xA |Number of lines for HDMA transfer. |
|
|
| | | |
|
|
|****************************************************************************|
|
|
|***** Addition information follows. |
|
|
|***** Most of the following information is for SMC defined files... |
|
|
|****************************************************************************|
|
|
| | | |
|
|
|rw |$FFC0 |Cartridge title. |
|
|
|rw |$FFD6 |ROM/RAM information on cart. |
|
|
|rw |$FFD7 |ROM size. |
|
|
|rw |$FFD8 |RAM size. |
|
|
|rw |$FFD9 |Maker ID code. |
|
|
|rw |$FFDB |Version #. |
|
|
|rw |$FFDC |Checksum complement. |
|
|
|rw |$FFDE |Checksum. |
|
|
|rw |$FFEA |NMI vector/VBL interrupt. |
|
|
|rw |$FFEC |Reset vector. |
|
|
| | | |
|
|
| | |*** With SMC (Super MagiComm) files, the offset is $7E00 less |
|
|
| | | than what is listed above. |
|
|
----------------------------------------------------------------------------
|