- [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:
Raimon @ quifisraimon
2026-09-10 13:50:56 +02:00
parent 421826d4b6
commit 22fd027cff
18 changed files with 3768 additions and 1 deletions
BIN
View File
Binary file not shown.
File diff suppressed because it is too large Load Diff
+37
View File
@@ -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.
+1
View File
@@ -0,0 +1 @@
https://www.atarimania.com/machines/atari-2600/home
+584
View File
@@ -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)
+44
View File
@@ -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} *
* *
*****************************************
+239
View File
@@ -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.
+107
View File
@@ -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."
+140
View File
@@ -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
+81
View File
@@ -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)
+31
View File
@@ -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);
}
}
+2 -1
View File
@@ -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);
}
}
+74
View File
@@ -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;
}
}
}
+3
View File
@@ -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);
}
+40
View File
@@ -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;
}
}
+9
View File
@@ -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);
}
+30
View File
@@ -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
}
}
+3
View File
@@ -1,7 +1,10 @@
#pragma once
#include <stdint.h>
namespace tia
{
void reset();
void tick();
uint8_t read(uint16_t address);
void write(uint16_t address, uint8_t value);
}