|
|
- [code];[FC音乐][MMC3 IRQ]
. _! l! i( d, F) v# i' u - ;FlameCyclone 20230710
8 T8 n2 ]: s1 N- D, a4 n+ O0 `9 p' | - + T. B- Y% A- ^- u2 L# ?
- ;文件头( W) p4 q4 K- c* C
- ;======================================================================
& C* n3 }3 a6 e - .INESPRG 4 ;16KB PRG 数量
0 S/ t+ }( N0 P+ J7 w3 O3 G3 e8 p - .INESCHR 1 ;8KB CHR 数量
; G5 k9 W J5 c - .INESMAP 4 ;mapper 4 y7 E* G# o5 y- W
- .INESMIR 1 ;命名表镜像 0水平 1垂直
4 r5 m; x) ?- {. r, P$ Q+ m - ( @ J( A9 F p
- ;必要条件/ S( ^+ }0 O9 }' T9 n) g+ U
- ;1.持有CHR ROM7 v( G' s7 y2 M; {" c
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000" R6 X* X% b* r7 }1 x* C
- ;3.精灵内存(OAM)不为空
3 H ]2 `. p. k5 K# F* L3 i
1 _" @! K8 Q" ?; Y, F- ;==================================================& p0 N# M1 ] h. K0 A7 y
- ;NES端口常量
. {9 t# W; j2 @ - PPU_CTRL = $2000 ;PPU控制寄存器" Q% I% K! z6 M" ], p: [+ d2 T
- PPU_MASK = $2001 ;PPU掩码寄存器
+ ~/ u# X1 a6 M - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
8 J! c u/ `- Y B - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1. e7 M/ Z/ l/ s+ Z+ M; q
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加14 s/ d' |$ |& x8 Z
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
) M$ Y7 _. Z( ?& T' A% A! F! M - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加( `4 Z. B6 [; W9 @
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 8 e( `* X( a/ G# X, m( i
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存/ s! B$ B0 N7 @: ^% e9 A( J: k
- APU_STATUS = $4015 ;声音通道切换! ]# U5 w1 s H/ U0 ^& W3 Z
- JOY1_FRAME = $4016 ;手柄1 + 选通5 y. B7 ^) G a e3 I+ K
- JOY2_FRAME = $4017 ;手柄2 + 选通4 O J0 `' Z8 d2 E8 s+ ^. n1 R
- 6 H. R0 F5 K6 W7 @8 F
- ;==================================================
* _- u2 x9 O4 Z; Z ^$ } E - ;MMC3端口常量# T4 l, h8 r! ]- u( V, I8 E- w
- MMC3_BANK_CTRL = $80008 R Z0 ~2 c/ r8 z) J( H$ U4 K
- MMC3_BANK_DATA = $8001! A, [: u) w* d. @1 _' K; D1 d. E# ]
- MMC3_MIRRORING = $A000
1 F% U1 i& D5 _: M- {# k - MMC3_PRG_RAM_PROTECT = $A001- i4 V! A) D$ l- E
- MMC3_IRQ_LATCH = $C000
) c! H7 _5 Q: t* l) D8 V3 j - MMC3_IRQ_RELOAD = $C001* U" M! Z; B% H6 O1 ?
- MMC3_IRQ_DISABLE = $E000
8 r# m) x* c+ ~ - MMC3_IRQ_ENABLE = $E001! J% h: _9 w/ L. m
- % g5 I- N; t! M1 c* D2 }1 Y: g6 C6 B
- ;==================================================6 s: d, w; _* i5 z( O
- ;程序块配置$ Z) H5 N1 ?9 F' `; b, O. j9 q" l Y
- BANK_DATA_MASK = $07
6 ?, C6 v5 h3 J& Q: B' O* } - ;--------------------------------------------------% Z9 X9 ]2 j# U
- RESET_BANK = $07$ Q; D+ I: C* U7 a/ f- [0 d7 a
- RESET_ADDR = $FC00. x7 k5 x' \0 ]3 a2 U% Q: U3 v
- 7 m# ~; C% u5 Q; N0 ^9 a8 h
- ;==================================================
6 ^- `" f( ~: V5 I - ;图像块配置# S& F V! s0 _! R9 S. R
- CHR_DATA_BANK = $08
+ M/ o" ?9 n3 S4 \9 P
" S, W: F: n: e/ J, I8 c- ;==================================================+ r6 N: Q3 u! u8 G7 {9 H0 q8 H
- ;零页内存地址配置
, P" }, j5 U I7 p8 l4 t8 H; @ - Use_Ram_Addr = $80
7 P$ t+ P$ N; k - PPU_Ctrl_Buf = Use_Ram_Addr% L7 H; q, x& V% L
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
6 S4 k- K( g" q( N! X - PPU_Scroll_H = PPU_Msak_Buf + $01- s: I& \/ n- t; |+ u) ~8 Y" D+ e
- PPU_Scroll_V = PPU_Scroll_H + $017 @( C& y$ G4 G; A$ n' P0 T
- FC_Data_L = PPU_Scroll_V + $01
: M# g/ i( _' K& ~$ }& c* i5 | - FC_Data_H = FC_Data_L + $01
/ _% y s x+ l! Z" ~8 y - FC_Data_Buf = FC_Data_H + $01
. z, c& T8 T5 k! c$ L4 |. V6 [! p - ;==================================================2 T$ v1 @! Q- D
- }8 J& E, `5 B6 O7 a+ q! B8 B
- GAMEPAD_MERGE_FLAG = $04
' O7 @7 U& @. f1 q! ?% K* M) T - % k s0 w: X7 Z7 F
- Gamepad_Keep = FC_Data_Buf + 1. h0 g' l$ ]( c* G, p5 k |1 f; p
- Gamepad_Once = Gamepad_Keep + 2& C1 c5 @5 M& M) a' l+ {2 i4 h5 d8 l
- Gamepad_Temp = Gamepad_Once + 2
4 @! ?- j3 l, J9 c$ T" b - 2 ~6 M. s. u. q% [1 k5 F
- Gamepad_0_State = Gamepad_Temp + 2 D* U* S f! i! Q8 r0 P6 E
- Gamepad_1_State = Gamepad_0_State + 1
$ X) y0 M$ F6 G6 f2 _- @9 J - Gamepad_0_Value = Gamepad_1_State + 1
/ c7 w1 I+ E7 p a% t, O - Gamepad_1_Value = Gamepad_0_Value + 1- i3 e- ^; X; ^; L
- Gamepad_Port_Value = Gamepad_1_Value + 1/ K/ g# ~* W+ @5 x
- Gamepad_Merge = Gamepad_Port_Value + 1
2 O$ j2 X# _6 p! c1 ]5 i
2 G% P* l" L+ w) [: _- ;==================================================
0 o+ U: J' w, D/ ^) p" t - IRQ_Index = Gamepad_Merge + $01& n5 R% d+ q4 V p6 a
- ;==================================================. T9 }; h h2 Z: N* v1 }
% x0 K6 J: {* Y5 d( P1 [- ;CHR图形数据
9 O( _1 t( P- t# o! k - ;==================================================
: g% q, }# U8 V( K* {" i2 h0 @ - .BANK CHR_DATA_BANK
' i" b7 Z9 Q7 h" F% V/ g/ ?' U - .INCBIN "chr_bank/chr_data.chr"7 |5 c, p# a3 r) D5 `+ j4 t
- # U# E3 V# H" _! h; b
- .BANK RESET_BANK & BANK_DATA_MASK
! I' n. R% M1 S, |6 K. s# J3 t - .ORG RESET_ADDR
3 t7 I8 J+ r; }1 ? - 8 l* D% k- y/ O- r. m
- ;--------------------------------------------------
l( G( @& ]# n0 l0 b3 B+ X - Attributes_Data
" w/ F4 \( H/ w/ e$ Y3 E3 Z% P - ;命名表属性3 s- u4 g, }& S! H; L4 [& A
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
2 P' o5 S/ _4 Z; z - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA/ h- z% w8 ^5 I5 j: g" b
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA: t, i4 t8 u1 w- D0 p/ J( M! F
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$558 p* @- m: b4 @' C$ b8 S" i u% \
- ;--------------------------------------------------+ a, _4 h2 x& C j9 i4 o
- ;调色板数据( e( C- W9 B9 \7 O
- Palette_Data
6 G, g" s. I/ ]* O! d - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
# |0 z6 S: W5 {3 x* n0 Q2 R - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
2 i; p) z/ k, l# u1 Q' y - 5 [6 s: j* x+ S0 p6 k8 ^/ r
- ;==================================================& P# m @: H5 n7 G7 I7 Y
- ;命名表初始化
% D6 S _1 o6 S, h, M7 h! b - Init_Name_Table
9 y1 G+ N% V/ a" p3 A! T' p. o - LDA #$20
2 V3 y/ f0 f, H$ V: @+ b) n - STA PPU_ADDRESS
3 F/ Z' C& v7 H& T" k7 B - LDA #$002 ~. l4 Z1 l4 l3 k. Q u
- STA PPU_ADDRESS
6 `+ F2 v4 Y$ X5 N3 I+ ^ - LDA #$00- o! Q4 k* U- l( p7 }
- LDY #$00
4 U& |# V8 i( M3 i - LDX #$10; U: Y5 E6 F, d6 D
- Init_Name_Table_Write7 x) k, N+ {, {5 n
- STA PPU_DATA1 R) ~6 M) a$ ^8 R' i% Q6 o' K
- INY) V: ^ [5 s) H5 P6 h/ w
- BNE Init_Name_Table_Write
6 O! ]# z Z( k3 M! V( O. y6 m - DEX
$ o3 j N* j1 k: ] - BNE Init_Name_Table_Write
2 C. k7 U3 v8 h6 h0 C5 @- @* o - RTS5 K" D: v" J; n: Y, d$ o' l; I
-
' g6 l J" M" T - ;==================================================
; v. X4 k+ a- g u* F - ;调色板初始化- Z/ g' G5 b9 i+ {3 \! }4 ~ `; D6 @
- Init_Palette
+ ^2 J. [/ O: P" B - BIT PPU_STATUS
% B& _ T V5 M" b5 M# { - LDA #$3F
5 |8 X' A, S* W/ t# y4 { - STA PPU_ADDRESS
9 t3 L& m8 x% v# [% ^ - LDA #$00- }/ _5 W) X' d/ _' L# H
- STA PPU_ADDRESS9 ^; B# [& _- ^& E6 n2 k
- LDX #$00
3 H. J' Z0 c2 d) z: o - Init_Palette_Write
% }, R# ~; n+ x/ o( c% }1 H0 j+ s - LDA Palette_Data,X5 {6 r& g5 ^: l- L' Y: Q
- STA PPU_DATA @$ |) M9 l# ?4 S5 T
- INX
! J! H3 {4 _# ?, F2 z6 C5 M - CPX #$20
& g+ i4 q9 [. ?0 g( R% ?: C - BCC Init_Palette_Write5 g7 f/ u( f* k7 T9 U
- RTS
, y8 ?' U1 M! }, R) v% p -
9 }. x* J1 y( T1 [4 m - ;==================================================
, ^5 _1 Z; Z4 J - ;设置命名表属性
4 ~$ [2 u9 ~! {! I( J- p - Init_NameTable_Attributes. i: N/ C# s7 N, |, m# m) H
- BIT PPU_STATUS/ H7 Q3 l8 d& |' S- x0 b6 p7 p6 R
- LDA #$23! s9 r. e4 N' w
- STA PPU_ADDRESS
, ^& G6 c! \9 }6 U/ s5 q - LDA #$C0! \9 h i5 U( y4 X$ h" B: M! t/ L
- STA PPU_ADDRESS2 m7 l' L" r2 N0 v
- LDX #$00) P. v) ^5 O3 |+ V8 a* r
- Init_NameTable_Attributes_Write2 `( V) s& S6 h9 t
- LDA Attributes_Data,X, @9 m1 F1 P( u; V
- STA PPU_DATA
$ Y$ h& Y& ?% I$ @6 ^) d. c - INX
4 n1 h1 d) Q+ _# f - CPX #$40 M& }" f: @7 m' Q& B! E1 V0 v I
- BCC Init_NameTable_Attributes_Write* _/ {5 v- N7 d+ _- _% H+ X% }6 X1 X( X
- RTS
- }" ]1 T& S# O @ - - b; G8 {8 ^( O
- ;==================================================
$ m( c$ {, v3 S3 m - ;初始化命名表文本! |0 I* ]" T- b+ y, H
- Init_Name_Table_Text* p' u' z$ o7 v/ e8 u* M0 c g5 q
- BIT PPU_STATUS
# q* l/ L$ G5 i( C; @5 t - LDA #$20
: R6 s$ v( H/ N - STA PPU_ADDRESS
E* p6 X- a7 y. V - LDA #$005 _ i; d- N: n1 ~* q% n
- STA PPU_ADDRESS d- x' Q% x; T- y! S8 g0 _
- LDA #$00
. o% U7 W9 v) M. }5 S - STA FC_Data_Buf" D* l* K2 s( l: q+ a2 q6 B6 k9 C
- LDY #303 \/ \* T' o" @! p$ d# e
- Init_Name_Table_Text_Write3 L6 w( s$ \, s7 L- ^
- LDX #32
+ r; H8 U, F# g - Init_Name_Table_Text_Write_Char+ O: ^% J; @% ]7 G5 i4 k' u( x- }' u
- LDA #'0'4 ~& ~* v5 }5 A7 @3 z8 |
- CLC* d |) G) j* i4 _$ n
- ADC FC_Data_Buf: y0 }2 _9 ]( ^' d# @
- STA PPU_DATA
" h2 D+ T9 Z4 l$ L e/ z; J* i5 k - DEX9 M* w7 t ~& z
- LDA #$14
/ Y* d6 g5 G) i# Z* o9 d6 b5 C# m4 _1 g1 [ - STA PPU_DATA
6 I0 F' g6 ^7 T7 c4 w - DEX: ?2 g! j' ?/ n% N. ]2 i8 V d0 b
- BNE Init_Name_Table_Text_Write_Char, O, f2 ]. s t( w0 i% ]. H: C
- INC FC_Data_Buf1 u9 S. H1 T% b1 z& v3 b
- DEY
6 n1 j0 J* v" a7 }# I% J9 J0 ^ - BNE Init_Name_Table_Text_Write' f9 C2 W; F9 v3 I3 O
- RTS! Z0 p' x( A& T4 }) V0 D' S
- - d, v$ K2 I: E P/ E& ]
- ;==============================. ~6 S4 d: R/ S' e: h4 o
- Init_OAM_Ram;初始化精灵内存# h" k0 u" l- f* _" C$ }0 e$ V0 e
- LDX #$006 v N2 B* A( w& g" X
- LDA #$00: ?6 x( l: }! i! V1 ?
- STA PPU_OAM_ADDR
, K, ?) [( k3 a - LDA #$F8+ ]5 ]4 W- ~% d+ q+ M1 Q, M
- Init_OAM_Ram_Write
) e$ O' s2 }7 ~3 |- F9 {& S - STA PPU_OAM_DATA
8 Q( L5 F* u. q' Z - INX
& C, z. E. y, s0 r - BNE Init_OAM_Ram_Write5 }) Z: J! R$ `, b3 ]# G: j# ]
- RTS
8 W( u0 l2 q& W0 j$ w7 {) r% s - , R+ Z- O6 Q J* Q+ @7 i. @8 T
- GamepadProcess;手柄处理- ~: @8 E# u$ k) W7 B4 e
- JSR GamepadDatacan d+ Z# @" O5 e0 V* z, L3 ?+ k
- LDA <Gamepad_0_Value
0 o0 g2 n3 y0 W3 X; V! D - STA <Gamepad_0_State
- ^1 B6 M, M/ d- T4 c9 R! P - LDA <Gamepad_1_Value
) R" N; I& y) A( N# X' m - STA <Gamepad_1_State' {- r4 ~5 m& ^; [& k" l
- JSR GamepadDatacan% x4 {- l- \9 G
- LDX #$01
& j' ?- `; ]" ]4 x( Z2 ^ - GamepadMergeCheck;合并手柄输入检查+ @! O6 z8 @& n' w" ^
- LDA <Gamepad_0_Value,X/ m. ~/ C% V9 Q8 s2 h
- CMP <Gamepad_0_State,X
9 E( `- t' \6 t, X) X - BEQ GamepadMergeInput7 ?$ R5 _. X$ \
- LDA <Gamepad_Temp,X/ t+ n& s7 g* z8 c A4 J7 u6 k
- STA <Gamepad_0_Value,X: G1 f5 ]: A) }! u9 j
- GamepadMergeInput;合并手柄输入
# n2 N. j8 n9 S; ]0 [7 b+ _ - DEX Y8 L% B5 Z: i7 j- g0 ]
- BPL GamepadMergeCheck
, q4 b' Z/ y4 Z" e' i6 P% N/ A0 F - LDA <Gamepad_Merge& s, |7 P! }. }9 s, M9 M- D
- AND #GAMEPAD_MERGE_FLAG
7 |/ O. P& o Y - BNE GamepadStateProcess" i `% A7 e3 f- j1 F, }, _+ P8 n
- LDA <Gamepad_0_Value6 l& r4 x6 D& C. ~* U+ }
- ORA <Gamepad_1_Value+ Y4 f' L, u5 N! s$ k i+ T2 ^; T
- STA <Gamepad_0_Value+ ~- y: ?8 t# q: E6 ~4 f' R
- GamepadStateProcess;手柄状态处理 G1 p& W& [- h9 y5 h6 e% m7 S* C
- LDX #$01' | a" }2 M. q# z" r9 N
- GamepadStateSave;手柄状态保存% i9 E7 W( Z( l% h
- LDA <Gamepad_0_Value,X
3 ]. W. [5 e& ?: p1 H: a( F5 M - TAY m! S$ z9 i% w, @
- EOR <Gamepad_Temp,X& q/ A) {8 z$ E, G3 \5 o+ b
- AND <Gamepad_0_Value,X
" B0 @! C# J) x z( u7 I5 \4 x+ V - STA <Gamepad_Once,X7 j+ N B* j8 ?/ e1 y
- STY <Gamepad_Keep,X8 w* N% K/ [& R2 I" q# D8 `
- STY <Gamepad_Temp,X
8 b1 @, {5 [$ N1 i$ ]6 C - DEX
( u/ z9 k, M, @* C+ _. N1 O7 H - BPL GamepadStateSave' |8 B" J# r$ L3 N2 f: ]8 ^2 Y
- RTS
' `- X% k! S$ j) k
0 o- V- _1 u9 X7 [6 o- GamepadDatacan;手柄数据扫描% p! }0 w& m9 R0 U6 h6 o
- LDX #$01* v5 i/ ?4 b* \. ?3 v
- STX $4016
; _ H2 P: |) Y3 t/ u) ]6 V - DEX, a% t( ~5 z" `8 ?# X! z6 U# u
- STX $4016
2 G/ q1 M! `# v. ~! M+ M - LDY #$08% x. G) T1 F; {9 D: `: {
- GamepadPortScan;手柄端口扫描% v: C+ W1 q4 _/ `4 k7 c9 ]
- LDA $4016
" X6 W5 o4 D: C$ H) _ {3 [6 |$ O1 V - STA <Gamepad_Port_Value4 ~$ V1 N1 G% W( D5 K0 A4 {* f. P
- LSR A
7 w3 Q/ q: T( }$ I$ s - ORA <Gamepad_Port_Value2 G3 A, L4 D0 e! r
- LSR A- ~2 ^) f% B- k$ Z2 q" q
- ROL <Gamepad_0_Value- V' K5 P. q) O8 q( `. S
- LDA $4017
, S. D8 K0 p/ B3 g! ^! O - STA <Gamepad_Port_Value( N& Q, k" F& H" J# S7 f) B3 M
- LSR A' v* V1 e6 k' V" T7 `+ b
- ORA <Gamepad_Port_Value$ g7 {- ?2 O; w" L0 w9 z
- LSR A; Z8 F# C( z5 H. J+ V( z. i
- ROL <Gamepad_1_Value/ x1 }9 t. y1 O! m/ D
- DEY; U8 X9 G: N t1 M) y3 U% [- x
- BNE GamepadPortScan& \+ S9 U! j8 A) E) M" b! |
- RTS1 o9 D3 Z2 x$ U6 D
-
9 S$ }% p, X, L9 J9 n8 I3 }7 z& [: k - ;==================================================
! M6 A9 [; }. d/ z$ C - ;PPU处理2 p- D7 F% p$ `3 y5 ~ T, F& S7 X
- PPU_Process1 Q( k2 N9 _, t( p# {
- LDA #$00' g" F# l4 b! H( X$ S+ @3 g
- STA PPU_MASK: v2 f9 I, |. {& Q b
-
5 O/ m0 J$ ^9 {% w' ~8 C5 h - BIT PPU_STATUS
0 D2 J$ c* I3 f8 @: f7 `5 f - LDA #$20
1 F% w* c/ V0 M4 g: S9 A - STA PPU_ADDRESS
( z( i& p. l7 f/ B5 o% X3 P9 H - LDA #$00
( J J/ _, W- S" f8 ]8 ]7 _; X - STA PPU_ADDRESS
/ m4 N0 V4 }. f4 y3 |+ f- { -
9 E7 _. y. e6 w0 p! ` - STA PPU_SCROLL
" B' N, ~! |: E; E - STA PPU_SCROLL0 p, r$ f1 R: v$ {% k" ?8 r
-
2 ?/ u. @) K" a$ U9 d, U ? - LDA PPU_Msak_Buf
) c3 {7 L& }* O$ O, W( \; k5 R" R* K - STA PPU_MASK; A8 L1 Y# L4 |) a
- & H: i( R; V/ c4 F
- RTS0 n" M* s% s% t5 J+ @2 e
- 0 m# ?6 Q; `2 M1 ?( x1 m. T
- ;==============================
. ]( W3 n. t6 J' _: [/ e - Time_For_Vblank;延时等待4 K/ H3 ]- ~7 ]9 v
- LDA PPU_STATUS& p" w" ]9 Y" L
- BPL Time_For_Vblank
9 N( y) b- o4 m5 d+ L. O7 I - RTS
8 Q& h7 D X9 f" T$ r -
5 m, ~$ L% p2 S, U - ;==================================================- Z+ {4 O1 ^0 Q
- ;初始化MMC3% R( R- U) q4 I( d; _
- Init_MMC30 g" H1 G& D9 j6 \1 M: o: Y! M
- STA MMC3_IRQ_DISABLE1 H( f9 f- F6 @, }9 G% a' ]( a- f
- " l% W s1 f9 k
- ;设置MMC3水平镜像
8 _- E& ?. U1 i - LDA #$01
# \2 v+ d# I/ Z- a/ c - STA MMC3_MIRRORING6 N2 E( _* s& I- L0 {
- , i+ p, D7 }/ [& H+ I2 R
- LDX #$05) d" P" F5 n& Z- ~9 S3 p9 F" B
- Init_MMC3_Chr_Bank_Write0 p9 j$ m' U% W+ s: w$ [
- STX MMC3_BANK_CTRL/ s+ m8 {: ]6 k. e) N
- LDA MMC3_Chr_Bank_Data,X4 `! F8 O3 ?" n2 H- e5 q
- STA MMC3_BANK_DATA
8 h3 ]# k3 l3 ]. ^' q3 ] - DEX/ _0 \& s7 }8 T
- BPL Init_MMC3_Chr_Bank_Write& I2 E7 U, z9 h: j1 u: B
- RTS
2 t2 W) q( N7 @# x: U, Q8 d) r - ;--------------------------------------------------1 K+ E8 R0 D- N
- MMC3_Chr_Bank_Data9 i* q" U' C3 t& V
- .DB $00,$02,$04,$05,$06,$079 e, k3 z: u. G) x2 Z
- ' E, H x, }9 m& M0 B' T
- ;==================================================
: ]6 K% H4 E r, P - ;重置中断处理
! w e( x5 N6 h5 B& T - ResetProgram
1 A) i( ?) z: o( j* V& L - SEI6 W9 \2 S! g+ {2 L# p9 U
- CLD3 [8 p6 ~$ l( z# i8 n! w
- LDA #$00
9 d4 q7 [% p1 G6 n4 F9 Z - STA PPU_CTRL" \6 ?; Z: a+ g- N: Q
- STA PPU_MASK; K: I! F/ S: H3 w+ G5 N2 j
- STA PPU_STATUS4 A$ F3 @7 w9 ]0 ~
- STA JOY2_FRAME
, g ]! y7 w' u: e - STA APU_STATUS
0 Z, `4 O/ X& ]+ z. I0 B - 9 ]# v2 ~- k/ {4 ^, x. c/ O0 ?
- LDA #$C0/ \9 n; _ [% a5 l5 B5 Y' L" u
- STA JOY2_FRAME
# d& [+ T! y U - : |7 e2 A' b& o, Z# q' x
- ;等待vblank
9 V- r) H5 j$ L - LDX #$02& \4 x C: I! P: i
- Vblank_Wait_1
* y8 j# e4 @! `( N& O) M% h - BIT PPU_STATUS
j# f; k. p& M8 v) |- S - BPL Vblank_Wait_1! Q9 K7 i8 t2 W3 y/ r
- Vblank_Wait_2* ~6 q: z8 o% p4 R4 s: a
- BIT PPU_STATUS
, C7 }& o5 M/ F! D5 k6 s - BMI Vblank_Wait_2. L5 p& B: h6 X4 [5 K( y2 I
- DEX/ g$ I- q& h: [' {3 i
- BNE Vblank_Wait_1
0 B7 C$ K3 `7 _5 C+ `, s9 Z- i -
$ I1 `9 x/ f1 u" }3 c% ? Y4 n p - LDX #$FF o2 ^, D: m5 p0 J2 T% I+ M1 o$ x
- TXS) c, M$ k# }# m% n0 R: f
- : f8 B! p e7 x. \1 O( p
- ;初始化MMC3/ u; B5 B, H$ s$ g: p) [9 j
- JSR Init_MMC3
3 E+ e0 A4 Z8 ` - - U& M3 n! ^& l, N7 f) j+ r/ Y
- ;==============================
G- V) T* X8 }1 H$ l - ;RAM初始化* A4 H- g' R# _) @ F0 j
- Nes_Ram_Init1 t q, S4 H( h" ]
- LDY #$00
5 ?7 H2 c+ D; N/ a - LDX #$08. A" P V2 _& I; L
- LDA #$00: y8 q4 m) N& p" ]# v+ b
- STA <$006 U# Y4 e0 u% S2 Z
- STA <$01
; \- `, ]4 e8 y- U - Nes_Ram_Init_Write
: e9 I& R+ Q: ]1 w2 N - STA [$00],Y
: s: k$ f1 Y# k - INY
5 a# K9 ^- G( M' C Q& V - BNE Nes_Ram_Init_Write p5 ]: j, w' ^' z/ s( z' {
- INC <$01
' n+ b& W" b9 ^) K - DEX
1 @* k, r; e+ s: h# k% v1 Z - BNE Nes_Ram_Init_Write( v7 @8 H' Q7 K( e- }6 g
-
a- p' Q; a" Z1 b5 B6 p8 E - ;初始化命名表% U0 v( @7 e( D9 N+ z) Z
- JSR Init_Name_Table6 W% i* `* s# b0 I1 S' o Q/ ?, S
- & B9 s' u- l$ d9 }( Y8 q( o6 R, I
- ;初始化调色板
. C/ _( }: s) V - JSR Init_Palette
) v1 y) Z; {. @- |# l9 N -
( U9 C @, N+ p! Y1 @ - ;初始化命名表属性
% v3 H7 _, @0 F9 ]7 [$ X8 K d: ~ - JSR Init_NameTable_Attributes
_) ]4 i! b7 q" f# B D -
( Y) P4 U; ^3 \) b" ~7 } - ;初始化精灵内存
0 H) t; x, h+ b% Z - JSR Init_OAM_Ram8 F) n7 X, j" |! N) u. ]& i
-
( |2 t# t$ c- s( s8 H - ;在屏幕上写点东西1 q' o, A. _4 t2 t! v; R
- JSR Init_Name_Table_Text
( L5 u: c1 | c - 3 [! X2 H! b, a4 J
- JSR Time_For_Vblank
4 m) t1 U! R8 i+ K - ;开启PPU控制
' y: `! t& _2 ?- M* p - LDA #$A83 A, J4 x7 w- l% E+ P
- STA PPU_Ctrl_Buf# t& w2 I: `$ Z; A7 B- N7 y# }
- STA PPU_CTRL
. k& a+ N# L& N6 d0 z, w- C -
% X2 A" D5 a0 m( L: ?9 | - ;开启PPU显示
! s2 e, E% u7 L$ h: } - LDA #$1E
, f2 V" y- O* s! w G# u) S - STA PPU_Msak_Buf P3 q2 `8 C5 M& ?0 F+ U! j" n+ |
-
; I' F4 r; @2 V3 h' [8 i, O3 q - CLI% A' T8 P3 M# G6 t9 H! p; P4 ?/ Q
- JMP Loop" [- ~1 R8 q7 ?- Y9 m
-
9 O4 R" i/ b. M B - ;==============================
! b) c$ t) ^+ X/ n. N7 b; ~ - ;死循环, 等待NMI中断- D( y4 x8 u0 ~
- Loop
, S! L1 u2 m+ S; M) F - JMP Loop! h* ]+ X! x$ B# ]& A, r3 O- m
- + K |- p/ u1 p, }- U# T' n9 C
- ;==================================================: A# L' D W* I# l, L* {& y
- ;NMI中断处理; {6 ]! }' ^. H# X- m: b0 t
- NmiProgram! ]4 k5 S; V; @; Y: Y6 e) C; K. O
- PHA) {1 \& c8 K9 T! t/ G l; T
- TXA
6 O% n8 R; H: m8 A" g" ^4 _& P/ K - PHA/ \) ~) z# x2 \- P; v- _- _, z
- TYA
- o! z# ^7 p/ [ - PHA n$ y( v7 p! K9 U
-
% d( X% @. K5 ]3 m, @; \ - BIT PPU_STATUS
' f3 b$ V. }" r X+ ~# V5 O -
* t; ]$ L! d7 n2 O# O1 k - ;关闭PPU控制
. W. m6 V ~ m$ e& {$ E; z - LDA #$00
" y0 l8 V2 C' V# ~ - STA PPU_CTRL2 q' l2 A5 {9 ]
-
( g6 u1 l& i; t5 l. w - ;处理PPU
, O5 H; F7 l# U$ V6 R - JSR PPU_Process
5 t6 R, c6 K; p, f - ; s5 t3 O# k' W7 y: r
- ;开启PPU控制
; i3 M; t$ _- P5 i: d$ @ - LDA PPU_Ctrl_Buf
A1 O( U8 c8 x, t - STA PPU_CTRL/ S* H' p) w/ M- k2 O7 y
-
% ~7 v" t0 I8 X5 m6 p3 L) R2 o- P - ;手柄处理
I+ a3 i3 x/ @0 c - JSR GamepadProcess7 E- P! ^5 R7 E( L, C
-
- o. D# `4 _# f d5 @ - LDA #$00
, A' ^* a; X- y* w+ _$ p - STA IRQ_Index
9 L! w2 R w8 y( x& c- t8 K - ) ^& E, D: ?$ x O% h" h
- ;启动IRQ中断, 第15条扫描线触发
+ {' P A( F$ J* L1 I' h - LDA #15 + 1
8 ?6 ]$ `" H5 j* N# e - STA MMC3_IRQ_LATCH \. s6 w- r% j7 B% K; k& L3 _
- STA MMC3_IRQ_RELOAD+ I6 W- B1 N$ P8 w) D4 w
- STA MMC3_IRQ_ENABLE+ p, r- _- V0 r3 p; t
- CLI
1 g v/ J" L! N5 t# B& @1 j3 I - & b9 H" z+ @( G2 d
- PLA
" N+ k; s: h6 J; O) r7 y" R, l - TAY( v! N" b& ?9 q2 m8 Q
- PLA
4 O& @% a* r. b' f0 o, Z; I. z - TAX
0 L7 e* o \' _8 i8 w" f4 g' m2 D& y$ p. M% D - PLA' {$ t4 F8 i# K, T; Y0 j) l
- RTI
) i R) r" t8 E7 D7 T3 [
9 g3 J% T5 B9 w9 e6 E% h- ;==================================================
* b, n5 h; s3 b) F- p0 p - ;IRQ中断处理
' f/ _2 W. q! F& {6 {$ g* i - IrqProgram. V; v0 p( y( c! P0 @( F2 y
- PHA
9 \2 q7 f5 P9 z( n! j' Q e - TXA
! m9 ~2 q. z5 s Y( U9 Y. D - PHA
1 P" H& z: k4 N# D* b% ~# V% k: G - TYA
+ ^3 J* f$ y0 N - PHA' o3 c& O% E! i$ J: |* @! X0 y
-
$ Q# V/ K( m( b" y - ;关闭IRQ
" `: m! r8 K) S1 i - STA MMC3_IRQ_DISABLE
' J" _: |1 |. y! V -
/ c' o) D; X, u& c - ;允许下个IRQ触发
9 _; ?+ E l5 ^/ ? - STA MMC3_IRQ_ENABLE+ k& n: ~ {' D8 W8 Z E
- - O- V# u) K6 S! }- R
- ;IRQ处理, 15线后继续触发' K9 y9 W1 F3 _ ?
- LDA #15% k8 w5 p9 `# w2 W) a
- STA MMC3_IRQ_LATCH
% I E! V1 E7 @0 u( M6 j" p9 ?: h7 y -
" |; `# i3 x3 ]: `% S2 P - LDA <IRQ_Index4 i0 O1 F4 i7 x& H( M
- BNE * + 4) W2 U8 m/ l- y* }
- INC <PPU_Scroll_H8 m9 p9 b6 H" q' l# T% [7 N& o8 F1 V3 G
- " }$ u6 q6 z3 F c8 w
- ;设置屏幕滚动
1 ?( ^' C2 u& u* f8 T8 S. L5 R - LDA <IRQ_Index
D4 O. B& k, j& @ - AND #$01
0 a/ t: l5 _) h \' E/ b" x - BEQ Irq_Scroll_Right( w$ Z+ C) r. p! b6 X: I. [4 _" l8 Q
- / G2 B0 Z1 L# [' H7 m: `5 C
- Irq_Scroll_Left
2 S/ P1 i5 R( _4 W - BIT PPU_STATUS6 i3 @1 }4 h$ q# u4 o! i
- LDA <PPU_Scroll_H
$ h! e% D* s$ F% } - STA PPU_SCROLL0 K, t8 K! Q5 ^( K9 A4 Z5 A
- STA PPU_SCROLL: A4 ~. F# x; D" W
- JMP Irq_Scroll_Over
" g8 t/ h# L* K) w - 0 d/ Z1 a; C) }1 K% q4 E& o
- Irq_Scroll_Right7 ] j' e$ z+ T% F
- SEC8 S5 r; m% W: C; Y. E
- SBC <PPU_Scroll_H6 t' i* \, Q; c/ Z$ Z" @0 ]5 H
- STA PPU_SCROLL) a- h/ K2 @( B+ ^4 [
- STA PPU_SCROLL
5 @6 h6 u4 @4 B) X" c8 q8 V - Irq_Scroll_Over+ \2 g5 O+ Y! n ?
-
" o0 M0 R$ D# n' ^/ t) m& A3 h N - INC <IRQ_Index
3 l# r# B7 c' K9 O1 Q3 Y - 3 `4 w5 _* [7 O" f, D+ b0 C4 V
- LDA <IRQ_Index2 x- {/ O0 o% O x# }2 d1 M. B
- CMP #14
1 P, l& B* Z( N4 [ - BCC * + 5* U7 A) W) _, m/ {
- ;关闭IRQ, s% A# V- s; z( [ ^4 f# k: Q
- STA MMC3_IRQ_DISABLE" Z+ _0 m9 J4 X. \' K
-
4 K8 N- [2 Q4 u1 e' c$ P+ }( ^ - IrqProgramEnd
/ J# o% X4 K) F - PLA
$ a2 J2 O( R! i C6 w! a5 K - TAY
8 {" _- \( ^, V; q- v* T) p- x - PLA
' E# P- {- a& r- x$ H - TAX
4 f! B9 T' e" J* @% J7 u. R - PLA, G1 h+ ^% Z# [7 j0 B; g/ N" H0 w% M
- RTI- O2 J& l j# D; w$ x: T
- 9 s0 L7 g* Y% \1 U/ N# E: N* h8 `
- ;==================================================& d+ u3 {% T2 Y/ p5 X+ s r
- ;中断表
! c* y, N: J3 a5 r* ^' b: c9 ^( \ - .ORG $FFFA0 d; W5 s7 J+ t6 q4 @. C! |9 K6 I
- .WORD NmiProgram
* }" W* I* A [) ] - .WORD ResetProgram
! ^9 h2 p2 \ K9 g - .WORD IrqProgram
复制代码 [/code] f% f7 X I- B, S% [ j4 J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|