; Register mnemonics for the Atari 2600 VCS
;
; Taken from the "Stella Programming Guide", at
; http://www.alienbill.com/2600/101/docs/stella.html

; Writable TIA addresses

.alias	VSYNC	$00	; vertical sync set-clear
.alias	VBLANK	$01	; vertical blank set-clear
.alias	WSYNC	$02	; wait for leading edge of horizontal blank
.alias	RSYNC	$03	; reset horizontal sync counter
.alias	NUSIZ0	$04	; number-size player-missile 0
.alias	NUSIZ1	$05	; number-size player-missile 1
.alias	COLUP0	$06	; color-lum player 0
.alias	COLUP1	$07	; color-lum player 1
.alias	COLUPF	$08	; color-lum playfield
.alias	COLUBK	$09	; color-lum background
.alias	CTRLPF	$0A	; control playfield ball size and collisions
.alias	REFP0	$0B	; reflect player 0
.alias	REFP1	$0C	; reflect player 1
.alias	PF0	$0D	; playfield register byte 0
.alias	PF1	$0E	; playfield register byte 1
.alias	PF2	$0F	; playfield register byte 2
.alias	RESP0	$10	; reset player 0
.alias	RESP1	$11	; reset player 1
.alias	RESM0	$12	; reset missile 0
.alias	RESM1	$13	; reset missile 1
.alias	RESBL	$14	; reset ball
.alias	AUDC0	$15	; audio control 0
.alias	AUDC1	$16	; audio control 1
.alias	AUDF0	$17	; audio frequency 0
.alias	AUDF1	$18	; audio frequency 1
.alias	AUDV0	$19	; audio volume 0
.alias	AUDV1	$1A	; audio volume 1
.alias	GRP0	$1B	; Graphics player 0
.alias	GRP1	$1C	; Graphics player 1
.alias	ENAM0	$1D	; Graphics enable missile 0
.alias	ENAM1	$1E	; Graphics enable missile 1
.alias	ENABL	$1F	; Graphics enable ball
.alias	HMP0	$20	; horizontal motion player 0
.alias	HMP1	$21	; horizontal motion player 1
.alias	HMM0	$22	; horizontal motion missile 0
.alias	HMM1	$23	; horizontal motion missile 1
.alias	HMBL	$24	; horizontal motion ball
.alias	VDELP0	$25	; vertical delay player 0
.alias	VDELP1	$26	; vertical delay player 1
.alias	VDELBL	$27	; vertical delay ball
.alias	RESMP0	$28	; reset missile 0 to player 0
.alias	RESMP1	$29	; reset missile 1 to player 1
.alias	HMOVE	$2A	; apply horizontal motion
.alias	HMCLR	$2B	; clear horizontal motion registers
.alias	CXCLR	$2C	; clear collision latches

; Readable TIA addresses

.alias	CXM0P	$00	; read collision missile 0 players
.alias	CXM1P	$01	; read collision missile 1 players
.alias	CXP0FB	$02	; read collision player 0 playfield/ball
.alias	CXP1FB	$03	; read collision player 1 playfield/ball
.alias	CXM0FB	$04	; read collision missile 0 playfield/ball
.alias	CXM1FB	$05	; read collision missile 1 playfield/ball
.alias	CXBLPF	$06	; read collision ball playfield
.alias	CXPPMM	$07	; read collision player/player missile/missile
.alias	INPT0	$08	; read pot port
.alias	INPT1	$09	; read pot port
.alias	INPT2	$0A	; read pot port
.alias	INPT3	$0B	; read pot port
.alias	INPT4	$0C	; read input
.alias	INPT5	$0D	; read input

; PIA addresses

.alias	SWCHA	$280	; Port A data register (read/write)
.alias	SWACNT	$281	; Port A data direction register (0=input, 1=output)
.alias	SWCHB	$282	; Port B - console switches (read-only)
.alias	SWBCNT	$283	; Port B data direction register (hardwired to 0)
.alias	INTIM	$284	; Timer output (read only)
.alias	TIM1T	$294	; Set 1-clock interval (838 nsec/interval)
.alias	TIM8T	$295	; Set 8-clock interval (6.7 usec/interval)
.alias	TIM64T	$296	; Set 64-clock interval (53.6 usec/interval
.alias	T1024T	$297	; Set 1025-clock interval (858.2 usec/interval)

; These macros are adapted from DASM's old macro.h. Credit and description are
; replicated from there.

;-------------------------------------------------------------------------------
; VERTICAL_SYNC
; Original author: Manuel Polik
; Inserts the code required for a proper 3 scanline
; vertical sync sequence
;
; Note: Alters the accumulator
;
; IN:
; OUT: A = 1

.macro	vertical'sync
	lda	#$02
	sta	WSYNC
	sta	VSYNC
	sta	WSYNC
	sta	WSYNC
	lsr
	sta	WSYNC
	sta	VSYNC
.macend

;-------------------------------------------------------------------------------
; CLEAN_START
; Original author: Andrew Davie
; Standardised start-up code, clears stack, all TIA registers and RAM to 0
; Sets stack pointer to $FF, and all registers to 0
; Sets decimal mode off, sets interrupt flag (kind of un-necessary)
; Use as very first section of code on boot (ie: at reset)
; Code written to minimise total ROM usage - uses weird 6502 knowledge :)
.macro	clean'start
	sei
	cld
	ldx	#$00
	txa
	tay
_clear'stack:
	dex
	txs
	pha
	bne	_clear'stack
.macend
