- [NEW] Afegida la rom de Combat. - [NEW] Afegit mòdul "rom" - [NEW] Ampliats stubs de "mem", "tia" i "pia"
240 lines
10 KiB
Plaintext
240 lines
10 KiB
Plaintext
From: https://forums.atariage.com/topic/192418-mirrored-memory/
|
|
|
|
THE 6507 PROCESSOR
|
|
===============================================================================
|
|
|
|
The 6507 chip has only 13 address pins (A0 through A12) so the usable addresses
|
|
are an 8K block from $0000 through $1FFF. Internally the 6507 still uses 16-bit
|
|
addresses, but since there are no pins for A13 through A15, any attempt to
|
|
access $2000 through $FFFF will actually access $0000 through $1FFF:
|
|
|
|
$E000 - $FFFF = 8K mirror of $0000 - $1FFF
|
|
$C000 - $DFFF = 8K mirror of $0000 - $1FFF
|
|
$A000 - $BFFF = 8K mirror of $0000 - $1FFF
|
|
$8000 - $9FFF = 8K mirror of $0000 - $1FFF
|
|
$6000 - $7FFF = 8K mirror of $0000 - $1FFF
|
|
$4000 - $5FFF = 8K mirror of $0000 - $1FFF
|
|
$2000 - $3FFF = 8K mirror of $0000 - $1FFF
|
|
$0000 - $1FFF = 8K of addressable memory
|
|
|
|
The cartridge slot, 6532 RIOT chip, and TIA chip have addresses within the 8K
|
|
memory block at $0000 - $1FFF, so they have mirrors in the other 8K memory
|
|
blocks. For simplicity, only mirrors within $0000 - $1FFF will be listed below,
|
|
with the others being understood.
|
|
|
|
|
|
|
|
THE CARTRIDGE SLOT
|
|
===============================================================================
|
|
|
|
The 2600's 4K cartridge slot has 12 address lines (A0-A11). A12 acts as a chip
|
|
select and is wired as 1, so the addresses are %xxx1 ???? ???? ????, where "x"
|
|
is "don't care" and "?" can be 0 or 1, giving addresses of $1000 - $1FFF.
|
|
|
|
If a cartridge has only 2K, then A11 isn't connected, in which case the
|
|
addresses are %xxx1 x??? ???? ????:
|
|
|
|
$1800 - $1FFF = 2K mirror of $1000 - $17FF
|
|
$1000 - $17FF = 2K of addressable ROM
|
|
|
|
If a cartridge includes the 128-byte SARA chip for extra RAM, the SARA chip
|
|
uses A7 for the R/W line:
|
|
|
|
$1100 - $1FFF = 3.75K of addressable ROM
|
|
$1080 - $10FF = 128 bytes of SARA RAM read addresses
|
|
$1000 - $107F = 128 bytes of SARA RAM write addresses
|
|
|
|
There are other cartridge formats that add extra RAM, but I won't try to list
|
|
their mappings.
|
|
|
|
|
|
|
|
THE 6532 RIOT CHIP
|
|
===============================================================================
|
|
|
|
The 6532 RIOT chip has only seven (7) address pins (A0-A6). The chip selects
|
|
are connected to A12 (which must be 0) and A7 (which must be 1). There is also
|
|
a RAM select, which is connected to A9.
|
|
|
|
To read or write the RIOT RAM, the RAM select (A9) must be 0, giving addresses
|
|
of %xxx0 xx0x 1??? ????:
|
|
|
|
$0D80 - $0DFF = mirror of the RIOT RAM
|
|
$0C80 - $0CFF = mirror of the RIOT RAM
|
|
$0980 - $09FF = mirror of the RIOT RAM
|
|
$0880 - $08FF = mirror of the RIOT RAM
|
|
$0580 - $05FF = mirror of the RIOT RAM
|
|
$0480 - $04FF = mirror of the RIOT RAM
|
|
$0180 - $01FF = mirror of the RIOT RAM (used by the 6507 for its stack memory)
|
|
$0080 - $00FF = 128 bytes of RIOT RAM
|
|
|
|
To access the RIOT's I/O or timer functions, the RAM select (A9) must be 1,
|
|
theoretically giving addresses of %xxx0 xx1x 1??? ????. However, the RIOT's I/O
|
|
and timer functions don't use all seven address pins.
|
|
|
|
To access the I/O functions, A2 must be 0, and only A0 and A1 (and A2) are used
|
|
for addresses, so the I/O addresses are %xxx0 xx1x 1xxx x0??:
|
|
|
|
$0Fxx, $0Exx, $0Bxx, $0Axx, $07xx, $06xx, $03xx = same mirrors as $02xx shown below
|
|
$02F8 - $02FB = mirror of $0280 - $0283
|
|
$02F0 - $02F3 = mirror of $0280 - $0283
|
|
$02E8 - $02EB = mirror of $0280 - $0283
|
|
$02E0 - $02E3 = mirror of $0280 - $0283
|
|
$02D8 - $02DB = mirror of $0280 - $0283
|
|
$02D0 - $02D3 = mirror of $0280 - $0283
|
|
$02C8 - $02CB = mirror of $0280 - $0283
|
|
$02C0 - $02C3 = mirror of $0280 - $0283
|
|
$02B8 - $02BB = mirror of $0280 - $0283
|
|
$02B0 - $02B3 = mirror of $0280 - $0283
|
|
$02A8 - $02AB = mirror of $0280 - $0283
|
|
$02A0 - $02A3 = mirror of $0280 - $0283
|
|
$0298 - $029B = mirror of $0280 - $0283
|
|
$0290 - $0293 = mirror of $0280 - $0283
|
|
$0288 - $028B = mirror of $0280 - $0283
|
|
$0283 = data-direction control for I/O register B
|
|
$0282 = I/O register B
|
|
$0281 = data-direction control for I/O register A
|
|
$0280 = I/O register A
|
|
|
|
To access the timer functions, A2 must be 1, and only A0, A1, A3, and A4 (and A2)
|
|
are used for addresses-- although A1, A3, and A4 aren't always used.
|
|
|
|
To set (write) the timer, A4 must be 1, A3 enables or disables the timer
|
|
interrupt, and A0 and A1 select the timer interval, so the addresses are
|
|
%xxx0 xx1x 1xx1 ?1??:
|
|
|
|
$0Fxx, $0Exx, $0Bxx, $0Axx, $07xx, $06xx, $03xx = same mirrors as $02xx shown below
|
|
$02FC - $02FF = mirror of $029C - $029F
|
|
$02F4 - $02F7 = mirror of $0294 - $0297
|
|
$02DC - $02DF = mirror of $029C - $029F
|
|
$02D4 - $02D7 = mirror of $0294 - $0297
|
|
$02BC - $02BF = mirror of $029C - $029F
|
|
$02B4 - $02B7 = mirror of $0294 - $0297
|
|
$029F = enable the timer interrupt and set the timer using the 1024-cycle interval
|
|
$029E = enable the timer interrupt and set the timer using the 64-cycle interval
|
|
$029D = enable the timer interrupt and set the timer using the 8-cycle interval
|
|
$029C = enable the timer interrupt and set the timer using the 1-cycle interval
|
|
$0297 = disable the timer interrupt and set the timer using the 1024-cycle interval
|
|
$0296 = disable the timer interrupt and set the timer using the 64-cycle interval
|
|
$0295 = disable the timer interrupt and set the timer using the 8-cycle interval
|
|
$0294 = disable the timer interrupt and set the timer using the 1-cycle interval
|
|
|
|
To read the timer, A0 must be 0, A3 enables or disables the timer interrupt,
|
|
and A1 and A4 aren't used, so the addresses are %xxx0 xx1x 1xxx ?1x0:
|
|
|
|
$0Fxx, $0Exx, $0Bxx, $0Axx, $07xx, $06xx, $03xx = same mirrors as $02xx shown below
|
|
$02Ax - $02Fx = same mirrors as $029x shown below
|
|
$029E, $029C, $0296, $0294 = mirrors of $028E, $028C, $0286, and $0284
|
|
$028E = mirror of $028C
|
|
$028C = enable the timer interrupt and read the timer
|
|
$0286 = mirror of $0284
|
|
$0284 = disable the timer interrupt and read the timer
|
|
|
|
To read the timer interrupt flag and PA7 interrupt flag, A0 must be 1, and A1,
|
|
A3, and A4 aren't used, so the addresses are %xxx0 xx1x 1xxx x1x1:
|
|
|
|
$0Fxx, $0Exx, $0Bxx, $0Axx, $07xx, $06xx, $03xx = same mirrors as $02xx shown below
|
|
$029x - $02Fx = same mirrors as $028x shown below
|
|
$028F, $028D, $0287 = mirrors of $0285
|
|
$0285 = read the interrupt flags
|
|
|
|
To set (write) the PA7 edge-detect control, A4 must be 0, A0 selects positive
|
|
or negative edge-detect, A1 enables or disables the PA7 interrupt, and A3 isn't
|
|
used, so the addresses are %xxx0 xx1x 1xx0 x1??:
|
|
|
|
$0Fxx, $0Exx, $0Bxx, $0Axx, $07xx, $06xx, $03xx = same mirrors as $02xx shown below
|
|
$02Ax, $02Cx, $02Ex = same mirrors as $028x shown below
|
|
$028C - $028F = mirrors of $0284 - $0287
|
|
$0287 = enable the PA7 interrupt and select positive edge-detect
|
|
$0286 = enable the PA7 interrupt and select negative edge-detect
|
|
$0285 = disable the PA7 interrupt and select positive edge-detect
|
|
$0284 = disable the PA7 interrupt and select negative edge-detect
|
|
|
|
As seen above, the RIOT's mirrors are rather complex. Where any mirrors seem to
|
|
conflict with other mirrors, the R/W and RAM select lines determine which
|
|
mirrors will be in effect.
|
|
|
|
|
|
|
|
THE TIA CHIP
|
|
===============================================================================
|
|
|
|
The TIA chip has only six (6) address pins-- A0 through A5. The chip selects
|
|
are connected to A12 (which must be 0) and A7 (which must be 0).
|
|
|
|
The TIA's write registers use all six address pins, so the addresses are
|
|
%xxx0 xxxx 0x?? ????:
|
|
|
|
$01xx - $0Fxx = same mirrors as $00xx shown below
|
|
$0040 - $007F = mirror of $0000 - $003F
|
|
$002D - $003F = not used
|
|
$002C = CXCLR (clear collision latches)
|
|
$002B = HMCLR (clear horizontal motion registers)
|
|
$002A = HMOVE (apply horizontal motion)
|
|
$0029 = RESMP1 (reset missile 1 to player 1)
|
|
$0028 = RESMP0 (reset missile 0 to player 0)
|
|
$0027 = VDELBL (vertical delay ball)
|
|
$0026 = VDELP1 (vertical delay player 1)
|
|
$0025 = VDELP0 (vertical delay player 0)
|
|
$0024 = HMBL (horizontal motion ball)
|
|
$0023 = HMM1 (horizontal motion missile 1)
|
|
$0022 = HMM0 (horizontal motion missile 0)
|
|
$0021 = HMP1 (horizontal motion player 1)
|
|
$0020 = HMP0 (horizontal motion player 0)
|
|
$001F = ENABL (enable ball graphics)
|
|
$001E = ENAM1 (enable missile 1 graphics)
|
|
$001D = ENAM0 (enable missile 0 graphics)
|
|
$001C = GRP1 (graphics player 1)
|
|
$001B = GRP0 (graphics player 0)
|
|
$001A = AUDV1 (audio volume 1)
|
|
$0019 = AUDV0 (audio volume 0)
|
|
$0018 = AUDF1 (audio frequency 1)
|
|
$0017 = AUDF0 (audio frequency 0)
|
|
$0016 = AUDC1 (audio control 1)
|
|
$0015 = AUDC0 (audio control 0)
|
|
$0014 = RESBL (reset ball)
|
|
$0013 = RESM1 (reset missile 1)
|
|
$0012 = RESM0 (reset missile 0)
|
|
$0011 = RESP1 (reset player 1)
|
|
$0010 = RESP0 (reset player 0)
|
|
$000F = PF2 (playfield register byte 2)
|
|
$000E = PF1 (playfield register byte 1)
|
|
$000D = PF0 (playfield register byte 0)
|
|
$000C = REFP1 (reflect player 1)
|
|
$000B = REFP0 (reflect player 0)
|
|
$000A = CTRLPF (control playfield ball size and reflect)
|
|
$0009 = COLUBK (color-lum background)
|
|
$0008 = COLUPF (color-lum playfield)
|
|
$0007 = COLUP1 (color-lum player 1)
|
|
$0006 = COLUP0 (color-lum player 0)
|
|
$0005 = NUSIZ1 (number-size player-missile 1)
|
|
$0004 = NUSIZ0 (number-size player-missile 0)
|
|
$0003 = RSYNC (reset horizontal sync counter)
|
|
$0002 = WSYNC (wait for leading edge of horizontal blank)
|
|
$0001 = VBLANK (vertical blank set-clear)
|
|
$0000 = VSYNC (vertical sync set-clear)
|
|
|
|
The TIA's read registers do not use A4 and A5, so the addresses are
|
|
%xxx0 xxxx 0xxx ????:
|
|
|
|
$01xx - $0Fxx = same mirrors as $00xx shown below
|
|
$001x - $007x = mirrors of $0000 - $000F
|
|
$000E - $000F = not used
|
|
$000D = INPT5 (input port 5, trigger 1)
|
|
$000C = INPT4 (input port 4, trigger 0)
|
|
$000B = INPT3 (input port 3, pot 3)
|
|
$000A = INPT2 (input port 2, pot 2)
|
|
$0009 = INPT1 (input port 1, pot 1)
|
|
$0008 = INPT0 (input port 0, pot 0)
|
|
$0007 = CXPPMM (collision of players and missiles)
|
|
$0006 = CXBLPF (collision of ball with playfield)
|
|
$0005 = CXM1FB (collision of missile 1 with playfield-ball)
|
|
$0004 = CXM0FB (collision of missile 0 with playfield-ball)
|
|
$0003 = CXP1FB (collision of player 1 with playfield-ball)
|
|
$0002 = CXP0FB (collision of player 0 with playfield-ball)
|
|
$0001 = CXM1P (collision of missile 1 with players)
|
|
$0000 = CXM0P (collision of missile 0 with players)
|
|
|
|
As with the RIOT mirrors, some TIA mirrors seem to conflict, but the R/W line
|
|
determines which mirrors will be in effect.
|