|
- [code];[FC音乐][MMC3 IRQ]2 P8 g0 Z0 K4 r5 g7 K. V# `
- ;FlameCyclone 20230710
% B0 Y# ~8 `0 W2 E
7 G4 B" X8 J- C+ M) |7 F) y+ P, \- ;文件头
2 `% q8 L$ M; L - ;======================================================================7 p4 J8 t# |' V3 Y
- .INESPRG 4 ;16KB PRG 数量
) p; N) z! N9 H - .INESCHR 1 ;8KB CHR 数量# T3 Y( }! [& X# u y5 x$ e
- .INESMAP 4 ;mapper 4
8 L) n6 r( o8 ? ~; I - .INESMIR 1 ;命名表镜像 0水平 1垂直# P+ `7 b" `$ `
- 0 a* B% V' `+ I! l k
- ;必要条件
% O# S/ x) b# F" a/ e7 p - ;1.持有CHR ROM
/ f8 I; x0 D4 a$ u& H2 ]' w - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10000 h* g! Y' K8 y6 s
- ;3.精灵内存(OAM)不为空
, G$ O. o$ k/ N( n' R
' f* y/ Y- `5 P8 b1 u$ p9 L% ^: ^- ;==================================================5 [. M3 n+ W4 }$ ?/ w% i# L
- ;NES端口常量) T, V9 H+ N4 M6 v* t& |. Z% F
- PPU_CTRL = $2000 ;PPU控制寄存器
* O8 g0 N6 Y# y, @2 d0 [0 j - PPU_MASK = $2001 ;PPU掩码寄存器
1 O2 z: w7 A" M, Q- g( j - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位8 e! c0 [# N! X) n1 q- S
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
6 Z R" P- p0 B8 L" R7 ^1 E - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加17 f; G! P2 ?( L3 C; [! e
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 - C. S" [3 d a1 \* N; L7 f
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加/ g0 |& L% ]" _" V9 L8 e0 L. t/ u6 w
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
$ z; H6 K" d2 n' q6 \ - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存 E3 z5 c& D" w" ]
- APU_STATUS = $4015 ;声音通道切换
/ Q8 [/ ]+ G! E i' N0 r0 ~ - JOY1_FRAME = $4016 ;手柄1 + 选通" P6 J7 v2 D9 y. c: u2 o) b: h
- JOY2_FRAME = $4017 ;手柄2 + 选通
& ~/ D: J9 C ]6 e - ; X. y, k+ J' k/ [
- ;==================================================
& X& Z: i/ D7 b* U9 h k5 { - ;MMC3端口常量: D) F6 T& E3 M# y# d# S
- MMC3_BANK_CTRL = $8000
M$ B p4 `/ U/ ^4 w - MMC3_BANK_DATA = $8001& l( Y% M, i; X
- MMC3_MIRRORING = $A000
, x) K. _: ]. D e* n, O - MMC3_PRG_RAM_PROTECT = $A001
# p! [5 }# R) `1 a1 F - MMC3_IRQ_LATCH = $C0005 d5 l }: R4 i0 c( I1 y/ Q( \
- MMC3_IRQ_RELOAD = $C001
3 l2 H+ F7 V$ C, A4 t: } - MMC3_IRQ_DISABLE = $E000
* X2 r) ]) M- }+ }2 T: K - MMC3_IRQ_ENABLE = $E001
/ q" |8 b/ v5 E5 Z2 c7 V3 ]
; K! S1 A5 s5 e7 X; h- ;==================================================4 z5 n+ z+ S+ ^# M* e7 A
- ;程序块配置% b; v! E4 @3 _. m5 `1 h( j* Z! a
- BANK_DATA_MASK = $075 Z" H5 k! T- T) w) n; r5 Q
- ;--------------------------------------------------1 s7 D1 M. M3 q7 C1 T
- RESET_BANK = $072 |/ X9 \0 i7 Q% E6 V$ ^+ n4 i
- RESET_ADDR = $FC000 S5 d: e% b2 F' |
% H1 g0 a+ ^$ t4 @9 U* c% C8 ^/ L- ;==================================================
2 B; [* Z. \: R, ]7 v, g - ;图像块配置
/ Z2 i s$ Q$ T- P3 k9 B& G8 | - CHR_DATA_BANK = $08
. M( b* q5 E: }: J( z' B3 O - 1 v4 i! c! ~/ N' z- T) {2 T
- ;==================================================
5 y! e w' |6 ?+ b. \+ f' K- |- L7 C - ;零页内存地址配置
9 t) v% [5 Q: L/ U - Use_Ram_Addr = $805 ~3 s# q p: r* S+ m F
- PPU_Ctrl_Buf = Use_Ram_Addr, w1 R. g( @, E7 \7 u( a
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
" `! i8 d8 |; D9 w! q - PPU_Scroll_H = PPU_Msak_Buf + $013 }* b2 \( V' k4 X
- PPU_Scroll_V = PPU_Scroll_H + $01
# I9 `# B, a1 B - FC_Data_L = PPU_Scroll_V + $01$ E. n$ I [9 V3 F; s
- FC_Data_H = FC_Data_L + $01
' {$ Q# y) t5 f - FC_Data_Buf = FC_Data_H + $01
+ R2 g4 K' \3 R: S; v3 u$ W; \ - ;==================================================" {8 L7 m, I4 K) P j0 x/ N
- . j2 X) D T9 W1 Q) d
- GAMEPAD_MERGE_FLAG = $04
9 m6 I G) k1 z0 M# G( q& u
) Q" u$ b. f1 u$ U* s- Gamepad_Keep = FC_Data_Buf + 1
* q- a" v& A7 G0 H) W - Gamepad_Once = Gamepad_Keep + 2; i2 U) L7 w9 X0 y
- Gamepad_Temp = Gamepad_Once + 2* F8 d: ^* ^4 ~- B) g7 t; |
-
; d) g: D" S/ j$ o3 D - Gamepad_0_State = Gamepad_Temp + 2+ x+ h+ _+ C7 e5 e4 G& D* F, L
- Gamepad_1_State = Gamepad_0_State + 1- \/ c9 D& y2 [1 P' v
- Gamepad_0_Value = Gamepad_1_State + 14 d8 [3 z5 ]% I0 F
- Gamepad_1_Value = Gamepad_0_Value + 1- X8 w* D1 G: S- g# O) ~2 @9 P! c
- Gamepad_Port_Value = Gamepad_1_Value + 1
- ~9 J& E; M$ U9 M6 H: Q8 |# N. ~ - Gamepad_Merge = Gamepad_Port_Value + 1: [: P% y$ |: J$ Q1 E' n! r
- ( p7 p/ Y3 e* t4 k K: z% Y" j7 y
- ;==================================================
# C: S( U7 N" p6 t$ c+ H - IRQ_Index = Gamepad_Merge + $013 C- u" R! \9 t
- ;==================================================
0 B4 c. d/ ?$ n: U- ]
4 a$ X6 v( ?7 ^, m6 }( I' I- ;CHR图形数据/ T2 C9 a- K0 ]1 Q
- ;==================================================
3 k4 v! u# s% ~- K' s - .BANK CHR_DATA_BANK
; {0 y9 H: v" ?. I - .INCBIN "chr_bank/chr_data.chr"5 G8 u/ {! Q4 c7 H
- ! Z6 Q2 z" Z0 d9 M
- .BANK RESET_BANK & BANK_DATA_MASK
: p; y, Z' l* ]- k! N8 G% B# r+ K - .ORG RESET_ADDR
+ q/ i1 }* r6 g8 Y -
+ k: a* P; H6 d) X - ;--------------------------------------------------" w" D3 J5 t4 p2 V
- Attributes_Data
R$ T$ y! _, y1 x! V: Z) j% B - ;命名表属性9 M) l0 k% ~8 z# S1 R& Q
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
- q7 l7 u) V* e3 r5 s6 e - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA. h- V5 o1 B l$ z
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA8 w' p! ]) d) O6 y3 D3 r6 ?
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55+ b# ~$ }, m4 k E4 l
- ;--------------------------------------------------9 P4 c3 H; b0 ~$ h$ P" e3 y+ i
- ;调色板数据: n. @& v1 G% z; w; G! v# j W; B
- Palette_Data4 S3 f* c0 g/ q; B# B; s) N: L, C
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
& r' i G$ f! b1 @% W - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F+ F; S6 w3 s7 \8 P; ?
* u0 `0 p% r, }: K6 b K- ;==================================================
4 K, P: s% r" x1 n - ;命名表初始化# m( q' H% W3 \* D
- Init_Name_Table) t% W d8 i3 S: U1 x4 L c
- LDA #$20+ }. R' F( F! A( N! f
- STA PPU_ADDRESS7 _( Q- g8 U5 w1 `1 r3 Q) ~( o
- LDA #$009 B# c" H. v g" g a/ J+ Q% _
- STA PPU_ADDRESS/ S" t; P L7 ?0 n1 g7 A1 Z
- LDA #$00" V* V1 O/ Q, a5 e
- LDY #$00
6 A- b% m0 i \3 w9 o6 S, ^3 @ - LDX #$105 r1 H& Z! A3 W1 I+ z3 d
- Init_Name_Table_Write
2 |8 Y4 ]! D8 N& w7 k - STA PPU_DATA
; n, Q6 M2 {. m8 ]7 Y$ E8 b - INY+ e9 x- Y/ |2 Q! X: j
- BNE Init_Name_Table_Write( f$ ^" `1 P' d" j: @1 G; @
- DEX
. C# ^9 X4 z- ?# A+ ? - BNE Init_Name_Table_Write
# Y7 r% _) |* e4 G! [* g - RTS
% C! G9 d! m* b3 h - 3 \1 E0 I1 ?9 X
- ;==================================================
3 w4 x, H! V! Z# ? - ;调色板初始化
$ ]' g( n9 h+ o - Init_Palette
# w# r5 C; }% q1 k - BIT PPU_STATUS
w( u, A$ n% N0 c - LDA #$3F+ |1 s" `) ]- {9 R# Q
- STA PPU_ADDRESS( Q4 l. a" k5 p% t: d1 k% X) u
- LDA #$00! y6 D$ `+ o; ~+ r$ s
- STA PPU_ADDRESS4 A- a6 A' u: U- M3 C; r+ K8 B
- LDX #$00 Z/ ^! G+ S; R# P5 Z
- Init_Palette_Write. C" z& {7 k4 p# a* z" H
- LDA Palette_Data,X
4 A: S P: R- x" k3 h6 U - STA PPU_DATA
, {# i- A- T2 u( n1 V - INX5 @ J2 m" G/ m y8 I5 l
- CPX #$209 w4 s5 I( j" I6 ?: o+ c
- BCC Init_Palette_Write9 s2 `: Q3 I) ]; F+ @5 o: o% x! [
- RTS/ F" I% m; u, g
- & l9 y" [$ C$ ?
- ;==================================================
8 H1 Y" v, N0 z7 n - ;设置命名表属性
# j. j1 }7 a3 p( | - Init_NameTable_Attributes @3 }, x9 R" _* P
- BIT PPU_STATUS
' T* T7 D4 S3 R/ e( S - LDA #$23* I+ l. R9 b1 G8 T2 _9 _
- STA PPU_ADDRESS" |7 m( ~' j. }3 z/ B, O4 k/ z
- LDA #$C0# L Q, U6 G# B5 `
- STA PPU_ADDRESS
) q3 z, c' q4 Q' i; ^ - LDX #$00
5 t, N/ ]9 M! j4 u- P) r, W - Init_NameTable_Attributes_Write
+ |- @: C: T5 O/ i* L; z - LDA Attributes_Data,X
# c; d" u; |0 ~* j, N - STA PPU_DATA6 c( \' j4 ?) V
- INX
0 D6 M2 u4 K; D" e2 k - CPX #$40" T4 P1 `2 `( o- O2 t9 l$ Q4 V
- BCC Init_NameTable_Attributes_Write
$ G/ u3 F" M+ E7 R; j6 P - RTS
6 R7 R5 q; W( G0 Y: x1 T0 p: V - % p' s" i- h7 l' F6 g
- ;==================================================! E6 y, G' m/ G( T; h' [4 A
- ;初始化命名表文本
( V3 a- g2 Y( p$ b& d$ r& j4 U - Init_Name_Table_Text
* i9 ^' j9 O1 B" \! O s. c - BIT PPU_STATUS# u% ]& Y2 D5 _ A# S: Z
- LDA #$20
5 w/ j# |4 P( T0 J+ T - STA PPU_ADDRESS
; M8 O# }" q9 k; E& l - LDA #$00( ]: j9 T' j3 y* i& G7 }3 }0 _3 B
- STA PPU_ADDRESS
: C5 q" \' ]! ]6 n* r - LDA #$00
9 k" W( r2 n! V - STA FC_Data_Buf7 X- h6 e; k' S% Z) q/ }, ~
- LDY #30
6 N8 O d4 T. f/ e' a - Init_Name_Table_Text_Write
( q6 A9 t( K! n, y; d - LDX #32, ^4 J6 i! {6 m0 j8 m
- Init_Name_Table_Text_Write_Char
8 C- V- @5 d$ O2 T7 r% T - LDA #'0'1 x) ^) ^; F. h& u. o
- CLC
: L% l, I: S, @3 G2 ~# M6 c - ADC FC_Data_Buf
) ~0 s4 F. w! r7 O0 J; U. | - STA PPU_DATA4 H9 W4 v+ T4 F
- DEX8 b' G5 ~% r! m
- LDA #$14
' G! a0 s# k* i8 U% \ - STA PPU_DATA
% t0 _- U( l2 E0 d# D' @, G - DEX
* {! [$ u& A- n+ _ - BNE Init_Name_Table_Text_Write_Char( J3 A$ p: A7 U0 D) q
- INC FC_Data_Buf
: A. R9 f0 X+ u# X B% f; b - DEY
5 P4 ]0 _* c7 B$ h3 }' v - BNE Init_Name_Table_Text_Write* u# g: ~2 Q O
- RTS
( T5 ~7 ~8 j/ O' ?. i - + |/ o0 k3 c' e% b2 o0 F1 H0 h
- ;==============================
/ r) q v0 Z, B8 c2 x. U: x - Init_OAM_Ram;初始化精灵内存
: `" L& ^3 ~( B3 ?2 m9 g% N, [: u - LDX #$00
( z( b' B$ ^) t - LDA #$00& M. G6 {6 t' T* y8 U5 H
- STA PPU_OAM_ADDR! q6 k+ z, v8 Z( Y4 o
- LDA #$F8
1 W7 k* l: G$ k% ] F3 } - Init_OAM_Ram_Write) L( j, J* w; Y; J% \+ t
- STA PPU_OAM_DATA
$ r# W" \ f/ r+ S$ ~2 p! x - INX; G. i$ M9 {& \: ^; Q3 w
- BNE Init_OAM_Ram_Write" |, l$ B) e% r, Q& }. W
- RTS8 Z2 b/ Y! _: D' J; U! T
-
8 F2 {5 l" q5 s# i. r - GamepadProcess;手柄处理 k: a9 [5 ^1 g0 W6 u! _
- JSR GamepadDatacan
$ c- \, w& P# [3 d- e% w - LDA <Gamepad_0_Value
3 d/ J3 Y1 t9 U1 [ - STA <Gamepad_0_State- ~2 o4 o8 c5 H8 v" P/ K9 z5 G
- LDA <Gamepad_1_Value, R1 r4 X0 ~# ~% N1 u9 E
- STA <Gamepad_1_State/ P) }% d6 b7 P# ? [
- JSR GamepadDatacan
& k% p% ^$ V8 q. P- S2 m7 s* U - LDX #$01# W4 t# @- R$ ^. W+ ~9 M5 o7 t
- GamepadMergeCheck;合并手柄输入检查
2 e3 q1 [( O- t1 F: v1 f - LDA <Gamepad_0_Value,X
# O) {) y- s" ] - CMP <Gamepad_0_State,X$ U: W1 ]( s7 q! ?: P4 K1 D* q
- BEQ GamepadMergeInput
7 [9 L5 u2 _3 _ - LDA <Gamepad_Temp,X
d6 l* J3 M$ s/ u* n/ } - STA <Gamepad_0_Value,X* P2 w& y; {9 m) K* t
- GamepadMergeInput;合并手柄输入
- d+ [ t/ `# \/ \7 [5 x4 z& K - DEX
7 r2 L$ e# I. Y6 R) N# E9 x - BPL GamepadMergeCheck
# o% q7 d3 k' `6 D. M - LDA <Gamepad_Merge
8 ]" ^0 a+ _8 a8 l! q. p' c6 q - AND #GAMEPAD_MERGE_FLAG: g0 e1 n+ V$ X& c
- BNE GamepadStateProcess% M# o/ s0 a( M4 w% R) u- s
- LDA <Gamepad_0_Value5 l0 G4 u/ Z0 G6 {7 p
- ORA <Gamepad_1_Value
: D6 `9 X/ e. @& C - STA <Gamepad_0_Value
& B4 u* c0 C2 M" T+ v9 I: r - GamepadStateProcess;手柄状态处理! b6 _8 T/ ?& f2 [" M
- LDX #$01
( z3 b, }6 m2 Y; S$ y. T - GamepadStateSave;手柄状态保存5 c$ @% P) A' j+ p
- LDA <Gamepad_0_Value,X
, f7 n ?: g& \8 w - TAY% L8 r5 c9 @ Y% o
- EOR <Gamepad_Temp,X9 L }, X& H9 H2 q' i
- AND <Gamepad_0_Value,X6 e, ~: ]& d2 R/ a
- STA <Gamepad_Once,X5 `% R6 n$ g- ?/ d; l0 G% [
- STY <Gamepad_Keep,X! O# P# g0 C% g5 T# U
- STY <Gamepad_Temp,X
# J( h# x7 v, ]4 ~ - DEX
3 r5 r$ S) I( v+ b0 C( K+ Y - BPL GamepadStateSave
" d6 b; z4 V8 Z, _% A - RTS
9 X; T0 p1 g# b5 O& K3 K+ q
" q j) J! C" C) z, r- GamepadDatacan;手柄数据扫描
9 R% t) y7 V1 X4 k6 c4 a3 e* Y$ k - LDX #$01; z8 ~6 t' u1 ~7 H) e
- STX $40168 X8 J7 U4 n( w! @- z; _' u
- DEX/ e) s4 a8 D# \
- STX $4016& B" f: U) ?5 ~+ I- h' Z
- LDY #$08& V X& l- a0 {7 g2 K
- GamepadPortScan;手柄端口扫描7 t2 g! r# h- s" U& B
- LDA $4016
% e5 v7 b' @: X) u4 H' K! v- V; U0 m - STA <Gamepad_Port_Value
# w Z- q" ?& v. B - LSR A
7 A4 a" O' y8 n: _ - ORA <Gamepad_Port_Value8 b/ `+ H0 K( L& f9 o% ]( U( e
- LSR A" ]9 l2 Z1 u8 H
- ROL <Gamepad_0_Value
0 u, V n) D8 V6 h/ h3 I - LDA $4017
& }4 `8 P ]" b4 D8 ?* d( I: U - STA <Gamepad_Port_Value
% v& I* U# O1 v J/ [% g4 I0 | - LSR A
7 Y3 C- M4 Q- {& N# n9 J0 t: {: C - ORA <Gamepad_Port_Value4 L5 i; X/ N7 z5 W+ Z
- LSR A
: c! ]$ E9 o; I9 D0 R - ROL <Gamepad_1_Value
* q4 w+ \4 t* S. E- ` - DEY' A i, o- ^ J' W. D
- BNE GamepadPortScan, j% y# C" `- {: Z% g9 Q: |
- RTS0 X5 l) ^) S G9 x3 P
- : l" w2 }$ u5 K5 W. s
- ;==================================================4 t# M$ J# D# ?1 o7 X: G
- ;PPU处理
8 I. y4 \* Z) N# j4 z# X) t - PPU_Process
2 |6 g1 Y+ O7 ^- R+ D5 e - LDA #$00/ D5 U* B* A' ]
- STA PPU_MASK+ w {6 Z5 o# Y8 }" z5 n9 _& c2 f
- 7 v! d5 j: j+ E$ D* }
- BIT PPU_STATUS3 M3 b3 ]" w- r/ T7 D5 i
- LDA #$20
B$ q; ?1 a9 z" |9 Q - STA PPU_ADDRESS2 |" ]6 B& [1 ?6 i, C, l+ y
- LDA #$00
! f7 W- ]! D2 f! D! z - STA PPU_ADDRESS& t l$ s. B' `. @
-
a. I6 ^( I2 w/ g% F( x% I - STA PPU_SCROLL
. G1 O. O5 e! F' G7 U3 P9 |# I" a. J - STA PPU_SCROLL
W3 Z4 t z* p) B9 [7 a - # W3 c, i* W. B5 U
- LDA PPU_Msak_Buf
$ \5 ]; m6 x& l% Q - STA PPU_MASK
& m; q- }' a/ A0 @ - 6 N5 z: \4 d/ {
- RTS9 D0 M' i4 t* B& b+ {! a
-
4 O+ q5 l$ z5 N; Q0 t- [% w& C - ;==============================6 `( ~* _$ s7 w
- Time_For_Vblank;延时等待- R8 K. A, S5 p a
- LDA PPU_STATUS+ P+ n$ m: A! T- U: H
- BPL Time_For_Vblank
* E. p9 ]& @! w! g, \# U' ^ - RTS
; @* k/ U$ A* Y; Q( H -
- I1 A1 H$ s! O/ _1 E - ;==================================================
# ~' g5 _9 F/ a8 F/ m* i8 c - ;初始化MMC3
% |% ]4 o; C3 P- u+ {+ [' [3 S - Init_MMC3
- D2 i* ?& E, l/ U/ K$ \9 S5 L - STA MMC3_IRQ_DISABLE5 L, |1 M+ w# L
- 0 K# A2 l; l t& o" x
- ;设置MMC3水平镜像
0 j; c) m" _2 f' P+ T - LDA #$01
+ L8 `9 ?) A) M2 {. l - STA MMC3_MIRRORING
7 a; U0 y1 l$ z - $ Q% s+ r' w# }" C+ P- Q) k& u6 I
- LDX #$05' S& c5 t4 O6 s, C+ p6 o
- Init_MMC3_Chr_Bank_Write
% J9 P3 `! C" t/ I - STX MMC3_BANK_CTRL: g& e1 W1 l) a- Q0 C7 h8 D$ j
- LDA MMC3_Chr_Bank_Data,X( H6 F3 ?) f& P2 [5 {4 k
- STA MMC3_BANK_DATA S) k: S5 m# [( p/ Q: q2 B
- DEX4 {+ y7 f6 q* F' ~* \" d
- BPL Init_MMC3_Chr_Bank_Write9 q5 R1 Y5 G, v" |$ P% K* q$ K
- RTS
* o5 s% w$ n- j2 |- e - ;--------------------------------------------------. x" w& u& T( n+ X
- MMC3_Chr_Bank_Data
: W% A: C! R0 c6 z - .DB $00,$02,$04,$05,$06,$07- c9 W9 X8 P' v* E: Z( _8 @
- 0 y0 R' r0 L9 r9 {7 `& U2 D+ D" K
- ;==================================================
6 g- z* C/ ~! s5 d- `- ]+ V - ;重置中断处理
% c7 _. z/ i+ a5 [; \ - ResetProgram" ]4 S6 d2 B4 j* X% }5 O+ \
- SEI
+ S0 f1 _0 g R% D - CLD
z+ s4 r- q* u- _! _+ E3 T% S - LDA #$00% e7 G0 r3 n+ q8 [( x/ g
- STA PPU_CTRL
" U% J4 j4 k) |( U - STA PPU_MASK
* G# G5 c6 M* P* ?( ~+ r - STA PPU_STATUS+ c! {1 F( H3 I
- STA JOY2_FRAME* c: V/ y# r5 {2 L3 U" ~
- STA APU_STATUS
# `$ V" T. R& G( A U" C - / {1 K+ g' g9 e" ^6 N
- LDA #$C07 D: V& M6 Q7 F: n
- STA JOY2_FRAME
4 b" `# x& ^' k! v/ g - , P/ B3 r1 E# r! x# P$ z
- ;等待vblank
$ J+ r6 h9 T! J+ M/ r2 F! w; a - LDX #$02
/ G8 |5 ~4 p* Q - Vblank_Wait_1
# C7 ~6 ^( v2 S$ ~3 ` i% c* z - BIT PPU_STATUS
( c$ j0 B% G" x1 r- x5 m+ e6 p - BPL Vblank_Wait_1# @8 A3 J( G& d6 U- K; r
- Vblank_Wait_2- G9 _$ q* T! Q
- BIT PPU_STATUS( T0 m: ?5 Y5 z
- BMI Vblank_Wait_24 ]: I* n# v6 t+ b9 f* r
- DEX
! x$ m0 Q, F- c; o" h9 }/ |! ^ - BNE Vblank_Wait_1
) o/ n2 F2 B$ q -
& x& ?+ s+ [/ c7 N( K9 o/ N - LDX #$FF8 q8 K6 d" _3 V, h, K
- TXS! d7 E7 O+ s- h+ \$ ?! a4 F
- - e4 K. A' W- A2 J0 d7 Z2 I& y
- ;初始化MMC3
0 b; f* @* ?, b9 b* t3 E" z - JSR Init_MMC3
& g1 T. F2 J2 m8 d. x3 ` - 3 b& G7 t; L) e4 \* j
- ;==============================" Y5 c6 F9 Q3 @3 p
- ;RAM初始化0 v) L0 w- `8 {/ r$ x4 m
- Nes_Ram_Init+ t4 j. d8 C8 P/ e/ f3 j( T7 f
- LDY #$00 q$ |. g2 Q1 k
- LDX #$08% T* Z8 A+ S4 I' B) v
- LDA #$00
) D/ K! n5 }, O, W( w& m$ | - STA <$007 R# R) ?% u9 |9 E! L8 L
- STA <$01
9 c: n- c+ v# H4 H- d( j - Nes_Ram_Init_Write
% L- g# X- V% S0 h8 i - STA [$00],Y
% h; m& I% H; j. ` s" J - INY
2 S. O/ j [# ^2 w a - BNE Nes_Ram_Init_Write
0 E1 i, b& i& U2 X% T" T( m/ C0 P; C - INC <$01& r0 ^# t9 F9 i' I- ]0 ~0 l1 ?/ x" M
- DEX; o- { P' w- Z; }: b
- BNE Nes_Ram_Init_Write
0 Q! i) { i0 ~ - - t' b2 n% B( l
- ;初始化命名表7 h% ?( n B( ~. T% p j
- JSR Init_Name_Table
: Q% ]0 G% o1 `: K" @ - ! `+ S o7 ~, M
- ;初始化调色板
$ l3 j o$ J/ k0 n* E w - JSR Init_Palette+ h( E. q- I9 h/ A5 N& E/ s
-
1 j2 Q7 K! E) n8 y& N3 m - ;初始化命名表属性6 p- G2 M, }0 [$ \. S
- JSR Init_NameTable_Attributes
/ _* O& t5 j; z9 d; w( g; J# k - , A# I! \) F1 {5 u
- ;初始化精灵内存& T8 T4 |; {+ w8 ~2 u
- JSR Init_OAM_Ram
: N$ L8 i7 f: w - - G; D% U; ~) _6 w
- ;在屏幕上写点东西
) v$ y% K- K. T5 j8 A' U. H1 h - JSR Init_Name_Table_Text) A- h t6 m; V) q, q. ]7 A4 U8 o
- 4 }& r7 t- _8 P& X- s( }
- JSR Time_For_Vblank5 r4 v6 d$ a- @' p6 B9 @$ I" k
- ;开启PPU控制
% Z: P# U- {% f5 }) }& u) i - LDA #$A8. a4 K( t, w5 B0 Y
- STA PPU_Ctrl_Buf2 n" V& `' O+ v3 o, k# y/ U7 u6 _
- STA PPU_CTRL7 c' X/ x; i4 z* x3 z; i3 ?
- ; L+ F! q o& T% \
- ;开启PPU显示
/ E# Z. w/ b$ E) y - LDA #$1E: M& `: z7 y) |
- STA PPU_Msak_Buf
; z( m# a" E5 }2 z# V7 A( i - ! l- C4 Y' X1 v2 r8 z. i
- CLI
# T4 V3 c L) V8 R) C% Q - JMP Loop
5 n3 E% Z) `2 \, K/ ^' a7 O; t -
5 w0 @' J l7 I( e! C3 @ - ;==============================! u Q r* ?6 M) c7 J6 `
- ;死循环, 等待NMI中断0 _$ V% _" i5 F5 |
- Loop6 K$ Q& h" z3 P+ }% n
- JMP Loop6 e' n# |; J8 T9 v
- - z4 X& E: I# S% z5 y8 K
- ;==================================================# O& D4 d) u: f5 n! H
- ;NMI中断处理
" E- b; }7 {9 G - NmiProgram
5 E4 ?/ z$ u, {( s2 H# s$ b - PHA
o7 Q4 D! f: N$ A - TXA
; z/ n. g" |+ X/ Y - PHA" X4 b+ o$ P( ?, f, N' ^, C
- TYA
) \* [" H' ^8 w: | - PHA8 L! w$ |0 Y6 f! y
- / ]: n* \2 d0 t2 N& u4 V5 X1 g f
- BIT PPU_STATUS
* k" Z3 p9 K" n! J8 m -
# b; g& L7 I$ Q - ;关闭PPU控制 B5 Y8 U' h/ g r9 B
- LDA #$00" N% m2 U% F( _- j0 o3 E5 r v# u
- STA PPU_CTRL
( M* Y+ W& R$ B - # y& N% ]$ t a% A! z
- ;处理PPU
) u; M* g- o. v - JSR PPU_Process4 m' R |2 X- z) ^7 c) w2 n
- . c v1 G }" p% i6 \3 k
- ;开启PPU控制- i7 N$ g, s% E* T
- LDA PPU_Ctrl_Buf
- w) J- i# u- j - STA PPU_CTRL
4 ?! ~( g% b6 U, e - % o) n0 G6 V6 f8 @, k- c
- ;手柄处理
) \2 @- ]8 G, w8 g - JSR GamepadProcess
' D' }0 ~8 |" j4 f3 y- y+ v - $ b6 j1 B# j' m; \* v
- LDA #$00+ ^* u: _0 m& A( N2 g( ^* p. b
- STA IRQ_Index9 W( X& H* @' w2 {+ Q! K
- , i$ ^/ S, v8 u0 Z
- ;启动IRQ中断, 第15条扫描线触发
8 j1 v h" a. |; e - LDA #15 + 16 J s! l# u" B( ~* u0 S3 Q
- STA MMC3_IRQ_LATCH2 R( f$ x' D2 t1 n# s5 z( F, L2 B
- STA MMC3_IRQ_RELOAD& q1 h+ ]4 ]% S% ~# \' T! {
- STA MMC3_IRQ_ENABLE
/ o; ~$ X# K ]$ \& ^( u# J - CLI
6 j% i9 l) f8 ?% H) Q; n3 _8 w' S - & |8 u. i, C; M- q4 v' [4 D# r
- PLA
/ H6 V0 k& g. P" x- B* a3 w - TAY
8 W. O# E" ]4 @) t' ]1 \ - PLA& ?) I6 Y Y% k# e4 c5 n
- TAX
* x/ }: t; n8 J- E, k( k - PLA
. L4 f9 j0 V) L' n2 W' ]4 l2 E - RTI7 w3 E1 g. x, z8 n$ k
- " r4 ^7 j$ I$ \
- ;==================================================+ [( d: S2 ]* k. M: b
- ;IRQ中断处理
' ^& U- l5 ]. P7 G8 I% r. W! {. Q - IrqProgram
% f2 i' L$ n( R$ @- C, C - PHA
5 P0 B$ I* Z9 F* w' M - TXA! ~0 k! k" V/ j, p
- PHA
) e0 U) U* t) c* F2 v5 o" j0 o' b - TYA
% U" A" l' Q' N: }* [# j - PHA" J4 k' q, c# Y& }5 w' z6 }5 C
- - p- l1 D+ d; o8 w
- ;关闭IRQ
/ p' T9 v% }/ F- N, k8 t - STA MMC3_IRQ_DISABLE
6 A0 C! B. v% u- o - + c; l! f" \, \3 g; N
- ;允许下个IRQ触发 E% s! ?5 J$ o
- STA MMC3_IRQ_ENABLE& z' M; P) L; E1 ?0 B
-
" C2 F: l/ \9 i' U7 r7 n" U, e - ;IRQ处理, 15线后继续触发
( Z& @# d; t. x - LDA #15: P- u) d! s+ t- ]9 e
- STA MMC3_IRQ_LATCH
9 ` B3 p2 M3 k - ! b0 k" d \% c* ~
- LDA <IRQ_Index" ]' Q- S9 u( o7 @
- BNE * + 4
# g8 M7 |+ j: C8 _ - INC <PPU_Scroll_H
) C, J7 o* V* f& `! \% R -
4 g1 B. x# w5 s! g4 x - ;设置屏幕滚动. G$ O! B' a8 |! I3 [) Q% p
- LDA <IRQ_Index
0 _; Z' m5 y$ {- O - AND #$01
, q% X3 P; E! ^' v2 v - BEQ Irq_Scroll_Right* b' @9 }9 D! B" a4 S4 i7 B
- 4 a" e8 e& r8 F( \' v8 q
- Irq_Scroll_Left: |2 ?. }! P) [ x( K" B9 y0 b H
- BIT PPU_STATUS+ Y$ ^: t4 w) p
- LDA <PPU_Scroll_H% T" ~/ ?7 U: `2 F! \
- STA PPU_SCROLL
, }" b9 ?# h( C& Z - STA PPU_SCROLL( \' R+ f# j/ l6 L
- JMP Irq_Scroll_Over. G# L: s, {. L+ |
- ( F6 t }3 _! E8 A$ _
- Irq_Scroll_Right
8 [. D5 N2 J( z! d: o! W/ Y4 M( u - SEC
2 C, O* G! B1 m; C - SBC <PPU_Scroll_H
2 i2 c1 d" G" u - STA PPU_SCROLL
6 F m/ K0 C2 h - STA PPU_SCROLL
- X r" o+ B4 v& c' A - Irq_Scroll_Over6 y/ ]" u# ]) P- {- e
-
* c) E- k" M5 ^- O4 j* R - INC <IRQ_Index
# i/ ]9 }* B6 `! j1 O5 f4 { - + Y% J! Y4 V5 y& K
- LDA <IRQ_Index
% @9 N6 z) D: Q! c% M - CMP #144 C- J, G" x' J: y) S
- BCC * + 5/ t( c/ [4 A7 [( A3 E* X
- ;关闭IRQ
4 }) J2 B2 D8 ]6 h - STA MMC3_IRQ_DISABLE+ w0 V# R9 U6 I1 t
- 4 R# C, C7 L( v G8 U
- IrqProgramEnd
: I- B4 U: d9 b( X - PLA% h0 n2 }2 x8 N# i" k ~' |
- TAY
8 H% V* Y7 \! `9 [+ O" H5 S - PLA) g$ n) E9 C1 X2 [5 E! F) _" Z* |
- TAX" y8 P6 [0 M. b# S! J! q5 M
- PLA) U( d. D" V+ I+ l
- RTI
5 o/ G* ~9 H! _# w( S6 k7 h - . a0 I5 P. Q& h3 w: C0 O
- ;==================================================
% A" ]$ m0 {6 |, D - ;中断表
$ b9 L4 q7 j2 y* A% d - .ORG $FFFA
M5 d. w h* m2 E+ V - .WORD NmiProgram' S* g* w- H" N
- .WORD ResetProgram, ^! i. a) s/ W5 S5 |; @6 ?+ T7 E
- .WORD IrqProgram
复制代码 [/code]( m) f; d' \- J! r
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|