blob: 340fd1b22a2ad1af972351d55acb512a361b0a4f (
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
; INES header stuff
.inesprg 1 ; 1 bank of PRG
.ineschr 2 ; 2 banks of CHR data
.inesmap 4 ; we use mapper 4 (MMC3)
.rsset $0000 ; variables
COPY_SOURCE_ADDR .rs 2
COPY_DEST_ADDR .rs 2
.org $DFFA ; start at $FFFA
.dw NMI
.dw Start
.dw IRQ
.org $C000 ; code starts at $E000
Start:
;sei ; no interrupts
; disable PPU
lda #%00000000
sta PPUCTRL
sta PPUMASK
; warm-up
jsr waitblank
jsr waitblank
; clean memory
lda #$00
sta <COPY_SOURCE_ADDR
lda #$02
sta <COPY_SOURCE_ADDR + 1
lda #$00
ldy #$00
ldx #$06
.loop:
sta [COPY_SOURCE_ADDR], y
iny
bne .loop
inc <COPY_SOURCE_ADDR+1
dex
bne .loop
; use IRQ at $DFFE
lda #$C0
sta IRQ_ACTION
; return to BIOS on reset
lda #$00
sta RESET_FLAG
sta RESET_TYPE
; loading palette
load_palette:
jsr waitblank
lda #$3F
sta PPUADDR
lda #$00
sta PPUADDR
ldx #$00
.loop:
lda palette, x
sta PPUDATA
inx
cpx #4
bne .loop
; loading blank nametable
clear_nametable:
lda PPUSTATUS
lda #$20
sta PPUADDR
lda #$00
sta PPUADDR
ldy #0
ldx #0
lda #$20
.loop:
cpy #$C0
bne .noat
cpx #$03
bne .noat
lda #$00
.noat:
sta PPUDATA
iny
bne .loop
inx
cpx #$04
bne .loop
.end:
load_text:
lda PPUSTATUS
lda #$20
sta PPUADDR
lda #$41
sta PPUADDR
lda #LOW(hello_world)
sta COPY_SOURCE_ADDR
lda #HIGH(hello_world)
sta COPY_SOURCE_ADDR+1
ldy #0
.loop:
lda [COPY_SOURCE_ADDR], y
beq .end
sta PPUDATA
iny
bne .loop
.end:
; enable PPU
jsr waitblank
; show background
lda #%00001010
sta PPUMASK
; main loop
infin:
jsr waitblank
jsr ReadOrDownPads
jmp infin
waitblank:
jsr fix_scroll
pha
bit PPUSTATUS
.loop:
bit PPUSTATUS ; load A with value at location PPUSTATUS
bpl .loop ; if bit 7 is not set (not VBlank) keep checking
pla
rts
fix_scroll:
; fix scrolling
pha
bit PPUSTATUS
lda #0
sta PPUSCROLL
sta PPUSCROLL
pla
rts
IRQ:
rti
NMI:
;
lda #$35
sta $102
lda #$AC
sta $103
jmp [$FFFC]
nametable:
; .incbin "bg_name_table.bin"
; .org nametable + $3C0
; .incbin "bg_attr_table.bin"
palette:
.incbin "palette0.bin"
; .incbin "palette1.bin"
hello_world:
.db "HELLO WORLD!", 0
.org $0000
.incbin "pattern_2.bin"
|