|
| 1 | +; VCS.H |
| 2 | +; Version 1.05, 13/November/2003 |
| 3 | + |
| 4 | +VERSION_VCS = 105 |
| 5 | + |
| 6 | +; THIS IS A PRELIMINARY RELEASE OF *THE* "STANDARD" VCS.H |
| 7 | +; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE |
| 8 | +; PLEASE DO *NOT* REDISTRIBUTE THIS FILE! |
| 9 | +; |
| 10 | +; This file defines hardware registers and memory mapping for the |
| 11 | +; Atari 2600. It is distributed as a companion machine-specific support package |
| 12 | +; for the DASM compiler. Updates to this file, DASM, and associated tools are |
| 13 | +; available at at http://www.atari2600.org/dasm |
| 14 | +; |
| 15 | +; Many thanks to the original author(s) of this file, and to everyone who has |
| 16 | +; contributed to understanding the Atari 2600. If you take issue with the |
| 17 | +; contents, or naming of registers, please write to me (atari2600@taswegian.com) |
| 18 | +; with your views. Please contribute, if you think you can improve this |
| 19 | +; file! |
| 20 | +; |
| 21 | +; Latest Revisions... |
| 22 | +; 1.05 13/NOV/2003 - Correction to 1.04 - now functions as requested by MR. |
| 23 | +; - Added VERSION_VCS equate (which will reflect 100x version #) |
| 24 | +; This will allow conditional code to verify VCS.H being |
| 25 | +; used for code assembly. |
| 26 | +; 1.04 12/NOV/2003 Added TIA_BASE_WRITE_ADDRESS and TIA_BASE_READ_ADDRESS for |
| 27 | +; convenient disassembly/reassembly compatibility for hardware |
| 28 | +; mirrored reading/writing differences. This is more a |
| 29 | +; readability issue, and binary compatibility with disassembled |
| 30 | +; and reassembled sources. Per Manuel Rotschkar's suggestion. |
| 31 | +; 1.03 12/MAY/2003 Added SEG segment at end of file to fix old-code compatibility |
| 32 | +; which was broken by the use of segments in this file, as |
| 33 | +; reported by Manuel Polik on [stella] 11/MAY/2003 |
| 34 | +; 1.02 22/MAR/2003 Added TIMINT($285) |
| 35 | +; 1.01 Constant offset added to allow use for 3F-style bankswitching |
| 36 | +; - define TIA_BASE_ADDRESS as $40 for Tigervision carts, otherwise |
| 37 | +; it is safe to leave it undefined, and the base address will |
| 38 | +; be set to 0. Thanks to Eckhard Stolberg for the suggestion. |
| 39 | +; Note, may use -DLABEL=EXPRESSION to define TIA_BASE_ADDRESS |
| 40 | +; - register definitions are now generated through assignment |
| 41 | +; in uninitialised segments. This allows a changeable base |
| 42 | +; address architecture. |
| 43 | +; 1.0 22/MAR/2003 Initial release |
| 44 | + |
| 45 | + |
| 46 | +;------------------------------------------------------------------------------- |
| 47 | + |
| 48 | +; TIA_BASE_ADDRESS |
| 49 | +; The TIA_BASE_ADDRESS defines the base address of access to TIA registers. |
| 50 | +; Normally 0, the base address should (externally, before including this file) |
| 51 | +; be set to $40 when creating 3F-bankswitched (and other?) cartridges. |
| 52 | +; The reason is that this bankswitching scheme treats any access to locations |
| 53 | +; < $40 as a bankswitch. |
| 54 | + |
| 55 | + IFNCONST TIA_BASE_ADDRESS |
| 56 | +TIA_BASE_ADDRESS = 0 |
| 57 | + ENDIF |
| 58 | + |
| 59 | +; Note: The address may be defined on the command-line using the -D switch, eg: |
| 60 | +; dasm.exe code.asm -DTIA_BASE_ADDRESS=$40 -f3 -v5 -ocode.bin |
| 61 | +; *OR* by declaring the label before including this file, eg: |
| 62 | +; TIA_BASE_ADDRESS = $40 |
| 63 | +; include "vcs.h" |
| 64 | + |
| 65 | +; Alternate read/write address capability - allows for some disassembly compatibility |
| 66 | +; usage ; to allow reassembly to binary perfect copies). This is essentially catering |
| 67 | +; for the mirrored ROM hardware registers. |
| 68 | + |
| 69 | +; Usage: As per above, define the TIA_BASE_READ_ADDRESS and/or TIA_BASE_WRITE_ADDRESS |
| 70 | +; using the -D command-line switch, as required. If the addresses are not defined, |
| 71 | +; they defaut to the TIA_BASE_ADDRESS. |
| 72 | + |
| 73 | + IFNCONST TIA_BASE_READ_ADDRESS |
| 74 | +TIA_BASE_READ_ADDRESS = TIA_BASE_ADDRESS |
| 75 | + ENDIF |
| 76 | + |
| 77 | + IFNCONST TIA_BASE_WRITE_ADDRESS |
| 78 | +TIA_BASE_WRITE_ADDRESS = TIA_BASE_ADDRESS |
| 79 | + ENDIF |
| 80 | + |
| 81 | +;------------------------------------------------------------------------------- |
| 82 | + |
| 83 | + SEG.U TIA_REGISTERS_WRITE |
| 84 | + ORG TIA_BASE_WRITE_ADDRESS |
| 85 | + |
| 86 | + ; DO NOT CHANGE THE RELATIVE ORDERING OF REGISTERS! |
| 87 | + |
| 88 | +VSYNC ds 1 ; $00 0000 00x0 Vertical Sync Set-Clear |
| 89 | +VBLANK ds 1 ; $01 xx00 00x0 Vertical Blank Set-Clear |
| 90 | +WSYNC ds 1 ; $02 ---- ---- Wait for Horizontal Blank |
| 91 | +RSYNC ds 1 ; $03 ---- ---- Reset Horizontal Sync Counter |
| 92 | +NUSIZ0 ds 1 ; $04 00xx 0xxx Number-Size player/missle 0 |
| 93 | +NUSIZ1 ds 1 ; $05 00xx 0xxx Number-Size player/missle 1 |
| 94 | +COLUP0 ds 1 ; $06 xxxx xxx0 Color-Luminance Player 0 |
| 95 | +COLUP1 ds 1 ; $07 xxxx xxx0 Color-Luminance Player 1 |
| 96 | +COLUPF ds 1 ; $08 xxxx xxx0 Color-Luminance Playfield |
| 97 | +COLUBK ds 1 ; $09 xxxx xxx0 Color-Luminance Background |
| 98 | +CTRLPF ds 1 ; $0A 00xx 0xxx Control Playfield, Ball, Collisions |
| 99 | +REFP0 ds 1 ; $0B 0000 x000 Reflection Player 0 |
| 100 | +REFP1 ds 1 ; $0C 0000 x000 Reflection Player 1 |
| 101 | +PF0 ds 1 ; $0D xxxx 0000 Playfield Register Byte 0 |
| 102 | +PF1 ds 1 ; $0E xxxx xxxx Playfield Register Byte 1 |
| 103 | +PF2 ds 1 ; $0F xxxx xxxx Playfield Register Byte 2 |
| 104 | +RESP0 ds 1 ; $10 ---- ---- Reset Player 0 |
| 105 | +RESP1 ds 1 ; $11 ---- ---- Reset Player 1 |
| 106 | +RESM0 ds 1 ; $12 ---- ---- Reset Missle 0 |
| 107 | +RESM1 ds 1 ; $13 ---- ---- Reset Missle 1 |
| 108 | +RESBL ds 1 ; $14 ---- ---- Reset Ball |
| 109 | +AUDC0 ds 1 ; $15 0000 xxxx Audio Control 0 |
| 110 | +AUDC1 ds 1 ; $16 0000 xxxx Audio Control 1 |
| 111 | +AUDF0 ds 1 ; $17 000x xxxx Audio Frequency 0 |
| 112 | +AUDF1 ds 1 ; $18 000x xxxx Audio Frequency 1 |
| 113 | +AUDV0 ds 1 ; $19 0000 xxxx Audio Volume 0 |
| 114 | +AUDV1 ds 1 ; $1A 0000 xxxx Audio Volume 1 |
| 115 | +GRP0 ds 1 ; $1B xxxx xxxx Graphics Register Player 0 |
| 116 | +GRP1 ds 1 ; $1C xxxx xxxx Graphics Register Player 1 |
| 117 | +ENAM0 ds 1 ; $1D 0000 00x0 Graphics Enable Missle 0 |
| 118 | +ENAM1 ds 1 ; $1E 0000 00x0 Graphics Enable Missle 1 |
| 119 | +ENABL ds 1 ; $1F 0000 00x0 Graphics Enable Ball |
| 120 | +HMP0 ds 1 ; $20 xxxx 0000 Horizontal Motion Player 0 |
| 121 | +HMP1 ds 1 ; $21 xxxx 0000 Horizontal Motion Player 1 |
| 122 | +HMM0 ds 1 ; $22 xxxx 0000 Horizontal Motion Missle 0 |
| 123 | +HMM1 ds 1 ; $23 xxxx 0000 Horizontal Motion Missle 1 |
| 124 | +HMBL ds 1 ; $24 xxxx 0000 Horizontal Motion Ball |
| 125 | +VDELP0 ds 1 ; $25 0000 000x Vertical Delay Player 0 |
| 126 | +VDELP1 ds 1 ; $26 0000 000x Vertical Delay Player 1 |
| 127 | +VDELBL ds 1 ; $27 0000 000x Vertical Delay Ball |
| 128 | +RESMP0 ds 1 ; $28 0000 00x0 Reset Missle 0 to Player 0 |
| 129 | +RESMP1 ds 1 ; $29 0000 00x0 Reset Missle 1 to Player 1 |
| 130 | +HMOVE ds 1 ; $2A ---- ---- Apply Horizontal Motion |
| 131 | +HMCLR ds 1 ; $2B ---- ---- Clear Horizontal Move Registers |
| 132 | +CXCLR ds 1 ; $2C ---- ---- Clear Collision Latches |
| 133 | + |
| 134 | +;------------------------------------------------------------------------------- |
| 135 | + |
| 136 | + SEG.U TIA_REGISTERS_READ |
| 137 | + ORG TIA_BASE_READ_ADDRESS |
| 138 | + |
| 139 | + ; bit 7 bit 6 |
| 140 | +CXM0P ds 1 ; $00 xx00 0000 Read Collision M0-P1 M0-P0 |
| 141 | +CXM1P ds 1 ; $01 xx00 0000 M1-P0 M1-P1 |
| 142 | +CXP0FB ds 1 ; $02 xx00 0000 P0-PF P0-BL |
| 143 | +CXP1FB ds 1 ; $03 xx00 0000 P1-PF P1-BL |
| 144 | +CXM0FB ds 1 ; $04 xx00 0000 M0-PF M0-BL |
| 145 | +CXM1FB ds 1 ; $05 xx00 0000 M1-PF M1-BL |
| 146 | +CXBLPF ds 1 ; $06 x000 0000 BL-PF ----- |
| 147 | +CXPPMM ds 1 ; $07 xx00 0000 P0-P1 M0-M1 |
| 148 | +INPT0 ds 1 ; $08 x000 0000 Read Pot Port 0 |
| 149 | +INPT1 ds 1 ; $09 x000 0000 Read Pot Port 1 |
| 150 | +INPT2 ds 1 ; $0A x000 0000 Read Pot Port 2 |
| 151 | +INPT3 ds 1 ; $0B x000 0000 Read Pot Port 3 |
| 152 | +INPT4 ds 1 ; $0C x000 0000 Read Input (Trigger) 0 |
| 153 | +INPT5 ds 1 ; $0D x000 0000 Read Input (Trigger) 1 |
| 154 | + |
| 155 | +;------------------------------------------------------------------------------- |
| 156 | + |
| 157 | + SEG.U RIOT |
| 158 | + ORG $280 |
| 159 | + |
| 160 | + ; RIOT MEMORY MAP |
| 161 | + |
| 162 | +SWCHA ds 1 ; $280 Port A data register for joysticks: |
| 163 | + ; Bits 4-7 for player 1. Bits 0-3 for player 2. |
| 164 | + |
| 165 | +SWACNT ds 1 ; $281 Port A data direction register (DDR) |
| 166 | +SWCHB ds 1 ; $282 Port B data (console switches) |
| 167 | +SWBCNT ds 1 ; $283 Port B DDR |
| 168 | +INTIM ds 1 ; $284 Timer output |
| 169 | + |
| 170 | +TIMINT ds 1 ; $285 |
| 171 | + |
| 172 | + ; Unused/undefined registers ($285-$294) |
| 173 | + |
| 174 | + ds 1 ; $286 |
| 175 | + ds 1 ; $287 |
| 176 | + ds 1 ; $288 |
| 177 | + ds 1 ; $289 |
| 178 | + ds 1 ; $28A |
| 179 | + ds 1 ; $28B |
| 180 | + ds 1 ; $28C |
| 181 | + ds 1 ; $28D |
| 182 | + ds 1 ; $28E |
| 183 | + ds 1 ; $28F |
| 184 | + ds 1 ; $290 |
| 185 | + ds 1 ; $291 |
| 186 | + ds 1 ; $292 |
| 187 | + ds 1 ; $293 |
| 188 | + |
| 189 | +TIM1T ds 1 ; $294 set 1 clock interval |
| 190 | +TIM8T ds 1 ; $295 set 8 clock interval |
| 191 | +TIM64T ds 1 ; $296 set 64 clock interval |
| 192 | +T1024T ds 1 ; $297 set 1024 clock interval |
| 193 | + |
| 194 | +;------------------------------------------------------------------------------- |
| 195 | +; The following required for back-compatibility with code which does not use |
| 196 | +; segments. |
| 197 | + |
| 198 | + SEG |
| 199 | + |
| 200 | +; EOF |
0 commit comments