|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
3 K/ ?6 \' D, P; ` K . `2 o1 U0 \ S
以下是主框架代码:
$ @( f4 o7 i6 b$ f% m/ m& X5 a- ;======================================================================' {' [2 h* W+ ~- |$ e* ]9 p
- ;文件头' l( G! d2 [/ [/ T- O9 w
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量8 ~ K$ M: t3 p
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
8 g$ D! A6 H) U - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码: ]1 j( a3 c& l( p9 \
- ;======================================================================
! B* L' u0 @6 j4 I* V2 s5 o+ p% @ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 21 W. ^8 y e/ c8 G D% K1 k1 c
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
, d2 v# T$ x) L* i% l( k# i; s2 m - ;====================================================================== M" N( v- V+ M7 w% ^
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1) y1 q8 v7 _* i' x
- RESET_ADDR = $E000 ;主程序起始地址" L" b* a) ]& P0 a5 ^, C2 D) r5 J
- ;======================================================================! v! ?% N' I4 u& e* Y* H8 X( g3 h
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB9 {0 Q* Y/ V9 h( f/ k# d
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 Y p3 f$ Y2 K; _; T" ~ - .INESMAP 4 ;Mapper号 (0-4095)
$ d2 E' w9 ~% e - .INESSUBMAP 0 ;子Mapper号 (0-15): o r6 j* T! c# E* a6 y% L
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)8 k$ Q6 D j+ Q- E# A9 [
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( K3 p2 z4 q! y0 Q: Z - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数); c6 O. n# @" G: W4 S: T$ Q7 M5 D$ C
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)0 T" U+ ]+ j ~( `6 P, t
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 T `% x% P) h) U5 C
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)% Y, `, o! B, {1 ~1 _
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
* }6 T5 d: R/ \" K6 J+ ? - ;======================================================================
+ G& G* q! F6 z - .INCLUDE "fc_demo_config.asm" ;全局配置
2 Y. U6 V; r) N/ \7 x% ^. m1 m o - .INCLUDE "fc_demo_constant.asm" ;NES常量$ \: q5 S1 h7 B6 h# L/ M' C
- ;======================================================================% X* z, k2 c8 k9 j; I2 k) X/ y
- ;音乐配置
5 ^7 W5 c) K& o7 K& L - .IF 0 = MUSIC_THEME " C* `$ C) C% B& b) s. T
- .INCLUDE "data/music/Gremlin 2/config.asm"8 ^% O( E% Y( g5 D; }, m
- .ENDIF; O/ ?: Q* F6 J; o3 c5 o
- e7 l5 T+ i3 _# P
- .IF 1 = MUSIC_THEME8 P2 g1 V. v A& I: q
- .INCLUDE "data/music/Raf World/config.asm"
2 a- a+ G9 ~* U$ q |; s8 g. C: [" G - .ENDIF
) b- B# t& \9 o- R - 3 V8 u+ C5 ~/ c% \# v! F
- .IF 2 = MUSIC_THEME # a8 n4 V$ s+ @% @; ]! M5 T9 b
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
* w' w; |: f2 F8 Z: F0 ~2 z. ^8 L1 o( @ - .ENDIF: C& O5 _' Q& Q/ g: L
- * L3 `3 K$ P& m# U% O l# \
- ;======================================================================
8 S1 z6 X$ O& A; r' U. p - ;引用CHR图像数据7 d, F$ W! Z8 ]- B
- .BANK NES_16KB_PRG_SIZE * 2
. R% I+ C" ]1 A - .ORG $0000% o7 z4 I% _; v7 V9 @/ g. @
- .INCBIN "data/bkg.chr"( d# |: Z. w L- q
- .INCBIN "data/sp.chr"$ l' _' r/ \" K# ~. v* J
- \2 u6 n/ K4 W( ?. M+ ?: f4 e$ H
- ;====================================================================== w2 ?+ m; V1 t' {9 l2 B6 }
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
" b# x4 f; y- t, E v - .ORG RESET_ADDR( V# G/ v; w& H5 P7 [+ W2 L
- ;======================================================================
) F4 M/ L r" ? - ;引用其他源文件
6 b4 S6 H& D6 [8 g- I3 O8 q- q - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
% L9 l& ^! f4 R - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理# g8 u, s, L' u& O: x" }
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
( m( d0 ^/ ], E9 `/ h - ;======================================================================
6 H- u& }4 F9 X r. V7 B - 3 D8 W5 r# V$ X/ \- V' M2 c5 c' L
- ;======================================================================
8 y- i1 g3 y& c8 f - ;等待VBlank到来
# Y, ^' B* l8 u/ Y - Wait_For_VBlank
E( v0 s0 V2 I8 [- Y% F - LDA PPU_STATUS% E! J; E$ z9 k: P2 M+ Y9 `: m
- BPL Wait_For_VBlank
- {4 O+ P) O% Z9 t' l5 e6 N - RTS3 [4 W$ L5 {* t4 U$ R' ^
- ( V2 U! h* D" d$ W9 O4 i5 ^
- ;======================================================================5 I3 q" F: p- E
- ;调色板初始化
4 U0 B ?% T3 ^4 _. E( s \: N. d - Palette_Init4 ?! `: h) @- `- S4 R5 H. T2 Q
- LDA #$3F
( H6 Z5 o h$ X {, j: Q - STA PPU_ADDRESS
8 q" w+ T# I% g0 g - LDA #$008 ^+ b! O S) O
- STA PPU_ADDRESS
* D- I8 B5 W0 s& r- p3 }" q - LDX #$00
- M9 Y6 u$ z) [' O% ~ - LDY #$20* b) [ @" g% @/ A/ w* L3 I
- .Write_Data# s% [8 R: @' j6 S/ N: g2 s
- LDA Palette_Data,X# |+ D( k0 x6 x- v( n% r9 \; R$ r
- STA FC_PPU_Pal_Addr,X
! _5 s8 u% x: ^) ? - INX: u3 T- x9 v3 |7 e
- DEY2 v3 }4 p! v$ Y5 B) y) a! R
- BNE .Write_Data$ f! Q6 `6 V U# w
- .End" f: {0 X1 ?" H5 }9 f$ a; a: N
- RTS
& x6 x6 d' ]; f' {9 k! J7 j - 0 v' l' \9 w# o& f
- ;----------------------------------------
7 D7 R7 d4 t3 C* z! a$ a# V9 J' ` - ;调色板数据
4 z) t) `2 D8 N; r. ?3 i% h - Palette_Data
2 ~% E3 I5 P+ H$ }* | - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) h& U$ R& c0 ]3 ^) J- B% }: g - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 F6 u+ X$ `& ~3 d - ( z; t' i) _- b5 Y5 y2 o
- ;======================================================================) v7 b5 F8 p9 a' ~
- ;命名表清空
# j; e% L8 e; U+ d ]1 R* q - Nametable_Clear* y4 @$ z+ O3 p J. f1 [
- LDA #$20
. r- b6 P# H. h. I1 i7 p$ h - STA PPU_ADDRESS* j+ A& s* h! b0 v1 z# O3 O$ X
- LDA #$00
% p' m$ }7 F5 Q' g9 {/ T' v+ Q& Y' _ - STA PPU_ADDRESS7 p/ `7 O$ `6 d% m
- LDA #$00
5 M8 Z! e3 U& h6 X - LDX #$00, }* T9 E$ k) }% P! P
- LDY #$08
X1 s7 x8 f( V4 W; ~+ v - .Write_Data
% y( O+ |0 m# K1 E+ @; q/ C - STA PPU_DATA
' R" y; s" f: k0 O$ t - INX
* W1 m& J; Q# j - BNE .Write_Data! K( z& y- b8 s4 I9 a) {/ j
- DEY
* r9 D" S6 r5 n' z! ^/ G$ Y - BNE .Write_Data" z8 F$ L5 `1 j' Z, ~
- .End
) z7 j) v+ X8 D6 W- B - RTS
1 e) b6 C" s& }4 s; | - % v& ~" \ @9 g2 Q) X: [$ F
- ;======================================================================; C, }3 F$ x5 f# G& v6 ~
- ;音乐曲目切换* t, f# X* i/ h4 {) D
- Music_Select_Process! Z9 T% y5 z; y# n
- ( F' a! h( p/ k+ e" _5 P
- .Pre_Music;上一曲; S! f( r/ O7 k; Z6 x, I: T
- LDA FC_Gamepad_Once+ R( g+ i& {! I
- CMP #JOY_KEY_LEFT
3 l u: N) j6 g) z+ U - BNE .Next_Music
- a2 o8 J0 K4 M' M( c - JSR Music_Play_Pre
/ r7 A+ ^/ y$ m+ C) m& Z - .Next_Music;下一曲" R( Q) ^) V! a
- LDA FC_Gamepad_Once
) ~2 _( s! v/ x5 t9 d6 J - CMP #JOY_KEY_RIGHT2 V% K5 |2 y* {# v; \0 Q1 y0 a' W& c
- BNE .Next_10_Music ?- z6 P5 ^9 w. c$ [
- JSR Music_Play_Next
1 O7 J' W- i" [4 V - .Next_10_Music;上10曲
, Y5 O& U5 n$ P: _- F+ S) [% [1 O - LDA FC_Gamepad_Once
7 R9 {( a! \" b t" [: J, k: G - CMP #JOY_KEY_UP
/ m+ z7 x" S- W - BNE .Pre_10_Music
- Z( h6 o2 I: V4 c" ^ - JSR Music_Play_Next_10
/ g$ o7 P9 @+ @ h; g& t - .Pre_10_Music;下10曲/ L1 E7 E# b5 I: L
- LDA FC_Gamepad_Once$ `, r; U' C0 B3 q
- CMP #JOY_KEY_DOWN4 e8 u* c$ i, w$ D7 Q- G, h3 S
- BNE .Reset* j. {& w- N# s F8 D: h. v
- JSR Music_Play_Pre_101 D; X3 s; |# N3 k4 x1 V+ w# [
- .Reset;重播当前曲目$ [+ p' f4 J" O
- LDA FC_Gamepad_Once, I. v+ y& Q' j
- CMP #JOY_KEY_START1 ~' m+ a- j" N8 N. M
- BNE .End9 m+ J4 U# L' X; C$ [* {
- LDA FC_Music_Index
: K' u5 P+ M8 y% I8 l& o, d# Z - JSR Music_Init_Process
# e; y' e8 h1 B9 H" Y - .End
9 C4 B) t; S2 K3 Z( r - RTS7 g( v+ q o: L; o( q6 m$ b* G5 d
- S$ A# x$ e2 C6 r4 \! B# V& z- ;----------------------------------------------------------------------
" t2 j# P3 M2 b- r, ^% M) k l - ;播放上一曲
) t& Q! U# o+ v/ }1 t5 r" Z - Music_Play_Pre
) ^0 r8 L7 i. y, [) v - LDA FC_Music_Index7 L" @4 _5 m9 P0 `5 ^
- BEQ .End: N8 T( M& f! i- g/ J
- DEC FC_Music_Index- m. @! c7 `3 Z6 u) v! }
- LDA FC_Music_Index# W1 {, B' C. _ |1 m3 b
- JSR Music_Init_Process
" P) g: X/ U5 S+ @% e; x - .End
8 _4 S7 S/ R- F y' e0 |- r# R - RTS. O" o( C; a7 o( ~( F
- ;----------------------------------------------------------------------4 Q% _$ |1 e9 v
- ;播放下一曲
- l9 a0 I% R( f. `' t5 w/ W& q n - Music_Play_Next
/ i- M4 S' x7 h - LDA FC_Music_Index& x( K% D" R7 H2 D m- `& E
- CMP FC_Music_Max_Index/ G3 L! b1 L# Q8 y; A% T) m
- BCS .End
0 E2 A/ b# e; N - INC FC_Music_Index) R* T# a0 y! Y: Q5 H3 P1 \- d
- LDA FC_Music_Index
: a/ M" Q+ @$ c% Z - JSR Music_Init_Process7 ^2 x$ ~/ g$ z4 `. Q0 h( z4 t, O' Z! C
- .End3 m' c! T6 W: T1 y3 ~
- RTS
- X; } U! t. \( H6 u8 o' D( S - 6 j" Z% }. s/ D* C L4 X/ e
- ;----------------------------------------------------------------------% v7 F3 y% m( t0 G8 c( a4 d
- ;播放上10曲
2 a, q; c T( L6 Y# Q/ `0 [; ~ - Music_Play_Pre_10% _/ B$ E1 v1 N: m% N
- LDA FC_Music_Index
. j8 \7 f- _& z3 ?* j4 [+ o) H - BEQ .End I- A9 V/ b, G6 U1 W. z" h% I
- SEC# f- B4 B0 @/ t) a; K
- SBC #107 \, ^( d" s# X, i6 r
- BCS .Pre_10
0 I9 D8 ^7 t7 m - LDA #$00
3 ?. [* K! S0 N( n - .Pre_10, o+ c( Q: ?7 x- Y8 s4 [2 \
- STA FC_Music_Index4 g% j7 e o% W
- JSR Music_Init_Process6 b- z& \! B) D) A0 _# O
- .End i% P1 W* S$ t. x
- RTS
* d0 D) l9 S# k' T) t( v - ;----------------------------------------------------------------------5 R; a3 r% ]; `* `# b
- ;播放下10曲* M/ Y `' h. \
- Music_Play_Next_10
( F- t+ A' U( H* z - LDA FC_Music_Index* g5 Z$ Q$ L( v2 n( Z0 L3 l
- CMP FC_Music_Max_Index
' m# s6 z4 c! m7 c/ ]9 c - BCS .End
% K% ^- o9 x, K6 Z - CLC
$ |0 g/ F' ?3 f& K& Y- _" n - ADC #10 b8 y. I- o5 [, a- O7 k# k: g7 [
- CMP FC_Music_Max_Index S; S- M0 i4 O$ j) R% K
- BCC .Next_10
7 I8 r7 Q# c' l& S( } - LDA FC_Music_Max_Index& P( ]1 O) e n! ]" c* P5 H
- .Next_10
3 J ~2 M6 [7 g# r) ` - STA FC_Music_Index
8 J3 S" w4 G* s0 ?1 b9 \ - JSR Music_Init_Process9 w( ]- x6 q( k' _
- .End
& [/ X9 W. `$ K2 }% ?* |/ _2 l( \ - RTS, Q ~( Y6 d3 Y8 Q- z5 ^
/ o/ H) D! k: x+ P3 m# y" S2 e- ;----------------------------------------------------------------------+ J1 c, r6 x+ p) \
- ;8位十六进制转3位十进制制
4 ]5 W3 T3 v6 ~4 V7 z( N2 N1 j - Hex8ToDec" }8 @) @& `* w' f* y6 k5 E9 k
- STA FC_Dec_Data_1
1 a7 ^4 n; E- n4 o - LDA #$00
- \1 ?8 }; B' J9 W9 u - STA FC_Dec_Data_100
% t% y5 I7 |& B8 K7 \ - STA FC_Dec_Data_10
- o4 Y/ U5 V- H% W' h) \, _ - LDA FC_Dec_Data_1
' m6 V* l& f- S! q { - .Convert_100
5 O1 `* |* Y7 F7 _* \ - CMP #100
3 w% S7 ~8 Q# ?7 w" y7 U - BCC .Convert_108 o7 C; w4 K6 K& q) g9 x, h3 H
- SEC
, v C! ]% }- O! {' a - SBC #100
! J- n& f% f; Q$ K7 G - INC FC_Dec_Data_100# ~) w- I6 i, z E5 b
- BNE .Convert_1000 |2 ~. R$ Z( G5 w
- .Convert_10, M! _3 |/ k8 C- m9 o; q
- CMP #10 r0 L7 H8 k. G) C% ^
- BCC .End. G# r- \+ h" |/ o6 F- }
- SEC
" p, { O4 I) [8 o3 j - SBC #10
# u' D$ h9 v8 G% O- N0 m$ m2 V - INC FC_Dec_Data_107 l$ U) O/ U( l* p* t
- BNE .Convert_10' {& d4 S( C2 e" ^! r
- .End
: m! \2 d' ]) }; B8 w2 F- P1 N, \ - STA FC_Dec_Data_1
1 l: K' c( v% y0 \8 b0 K* ` - RTS8 {+ ]7 f# x% o) [ p* e! f- u, N
- ! U: N; c: A) Y8 }1 j1 k' w1 a$ B+ B7 o
- ;----------------------------------------------------------------------
" d" r1 E" G1 H) Y* J. u' d% k - ;显示曲目信息
1 t% s/ k5 B9 C0 L- M - Music_Info_Display& A8 T' w0 Z& T' B- E
- LDX FC_PPU_Buf_Count
* h( e* K6 e7 T! R - LDA #PPU_WRITE_MODE_CNT_LINE
6 i# l2 Z2 I7 |( I# N7 Y - STA Use_PPU_Buffer,X
6 L8 ~. K1 A$ J# S& o( [2 ~* w, i - INX
d# F" A$ w# H% R% d8 H0 J8 }4 Q - & v7 n; _1 k" n( a
- LDA #>MUSIC_INFO_POS1 ?0 K/ Z3 y/ \/ X Y: |: y
- STA Use_PPU_Buffer,X
$ z+ r1 X9 f9 @7 C8 S8 o - INX6 w% n N- U5 ?0 Y/ Z. t9 g
-
8 d+ U4 Z; d9 C. o* R - ;居中' N! q9 M! b# Y j" Q |8 }" j
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2* j; ~2 C4 h$ N/ t1 S+ p2 T
- STA Use_PPU_Buffer,X! F/ Q/ ]+ v0 m
- INX
7 y4 \ q; {# }/ s" |3 L - / @6 n/ v3 M# G
- LDA #$057 g1 b$ ^' \- Z- l! A
- STA Use_PPU_Buffer,X
2 I/ q: {" }4 b" l, f& P - INX
+ z& ~7 u/ @( r' {4 S1 A1 p/ [ - 6 o1 j# r! v6 T! |9 ^0 q
- LDA FC_Music_Index0 t" F; e6 b1 u5 J t
- CLC7 I- z: |/ x* [, K2 J5 T4 q8 l9 ~
- ADC #$01) N f9 L; I8 q4 E+ k7 B/ C7 J
- JSR Hex8ToDec8 [! Y9 }3 N" l. T s4 p P
-
6 F" u7 W* M1 i2 z5 l - LDA FC_Dec_Data_10
0 c8 p5 J7 Y2 [ - CLC5 Z+ ~! L1 N$ o, [ ?* w( ^
- ADC #'0'6 t2 Z1 Y0 t2 E
- STA Use_PPU_Buffer,X
" ]- W6 v( u3 R5 i1 R; O P - INX
) n3 A. O# q/ q0 B! Y Z -
- {2 r2 R" ^) ~) U/ K8 h - LDA FC_Dec_Data_1& Q. ^- {0 r# u7 w [
- CLC4 {# [1 y: |" T* u
- ADC #'0'
L; y7 L, h' H+ X9 `3 ?# ~ - STA Use_PPU_Buffer,X; V W3 e" K0 n& @* K
- INX
% @# w/ l+ R7 U -
( Q3 O \8 E6 S# F - LDA #'/'# b K2 o( ^8 f( D
- STA Use_PPU_Buffer,X
& L, G2 M+ G; f - INX2 U, \, R& w, Z( ], M! b( g
- 0 M/ b- v" N C1 `5 B. N
- LDA FC_Music_Max_Index
/ e; |; r* X# H9 P- g* V/ v5 }8 Z - CLC
' E% `- [9 ~) ?7 J" Y2 y4 l3 E - ADC #$01
! E' v$ k, `+ L$ ?6 I/ f' d - JSR Hex8ToDec) H3 L9 H) O: M5 H& Z$ b4 l3 W
- 4 P7 |& _. K' `0 O
- LDA FC_Dec_Data_10 \( ?: V5 e9 C8 ^- B; S
- CLC
& b; ~& Q U4 L1 U: l( I' ? - ADC #'0', g, `9 g8 S5 A
- STA Use_PPU_Buffer,X8 b6 z5 H$ j) U
- INX
4 N: _8 Z I% W; n - 8 H& \ G+ y8 I! q# _$ S; A r
- LDA FC_Dec_Data_1
. r% o9 O7 V0 T p* N9 R& c - CLC
/ k, I2 e+ q& r, Z5 u" o J" G - ADC #'0'
8 H# J' N) y( Y; I' o( P0 u( d! u+ }+ F - STA Use_PPU_Buffer,X$ K; ]: v) Y {# U# {9 u
- INX$ g8 B, ^1 _ q6 G( a
-
% k6 w* j% B- B3 b; g - .End% K+ p4 |; ]( i
- STX FC_PPU_Buf_Count
9 H9 ^- p$ s* g - RTS9 \( H" x6 C! ]! ^% U" q# A$ v
- 7 j0 j# I; [/ E! ]
- ;----------------------------------------------------------------------
# m! X+ x2 q7 S6 g - ;音乐曲目初始化处理
8 Z: t3 y! q% W - Music_Init_Process/ s2 t6 P" X+ _
- PHA5 P% P7 c, B' g
- JSR Music_Clear_Process
% ~# m3 L5 e& I. D* F - LDA #$1F. o6 P7 x. [1 T; X! I
- STA $4015
5 c! T( ]+ s. _2 \ - PLA
# k; p. Y8 v+ c1 x l - JSR Music_Init_Addr6 R) b; u0 f7 b$ v6 c
- JSR Music_Info_Display1 ^# C( R$ u# c: u
- RTS$ G# n$ l$ u( T) k0 n0 v
- 4 S" B% k3 N, Q7 `0 o# J
- ;----------------------------------------------------------------------8 t4 E( b5 s* j: z# N) H4 e" E
- ;音乐播放处理
G: J0 u) _9 K3 b - Music_Play_Process
& n" ]/ f$ |1 v& l2 ^ - JSR Music_Play_Addr2 J3 B- k& B- H9 X
- RTS1 p* F. A) N* \- ]$ y( l0 o4 |7 P
% }& ^. |1 W- p' q( b0 G1 f4 \! E8 T& }- ;----------------------------------------------------------------------
( y0 ?0 h3 S8 ]% x4 D) W - ;音乐播放处理
3 s& d: W1 U( |- k- W+ k! [ - Music_Clear_Process
8 s6 H8 |. ]4 \6 I' p5 m# X: o( ]$ j& ] - .IF Music_Clear_Addr# G$ x1 }% h& F' M- e# d" y _
- JSR Music_Clear_Addr1 V) [* I0 @6 {) M' R7 h8 }
- RTS' V+ @" U3 i; Z, B! F- o* H5 i
- .ELSE
! I0 `% H7 X4 |: O# P: X/ ?1 ~ - LDA #$1F
2 z4 ^0 A; {2 V4 Q+ ] - STA $40155 f6 z8 ?& J( a4 G
- LDA #$001 ?' b5 p, x: c+ k8 m+ H
- STA $40108 S3 f& j5 Y9 Y( b: j( Y. J8 G
- LDX #$009 u5 t. a7 R0 C2 E
- LDA #$001 _: _7 }& W6 ~
-
. R% E' ]- i' ]! u8 y6 b/ Z7 Q' u& Q - .Music_Clear_Zreo_Page_0
# L' }& H0 L. w" p - STA $00,X4 Q- K) p! Z! P! a6 Y+ P/ S
- INX' P! {7 n O9 j$ }$ e5 t/ K6 j0 T
- CPX #Use_Zero_Page_Begin
1 {, n" l3 g/ x% Y$ m9 E - BCC .Music_Clear_Zreo_Page_0
: B3 w) h: a7 ~1 r, v% J0 a$ ?9 j -
" G e# i/ W2 a) ~, k; L% ^/ j - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
! ~7 h6 d- y9 o1 w) R5 `' n - .Music_Clear_Zreo_Page_1
5 B1 v, j3 O% `$ D8 s' ?4 A* T - STA $00,X
/ O: {) z- P/ y2 S9 w1 H - INX* g% O* ^2 J0 P% t: T1 o8 S- T
- BNE .Music_Clear_Zreo_Page_1' h- D% R; n" i+ c! a' z
- 8 ^3 P9 t4 K- l1 _! c/ D
- Music_Clear_Process_1
) v5 ~/ u5 ~: v( O% N9 f - STA $0600,X2 u- z; }* b0 v( v. t! O% C9 ^3 J$ B1 z
- STA $0700,X
5 C$ k5 g/ [. A2 S! W8 e - INX" m+ L; L c; E2 Y# j
- BNE Music_Clear_Process_1$ r" h8 v$ x& j( c1 ^: l
- LDA #$10
8 D9 C8 M; r% J3 o i- W# f - STA $4000
" {. A) J* _" W; Z( q } - STA $4004
4 y) S6 ?0 z, a - STA $400C* _. V/ V* r+ {8 ^6 O2 ~
- LDA #$00/ m+ c' G& m& I; R8 R' {6 `
- STA $4008
+ F) c! J- m8 Y+ r% F - LDA #$0F
; A, Y; R/ X: E - STA $4015; G0 u" l: i3 B; @7 Y5 ^
- .ENDIF0 z. c6 s7 P; q' t; i" l* E* T$ G
-
0 \+ U2 y9 I1 B* S9 _& U - RTS0 H; l6 D3 X+ B8 t+ f( y% T4 m
4 X0 B" y! G0 S2 A1 Q# f; h- ;======================================================================( L8 K! R) e; X- A1 i1 P
- ;重启处理) w9 T& M0 \4 E# j' ?
- Reset_Program3 ~3 r: i7 z) O, _
- SEI" Z( _, t3 f9 ~4 Z
- CLD
$ t0 M4 {: R5 z# b! @4 g - LDA #$00
0 |, {+ i: n! `9 D9 ~( S0 R - STA PPU_CTRL4 R q! h Y5 {! X
- STA PPU_MASK
% p' f% |1 M O) r - STA JOY2_FRAME
, I" Y, G9 S' \ - STA APU_STATUS
& \) a" O# J. |- t7 X# w -
. Q0 ?; n0 D% W6 y1 a - ;等待屏幕准备完毕
) T! A2 {: D {8 { - LDX #$02; [% @8 M& Q+ X' C
- .Wait_For_Screen_Ready
8 o/ ]. E% k9 t3 T6 Q - LDA PPU_STATUS, `8 M+ D- n1 E7 A
- BPL .Wait_For_Screen_Ready
[' z: j% L c# |6 L# C8 A% s - DEX+ M3 |% E* H; V: s) i* A6 W2 {
- BNE .Wait_For_Screen_Ready6 V* `) n, }& \$ L; r1 f
-
8 L& w. q1 d. u1 W! O. S3 V5 }/ J - ;清空调色板
6 F; l8 o! C& U2 n9 F - Palette_Clear( {" f: `1 y) r
- LDA #$3F/ I0 w3 {8 J; }, m7 f; r
- STA PPU_ADDRESS
* F/ N$ f1 [( @! {- M! F2 ?6 H - LDA #$008 {* l* R9 u2 l! w/ H
- STA PPU_ADDRESS L8 z$ H& _' C: ?
- LDX #$20# E( N" b( C0 }0 `. S
- LDA #$0F% O& l3 U- I) F, o0 X& F
- .Write_Data
8 H( B8 ?3 W$ d1 w0 t4 P: Y5 R - STA PPU_DATA6 [' P/ O O) E( D! n5 s
- DEX4 B7 w: @ Q2 E7 p3 U7 o+ c1 O' L# d* n
- BNE .Write_Data
" G8 p$ A3 E1 ^3 Z
/ t2 ]8 j* J( _0 a, |3 Q- `5 d7 n- ;清除声音 $4000-4013
7 m$ i h4 o4 d1 n - LDY #$147 C; J1 J Q1 s/ [9 t$ O _
- LDX #$005 _+ N1 q6 R$ `' o. \
- .Sound_Clear
4 e- D8 V: Z a9 o - STA $4000,X4 ]2 [ c1 l' g
- INX& p% X& A- Q6 B. B3 X
- DEY
; G1 s5 q5 [* C% X' O% f* t: H - BNE .Sound_Clear
0 M2 ~# m5 m8 V: C - & D: D+ d, ?& ]# X3 f. z
- ;清除 RAM $0000-07FF# \/ n& a% O: V' ?6 d- ~
- LDA #$00
* _! O5 B9 d$ V5 o* y- ` - STA $00
1 b7 j) P% z; D: Y) c - STA $01& ~) d3 |4 S; r( X' J# d
- TAY9 e7 r& f$ ]6 t4 X) R
- LDX #$08% I( t) a3 b( x6 h5 v8 E
- .Memory_Clear
( b; i2 d6 O. a: \3 `. U& t( @ - STA [$00],Y
9 @0 Q3 e5 F% m% c- \) U - INY: A9 U+ n8 m+ s: d# C% p1 A8 _
- BNE .Memory_Clear
; v) ~& g9 f; `* Q% K - INC $01
; B2 n6 @) d' i0 B - DEX& g+ F, _) U$ B) T
- BNE .Memory_Clear
$ P2 a' b0 F9 _$ @/ M' g5 d1 I1 j4 R - 3 B& a1 V( G' Q
- ;精灵缓冲初始化
6 @- k: M! r9 [ - LDX #$003 e) e7 g3 \) K+ i+ @/ c4 g9 a
- LDA #$F8
8 z2 P: k- {9 S" ?% w - .OAM_Clear
" S# L9 u+ S) B I5 C - STA OAM_DMA_Buffer,X7 L/ _& P# X% _& }
- INX+ Z) K/ u$ x' f. q4 L/ G9 L
- BNE .OAM_Clear. a# Y7 Q2 ~* V! w
- 6 r9 h/ F1 m- _
- ;栈指针初始化
3 s, p: g* F4 {) I% |/ ?( r8 F - LDX #$FF
2 v# R1 E% {9 N* a - TXS$ w' _- v0 L8 O" g
- 2 {' T8 i% W1 p- K
- JSR Nametable_Clear;命名表清空' M. w" l# l: Q5 i
- JSR Palette_Init;初始化调色板缓冲% x1 q/ \4 m; E6 g+ ^9 {
- JSR Static_Text_Init;初始化静态文本
+ `1 r; T$ B% R9 B - ( z0 \1 ^+ E& e5 r% j5 l; W* Q
- LDA #MUSIC_ITEM_TOTAL - 14 ]+ O2 N9 ~ S* C0 k; l% x. p$ u
- STA FC_Music_Max_Index
. U% W/ k! x3 a" i2 j4 P ~# ^* i - ) G/ E& P$ G$ F1 S5 n+ I7 F
- LDA #$1F
* H0 m1 Z. _3 ]4 s Y8 n; _ - STA APU_STATUS
7 t6 ^/ o! l ?7 L" Q - LDA #MUSIC_BGM - 1, P e0 @/ ]* o/ `) |2 {
- STA FC_Music_Index
. B [3 L. I9 ^' L8 n/ J- J3 y& Y - JSR Music_Init_Process;音乐播放
2 y, _( J' ~: m% c. V - - v, t0 }) S/ |; R" ^
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态), j; q" {. U/ s/ L( z
- LDA #$1E
' F' P6 ^( F& Y' q! l: f - STA FC_PPU_Mask_Buf, s' I6 u/ h- f. D3 x
- . r9 M6 a. q" C
- ;启用NMI处理 }5 W* ^4 j# M4 Z% \
- LDA #$807 [0 N- u0 U( H/ q% N. H7 n! {; D2 t
- STA PPU_CTRL
% y# C' j1 K7 R- y ~3 D3 h - 2 ^, c$ X! m7 a
- ;程序循环, 剩余工作交给 NMI 中断处理5 B$ T! l$ L0 l8 `
- .Loop& _ q2 F4 x& n w
- JMP .Loop
. r/ L+ N$ Z; `1 @- N
1 b# ?4 h0 Y8 M& r7 S) H: C- ;======================================================================, ^% W8 p2 p8 {% F% Z* _
- ;不可屏蔽中断处理
% h* j: V& P* F/ U/ D; r - Nmi_Program
& e; {* d$ J( q5 L - PHA3 A0 d$ M' Q/ u1 W
- TXA
2 I4 ^' }9 q$ R0 K( L - PHA. \$ T4 I% g/ C' T3 b+ E5 D7 |9 T' j& }% |
- TYA0 F i3 V, J" J. A$ J; p' M8 ^# u4 _
- PHA& X& F3 C2 v4 ` Q4 [4 ]
- 5 ~7 |3 V$ g- u2 m5 B8 T+ u1 n4 C; e
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位, F" S& g0 h; c6 n
-
y' T a+ x/ N' d- T; x$ ? `: c - JSR FC_PPU_Procrss;PPU处理6 G' F: f# z, P1 m- c" f! G
-
; u% b) k, V5 C' s; B* H0 \ - ;精灵内存更新
: r4 W$ Y1 u' X7 t - LDA #$003 \' }6 ^! F: V$ N+ k# l
- STA PPU_OAM_ADDR
/ B9 q1 ?. A4 g: q5 `! z; q" s% u - LDA #OAM_DMA_Buffer / $01009 a9 I* y; X( L6 b7 ^3 K' Y
- STA OAM_DMA5 h1 E4 R' K+ h, H
- 5 M8 {- |0 Z# `7 A0 I3 ~6 X4 A
- JSR FC_Gamepad_Process;手柄输入处理
_0 t w9 u4 e& G3 Q5 U" T - JSR Music_Select_Process;音乐选曲处理
; X- w! J* ~9 x5 ]; E! O - JSR Music_Play_Process;音乐播放处理' q* a$ g9 K$ L1 Q, I: E1 ] _
- 9 N4 W8 e# P0 Q! O' ^4 h4 m
- PLA' k' h& d6 S) \9 u6 W! u( A% E
- TAY, b7 Z0 W6 @0 ?7 X4 _: x2 f2 P
- PLA
0 Y0 g2 n. w5 C7 j; U3 O9 A# t - TAX- Q5 L5 u( z8 v/ e! h2 Z
- PLA
7 H! y- m8 k% }
j' L$ y7 n) r2 b) L- RTI0 b% s' j; g$ X. w
- # h% {* [2 E% G, c/ O$ d
- ;======================================================================- D: P$ p; w' n/ t
- ;请求中断处理' i% n2 u& ~7 |* {
- Irq_Program) K% v/ T; Z& b; U4 B
- RTI$ r E9 h8 z' `) y$ L- u( j1 F9 ^
- Z% N. ?7 H# q9 |5 `- ;======================================================================* r# H) V" D e [" A# p" I
- ;中断向量表6 y2 P% ?3 w+ w8 g" |" o5 G/ p: B
- .ORG $FFFA/ t/ |& I }/ f
- .DW Nmi_Program ;NMI触发时执行
, B, a: Y( i" E; D/ V+ \3 v3 c5 \ - .DW Reset_Program ;载入ROM时最先执行
0 q7 m' g, d6 O; l- w7 N - .DW Irq_Program ;IRQ触发时执行3 V% @# x9 [ p7 ^2 u
复制代码 , {( H& [. O) e& ~. u
8 ^' ?, \5 j t. F* X$ R
# J3 `/ s1 x4 K; o. o
https://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|