- [NEW] Afegits varios documents útils recopilats.
- [NEW] Afegida la rom de Combat. - [NEW] Afegit mòdul "rom" - [NEW] Ampliats stubs de "mem", "tia" i "pia"
This commit is contained in:
BIN
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
||||
From: https://forums.atariage.com/topic/192418-mirrored-memory/
|
||||
|
||||
There are two bankswitching schemes commonly called 3E and 3F because those
|
||||
zero-page addresses are used as hotspots to trigger a bank switch. The original
|
||||
version was 3F, also called Tigervision because it was used by Tigervision, and
|
||||
there is an extended version of 3F, as well as 3E. (I'm no expert on these
|
||||
schemes, so this information may contain errors.) I'm not sure if extended 3F
|
||||
and 3E are the same, or separate schemes, but 3E adds extra RAM, whereas 3F and
|
||||
extended 3F don't necessarily add extra RAM.
|
||||
|
||||
Anyway, these bankswitching schemes divide the 4K cartridge area into two 2K
|
||||
slots. The upper 2K area ($1800 - $1FFF) always points to the last 2K of the
|
||||
cartridge ROM, but the lower 2K area ($1000 - $17FF) can be selected from
|
||||
several 2K banks by writing the desired bank number into address $3F. I think
|
||||
the original version had four 2K banks, for a total cartridge size of 8K,
|
||||
whereas the extended version allows up to 256 2K banks, for a total cartridge
|
||||
size of 512K.
|
||||
|
||||
The 3E version still uses address $3F to select between different 2K ROM banks,
|
||||
but it also allows you to select between different 1K banks of extra RAM by
|
||||
writing the desired RAM bank number into address $3E.
|
||||
|
||||
The TIA write addresses are $00 - $2C, and the TIA read addresses are $0 - $D,
|
||||
so even though $3E and $3F fall within the memory area that's normally
|
||||
associated with the TIA chip, they don't actually correspond to any addresses
|
||||
or mirrors that are used by the TIA read or write registers. So in theory it
|
||||
should be safe to use $3E and $3F as bankswitching hotspots without interfering
|
||||
with the TIA addresses and mirrors.
|
||||
|
||||
However, it's my understanding that any access below $40 (i.e., from $00 - $3F)
|
||||
can trigger a bank switch in these schemes-- although this might not be true
|
||||
for all cartridges that use 3E or 3F bankswitching (I don't know). For this
|
||||
reason, the TIA addresses are usually (or always?) relocated to $40 - $7F when
|
||||
using 3E or 3F bankswitching. That is, $40 - $6C are used for the TIA write
|
||||
registers, and either $40 - $4D or $70 - $7D are used for the TIA read
|
||||
registers. Since these are mirrors of the "real" TIA addresses, accessing them
|
||||
is the same (from the TIA's point of view) as accessing $00 - $2C and $00 - $0D.
|
||||
@@ -0,0 +1 @@
|
||||
https://www.atarimania.com/machines/atari-2600/home
|
||||
@@ -0,0 +1,584 @@
|
||||
$0000-$003F = TIA Addresses $00-$3F (zero page)
|
||||
$0040-$007F = TIA Addresses $00-$3F (mirror)
|
||||
$0080-$00FF = RIOT RAM (zero page)
|
||||
$0100-$013F = TIA Addresses $00-$3F (mirror)
|
||||
$0140-$017F = TIA Addresses $00-$3F (mirror)
|
||||
$0180-$01FF = RIOT RAM (mirror)
|
||||
$0200-$023F = TIA Addresses $00-$3F (mirror)
|
||||
$0240-$027F = TIA Addresses $00-$3F (mirror)
|
||||
$0280-$029F = RIOT Addresses $00-$1F
|
||||
$02A0-$02BF = RIOT Addresses $00-$1F (mirror)
|
||||
$02C0-$02DF = RIOT Addresses $00-$1F (mirror)
|
||||
$02E0-$02FF = RIOT Addresses $00-$1F (mirror)
|
||||
$0300-$033F = TIA Addresses $00-$3F (mirror)
|
||||
$0340-$037F = TIA Addresses $00-$3F (mirror)
|
||||
$0380-$039F = RIOT Addresses $00-$1F (mirror)
|
||||
$03A0-$03BF = RIOT Addresses $00-$1F (mirror)
|
||||
$03C0-$03DF = RIOT Addresses $00-$1F (mirror)
|
||||
$03E0-$03FF = RIOT Addresses $00-$1F (mirror)
|
||||
$0400-$043F = TIA Addresses $00-$3F (mirror)
|
||||
$0440-$047F = TIA Addresses $00-$3F (mirror)
|
||||
$0480-$04FF = RIOT RAM (mirror)
|
||||
$0500-$053F = TIA Addresses $00-$3F (mirror)
|
||||
$0540-$057F = TIA Addresses $00-$3F (mirror)
|
||||
$0580-$05FF = RIOT RAM (mirror)
|
||||
$0600-$063F = TIA Addresses $00-$3F (mirror)
|
||||
$0640-$067F = TIA Addresses $00-$3F (mirror)
|
||||
$0680-$069F = RIOT Addresses $00-$1F (mirror)
|
||||
$06A0-$06BF = RIOT Addresses $00-$1F (mirror)
|
||||
$06C0-$06DF = RIOT Addresses $00-$1F (mirror)
|
||||
$06E0-$06FF = RIOT Addresses $00-$1F (mirror)
|
||||
$0700-$073F = TIA Addresses $00-$3F (mirror)
|
||||
$0740-$077F = TIA Addresses $00-$3F (mirror)
|
||||
$0780-$079F = RIOT Addresses $00-$1F (mirror)
|
||||
$07A0-$07BF = RIOT Addresses $00-$1F (mirror)
|
||||
$07C0-$07DF = RIOT Addresses $00-$1F (mirror)
|
||||
$07E0-$07FF = RIOT Addresses $00-$1F (mirror)
|
||||
$0800-$083F = TIA Addresses $00-$3F (mirror)
|
||||
$0840-$087F = TIA Addresses $00-$3F (mirror)
|
||||
$0880-$08FF = RIOT RAM (mirror)
|
||||
$0900-$093F = TIA Addresses $00-$3F (mirror)
|
||||
$0940-$097F = TIA Addresses $00-$3F (mirror)
|
||||
$0980-$09FF = RIOT RAM (mirror)
|
||||
$0A00-$0A3F = TIA Addresses $00-$3F (mirror)
|
||||
$0A40-$0A7F = TIA Addresses $00-$3F (mirror)
|
||||
$0A80-$0A9F = RIOT Addresses $00-$1F (mirror)
|
||||
$0AA0-$0ABF = RIOT Addresses $00-$1F (mirror)
|
||||
$0AC0-$0ADF = RIOT Addresses $00-$1F (mirror)
|
||||
$0AE0-$0AFF = RIOT Addresses $00-$1F (mirror)
|
||||
$0B00-$0B3F = TIA Addresses $00-$3F (mirror)
|
||||
$0B40-$0B7F = TIA Addresses $00-$3F (mirror)
|
||||
$0B80-$0B9F = RIOT Addresses $00-$1F (mirror)
|
||||
$0BA0-$0BBF = RIOT Addresses $00-$1F (mirror)
|
||||
$0BC0-$0BDF = RIOT Addresses $00-$1F (mirror)
|
||||
$0BE0-$0BFF = RIOT Addresses $00-$1F (mirror)
|
||||
$0C00-$0C3F = TIA Addresses $00-$3F (mirror)
|
||||
$0C40-$0C7F = TIA Addresses $00-$3F (mirror)
|
||||
$0C80-$0CFF = RIOT RAM (mirror)
|
||||
$0D00-$0D3F = TIA Addresses $00-$3F (mirror)
|
||||
$0D40-$0D7F = TIA Addresses $00-$3F (mirror)
|
||||
$0D80-$0DFF = RIOT RAM (mirror)
|
||||
$0E00-$0E3F = TIA Addresses $00-$3F (mirror)
|
||||
$0E40-$0E7F = TIA Addresses $00-$3F (mirror)
|
||||
$0E80-$0E9F = RIOT Addresses $00-$1F (mirror)
|
||||
$0EA0-$0EBF = RIOT Addresses $00-$1F (mirror)
|
||||
$0EC0-$0EDF = RIOT Addresses $00-$1F (mirror)
|
||||
$0EE0-$0EFF = RIOT Addresses $00-$1F (mirror)
|
||||
$0F00-$0F3F = TIA Addresses $00-$3F (mirror)
|
||||
$0F40-$0F7F = TIA Addresses $00-$3F (mirror)
|
||||
$0F80-$0F9F = RIOT Addresses $00-$1F (mirror)
|
||||
$0FA0-$0FBF = RIOT Addresses $00-$1F (mirror)
|
||||
$0FC0-$0FDF = RIOT Addresses $00-$1F (mirror)
|
||||
$0FE0-$0FFF = RIOT Addresses $00-$1F (mirror)
|
||||
$1000-$1FFF = ROM Addresses $000-$FFF
|
||||
$2000-$203F = TIA Addresses $00-$3F (mirror)
|
||||
$2040-$207F = TIA Addresses $00-$3F (mirror)
|
||||
$2080-$20FF = RIOT RAM (mirror)
|
||||
$2100-$213F = TIA Addresses $00-$3F (mirror)
|
||||
$2140-$217F = TIA Addresses $00-$3F (mirror)
|
||||
$2180-$21FF = RIOT RAM (mirror)
|
||||
$2200-$223F = TIA Addresses $00-$3F (mirror)
|
||||
$2240-$227F = TIA Addresses $00-$3F (mirror)
|
||||
$2280-$229F = RIOT Addresses $00-$1F (mirror)
|
||||
$22A0-$22BF = RIOT Addresses $00-$1F (mirror)
|
||||
$22C0-$22DF = RIOT Addresses $00-$1F (mirror)
|
||||
$22E0-$22FF = RIOT Addresses $00-$1F (mirror)
|
||||
$2300-$233F = TIA Addresses $00-$3F (mirror)
|
||||
$2340-$237F = TIA Addresses $00-$3F (mirror)
|
||||
$2380-$239F = RIOT Addresses $00-$1F (mirror)
|
||||
$23A0-$23BF = RIOT Addresses $00-$1F (mirror)
|
||||
$23C0-$23DF = RIOT Addresses $00-$1F (mirror)
|
||||
$23E0-$23FF = RIOT Addresses $00-$1F (mirror)
|
||||
$2400-$243F = TIA Addresses $00-$3F (mirror)
|
||||
$2440-$247F = TIA Addresses $00-$3F (mirror)
|
||||
$2480-$24FF = RIOT RAM (mirror)
|
||||
$2500-$253F = TIA Addresses $00-$3F (mirror)
|
||||
$2540-$257F = TIA Addresses $00-$3F (mirror)
|
||||
$2580-$25FF = RIOT RAM (mirror)
|
||||
$2600-$263F = TIA Addresses $00-$3F (mirror)
|
||||
$2640-$267F = TIA Addresses $00-$3F (mirror)
|
||||
$2680-$269F = RIOT Addresses $00-$1F (mirror)
|
||||
$26A0-$26BF = RIOT Addresses $00-$1F (mirror)
|
||||
$26C0-$26DF = RIOT Addresses $00-$1F (mirror)
|
||||
$26E0-$26FF = RIOT Addresses $00-$1F (mirror)
|
||||
$2700-$273F = TIA Addresses $00-$3F (mirror)
|
||||
$2740-$277F = TIA Addresses $00-$3F (mirror)
|
||||
$2780-$279F = RIOT Addresses $00-$1F (mirror)
|
||||
$27A0-$27BF = RIOT Addresses $00-$1F (mirror)
|
||||
$27C0-$27DF = RIOT Addresses $00-$1F (mirror)
|
||||
$27E0-$27FF = RIOT Addresses $00-$1F (mirror)
|
||||
$2800-$283F = TIA Addresses $00-$3F (mirror)
|
||||
$2840-$287F = TIA Addresses $00-$3F (mirror)
|
||||
$2880-$28FF = RIOT RAM (mirror)
|
||||
$2900-$293F = TIA Addresses $00-$3F (mirror)
|
||||
$2940-$297F = TIA Addresses $00-$3F (mirror)
|
||||
$2980-$29FF = RIOT RAM (mirror)
|
||||
$2A00-$2A3F = TIA Addresses $00-$3F (mirror)
|
||||
$2A40-$2A7F = TIA Addresses $00-$3F (mirror)
|
||||
$2A80-$2A9F = RIOT Addresses $00-$1F (mirror)
|
||||
$2AA0-$2ABF = RIOT Addresses $00-$1F (mirror)
|
||||
$2AC0-$2ADF = RIOT Addresses $00-$1F (mirror)
|
||||
$2AE0-$2AFF = RIOT Addresses $00-$1F (mirror)
|
||||
$2B00-$2B3F = TIA Addresses $00-$3F (mirror)
|
||||
$2B40-$2B7F = TIA Addresses $00-$3F (mirror)
|
||||
$2B80-$2B9F = RIOT Addresses $00-$1F (mirror)
|
||||
$2BA0-$2BBF = RIOT Addresses $00-$1F (mirror)
|
||||
$2BC0-$2BDF = RIOT Addresses $00-$1F (mirror)
|
||||
$2BE0-$2BFF = RIOT Addresses $00-$1F (mirror)
|
||||
$2C00-$2C3F = TIA Addresses $00-$3F (mirror)
|
||||
$2C40-$2C7F = TIA Addresses $00-$3F (mirror)
|
||||
$2C80-$2CFF = RIOT RAM (mirror)
|
||||
$2D00-$2D3F = TIA Addresses $00-$3F (mirror)
|
||||
$2D40-$2D7F = TIA Addresses $00-$3F (mirror)
|
||||
$2D80-$2DFF = RIOT RAM (mirror)
|
||||
$2E00-$2E3F = TIA Addresses $00-$3F (mirror)
|
||||
$2E40-$2E7F = TIA Addresses $00-$3F (mirror)
|
||||
$2E80-$2E9F = RIOT Addresses $00-$1F (mirror)
|
||||
$2EA0-$2EBF = RIOT Addresses $00-$1F (mirror)
|
||||
$2EC0-$2EDF = RIOT Addresses $00-$1F (mirror)
|
||||
$2EE0-$2EFF = RIOT Addresses $00-$1F (mirror)
|
||||
$2F00-$2F3F = TIA Addresses $00-$3F (mirror)
|
||||
$2F40-$2F7F = TIA Addresses $00-$3F (mirror)
|
||||
$2F80-$2F9F = RIOT Addresses $00-$1F (mirror)
|
||||
$2FA0-$2FBF = RIOT Addresses $00-$1F (mirror)
|
||||
$2FC0-$2FDF = RIOT Addresses $00-$1F (mirror)
|
||||
$2FE0-$2FFF = RIOT Addresses $00-$1F (mirror)
|
||||
$3000-$3FFF = ROM Addresses $000-$FFF (mirror)
|
||||
$4000-$403F = TIA Addresses $00-$3F (mirror)
|
||||
$4040-$407F = TIA Addresses $00-$3F (mirror)
|
||||
$4080-$40FF = RIOT RAM (mirror)
|
||||
$4100-$413F = TIA Addresses $00-$3F (mirror)
|
||||
$4140-$417F = TIA Addresses $00-$3F (mirror)
|
||||
$4180-$41FF = RIOT RAM (mirror)
|
||||
$4200-$423F = TIA Addresses $00-$3F (mirror)
|
||||
$4240-$427F = TIA Addresses $00-$3F (mirror)
|
||||
$4280-$429F = RIOT Addresses $00-$1F (mirror)
|
||||
$42A0-$42BF = RIOT Addresses $00-$1F (mirror)
|
||||
$42C0-$42DF = RIOT Addresses $00-$1F (mirror)
|
||||
$42E0-$42FF = RIOT Addresses $00-$1F (mirror)
|
||||
$4300-$433F = TIA Addresses $00-$3F (mirror)
|
||||
$4340-$437F = TIA Addresses $00-$3F (mirror)
|
||||
$4380-$439F = RIOT Addresses $00-$1F (mirror)
|
||||
$43A0-$43BF = RIOT Addresses $00-$1F (mirror)
|
||||
$43C0-$43DF = RIOT Addresses $00-$1F (mirror)
|
||||
$43E0-$43FF = RIOT Addresses $00-$1F (mirror)
|
||||
$4400-$443F = TIA Addresses $00-$3F (mirror)
|
||||
$4440-$447F = TIA Addresses $00-$3F (mirror)
|
||||
$4480-$44FF = RIOT RAM (mirror)
|
||||
$4500-$453F = TIA Addresses $00-$3F (mirror)
|
||||
$4540-$457F = TIA Addresses $00-$3F (mirror)
|
||||
$4580-$45FF = RIOT RAM (mirror)
|
||||
$4600-$463F = TIA Addresses $00-$3F (mirror)
|
||||
$4640-$467F = TIA Addresses $00-$3F (mirror)
|
||||
$4680-$469F = RIOT Addresses $00-$1F (mirror)
|
||||
$46A0-$46BF = RIOT Addresses $00-$1F (mirror)
|
||||
$46C0-$46DF = RIOT Addresses $00-$1F (mirror)
|
||||
$46E0-$46FF = RIOT Addresses $00-$1F (mirror)
|
||||
$4700-$473F = TIA Addresses $00-$3F (mirror)
|
||||
$4740-$477F = TIA Addresses $00-$3F (mirror)
|
||||
$4780-$479F = RIOT Addresses $00-$1F (mirror)
|
||||
$47A0-$47BF = RIOT Addresses $00-$1F (mirror)
|
||||
$47C0-$47DF = RIOT Addresses $00-$1F (mirror)
|
||||
$47E0-$47FF = RIOT Addresses $00-$1F (mirror)
|
||||
$4800-$483F = TIA Addresses $00-$3F (mirror)
|
||||
$4840-$487F = TIA Addresses $00-$3F (mirror)
|
||||
$4880-$48FF = RIOT RAM (mirror)
|
||||
$4900-$493F = TIA Addresses $00-$3F (mirror)
|
||||
$4940-$497F = TIA Addresses $00-$3F (mirror)
|
||||
$4980-$49FF = RIOT RAM (mirror)
|
||||
$4A00-$4A3F = TIA Addresses $00-$3F (mirror)
|
||||
$4A40-$4A7F = TIA Addresses $00-$3F (mirror)
|
||||
$4A80-$4A9F = RIOT Addresses $00-$1F (mirror)
|
||||
$4AA0-$4ABF = RIOT Addresses $00-$1F (mirror)
|
||||
$4AC0-$4ADF = RIOT Addresses $00-$1F (mirror)
|
||||
$4AE0-$4AFF = RIOT Addresses $00-$1F (mirror)
|
||||
$4B00-$4B3F = TIA Addresses $00-$3F (mirror)
|
||||
$4B40-$4B7F = TIA Addresses $00-$3F (mirror)
|
||||
$4B80-$4B9F = RIOT Addresses $00-$1F (mirror)
|
||||
$4BA0-$4BBF = RIOT Addresses $00-$1F (mirror)
|
||||
$4BC0-$4BDF = RIOT Addresses $00-$1F (mirror)
|
||||
$4BE0-$4BFF = RIOT Addresses $00-$1F (mirror)
|
||||
$4C00-$4C3F = TIA Addresses $00-$3F (mirror)
|
||||
$4C40-$4C7F = TIA Addresses $00-$3F (mirror)
|
||||
$4C80-$4CFF = RIOT RAM (mirror)
|
||||
$4D00-$4D3F = TIA Addresses $00-$3F (mirror)
|
||||
$4D40-$4D7F = TIA Addresses $00-$3F (mirror)
|
||||
$4D80-$4DFF = RIOT RAM (mirror)
|
||||
$4E00-$4E3F = TIA Addresses $00-$3F (mirror)
|
||||
$4E40-$4E7F = TIA Addresses $00-$3F (mirror)
|
||||
$4E80-$4E9F = RIOT Addresses $00-$1F (mirror)
|
||||
$4EA0-$4EBF = RIOT Addresses $00-$1F (mirror)
|
||||
$4EC0-$4EDF = RIOT Addresses $00-$1F (mirror)
|
||||
$4EE0-$4EFF = RIOT Addresses $00-$1F (mirror)
|
||||
$4F00-$4F3F = TIA Addresses $00-$3F (mirror)
|
||||
$4F40-$4F7F = TIA Addresses $00-$3F (mirror)
|
||||
$4F80-$4F9F = RIOT Addresses $00-$1F (mirror)
|
||||
$4FA0-$4FBF = RIOT Addresses $00-$1F (mirror)
|
||||
$4FC0-$4FDF = RIOT Addresses $00-$1F (mirror)
|
||||
$4FE0-$4FFF = RIOT Addresses $00-$1F (mirror)
|
||||
$5000-$5FFF = ROM Addresses $000-$FFF (mirror)
|
||||
$6000-$603F = TIA Addresses $00-$3F (mirror)
|
||||
$6040-$607F = TIA Addresses $00-$3F (mirror)
|
||||
$6080-$60FF = RIOT RAM (mirror)
|
||||
$6100-$613F = TIA Addresses $00-$3F (mirror)
|
||||
$6140-$617F = TIA Addresses $00-$3F (mirror)
|
||||
$6180-$61FF = RIOT RAM (mirror)
|
||||
$6200-$623F = TIA Addresses $00-$3F (mirror)
|
||||
$6240-$627F = TIA Addresses $00-$3F (mirror)
|
||||
$6280-$629F = RIOT Addresses $00-$1F (mirror)
|
||||
$62A0-$62BF = RIOT Addresses $00-$1F (mirror)
|
||||
$62C0-$62DF = RIOT Addresses $00-$1F (mirror)
|
||||
$62E0-$62FF = RIOT Addresses $00-$1F (mirror)
|
||||
$6300-$633F = TIA Addresses $00-$3F (mirror)
|
||||
$6340-$637F = TIA Addresses $00-$3F (mirror)
|
||||
$6380-$639F = RIOT Addresses $00-$1F (mirror)
|
||||
$63A0-$63BF = RIOT Addresses $00-$1F (mirror)
|
||||
$63C0-$63DF = RIOT Addresses $00-$1F (mirror)
|
||||
$63E0-$63FF = RIOT Addresses $00-$1F (mirror)
|
||||
$6400-$643F = TIA Addresses $00-$3F (mirror)
|
||||
$6440-$647F = TIA Addresses $00-$3F (mirror)
|
||||
$6480-$64FF = RIOT RAM (mirror)
|
||||
$6500-$653F = TIA Addresses $00-$3F (mirror)
|
||||
$6540-$657F = TIA Addresses $00-$3F (mirror)
|
||||
$6580-$65FF = RIOT RAM (mirror)
|
||||
$6600-$663F = TIA Addresses $00-$3F (mirror)
|
||||
$6640-$667F = TIA Addresses $00-$3F (mirror)
|
||||
$6680-$669F = RIOT Addresses $00-$1F (mirror)
|
||||
$66A0-$66BF = RIOT Addresses $00-$1F (mirror)
|
||||
$66C0-$66DF = RIOT Addresses $00-$1F (mirror)
|
||||
$66E0-$66FF = RIOT Addresses $00-$1F (mirror)
|
||||
$6700-$673F = TIA Addresses $00-$3F (mirror)
|
||||
$6740-$677F = TIA Addresses $00-$3F (mirror)
|
||||
$6780-$679F = RIOT Addresses $00-$1F (mirror)
|
||||
$67A0-$67BF = RIOT Addresses $00-$1F (mirror)
|
||||
$67C0-$67DF = RIOT Addresses $00-$1F (mirror)
|
||||
$67E0-$67FF = RIOT Addresses $00-$1F (mirror)
|
||||
$6800-$683F = TIA Addresses $00-$3F (mirror)
|
||||
$6840-$687F = TIA Addresses $00-$3F (mirror)
|
||||
$6880-$68FF = RIOT RAM (mirror)
|
||||
$6900-$693F = TIA Addresses $00-$3F (mirror)
|
||||
$6940-$697F = TIA Addresses $00-$3F (mirror)
|
||||
$6980-$69FF = RIOT RAM (mirror)
|
||||
$6A00-$6A3F = TIA Addresses $00-$3F (mirror)
|
||||
$6A40-$6A7F = TIA Addresses $00-$3F (mirror)
|
||||
$6A80-$6A9F = RIOT Addresses $00-$1F (mirror)
|
||||
$6AA0-$6ABF = RIOT Addresses $00-$1F (mirror)
|
||||
$6AC0-$6ADF = RIOT Addresses $00-$1F (mirror)
|
||||
$6AE0-$6AFF = RIOT Addresses $00-$1F (mirror)
|
||||
$6B00-$6B3F = TIA Addresses $00-$3F (mirror)
|
||||
$6B40-$6B7F = TIA Addresses $00-$3F (mirror)
|
||||
$6B80-$6B9F = RIOT Addresses $00-$1F (mirror)
|
||||
$6BA0-$6BBF = RIOT Addresses $00-$1F (mirror)
|
||||
$6BC0-$6BDF = RIOT Addresses $00-$1F (mirror)
|
||||
$6BE0-$6BFF = RIOT Addresses $00-$1F (mirror)
|
||||
$6C00-$6C3F = TIA Addresses $00-$3F (mirror)
|
||||
$6C40-$6C7F = TIA Addresses $00-$3F (mirror)
|
||||
$6C80-$6CFF = RIOT RAM (mirror)
|
||||
$6D00-$6D3F = TIA Addresses $00-$3F (mirror)
|
||||
$6D40-$6D7F = TIA Addresses $00-$3F (mirror)
|
||||
$6D80-$6DFF = RIOT RAM (mirror)
|
||||
$6E00-$6E3F = TIA Addresses $00-$3F (mirror)
|
||||
$6E40-$6E7F = TIA Addresses $00-$3F (mirror)
|
||||
$6E80-$6E9F = RIOT Addresses $00-$1F (mirror)
|
||||
$6EA0-$6EBF = RIOT Addresses $00-$1F (mirror)
|
||||
$6EC0-$6EDF = RIOT Addresses $00-$1F (mirror)
|
||||
$6EE0-$6EFF = RIOT Addresses $00-$1F (mirror)
|
||||
$6F00-$6F3F = TIA Addresses $00-$3F (mirror)
|
||||
$6F40-$6F7F = TIA Addresses $00-$3F (mirror)
|
||||
$6F80-$6F9F = RIOT Addresses $00-$1F (mirror)
|
||||
$6FA0-$6FBF = RIOT Addresses $00-$1F (mirror)
|
||||
$6FC0-$6FDF = RIOT Addresses $00-$1F (mirror)
|
||||
$6FE0-$6FFF = RIOT Addresses $00-$1F (mirror)
|
||||
$7000-$7FFF = ROM Addresses $000-$FFF (mirror)
|
||||
$8000-$803F = TIA Addresses $00-$3F (mirror)
|
||||
$8040-$807F = TIA Addresses $00-$3F (mirror)
|
||||
$8080-$80FF = RIOT RAM (mirror)
|
||||
$8100-$813F = TIA Addresses $00-$3F (mirror)
|
||||
$8140-$817F = TIA Addresses $00-$3F (mirror)
|
||||
$8180-$81FF = RIOT RAM (mirror)
|
||||
$8200-$823F = TIA Addresses $00-$3F (mirror)
|
||||
$8240-$827F = TIA Addresses $00-$3F (mirror)
|
||||
$8280-$829F = RIOT Addresses $00-$1F (mirror)
|
||||
$82A0-$82BF = RIOT Addresses $00-$1F (mirror)
|
||||
$82C0-$82DF = RIOT Addresses $00-$1F (mirror)
|
||||
$82E0-$82FF = RIOT Addresses $00-$1F (mirror)
|
||||
$8300-$833F = TIA Addresses $00-$3F (mirror)
|
||||
$8340-$837F = TIA Addresses $00-$3F (mirror)
|
||||
$8380-$839F = RIOT Addresses $00-$1F (mirror)
|
||||
$83A0-$83BF = RIOT Addresses $00-$1F (mirror)
|
||||
$83C0-$83DF = RIOT Addresses $00-$1F (mirror)
|
||||
$83E0-$83FF = RIOT Addresses $00-$1F (mirror)
|
||||
$8400-$843F = TIA Addresses $00-$3F (mirror)
|
||||
$8440-$847F = TIA Addresses $00-$3F (mirror)
|
||||
$8480-$84FF = RIOT RAM (mirror)
|
||||
$8500-$853F = TIA Addresses $00-$3F (mirror)
|
||||
$8540-$857F = TIA Addresses $00-$3F (mirror)
|
||||
$8580-$85FF = RIOT RAM (mirror)
|
||||
$8600-$863F = TIA Addresses $00-$3F (mirror)
|
||||
$8640-$867F = TIA Addresses $00-$3F (mirror)
|
||||
$8680-$869F = RIOT Addresses $00-$1F (mirror)
|
||||
$86A0-$86BF = RIOT Addresses $00-$1F (mirror)
|
||||
$86C0-$86DF = RIOT Addresses $00-$1F (mirror)
|
||||
$86E0-$86FF = RIOT Addresses $00-$1F (mirror)
|
||||
$8700-$873F = TIA Addresses $00-$3F (mirror)
|
||||
$8740-$877F = TIA Addresses $00-$3F (mirror)
|
||||
$8780-$879F = RIOT Addresses $00-$1F (mirror)
|
||||
$87A0-$87BF = RIOT Addresses $00-$1F (mirror)
|
||||
$87C0-$87DF = RIOT Addresses $00-$1F (mirror)
|
||||
$87E0-$87FF = RIOT Addresses $00-$1F (mirror)
|
||||
$8800-$883F = TIA Addresses $00-$3F (mirror)
|
||||
$8840-$887F = TIA Addresses $00-$3F (mirror)
|
||||
$8880-$88FF = RIOT RAM (mirror)
|
||||
$8900-$893F = TIA Addresses $00-$3F (mirror)
|
||||
$8940-$897F = TIA Addresses $00-$3F (mirror)
|
||||
$8980-$89FF = RIOT RAM (mirror)
|
||||
$8A00-$8A3F = TIA Addresses $00-$3F (mirror)
|
||||
$8A40-$8A7F = TIA Addresses $00-$3F (mirror)
|
||||
$8A80-$8A9F = RIOT Addresses $00-$1F (mirror)
|
||||
$8AA0-$8ABF = RIOT Addresses $00-$1F (mirror)
|
||||
$8AC0-$8ADF = RIOT Addresses $00-$1F (mirror)
|
||||
$8AE0-$8AFF = RIOT Addresses $00-$1F (mirror)
|
||||
$8B00-$8B3F = TIA Addresses $00-$3F (mirror)
|
||||
$8B40-$8B7F = TIA Addresses $00-$3F (mirror)
|
||||
$8B80-$8B9F = RIOT Addresses $00-$1F (mirror)
|
||||
$8BA0-$8BBF = RIOT Addresses $00-$1F (mirror)
|
||||
$8BC0-$8BDF = RIOT Addresses $00-$1F (mirror)
|
||||
$8BE0-$8BFF = RIOT Addresses $00-$1F (mirror)
|
||||
$8C00-$8C3F = TIA Addresses $00-$3F (mirror)
|
||||
$8C40-$8C7F = TIA Addresses $00-$3F (mirror)
|
||||
$8C80-$8CFF = RIOT RAM (mirror)
|
||||
$8D00-$8D3F = TIA Addresses $00-$3F (mirror)
|
||||
$8D40-$8D7F = TIA Addresses $00-$3F (mirror)
|
||||
$8D80-$8DFF = RIOT RAM (mirror)
|
||||
$8E00-$8E3F = TIA Addresses $00-$3F (mirror)
|
||||
$8E40-$8E7F = TIA Addresses $00-$3F (mirror)
|
||||
$8E80-$8E9F = RIOT Addresses $00-$1F (mirror)
|
||||
$8EA0-$8EBF = RIOT Addresses $00-$1F (mirror)
|
||||
$8EC0-$8EDF = RIOT Addresses $00-$1F (mirror)
|
||||
$8EE0-$8EFF = RIOT Addresses $00-$1F (mirror)
|
||||
$8F00-$8F3F = TIA Addresses $00-$3F (mirror)
|
||||
$8F40-$8F7F = TIA Addresses $00-$3F (mirror)
|
||||
$8F80-$8F9F = RIOT Addresses $00-$1F (mirror)
|
||||
$8FA0-$8FBF = RIOT Addresses $00-$1F (mirror)
|
||||
$8FC0-$8FDF = RIOT Addresses $00-$1F (mirror)
|
||||
$8FE0-$8FFF = RIOT Addresses $00-$1F (mirror)
|
||||
$9000-$9FFF = ROM Addresses $000-$FFF (mirror)
|
||||
$A000-$A03F = TIA Addresses $00-$3F (mirror)
|
||||
$A040-$A07F = TIA Addresses $00-$3F (mirror)
|
||||
$A080-$A0FF = RIOT RAM (mirror)
|
||||
$A100-$A13F = TIA Addresses $00-$3F (mirror)
|
||||
$A140-$A17F = TIA Addresses $00-$3F (mirror)
|
||||
$A180-$A1FF = RIOT RAM (mirror)
|
||||
$A200-$A23F = TIA Addresses $00-$3F (mirror)
|
||||
$A240-$A27F = TIA Addresses $00-$3F (mirror)
|
||||
$A280-$A29F = RIOT Addresses $00-$1F (mirror)
|
||||
$A2A0-$A2BF = RIOT Addresses $00-$1F (mirror)
|
||||
$A2C0-$A2DF = RIOT Addresses $00-$1F (mirror)
|
||||
$A2E0-$A2FF = RIOT Addresses $00-$1F (mirror)
|
||||
$A300-$A33F = TIA Addresses $00-$3F (mirror)
|
||||
$A340-$A37F = TIA Addresses $00-$3F (mirror)
|
||||
$A380-$A39F = RIOT Addresses $00-$1F (mirror)
|
||||
$A3A0-$A3BF = RIOT Addresses $00-$1F (mirror)
|
||||
$A3C0-$A3DF = RIOT Addresses $00-$1F (mirror)
|
||||
$A3E0-$A3FF = RIOT Addresses $00-$1F (mirror)
|
||||
$A400-$A43F = TIA Addresses $00-$3F (mirror)
|
||||
$A440-$A47F = TIA Addresses $00-$3F (mirror)
|
||||
$A480-$A4FF = RIOT RAM (mirror)
|
||||
$A500-$A53F = TIA Addresses $00-$3F (mirror)
|
||||
$A540-$A57F = TIA Addresses $00-$3F (mirror)
|
||||
$A580-$A5FF = RIOT RAM (mirror)
|
||||
$A600-$A63F = TIA Addresses $00-$3F (mirror)
|
||||
$A640-$A67F = TIA Addresses $00-$3F (mirror)
|
||||
$A680-$A69F = RIOT Addresses $00-$1F (mirror)
|
||||
$A6A0-$A6BF = RIOT Addresses $00-$1F (mirror)
|
||||
$A6C0-$A6DF = RIOT Addresses $00-$1F (mirror)
|
||||
$A6E0-$A6FF = RIOT Addresses $00-$1F (mirror)
|
||||
$A700-$A73F = TIA Addresses $00-$3F (mirror)
|
||||
$A740-$A77F = TIA Addresses $00-$3F (mirror)
|
||||
$A780-$A79F = RIOT Addresses $00-$1F (mirror)
|
||||
$A7A0-$A7BF = RIOT Addresses $00-$1F (mirror)
|
||||
$A7C0-$A7DF = RIOT Addresses $00-$1F (mirror)
|
||||
$A7E0-$A7FF = RIOT Addresses $00-$1F (mirror)
|
||||
$A800-$A83F = TIA Addresses $00-$3F (mirror)
|
||||
$A840-$A87F = TIA Addresses $00-$3F (mirror)
|
||||
$A880-$A8FF = RIOT RAM (mirror)
|
||||
$A900-$A93F = TIA Addresses $00-$3F (mirror)
|
||||
$A940-$A97F = TIA Addresses $00-$3F (mirror)
|
||||
$A980-$A9FF = RIOT RAM (mirror)
|
||||
$AA00-$AA3F = TIA Addresses $00-$3F (mirror)
|
||||
$AA40-$AA7F = TIA Addresses $00-$3F (mirror)
|
||||
$AA80-$AA9F = RIOT Addresses $00-$1F (mirror)
|
||||
$AAA0-$AABF = RIOT Addresses $00-$1F (mirror)
|
||||
$AAC0-$AADF = RIOT Addresses $00-$1F (mirror)
|
||||
$AAE0-$AAFF = RIOT Addresses $00-$1F (mirror)
|
||||
$AB00-$AB3F = TIA Addresses $00-$3F (mirror)
|
||||
$AB40-$AB7F = TIA Addresses $00-$3F (mirror)
|
||||
$AB80-$AB9F = RIOT Addresses $00-$1F (mirror)
|
||||
$ABA0-$ABBF = RIOT Addresses $00-$1F (mirror)
|
||||
$ABC0-$ABDF = RIOT Addresses $00-$1F (mirror)
|
||||
$ABE0-$ABFF = RIOT Addresses $00-$1F (mirror)
|
||||
$AC00-$AC3F = TIA Addresses $00-$3F (mirror)
|
||||
$AC40-$AC7F = TIA Addresses $00-$3F (mirror)
|
||||
$AC80-$ACFF = RIOT RAM (mirror)
|
||||
$AD00-$AD3F = TIA Addresses $00-$3F (mirror)
|
||||
$AD40-$AD7F = TIA Addresses $00-$3F (mirror)
|
||||
$AD80-$ADFF = RIOT RAM (mirror)
|
||||
$AE00-$AE3F = TIA Addresses $00-$3F (mirror)
|
||||
$AE40-$AE7F = TIA Addresses $00-$3F (mirror)
|
||||
$AE80-$AE9F = RIOT Addresses $00-$1F (mirror)
|
||||
$AEA0-$AEBF = RIOT Addresses $00-$1F (mirror)
|
||||
$AEC0-$AEDF = RIOT Addresses $00-$1F (mirror)
|
||||
$AEE0-$AEFF = RIOT Addresses $00-$1F (mirror)
|
||||
$AF00-$AF3F = TIA Addresses $00-$3F (mirror)
|
||||
$AF40-$AF7F = TIA Addresses $00-$3F (mirror)
|
||||
$AF80-$AF9F = RIOT Addresses $00-$1F (mirror)
|
||||
$AFA0-$AFBF = RIOT Addresses $00-$1F (mirror)
|
||||
$AFC0-$AFDF = RIOT Addresses $00-$1F (mirror)
|
||||
$AFE0-$AFFF = RIOT Addresses $00-$1F (mirror)
|
||||
$B000-$BFFF = ROM Addresses $000-$FFF (mirror)
|
||||
$C000-$C03F = TIA Addresses $00-$3F (mirror)
|
||||
$C040-$C07F = TIA Addresses $00-$3F (mirror)
|
||||
$C080-$C0FF = RIOT RAM (mirror)
|
||||
$C100-$C13F = TIA Addresses $00-$3F (mirror)
|
||||
$C140-$C17F = TIA Addresses $00-$3F (mirror)
|
||||
$C180-$C1FF = RIOT RAM (mirror)
|
||||
$C200-$C23F = TIA Addresses $00-$3F (mirror)
|
||||
$C240-$C27F = TIA Addresses $00-$3F (mirror)
|
||||
$C280-$C29F = RIOT Addresses $00-$1F (mirror)
|
||||
$C2A0-$C2BF = RIOT Addresses $00-$1F (mirror)
|
||||
$C2C0-$C2DF = RIOT Addresses $00-$1F (mirror)
|
||||
$C2E0-$C2FF = RIOT Addresses $00-$1F (mirror)
|
||||
$C300-$C33F = TIA Addresses $00-$3F (mirror)
|
||||
$C340-$C37F = TIA Addresses $00-$3F (mirror)
|
||||
$C380-$C39F = RIOT Addresses $00-$1F (mirror)
|
||||
$C3A0-$C3BF = RIOT Addresses $00-$1F (mirror)
|
||||
$C3C0-$C3DF = RIOT Addresses $00-$1F (mirror)
|
||||
$C3E0-$C3FF = RIOT Addresses $00-$1F (mirror)
|
||||
$C400-$C43F = TIA Addresses $00-$3F (mirror)
|
||||
$C440-$C47F = TIA Addresses $00-$3F (mirror)
|
||||
$C480-$C4FF = RIOT RAM (mirror)
|
||||
$C500-$C53F = TIA Addresses $00-$3F (mirror)
|
||||
$C540-$C57F = TIA Addresses $00-$3F (mirror)
|
||||
$C580-$C5FF = RIOT RAM (mirror)
|
||||
$C600-$C63F = TIA Addresses $00-$3F (mirror)
|
||||
$C640-$C67F = TIA Addresses $00-$3F (mirror)
|
||||
$C680-$C69F = RIOT Addresses $00-$1F (mirror)
|
||||
$C6A0-$C6BF = RIOT Addresses $00-$1F (mirror)
|
||||
$C6C0-$C6DF = RIOT Addresses $00-$1F (mirror)
|
||||
$C6E0-$C6FF = RIOT Addresses $00-$1F (mirror)
|
||||
$C700-$C73F = TIA Addresses $00-$3F (mirror)
|
||||
$C740-$C77F = TIA Addresses $00-$3F (mirror)
|
||||
$C780-$C79F = RIOT Addresses $00-$1F (mirror)
|
||||
$C7A0-$C7BF = RIOT Addresses $00-$1F (mirror)
|
||||
$C7C0-$C7DF = RIOT Addresses $00-$1F (mirror)
|
||||
$C7E0-$C7FF = RIOT Addresses $00-$1F (mirror)
|
||||
$C800-$C83F = TIA Addresses $00-$3F (mirror)
|
||||
$C840-$C87F = TIA Addresses $00-$3F (mirror)
|
||||
$C880-$C8FF = RIOT RAM (mirror)
|
||||
$C900-$C93F = TIA Addresses $00-$3F (mirror)
|
||||
$C940-$C97F = TIA Addresses $00-$3F (mirror)
|
||||
$C980-$C9FF = RIOT RAM (mirror)
|
||||
$CA00-$CA3F = TIA Addresses $00-$3F (mirror)
|
||||
$CA40-$CA7F = TIA Addresses $00-$3F (mirror)
|
||||
$CA80-$CA9F = RIOT Addresses $00-$1F (mirror)
|
||||
$CAA0-$CABF = RIOT Addresses $00-$1F (mirror)
|
||||
$CAC0-$CADF = RIOT Addresses $00-$1F (mirror)
|
||||
$CAE0-$CAFF = RIOT Addresses $00-$1F (mirror)
|
||||
$CB00-$CB3F = TIA Addresses $00-$3F (mirror)
|
||||
$CB40-$CB7F = TIA Addresses $00-$3F (mirror)
|
||||
$CB80-$CB9F = RIOT Addresses $00-$1F (mirror)
|
||||
$CBA0-$CBBF = RIOT Addresses $00-$1F (mirror)
|
||||
$CBC0-$CBDF = RIOT Addresses $00-$1F (mirror)
|
||||
$CBE0-$CBFF = RIOT Addresses $00-$1F (mirror)
|
||||
$CC00-$CC3F = TIA Addresses $00-$3F (mirror)
|
||||
$CC40-$CC7F = TIA Addresses $00-$3F (mirror)
|
||||
$CC80-$CCFF = RIOT RAM (mirror)
|
||||
$CD00-$CD3F = TIA Addresses $00-$3F (mirror)
|
||||
$CD40-$CD7F = TIA Addresses $00-$3F (mirror)
|
||||
$CD80-$CDFF = RIOT RAM (mirror)
|
||||
$CE00-$CE3F = TIA Addresses $00-$3F (mirror)
|
||||
$CE40-$CE7F = TIA Addresses $00-$3F (mirror)
|
||||
$CE80-$CE9F = RIOT Addresses $00-$1F (mirror)
|
||||
$CEA0-$CEBF = RIOT Addresses $00-$1F (mirror)
|
||||
$CEC0-$CEDF = RIOT Addresses $00-$1F (mirror)
|
||||
$CEE0-$CEFF = RIOT Addresses $00-$1F (mirror)
|
||||
$CF00-$CF3F = TIA Addresses $00-$3F (mirror)
|
||||
$CF40-$CF7F = TIA Addresses $00-$3F (mirror)
|
||||
$CF80-$CF9F = RIOT Addresses $00-$1F (mirror)
|
||||
$CFA0-$CFBF = RIOT Addresses $00-$1F (mirror)
|
||||
$CFC0-$CFDF = RIOT Addresses $00-$1F (mirror)
|
||||
$CFE0-$CFFF = RIOT Addresses $00-$1F (mirror)
|
||||
$D000-$DFFF = ROM Addresses $000-$FFF (mirror)
|
||||
$E000-$E03F = TIA Addresses $00-$3F (mirror)
|
||||
$E040-$E07F = TIA Addresses $00-$3F (mirror)
|
||||
$E080-$E0FF = RIOT RAM (mirror)
|
||||
$E100-$E13F = TIA Addresses $00-$3F (mirror)
|
||||
$E140-$E17F = TIA Addresses $00-$3F (mirror)
|
||||
$E180-$E1FF = RIOT RAM (mirror)
|
||||
$E200-$E23F = TIA Addresses $00-$3F (mirror)
|
||||
$E240-$E27F = TIA Addresses $00-$3F (mirror)
|
||||
$E280-$E29F = RIOT Addresses $00-$1F (mirror)
|
||||
$E2A0-$E2BF = RIOT Addresses $00-$1F (mirror)
|
||||
$E2C0-$E2DF = RIOT Addresses $00-$1F (mirror)
|
||||
$E2E0-$E2FF = RIOT Addresses $00-$1F (mirror)
|
||||
$E300-$E33F = TIA Addresses $00-$3F (mirror)
|
||||
$E340-$E37F = TIA Addresses $00-$3F (mirror)
|
||||
$E380-$E39F = RIOT Addresses $00-$1F (mirror)
|
||||
$E3A0-$E3BF = RIOT Addresses $00-$1F (mirror)
|
||||
$E3C0-$E3DF = RIOT Addresses $00-$1F (mirror)
|
||||
$E3E0-$E3FF = RIOT Addresses $00-$1F (mirror)
|
||||
$E400-$E43F = TIA Addresses $00-$3F (mirror)
|
||||
$E440-$E47F = TIA Addresses $00-$3F (mirror)
|
||||
$E480-$E4FF = RIOT RAM (mirror)
|
||||
$E500-$E53F = TIA Addresses $00-$3F (mirror)
|
||||
$E540-$E57F = TIA Addresses $00-$3F (mirror)
|
||||
$E580-$E5FF = RIOT RAM (mirror)
|
||||
$E600-$E63F = TIA Addresses $00-$3F (mirror)
|
||||
$E640-$E67F = TIA Addresses $00-$3F (mirror)
|
||||
$E680-$E69F = RIOT Addresses $00-$1F (mirror)
|
||||
$E6A0-$E6BF = RIOT Addresses $00-$1F (mirror)
|
||||
$E6C0-$E6DF = RIOT Addresses $00-$1F (mirror)
|
||||
$E6E0-$E6FF = RIOT Addresses $00-$1F (mirror)
|
||||
$E700-$E73F = TIA Addresses $00-$3F (mirror)
|
||||
$E740-$E77F = TIA Addresses $00-$3F (mirror)
|
||||
$E780-$E79F = RIOT Addresses $00-$1F (mirror)
|
||||
$E7A0-$E7BF = RIOT Addresses $00-$1F (mirror)
|
||||
$E7C0-$E7DF = RIOT Addresses $00-$1F (mirror)
|
||||
$E7E0-$E7FF = RIOT Addresses $00-$1F (mirror)
|
||||
$E800-$E83F = TIA Addresses $00-$3F (mirror)
|
||||
$E840-$E87F = TIA Addresses $00-$3F (mirror)
|
||||
$E880-$E8FF = RIOT RAM (mirror)
|
||||
$E900-$E93F = TIA Addresses $00-$3F (mirror)
|
||||
$E940-$E97F = TIA Addresses $00-$3F (mirror)
|
||||
$E980-$E9FF = RIOT RAM (mirror)
|
||||
$EA00-$EA3F = TIA Addresses $00-$3F (mirror)
|
||||
$EA40-$EA7F = TIA Addresses $00-$3F (mirror)
|
||||
$EA80-$EA9F = RIOT Addresses $00-$1F (mirror)
|
||||
$EAA0-$EABF = RIOT Addresses $00-$1F (mirror)
|
||||
$EAC0-$EADF = RIOT Addresses $00-$1F (mirror)
|
||||
$EAE0-$EAFF = RIOT Addresses $00-$1F (mirror)
|
||||
$EB00-$EB3F = TIA Addresses $00-$3F (mirror)
|
||||
$EB40-$EB7F = TIA Addresses $00-$3F (mirror)
|
||||
$EB80-$EB9F = RIOT Addresses $00-$1F (mirror)
|
||||
$EBA0-$EBBF = RIOT Addresses $00-$1F (mirror)
|
||||
$EBC0-$EBDF = RIOT Addresses $00-$1F (mirror)
|
||||
$EBE0-$EBFF = RIOT Addresses $00-$1F (mirror)
|
||||
$EC00-$EC3F = TIA Addresses $00-$3F (mirror)
|
||||
$EC40-$EC7F = TIA Addresses $00-$3F (mirror)
|
||||
$EC80-$ECFF = RIOT RAM (mirror)
|
||||
$ED00-$ED3F = TIA Addresses $00-$3F (mirror)
|
||||
$ED40-$ED7F = TIA Addresses $00-$3F (mirror)
|
||||
$ED80-$EDFF = RIOT RAM (mirror)
|
||||
$EE00-$EE3F = TIA Addresses $00-$3F (mirror)
|
||||
$EE40-$EE7F = TIA Addresses $00-$3F (mirror)
|
||||
$EE80-$EE9F = RIOT Addresses $00-$1F (mirror)
|
||||
$EEA0-$EEBF = RIOT Addresses $00-$1F (mirror)
|
||||
$EEC0-$EEDF = RIOT Addresses $00-$1F (mirror)
|
||||
$EEE0-$EEFF = RIOT Addresses $00-$1F (mirror)
|
||||
$EF00-$EF3F = TIA Addresses $00-$3F (mirror)
|
||||
$EF40-$EF7F = TIA Addresses $00-$3F (mirror)
|
||||
$EF80-$EF9F = RIOT Addresses $00-$1F (mirror)
|
||||
$EFA0-$EFBF = RIOT Addresses $00-$1F (mirror)
|
||||
$EFC0-$EFDF = RIOT Addresses $00-$1F (mirror)
|
||||
$EFE0-$EFFF = RIOT Addresses $00-$1F (mirror)
|
||||
$F000-$FFFF = ROM Addresses $000-$FFF (mirror)
|
||||
@@ -0,0 +1,44 @@
|
||||
***************************************************
|
||||
* $0000-$003F = TIA Addresses $00-$3F (zero page) *
|
||||
* ----------------------------------------------- *
|
||||
* *
|
||||
* mirror: $xyz0 *
|
||||
* *
|
||||
* x = {even} *
|
||||
* y = {anything} *
|
||||
* z = {0, 4} *
|
||||
* *
|
||||
***************************************************
|
||||
|
||||
**************************************
|
||||
* $0080-$00FF = RIOT RAM (zero page) *
|
||||
* ---------------------------------- *
|
||||
* *
|
||||
* mirror: $xy80 *
|
||||
* *
|
||||
* x = {even} *
|
||||
* y = {0,1,4,5,8,9,$C,$D} *
|
||||
* *
|
||||
**************************************
|
||||
|
||||
****************************************
|
||||
* $0280-$029F = RIOT Addresses $00-$1F *
|
||||
* ------------------------------------ *
|
||||
* *
|
||||
* mirror: $xyz0 *
|
||||
* *
|
||||
* x = {even} *
|
||||
* y = {2,3,6,7,$A,$B,$E,$F} *
|
||||
* z = {8,$A,$C,$E} *
|
||||
* *
|
||||
****************************************
|
||||
|
||||
*****************************************
|
||||
* $1000-$1FFF = ROM Addresses $000-$FFF *
|
||||
* ------------------------------------- *
|
||||
* *
|
||||
* mirror: $x000 *
|
||||
* *
|
||||
* x = {odd} *
|
||||
* *
|
||||
*****************************************
|
||||
@@ -0,0 +1,239 @@
|
||||
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.
|
||||
@@ -0,0 +1,107 @@
|
||||
From: https://forums.atariage.com/topic/133686-please-explain-riot-timmers/#comment-1617207
|
||||
|
||||
|
||||
NOTE about timer initial state from
|
||||
(https://forums.atariage.com/topic/256802-two-questions-about-the-pia/):
|
||||
- the increment seem to be always set to 1024T (unless you just played
|
||||
a game and swap it with the testrom leaving the console unpowered for
|
||||
a very short time)
|
||||
- the actual timer value is random
|
||||
- the interrupt flag is also random
|
||||
|
||||
|
||||
The documentation for the 6532 "RIOT" chip calls it the "interrupt flag register."
|
||||
The VCS.H file calls it "TIMINT" (for "timer interrupt"). It's located at address
|
||||
$5 of the RIOT chip. On the Atari 2600, the RIOT chip addresses begin at address
|
||||
$280, so that means the TIMINT register is at address $285 (and its many mirrors).
|
||||
|
||||
This register holds two RIOT interrupt flags-- the timer interrupt flag (bit 7)
|
||||
and the PA7 edge-detect interrupt flag (bit 6). These flags will trigger IRQ
|
||||
interrupts, but they have no "real" effect on an Atari 2600, because the Atari
|
||||
2600 uses a 6507 CPU, and the 6507 chip doesn't have an IRQ line, therefore the
|
||||
Atari 2600 doesn't have IRQ interrupts.
|
||||
|
||||
I don't know if the PA7 edge-detect interrupt flag has any significance for
|
||||
Atari 2600 programming, so I won't try to explain it. But the timer interrupt
|
||||
flag can be used to tell if the timer has counted down past 0.
|
||||
|
||||
Whenever you set the interval timer by writing a value to TIM1T, TIM8T, TIM64T,
|
||||
or T1024T, the timer interrupt flag will be cleared automatically. The timer
|
||||
then counts down to 0, starting from the value you've set it to. The first
|
||||
decrement occurs right after you set the timer (i.e., 1 cycle later), but the
|
||||
subsequent decrements occur at the interval you've selected (i.e., after every
|
||||
1 cycle, 8 cycles, 64 cycles, or 1024 cycles). When the timer reaches 0, it
|
||||
will stay 0 for the indicated interval, and will then wrap around to 255. The
|
||||
moment it wraps around from 0 to 255, the timer interrupt flag will be set.
|
||||
Once the timer has wrapped around and the timer interrupt flag has been set,
|
||||
the timer will decrement every 1 cycle.
|
||||
|
||||
Whenever you read the timer or the timer interrupt flag, the timer interrupt
|
||||
flag will be cleared. However, the flag will *not* be cleared if you read it
|
||||
(or the timer) at the same moment that the flag is set.
|
||||
|
||||
Anyway, let's suppose you write a value of 5 to TIM8T, which will cause the
|
||||
timer to count down from 5 to 0 at an interval of 8 cycles. The timer and the
|
||||
timer interrupt flag will contain the following values:
|
||||
|
||||
Instruction: | Cycle: | Timer: | Flag:
|
||||
-------------|------------|--------------|-------------
|
||||
LDA #5 | 00, 01 | ???, ??? | ???, ???
|
||||
STA TIM8T | 02, ... 05 | ???, ... 005 | ???, ... 000
|
||||
| 06, ... 13 | 004, ... 004 | 000, ... 000
|
||||
| 14, ... 21 | 003, ... 003 | 000, ... 000
|
||||
| 22, ... 29 | 002, ... 002 | 000, ... 000
|
||||
| 30, ... 37 | 001, ... 001 | 000, ... 000
|
||||
| 38, ... 45 | 000, ... 000 | 000, ... 000
|
||||
| 46 | 255 | 128
|
||||
| 47 | 254 | 128
|
||||
| 48 | 253 | 128
|
||||
| etc. | etc. | etc.
|
||||
|
||||
In other words, "LDA #5" takes 2 cycles, and we don't know what the timer or
|
||||
the flag are set to. "STA TIM8T" takes 4 cycles. On the last cycle of that
|
||||
instruction, the timer will be set to 5, and the flag will be cleared. On the
|
||||
very next cycle, the timer will decrement from 5 to 4, but the flag will still
|
||||
be 0. The timer will stay at 4 for 8 cycles, then it will decrement to 3 and
|
||||
stay at 3 for 8 cycles, etc. When the timer reaches 0, it will stay at 0 for
|
||||
8 cycles.
|
||||
|
||||
Then the timer will decrement from 0 to 255, and the flag will be set. The
|
||||
timer flag is bit 7, so it has a value of 128. The timer will continue
|
||||
decrementing, but it will decrement once each cycle, rather than every 8 cycles
|
||||
as before.
|
||||
|
||||
One way to check when the timer has finished counting down is to read the timer
|
||||
(or INTIM), which tells us what value is in the timer at that moment. We could
|
||||
then test the value of the timer to see if it's equal to 0, not equal to 0,
|
||||
plus/positive (0 to 127), or minus/negative (128 to 255). But that method can
|
||||
present problems, depending on what value we set the timer to, and how we're
|
||||
testing its value. For example, if you set the timer to 255, and then test
|
||||
whether its value is minus, then it will be minus right away. Or if you set the
|
||||
timer to 64, and then test whether its value is plus, then it will be plus
|
||||
right away. A more generic test would be to see if its 0 yet-- but that would
|
||||
mean you aren't waiting until it's counted *past* 0.
|
||||
|
||||
Another way to check when the timer has finished counting down is to read the
|
||||
timer flag (or TIMINT). As long as TIMINT is still 0, the timer hasn't finished
|
||||
counting down yet. But if TIMINT is 128, then the timer has finished counting
|
||||
down. If you aren't worried about the PA7 edge-detect interrupt flag (bit 6 of
|
||||
TIMINT), then you can just use "not equal 0."
|
||||
|
||||
So let's say you want to wait for 20 scan lines before doing something. A scan
|
||||
line is 76 cycles long, so 20 scan lines would be 1520 cycles. Dividing that by
|
||||
64, we get 23.75. So we could do the following:
|
||||
|
||||
LDA #23
|
||||
STA TIM64T
|
||||
; do some stuff here, then start checking the timer flag
|
||||
LOOP
|
||||
LDA TIMINT
|
||||
BEQ LOOP; this will keep looping as long as the flag isn't set yet
|
||||
STA WSYNC; finish off the scan line so we resume at the beginning of a scan line
|
||||
; now we've waited 20 scan lines
|
||||
|
||||
Note that it takes time to set the timer, and it takes time to read the timer,
|
||||
so that needs to be factored into the amount of time we set the timer for. You
|
||||
might need to adjust the number you set the timer to in order to get the desired
|
||||
result. For example, we might need to use "LDA #22" instead of "LDA #23."
|
||||
@@ -0,0 +1,140 @@
|
||||
--------------------------------
|
||||
RIOT Addresses: names taken from
|
||||
Atari VCS Stella Documentation
|
||||
--------------------------------
|
||||
$0280 = (RIOT $00) - SWCHA (read/write)
|
||||
$0281 = (RIOT $01) - SWACNT (read/write)
|
||||
$0282 = (RIOT $02) - SWCHB (read/write) (*)
|
||||
$0283 = (RIOT $03) - SWBCNT (read/write) (*)
|
||||
$0284 = (RIOT $04) - INTIM (read), edge detect control (write)
|
||||
$0285 = (RIOT $05) - read interrupt flag (read), edge detect control (write)
|
||||
$0286 = (RIOT $06) - INTIM (read), edge detect control (write)
|
||||
$0287 = (RIOT $07) - read interrupt flag (read), edge detect control (write)
|
||||
$0288 = (RIOT $08) - SWCHA (read/write)
|
||||
$0289 = (RIOT $09) - SWACNT (read/write)
|
||||
$028A = (RIOT $0A) - SWCHB (read/write) (*)
|
||||
$028B = (RIOT $0B) - SWBCNT (read/write) (*)
|
||||
$028C = (RIOT $0C) - INTIM (read) , edge detect control (write)
|
||||
$028D = (RIOT $0D) - read interrupt flag (read), edge detect control (write)
|
||||
$028E = (RIOT $0E) - INTIM (read) , edge detect control (write)
|
||||
$028F = (RIOT $0F) - read interrupt flag (read), edge detect control (write)
|
||||
$0290 = (RIOT $10) - SWCHA (read/write)
|
||||
$0291 = (RIOT $11) - SWACNT (read/write)
|
||||
$0292 = (RIOT $12) - SWCHB (read/write) (*)
|
||||
$0293 = (RIOT $13) - SWBCNT (read/write) (*)
|
||||
$0294 = (RIOT $14) - INTIM (read), TIM1T (write)
|
||||
$0295 = (RIOT $15) - read interrupt flag (read), TIM8T (write)
|
||||
$0296 = (RIOT $16) - INTIM (read), TIM64T (write)
|
||||
$0297 = (RIOT $17) - read interrupt flag (read), TIM1024T (write)
|
||||
$0298 = (RIOT $18) - SWCHA (read/write)
|
||||
$0299 = (RIOT $19) - SWACNT (read/write)
|
||||
$029A = (RIOT $1A) - SWCHB (read/write) (*)
|
||||
$029B = (RIOT $1B) - SWBCNT (read/write) (*)
|
||||
$029C = (RIOT $1C) - INTIM (read), TIM1T (write)
|
||||
$029D = (RIOT $1D) - read interrupt flag (read), TIM8T (write)
|
||||
$029E = (RIOT $1E) - INTIM (read), TIM64T (write)
|
||||
$029F = (RIOT $1F) - read interrupt flag (read), TIM1024T (write)
|
||||
|
||||
(*) The Stella documentation states that Port B is hardwired for input
|
||||
only. In reality, Port B is fully configurable. Configuring Port B
|
||||
as an output, however, will cause direct hardware conflicts with the
|
||||
console switches. DO NOT ATTEMPT THIS.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
**********************
|
||||
* RIOT Documentation *
|
||||
**********************
|
||||
|
||||
---------------------------------------
|
||||
RIOT Addressing Notes for the Atari VCS
|
||||
---------------------------------------
|
||||
A12 is connected to /CS2 (Chip Select 2 - active low)
|
||||
A7 is connected to CS1 (Chip Select 1 - active high)
|
||||
A9 is connected to /RS (RAM Select - active low)
|
||||
A11, A10, and A8 are not connected to the RIOT
|
||||
|
||||
-------------------------------------
|
||||
$0080 - $00FF = RIOT RAM (read/write)
|
||||
-------------------------------------
|
||||
$0080 - $00FF = RIOT RAM, Addresses $00-$7F
|
||||
|
||||
---------------------------------------------
|
||||
$0280 - $029F = RIOT Read Addresses (not RAM)
|
||||
---------------------------------------------
|
||||
$0280 = (RIOT $00) - Read DRA
|
||||
$0281 = (RIOT $01) - Read DDRA
|
||||
$0282 = (RIOT $02) - Read DRB
|
||||
$0283 = (RIOT $03) - Read DDRB
|
||||
$0284 = (RIOT $04) - Read timer, disable interrupt (2)
|
||||
$0285 = (RIOT $05) - Read interrupt flag
|
||||
$0286 = (RIOT $06) - Read timer, disable interrupt (2)
|
||||
$0287 = (RIOT $07) - Read interrupt flag
|
||||
$0288 = (RIOT $08) - Read DRA
|
||||
$0289 = (RIOT $09) - Read DDRA
|
||||
$028A = (RIOT $0A) - Read DRB
|
||||
$028B = (RIOT $0B) - Read DDRB
|
||||
$028C = (RIOT $0C) - Read timer, enable interrupt (2)
|
||||
$028D = (RIOT $0D) - Read interrupt flag
|
||||
$028E = (RIOT $0E) - Read timer, enable interrupt (2)
|
||||
$028F = (RIOT $0F) - Read interrupt flag
|
||||
$0290 = (RIOT $10) - Read DRA
|
||||
$0291 = (RIOT $11) - Read DDRA
|
||||
$0292 = (RIOT $12) - Read DRB
|
||||
$0293 = (RIOT $13) - Read DDRB
|
||||
$0294 = (RIOT $14) - Read timer, disable interrupt (2)
|
||||
$0295 = (RIOT $15) - Read interrupt flag
|
||||
$0296 = (RIOT $16) - Read timer, disable interrupt (2)
|
||||
$0297 = (RIOT $17) - Read interrupt flag
|
||||
$0298 = (RIOT $18) - Read DRA
|
||||
$0299 = (RIOT $19) - Read DDRA
|
||||
$029A = (RIOT $1A) - Read DRB
|
||||
$029B = (RIOT $1B) - Read DDRB
|
||||
$029C = (RIOT $1C) - Read timer, enable interrupt (2)
|
||||
$029D = (RIOT $1D) - Read interrupt flag
|
||||
$029E = (RIOT $1E) - Read timer, enable interrupt (2)
|
||||
$029F = (RIOT $1F) - Read interrupt flag
|
||||
|
||||
----------------------------------------------
|
||||
$0280 - $029F = RIOT Write Addresses (not RAM)
|
||||
----------------------------------------------
|
||||
$0280 = (RIOT $00) - Write DRA
|
||||
$0281 = (RIOT $01) - Write DDRA
|
||||
$0282 = (RIOT $02) - Write DRB
|
||||
$0283 = (RIOT $03) - Write DDRB
|
||||
$0284 = (RIOT $04) - Write edge detect control - negative edge, disable int (1)
|
||||
$0285 = (RIOT $05) - Write edge detect control - positive edge, disable int (1)
|
||||
$0286 = (RIOT $06) - Write edge detect control - negative edge, enable int (1)
|
||||
$0287 = (RIOT $07) - Write edge detect control - positive edge, enable int (1)
|
||||
$0288 = (RIOT $08) - Write DRA
|
||||
$0289 = (RIOT $09) - Write DDRA
|
||||
$028A = (RIOT $0A) - Write DRB
|
||||
$028B = (RIOT $0B) - Write DDRB
|
||||
$028C = (RIOT $0C) - Write edge detect control - negative edge, disable int (1)
|
||||
$028D = (RIOT $0D) - Write edge detect control - positive edge, disable int (1)
|
||||
$028E = (RIOT $0E) - Write edge detect control - negative edge, enable int (1)
|
||||
$028F = (RIOT $0F) - Write edge detect control - positive edge, enable int (1)
|
||||
$0290 = (RIOT $10) - Write DRA
|
||||
$0291 = (RIOT $11) - Write DDRA
|
||||
$0292 = (RIOT $12) - Write DRB
|
||||
$0293 = (RIOT $13) - Write DDRB
|
||||
$0294 = (RIOT $14) - Write timer (div by 1) - disable int (2)
|
||||
$0295 = (RIOT $15) - Write timer (div by 8) - disable int (2)
|
||||
$0296 = (RIOT $16) - Write timer (div by 64) - disable int (2)
|
||||
$0297 = (RIOT $17) - Write timer (div by 1024) - disable int (2)
|
||||
$0298 = (RIOT $18) - Write DRA
|
||||
$0299 = (RIOT $19) - Write DDRA
|
||||
$029A = (RIOT $1A) - Write DRB
|
||||
$029B = (RIOT $1B) - Write DDRB
|
||||
$029C = (RIOT $1C) - Write timer (div by 1) - enable int (2)
|
||||
$029D = (RIOT $1D) - Write timer (div by 8) - enable int (2)
|
||||
$029E = (RIOT $1E) - Write timer (div by 64) - enable int (2)
|
||||
$029F = (RIOT $1F) - Write timer (div by 1024) - enable int (2)
|
||||
|
||||
(1) A0 = 0 for negative edge detect
|
||||
A0 = 1 for positive edge detect
|
||||
A1 = 0 to disable interrupt from PA7 to /IRQ
|
||||
A1 = 1 to enable interrupt from PA7 to /IRQ
|
||||
|
||||
(2) A3 = 0 to disable interrupt from timer to /IRQ
|
||||
A3 = 1 to enable interrupt from timer to /IRQ
|
||||
@@ -0,0 +1,81 @@
|
||||
*********************
|
||||
* TIA Documentation *
|
||||
*********************
|
||||
|
||||
--------------------------------------
|
||||
TIA Addressing Notes for the Atari VCS
|
||||
--------------------------------------
|
||||
A12 is connected to /CS0 (Chip Select 0 - active low)
|
||||
A7 is connected to /CS3 (Chip Select 3 - active low)
|
||||
A[11:8] and A6 are not connected to the TIA
|
||||
|
||||
VCC is connected to CS1 (Chip Select 1 - active high)
|
||||
GND is connected to /CS2 (Chip Select 2 - active low)
|
||||
|
||||
--------------------------------------------
|
||||
$0000 - $003F = TIA.......(write)......(read)
|
||||
--------------------------------------------
|
||||
$0000 = TIA Address $00 - (VSYNC)......(CXM0P)
|
||||
$0001 = TIA Address $01 - (VBLANK).....(CXM1P)
|
||||
$0002 = TIA Address $02 - (WSYNC)......(CXP0FB)
|
||||
$0003 = TIA Address $03 - (RSYNC)......(CXP1FB)
|
||||
$0004 = TIA Address $04 - (NUSIZ0).....(CXM0FB)
|
||||
$0005 = TIA Address $05 - (NUSIZ1).....(CXM1FB)
|
||||
$0006 = TIA Address $06 - (COLUP0).....(CXBLPF)
|
||||
$0007 = TIA Address $07 - (COLUP1).....(CXPPMM)
|
||||
$0008 = TIA Address $08 - (COLUPF).....(INPT0)
|
||||
$0009 = TIA Address $09 - (COLUBK).....(INPT1)
|
||||
$000A = TIA Address $0A - (CTRLPF).....(INPT2)
|
||||
$000B = TIA Address $0B - (REFP0)......(INPT3)
|
||||
$000C = TIA Address $0C - (REFP1)......(INPT4)
|
||||
$000D = TIA Address $0D - (PF0)........(INPT5)
|
||||
$000E = TIA Address $0E - (PF1)........(UNDEFINED)
|
||||
$000F = TIA Address $0F - (PF2)........(UNDEFINED)
|
||||
$0010 = TIA Address $10 - (RESP0)......(CXM0P)
|
||||
$0011 = TIA Address $11 - (RESP1)......(CXM1P)
|
||||
$0012 = TIA Address $12 - (RESM0)......(CXP0FB)
|
||||
$0013 = TIA Address $13 - (RESM1)......(CXP1FB)
|
||||
$0014 = TIA Address $14 - (RESBL)......(CXM0FB)
|
||||
$0015 = TIA Address $15 - (AUDC0)......(CXM1FB)
|
||||
$0016 = TIA Address $16 - (AUDC1)......(CXBLPF)
|
||||
$0017 = TIA Address $17 - (AUDF0)......(CXPPMM)
|
||||
$0018 = TIA Address $18 - (AUDF1)......(INPT0)
|
||||
$0019 = TIA Address $19 - (AUDV0)......(INPT1)
|
||||
$001A = TIA Address $1A - (AUDV1)......(INPT2)
|
||||
$001B = TIA Address $1B - (GRP0).......(INPT3)
|
||||
$001C = TIA Address $1C - (GRP1).......(INPT4)
|
||||
$001D = TIA Address $1D - (ENAM0)......(INPT5)
|
||||
$001E = TIA Address $1E - (ENAM1)......(UNDEFINED)
|
||||
$001F = TIA Address $1F - (ENABL)......(UNDEFINED)
|
||||
$0020 = TIA Address $20 - (HMP0).......(CXM0P)
|
||||
$0021 = TIA Address $21 - (HMP1).......(CXM1P)
|
||||
$0022 = TIA Address $22 - (HMM0).......(CXP0FB)
|
||||
$0023 = TIA Address $23 - (HMM1).......(CXP1FB)
|
||||
$0024 = TIA Address $24 - (HMBL).......(CXM0FB)
|
||||
$0025 = TIA Address $25 - (VDELP0).....(CXM1FB)
|
||||
$0026 = TIA Address $26 - (VDELP1).....(CXBLPF)
|
||||
$0027 = TIA Address $27 - (VDELBL).....(CXPPMM)
|
||||
$0028 = TIA Address $28 - (RESMP0).....(INPT0)
|
||||
$0029 = TIA Address $29 - (RESMP1).....(INPT1)
|
||||
$002A = TIA Address $2A - (HMOVE)......(INPT2)
|
||||
$002B = TIA Address $2B - (HMCLR)......(INPT3)
|
||||
$002C = TIA Address $2C - (CXCLR)......(INPT4)
|
||||
$002D = TIA Address $2D - (UNDEFINED)..(INPT5)
|
||||
$002E = TIA Address $2E - (UNDEFINED)..(UNDEFINED)
|
||||
$002F = TIA Address $2F - (UNDEFINED)..(UNDEFINED)
|
||||
$0030 = TIA Address $30 - (UNDEFINED)..(CXM0P)
|
||||
$0031 = TIA Address $31 - (UNDEFINED)..(CXM1P)
|
||||
$0032 = TIA Address $32 - (UNDEFINED)..(CXP0FB)
|
||||
$0033 = TIA Address $33 - (UNDEFINED)..(CXP1FB)
|
||||
$0034 = TIA Address $34 - (UNDEFINED)..(CXM0FB)
|
||||
$0035 = TIA Address $35 - (UNDEFINED)..(CXM1FB)
|
||||
$0036 = TIA Address $36 - (UNDEFINED)..(CXBLPF)
|
||||
$0037 = TIA Address $37 - (UNDEFINED)..(CXPPMM)
|
||||
$0038 = TIA Address $38 - (UNDEFINED)..(INPT0)
|
||||
$0039 = TIA Address $39 - (UNDEFINED)..(INPT1)
|
||||
$003A = TIA Address $3A - (UNDEFINED)..(INPT2)
|
||||
$003B = TIA Address $3B - (UNDEFINED)..(INPT3)
|
||||
$003C = TIA Address $3C - (UNDEFINED)..(INPT4)
|
||||
$003D = TIA Address $3D - (UNDEFINED)..(INPT5)
|
||||
$003E = TIA Address $3E - (UNDEFINED)..(UNDEFINED)
|
||||
$003F = TIA Address $3F - (UNDEFINED)..(UNDEFINED)
|
||||
@@ -0,0 +1,31 @@
|
||||
#include "mem.h"
|
||||
#include "rom.h"
|
||||
#include "tia.h"
|
||||
#include "pia.h"
|
||||
|
||||
namespace mem
|
||||
{
|
||||
void reset()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint8_t read(uint16_t address)
|
||||
{
|
||||
address &= 0x1fff;
|
||||
|
||||
if (address & 0x1000) return rom::read(address);
|
||||
if (address & 0x0080) return pia::read(address);
|
||||
return tia::read(address);
|
||||
}
|
||||
|
||||
void write(uint16_t address, uint8_t value)
|
||||
{
|
||||
address &= 0x1fff;
|
||||
|
||||
if (address & 0x1000) { rom::write(address, value); return; }
|
||||
if (address & 0x0080) { pia::write(address, value); return; }
|
||||
tia::write(address, value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
|
||||
namespace mem
|
||||
{
|
||||
void reset();
|
||||
uint8_t read(uint16_t address);
|
||||
void write(uint16_t address, uint8_t value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
#include "pia.h"
|
||||
|
||||
namespace pia
|
||||
{
|
||||
uint8_t ram[128];
|
||||
uint8_t INTIM;
|
||||
uint8_t TIMINT;
|
||||
|
||||
void reset()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void tick()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint8_t read(uint16_t address)
|
||||
{
|
||||
if (address & 0x200) {
|
||||
if ( (address & 0x04) ) {
|
||||
// Timer functions
|
||||
if (address & 0x01) {
|
||||
uint8_t flags = TIMINT;
|
||||
TIMINT &= ~0x80; // resetejem el flag
|
||||
return flags;
|
||||
} else {
|
||||
return INTIM;
|
||||
}
|
||||
} else {
|
||||
// I/O Ports
|
||||
switch( address & 0x03) {
|
||||
case 0x00: // [TODO] SWCHA
|
||||
case 0x01: // [TODO] DDRA
|
||||
case 0x02: // [TODO] SWCHB
|
||||
case 0x03: // [TODO] DDRB
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return ram[address & 0x7f];
|
||||
}
|
||||
}
|
||||
|
||||
void write(uint16_t address, uint8_t value)
|
||||
{
|
||||
if (address & 0x200) {
|
||||
if ( (address & 0x04) ) {
|
||||
if ( (address & 0x10) ) {
|
||||
// Timer functions
|
||||
switch( address & 0x03) {
|
||||
case 0x00: // [TODO] TIM1T
|
||||
case 0x01: // [TODO] TIM8T
|
||||
case 0x02: // [TODO] TIM64T
|
||||
case 0x03: // [TODO] TIM1024T
|
||||
}
|
||||
} else {
|
||||
// Funcionalitat relacionada amb les interrupcions. Ignorar per a la Atari 2600
|
||||
}
|
||||
} else {
|
||||
// I/O Ports
|
||||
switch( address & 0x03) {
|
||||
case 0x00: // [TODO] SWCHA
|
||||
case 0x01: // [TODO] DDRA
|
||||
case 0x02: // [TODO] SWCHB
|
||||
case 0x03: // [TODO] DDRB
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ram[address & 0x7f] = value;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
|
||||
namespace pia
|
||||
{
|
||||
void reset();
|
||||
void tick();
|
||||
uint8_t read(uint16_t address);
|
||||
void write(uint16_t address, uint8_t value);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#include "rom.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
namespace rom
|
||||
{
|
||||
uint8_t *data = NULL;
|
||||
int size = 0;
|
||||
uint16_t mask = 0xffff;
|
||||
|
||||
void load(const char* filename)
|
||||
{
|
||||
if (data) free(data);
|
||||
size = 0;
|
||||
|
||||
FILE* f = fopen(filename, "rb");
|
||||
if (f) {
|
||||
fseek(f, 0, SEEK_END);
|
||||
size = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
data = (uint8_t*)malloc(size);
|
||||
fread(data, size, 1, f);
|
||||
fclose(f);
|
||||
|
||||
if (size <= 4096) mask = size-1;
|
||||
// [TODO] Gestionar ROMs mes grans de 4K
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t read(uint16_t address)
|
||||
{
|
||||
return data[address & mask];
|
||||
}
|
||||
|
||||
void write(uint16_t address, uint8_t value)
|
||||
{
|
||||
data[address & mask] = value;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
|
||||
namespace rom
|
||||
{
|
||||
void load(const char* filename);
|
||||
uint8_t read(uint16_t address);
|
||||
void write(uint16_t address, uint8_t value);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
#include "tia.h"
|
||||
|
||||
namespace tia
|
||||
{
|
||||
void reset()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void tick()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint8_t read(uint16_t address)
|
||||
{
|
||||
address &= 0x0f;
|
||||
|
||||
// [TODO] Procesar segons l'adreça resultant
|
||||
}
|
||||
|
||||
void write(uint16_t address, uint8_t value)
|
||||
{
|
||||
address &= 0x3f;
|
||||
if (address >= 0x2d) address -= 0x20;
|
||||
|
||||
// [TODO] Procesar segons l'adreça resultant
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user