aboutsummaryrefslogtreecommitdiff
path: root/src/example/snes.asm
blob: bea3235f065e8988ff75f87161dd9d3979e5d8b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
	processor	65c816

	option  output-file,snes.sfc
	option  output-format,snes

	option	snes-irq,vbl,handler
	option	snes-irq,irq,handler

	; Initialise SNES 
	;
	org	$8000

	sei
	clc
	xce
	ldx	#$1fff
	txs

 	sep 	#$30    ; X,Y,A are 8 bit numbers
 	lda 	#$8F    ; screen off, full brightness
 	sta 	$2100   ; brightness + screen enable register 
 	stz 	$2101   ; Sprite register (size + address in VRAM) 
 	stz 	$2102   ; Sprite registers (address of sprite memory [OAM])
 	stz 	$2103   ;    ""                       ""
 	stz 	$2105   ; Mode 0, = Graphic mode register
 	stz 	$2106   ; noplanes, no mosaic, = Mosaic register
 	stz 	$2107   ; Plane 0 map VRAM location
 	stz 	$2108   ; Plane 1 map VRAM location
 	stz 	$2109   ; Plane 2 map VRAM location
 	stz 	$210A   ; Plane 3 map VRAM location
 	stz 	$210B   ; Plane 0+1 Tile data location
 	stz 	$210C   ; Plane 2+3 Tile data location
 	stz 	$210D   ; Plane 0 scroll x (first 8 bits)
 	stz 	$210D   ; Plane 0 scroll x (last 3 bits) #$0 - #$07ff
 	lda 	#$FF    ; The top pixel drawn on the screen isn't the top one in the tilemap, it's the one above that.
 	sta 	$210E   ; Plane 0 scroll y (first 8 bits)
 	sta 	$2110   ; Plane 1 scroll y (first 8 bits)
 	sta 	$2112   ; Plane 2 scroll y (first 8 bits)
 	sta 	$2114   ; Plane 3 scroll y (first 8 bits)
 	lda 	#$07    ; Since this could get quite annoying, it's better to edit the scrolling registers to fix this.
 	sta 	$210E   ; Plane 0 scroll y (last 3 bits) #$0 - #$07ff
 	sta 	$2110   ; Plane 1 scroll y (last 3 bits) #$0 - #$07ff
 	sta 	$2112   ; Plane 2 scroll y (last 3 bits) #$0 - #$07ff
 	sta 	$2114   ; Plane 3 scroll y (last 3 bits) #$0 - #$07ff
 	stz 	$210F   ; Plane 1 scroll x (first 8 bits)
 	stz 	$210F   ; Plane 1 scroll x (last 3 bits) #$0 - #$07ff
 	stz 	$2111   ; Plane 2 scroll x (first 8 bits)
 	stz 	$2111   ; Plane 2 scroll x (last 3 bits) #$0 - #$07ff
 	stz 	$2113   ; Plane 3 scroll x (first 8 bits)
 	stz 	$2113   ; Plane 3 scroll x (last 3 bits) #$0 - #$07ff
 	lda 	#$80    ; increase VRAM address after writing to $2119
 	sta 	$2115   ; VRAM address increment register
 	stz 	$2116   ; VRAM address low
 	stz 	$2117   ; VRAM address high
 	stz 	$211A   ; Initial Mode 7 setting register
 	stz 	$211B   ; Mode 7 matrix parameter A register (low)
 	lda 	#$01
 	sta 	$211B   ; Mode 7 matrix parameter A register (high)
 	stz 	$211C   ; Mode 7 matrix parameter B register (low)
 	stz 	$211C   ; Mode 7 matrix parameter B register (high)
 	stz 	$211D   ; Mode 7 matrix parameter C register (low)
 	stz 	$211D   ; Mode 7 matrix parameter C register (high)
 	stz 	$211E   ; Mode 7 matrix parameter D register (low)
 	sta 	$211E   ; Mode 7 matrix parameter D register (high)
 	stz 	$211F   ; Mode 7 center position X register (low)
 	stz 	$211F   ; Mode 7 center position X register (high)
 	stz 	$2120   ; Mode 7 center position Y register (low)
 	stz 	$2120   ; Mode 7 center position Y register (high)
 	stz 	$2121   ; Color number register ($0-ff)
 	stz 	$2123   ; BG1 & BG2 Window mask setting register
 	stz 	$2124   ; BG3 & BG4 Window mask setting register
 	stz 	$2125   ; OBJ & Color Window mask setting register
 	stz 	$2126   ; Window 1 left position register
 	stz 	$2127   ; Window 2 left position register
 	stz 	$2128   ; Window 3 left position register
 	stz 	$2129   ; Window 4 left position register
 	stz 	$212A   ; BG1, BG2, BG3, BG4 Window Logic register
 	stz 	$212B   ; OBJ, Color Window Logic Register (or,and,xor,xnor)
 	sta 	$212C   ; Main Screen designation (planes, sprites enable)
 	stz 	$212D   ; Sub Screen designation
 	stz 	$212E   ; Window mask for Main Screen
 	stz 	$212F   ; Window mask for Sub Screen
 	lda 	#$30
 	sta 	$2130   ; Color addition & screen addition init setting
 	stz 	$2131   ; Add/Sub sub designation for screen, sprite, color
 	lda 	#$E0
 	sta 	$2132   ; color data for addition/subtraction
 	stz 	$2133   ; Screen setting (interlace x,y/enable SFX data)
 	stz 	$4200   ; Enable V-blank, interrupt, Joypad register
 	lda 	#$FF
 	sta 	$4201   ; Programmable I/O port
 	stz 	$4202   ; Multiplicand A
 	stz 	$4203   ; Multiplier B
 	stz 	$4204   ; Multiplier C
 	stz 	$4205   ; Multiplicand C
 	stz 	$4206   ; Divisor B
 	stz 	$4207   ; Horizontal Count Timer
 	stz 	$4208   ; Horizontal Count Timer MSB (most significant bit)
 	stz 	$4209   ; Vertical Count Timer
 	stz 	$420A   ; Vertical Count Timer MSB
 	stz 	$420B   ; General DMA enable (bits 0-7)
 	stz 	$420C   ; Horizontal DMA (HDMA) enable (bits 0-7)
 	stz 	$420D	; Access cycle designation (slow/fast rom)

 	cli 	 	; Enable interrupts

	; Set the background color to green.
	sep     #$20        ; Set the A register to 8-bit.
	lda     #%10000000  ; Force VBlank by turning off the screen.
	sta     $2100
	lda     #%11100000  ; Load the low byte of the green color.
	sta     $2122
	lda     #%00000000  ; Load the high byte of the green color.
	sta     $2122
	lda     #%00001111  ; End VBlank, setting brightness to 15 (100%).
	sta     $2100

	; Loop forever.
Forever:
	jmp Forever


; IRQ vectors
;

handler:
	rti