|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下9 [" m9 L7 Y5 n; R' |

8 B; H/ A, F' k# U: d: w- o( ^以下是主框架代码:+ i7 k1 X' @6 A4 l: E, z* Y
- ;======================================================================
3 z# b) L! r+ W" J2 y8 n - ;文件头
3 Z' i1 }& i; N9 S% T. W, ? - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
; p" O4 S6 }, Q6 S- n/ G" @ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
, ^" ?1 I8 H& `9 W2 u/ b - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码. s. ~ e( K# l: T6 Q" h5 q5 }! X) J
- ;======================================================================' l( g% L/ N h& }3 G& n
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
8 g' u3 n5 A- ? - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
, b- q% G8 F3 R7 Q* W4 W- s1 j - ;======================================================================
( t( r' x {/ P; t2 W3 ]8 F - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, s" L9 W1 F3 K2 j
- RESET_ADDR = $E000 ;主程序起始地址
4 G! i: r" ?0 f; I9 Y' a; l - ;======================================================================9 |8 O3 {) m1 |1 V
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB* E2 i4 |7 f# e0 M' T
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
|5 F5 k$ g9 Z! W1 S6 @ - .INESMAP 4 ;Mapper号 (0-4095)& @6 T7 j1 s. s1 Z
- .INESSUBMAP 0 ;子Mapper号 (0-15)) R5 y- q& r6 V% x; l9 a3 ]
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
& V$ u# {' s* e/ O0 V/ n" A - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)5 x2 w2 ^2 V4 O$ m1 v% o
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数); i' `: S/ F9 ~ Q, A
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
& U7 l e. g+ @( u) r' Z; g. N' ? - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
( ~# ~$ D% T8 s, n9 |- D - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
G2 M/ K& K H& Y, X5 ?* v - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy): Z7 a. n6 m, c* Y2 @& p
- ;======================================================================
9 u& h$ V' m1 A, C, V - .INCLUDE "fc_demo_config.asm" ;全局配置2 `* Y8 L3 {$ c9 z: K: _ a
- .INCLUDE "fc_demo_constant.asm" ;NES常量
- }# d) U! Y9 D2 t) d0 p% G) M1 _ - ;======================================================================
& u( g' }8 V: ]8 x/ w - ;音乐配置
" }9 [ R9 m: o: t$ H; _* @ - .IF 0 = MUSIC_THEME
2 g: e# A j4 o, P! w: f - .INCLUDE "data/music/Gremlin 2/config.asm"
8 c2 | M+ O& r u - .ENDIF# k$ M _3 \1 J0 \, r
-
; v& P7 y) A# E6 X - .IF 1 = MUSIC_THEME2 u6 x' q, I: c) ]2 E: Q
- .INCLUDE "data/music/Raf World/config.asm"/ B# G, m! V1 m3 Y x9 u, w
- .ENDIF
5 _) }' f% Z; j( f+ N3 f" x - : }* P4 k+ q5 _; ^6 ?- K! t. g
- .IF 2 = MUSIC_THEME + v9 R2 S* {3 S, U9 X
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"0 L9 [& O! k3 ]% W9 c R
- .ENDIF+ A9 B0 h8 V* l( Y& i
- 6 m. f1 X3 }- R1 C2 E ^( v( [( z) J
- ;======================================================================/ O3 q$ W3 g, \5 I; k+ W9 M
- ;引用CHR图像数据8 v3 L1 {2 [) W
- .BANK NES_16KB_PRG_SIZE * 2) y3 z! q6 }. e! y0 P% a
- .ORG $0000! y7 T- u. X6 l; V) k# t
- .INCBIN "data/bkg.chr"
4 h& j; [( ^( [+ T5 N9 g4 r3 z# I - .INCBIN "data/sp.chr"8 d0 z, C; G, ^: ^) |" y8 k9 [
- 9 e1 T. m$ A/ Q4 Z% b
- ;======================================================================
+ z8 g/ C e! ]7 i/ U: K* @2 D) I - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank, U3 k u2 f& M3 r1 k' I
- .ORG RESET_ADDR; {1 G% D4 a H w2 D/ Q
- ;======================================================================8 Y. W1 L3 q4 R$ _
- ;引用其他源文件1 a# s* ~ s/ J- y
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
( l; L( Y9 `* T$ H. T* G - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 d' \) \& A+ n
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
" X( p. b1 q: Q0 |" ^# X5 {0 w - ;======================================================================
4 w- G5 R: B1 D& f E% Q( T - g7 B+ G4 p4 _) s1 z6 D
- ;======================================================================
' j. r% T) q$ F* E% h! x - ;等待VBlank到来+ o" [+ X: j$ _
- Wait_For_VBlank. @4 @+ G4 R. K* f/ P8 U
- LDA PPU_STATUS; o9 V/ E! _# q% _( R
- BPL Wait_For_VBlank# ^& {) V! n9 ~/ z
- RTS+ \* c3 S) M) c; j1 V
- f/ D' a. {% ?: [, Q- ;======================================================================4 {6 I/ ?8 n& V% b7 J% s4 g3 p) f4 V
- ;调色板初始化
( ]7 Y& m/ Y# }4 }* u - Palette_Init
% m5 d) J# G9 L% Z/ O, G/ I - LDA #$3F( d/ ^3 N8 f; H& o" C# K
- STA PPU_ADDRESS) n1 O9 F* r! C
- LDA #$006 G5 X8 I+ Z: r% T
- STA PPU_ADDRESS& A( ]' h' G) u, ?/ z' R7 f4 S) O
- LDX #$00, ?8 L# i8 ~: I9 G" m- c' [ s4 D
- LDY #$20) S" ?+ g' y* }) D0 {7 p
- .Write_Data1 o4 C& x0 p$ [ k1 E$ Y
- LDA Palette_Data,X- j, h3 @2 f( F5 q! U3 }9 {! {- F
- STA FC_PPU_Pal_Addr,X
. L0 R6 w1 ^+ m$ H! `+ a" Q - INX) J* O, _6 H) a
- DEY
! B0 X( o, B& C - BNE .Write_Data# P4 H" X4 h! W2 P" C( S# z
- .End4 k6 Q ^* V- N2 T
- RTS
5 `) V! Q1 `; R5 E. ?4 y
7 A7 d4 B6 l7 a" k3 F( @- ;----------------------------------------
1 O7 m( u0 ]9 @+ b - ;调色板数据
# _$ P. j- H* t# ]5 \% T4 d- \ - Palette_Data
1 {2 r3 w3 m- c0 s9 {* M `* m* R - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
6 I: r* I4 M" N# P - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 229 T1 {3 y* q2 e0 k% `& d
- ! y. u; H: ] E& C6 N4 c
- ;======================================================================; J9 e7 C( ~- A
- ;命名表清空9 @% _5 Z2 i: q0 I9 m" C) R: J
- Nametable_Clear
! H2 Y" _/ f4 r1 y - LDA #$20& U- \6 w8 @6 ?2 z6 W6 [) [( \
- STA PPU_ADDRESS4 Y% _: y. W e" K2 o9 U& e
- LDA #$00! Y+ b7 g4 \7 U& N
- STA PPU_ADDRESS$ I! H, Q# |9 k( ?7 C" o# v
- LDA #$00
( j" r J+ a" U. B& o2 [' q - LDX #$009 y; f' d0 |- ~) m- h* S# B7 l
- LDY #$08 q. g3 O x6 k
- .Write_Data
9 L) h" d% H0 }5 U6 v - STA PPU_DATA
! m/ X) S, m7 `- | - INX7 ?% b4 x! c. D3 ]. ?9 Q' J: T
- BNE .Write_Data+ q2 B" n, Q3 ^ D8 E8 b! B& _
- DEY
, H; W7 e6 l, L: C - BNE .Write_Data0 j& [; B# n* V, J. H. X
- .End" J! v8 O, T8 \) t+ E7 U
- RTS$ A) @: U+ E7 l( W- e. S
- 6 s4 V/ K3 d/ r. G0 _3 e
- ;======================================================================
: }6 ]" R% @& ^4 c3 l/ h0 b5 G - ;音乐曲目切换
! Y0 I; ?4 ~( F3 ?* V- o5 ~: g - Music_Select_Process
" r5 t, M% D( o# ?5 r {
# E2 j8 U+ A. B y. G- .Pre_Music;上一曲: l( F% v& Y6 h# V5 ~* V7 F: p
- LDA FC_Gamepad_Once
3 c1 b/ @4 u% X% w. E - CMP #JOY_KEY_LEFT7 N4 ]0 f+ i: \4 g$ A+ D
- BNE .Next_Music
5 s% z8 `) O! D1 e/ u1 [* v - JSR Music_Play_Pre
9 I* h2 d' t9 B' I2 M2 P h1 u6 T - .Next_Music;下一曲4 i4 I" R& O; _# ^
- LDA FC_Gamepad_Once; @8 \3 |: T r2 W$ o) M, F( d
- CMP #JOY_KEY_RIGHT3 B9 O N9 u$ [+ a5 x
- BNE .Next_10_Music9 @& B; Z8 o. A
- JSR Music_Play_Next7 o+ a0 \' z% b5 R3 m
- .Next_10_Music;上10曲
0 U7 X. k; \8 O5 J - LDA FC_Gamepad_Once
* K; i+ Y, f; c$ `! a, ?# y0 K0 S8 K" R - CMP #JOY_KEY_UP
9 \! T1 u4 |, t3 P% J M- S - BNE .Pre_10_Music/ z$ O# C4 [0 X4 t
- JSR Music_Play_Next_101 l. l: x+ {& k( s- s a/ k
- .Pre_10_Music;下10曲; L2 ?# P- i4 U) X
- LDA FC_Gamepad_Once; ^1 k% f: l5 _% S
- CMP #JOY_KEY_DOWN
2 H+ Z$ ]/ G/ a8 m3 l d - BNE .Reset$ S' S4 q4 Z2 i3 [0 [
- JSR Music_Play_Pre_103 _4 Y# ~: j& a1 A# ~
- .Reset;重播当前曲目: L' e o) Y) ?; _; D
- LDA FC_Gamepad_Once
5 D9 k! m2 |, Y - CMP #JOY_KEY_START
$ f- o6 e; h2 Z' o0 O6 X - BNE .End5 t# R) Y; ~2 h# x, x9 O* c; d
- LDA FC_Music_Index
7 J! `; o, F1 p! j( R8 L9 X - JSR Music_Init_Process
# x( p+ S: [4 n% z3 n- ?5 G - .End
6 h2 H0 ] v* J' ]3 v! A5 {% r - RTS
, a2 d8 c D2 _4 l - 0 r( c% d( l9 N" ?* l
- ;----------------------------------------------------------------------
) O, E; m' ^& W, ~ - ;播放上一曲
" i& a8 i5 Y0 o6 o% O* m4 ?9 f - Music_Play_Pre
* m& z4 w7 B6 j0 h L - LDA FC_Music_Index
$ o/ z& p+ y$ g5 O$ { - BEQ .End
$ ]. c( U, n8 m) i - DEC FC_Music_Index; L5 p0 s: T% ]! A. C
- LDA FC_Music_Index
2 n% C5 _- Z# L- A1 @ - JSR Music_Init_Process* G2 b* v, o# E' p! O
- .End+ H9 f, P) Y0 {/ u, f' W
- RTS) c6 {3 P# H9 d# ~: H
- ;----------------------------------------------------------------------
& V; t' C/ o) u( n - ;播放下一曲
' [* M2 A* n' H - Music_Play_Next9 g( ^* M! Q) M/ j- c) M, G
- LDA FC_Music_Index7 E) {+ K0 [( J* U3 [$ W% Y
- CMP FC_Music_Max_Index
1 G$ j3 V1 v$ n7 p - BCS .End0 ?" S; s. N" h$ x7 t5 i
- INC FC_Music_Index
1 J7 _+ `# P$ {8 H- B. j7 t7 ` - LDA FC_Music_Index
2 j+ I, {8 y0 f- e# m - JSR Music_Init_Process3 D* `0 I9 Y5 f; q* u& [! {1 G
- .End
- k+ N% p9 A% k! A) D: ^+ V& O - RTS
: C' W8 q5 Q/ t9 p0 U( h" z
) O1 V) m: s |3 U8 N8 z; y$ a- ;----------------------------------------------------------------------, R9 F% L# a, [* [
- ;播放上10曲
0 q" u3 k- E0 C+ V! ~- P K' v - Music_Play_Pre_10& r* Y6 Y0 _* }
- LDA FC_Music_Index
) e5 ^. S- r) U3 s" Q$ M6 G2 g - BEQ .End& ?& Q# d" G2 q$ e* d
- SEC
: `/ S' v; ]* \5 m- d3 `( a - SBC #104 r8 u6 X' [0 G% b7 j2 E) k- A
- BCS .Pre_10- a, j! x/ C/ L2 b- L
- LDA #$00
6 w8 X" s4 V1 a& f - .Pre_10
& V8 ]1 v( l/ ` - STA FC_Music_Index
0 w3 c; s9 C" r5 ]' o - JSR Music_Init_Process2 O7 b* v6 A. _- {, n3 s
- .End2 X# |0 S, V1 k) U$ n
- RTS( @& Z6 ?5 T2 P- X
- ;----------------------------------------------------------------------4 j8 p; D; n. ?8 [+ f3 x& F# o
- ;播放下10曲$ ]4 W% S, d3 S! {
- Music_Play_Next_102 R9 x' N& e0 E' e o& \
- LDA FC_Music_Index
% @( ~& m+ g$ A4 c6 \ - CMP FC_Music_Max_Index
8 |# d6 w0 C& V! {+ `2 w3 V0 N6 k8 G - BCS .End$ n0 @3 t7 d/ ]
- CLC
* ~0 f$ S( C: k2 D - ADC #10. d0 `' e1 \0 [. M: j
- CMP FC_Music_Max_Index, ^7 c: c/ r- M$ `6 \' w% o
- BCC .Next_10) X" \( C8 S) v/ H) L+ e
- LDA FC_Music_Max_Index
. J8 s, Y/ L( r* U# ]; y - .Next_10% W: Y6 z4 q6 n( U# K2 P
- STA FC_Music_Index0 m0 R6 P" p, [% ^' z; v
- JSR Music_Init_Process
/ W( U* O1 v" O - .End
5 a2 `, E5 r' T) w: R0 U1 o" x* A& H - RTS2 q5 [9 x. g- H# f
$ Y% x, [0 ?8 V7 ?* `5 O- ;----------------------------------------------------------------------
0 N& g7 Y0 O2 Z7 c# U' H% j - ;8位十六进制转3位十进制制! \ x! B7 I' Y% }+ I6 l
- Hex8ToDec
1 j7 ?6 P0 y( ~- n: L7 R8 \ - STA FC_Dec_Data_19 d2 w. I- B" U t1 X. j! r* `
- LDA #$00. q( s8 n T4 s' O# `1 R9 J
- STA FC_Dec_Data_1008 J& j1 l+ L5 M1 S8 e- R' j* E
- STA FC_Dec_Data_106 }1 M8 D5 }/ {3 x7 E6 S; [8 G
- LDA FC_Dec_Data_1
1 n' D1 `. h% O0 A+ | - .Convert_100
/ ]- Y1 y; u3 S8 C1 g - CMP #1009 j7 o8 J/ o; `9 o4 G
- BCC .Convert_10
4 Y3 M6 ]" W/ y; D A3 p - SEC5 V- H1 V S# I% n
- SBC #100) s/ G t; R) X! I. Y7 h3 K
- INC FC_Dec_Data_100
4 t+ l' X* }3 g' a - BNE .Convert_100
; X* n% Y- q$ K( P3 ?1 r - .Convert_10
9 K) M. j1 L: o2 W( b1 A - CMP #10
B% `8 F/ D$ W# S2 w - BCC .End
; I4 P: f' \ M" } - SEC
( `6 n* X) ]8 ?! ?8 z+ l, { - SBC #10' }! g& B. w" L7 a
- INC FC_Dec_Data_10, `( i/ I1 h" O P2 r% P f
- BNE .Convert_105 @3 e( t! \+ u6 P
- .End5 z1 c- |1 G/ _' k/ J6 }
- STA FC_Dec_Data_1
7 i/ y3 A' U* k* x' Z7 v - RTS
% l/ t: N; h9 S5 l4 B - ( v# Y% F4 s3 o: w
- ;----------------------------------------------------------------------
8 X0 h8 @( m. j2 i: M: v - ;显示曲目信息 I& d; _& `1 S
- Music_Info_Display$ A& v4 z5 q d p0 S) ~! Y
- LDX FC_PPU_Buf_Count
4 y" r! X' P6 M, }3 r% D. N - LDA #PPU_WRITE_MODE_CNT_LINE* x. B" |. h9 r
- STA Use_PPU_Buffer,X3 K7 Q7 O1 V1 e" O/ H
- INX
- P) C" I. e6 X; s5 J - ! o V& _* A/ ^$ o, |
- LDA #>MUSIC_INFO_POS; [: C' q0 ]6 K0 w+ j9 L# B8 l' ~) A
- STA Use_PPU_Buffer,X1 m2 C7 U: V$ i) Y$ `$ h5 w! c9 q
- INX
" p% Q: n3 }- \& J) d -
4 Q6 ^" b" v7 ~3 d - ;居中 {: }6 f4 p) v! g
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/29 [6 l) I! x2 E1 F) x4 _
- STA Use_PPU_Buffer,X1 j9 N u9 k: n& T" S |' |4 _
- INX* e9 l' w6 O& T
-
# ^5 J9 C! ~: _5 z _( g- t' G - LDA #$053 }- s% j# |' i% i) p
- STA Use_PPU_Buffer,X# |) T/ d8 y- _# L! h7 P
- INX
" z) O2 }1 A% b, N - ^, d' B8 H& r# i) Z
- LDA FC_Music_Index
( p4 L( j; b2 l5 H D" V! B - CLC
0 k1 Z8 o9 D2 p0 |; c4 g - ADC #$014 N, Y8 W& z: P+ e2 R# C& i% v$ Y
- JSR Hex8ToDec3 E5 S& F. Z( n6 c
-
$ X1 p$ d j, j) d P K - LDA FC_Dec_Data_10! v2 ~# P2 T: I, \' E& l8 c
- CLC
6 W I) U- W0 n! B) ` - ADC #'0') ?" o. o# P @1 I( Y% c
- STA Use_PPU_Buffer,X; f3 B/ h; a: G) f9 R
- INX- }; S1 y+ t4 w/ Z& Y
- * {, C P" Q' i9 X; i$ v3 _# n
- LDA FC_Dec_Data_1
: m9 p1 Q/ Y! {9 C- } - CLC# l; w! U! n1 J! V
- ADC #'0' e; s/ @4 o, Q; n7 |( W; s/ `/ M6 u
- STA Use_PPU_Buffer,X
2 ~% g' q5 b/ I+ M - INX$ a; \* O) J4 b
-
7 t4 v* G) Y4 d; n0 T# ?# R - LDA #'/': w, \! W+ N, m
- STA Use_PPU_Buffer,X
6 l0 K. O( n. ]; n - INX7 o! \+ L. L8 Y9 s1 G
-
$ b; L5 l2 v9 G% K - LDA FC_Music_Max_Index' z! @! f& \1 @! K q( ]8 b5 N0 ?& N
- CLC# { I% a. h/ b! Q0 i, P
- ADC #$01, F0 G+ J( N: A9 f E5 m4 V
- JSR Hex8ToDec
( }+ a$ O: d! r, d- L2 e: R - 9 l3 p( ?# w* {2 h8 G n
- LDA FC_Dec_Data_10' V/ k/ o: i$ [$ W$ _7 U
- CLC
4 y$ `9 L, l% U0 T% h, O - ADC #'0'
' C: D% f: N9 j- ^) a, \" F/ M - STA Use_PPU_Buffer,X
$ L" }* z/ D* u - INX" @1 @/ P+ p1 [3 J( y7 r$ \
-
k. [; Y+ w/ a5 ~! \* R - LDA FC_Dec_Data_1' n+ _' B8 E# G) L& _* J* t- {
- CLC V, b. g% w$ D
- ADC #'0'1 L8 q$ n- {- _' e w w% C1 n& H3 J2 A
- STA Use_PPU_Buffer,X- E/ I; r2 [1 R1 K# S. W8 `. V& q
- INX
: H5 ~% \9 @' I( k- d2 w - 2 a- S1 R1 x0 M" ?& f: V2 L
- .End
3 m8 u; T. E+ b7 M* ` - STX FC_PPU_Buf_Count
: U1 \: }& |1 R" l - RTS* [4 ?/ W5 x+ [- N
- - b ]) w0 H" C: D$ o
- ;----------------------------------------------------------------------
. p. S9 b" D# k. E6 ?6 H# s' @" v - ;音乐曲目初始化处理9 v! B$ n( a# Q: L# E4 |
- Music_Init_Process
$ O0 q. s% W( f* f9 \2 Y8 v) ?; J - PHA6 c ~5 j6 N7 P1 e' a
- JSR Music_Clear_Process
8 y8 J7 n) ?, E2 e6 q - LDA #$1F5 F1 X1 Q5 m& q5 E. U" U# g
- STA $4015/ \, z5 }0 O1 K1 [
- PLA
3 P* I! {- v# @9 b5 n - JSR Music_Init_Addr
$ f% F0 B! h6 n! T5 ` h- {7 F$ P - JSR Music_Info_Display
* S& Y: u6 T- y0 ?1 Q! R' H - RTS
# S' }5 h- C& v4 o) O
' y) r J7 S c) t& n3 \# N- ;----------------------------------------------------------------------
* }2 t& B& Z i9 C" O+ C7 z - ;音乐播放处理
$ @. z5 Y# X: H3 Q5 P - Music_Play_Process
0 t% r. g+ q* L, s+ g: J - JSR Music_Play_Addr
. U4 J1 `1 ^( ?, B Z8 G - RTS
$ ?) N$ ?9 a! P U! U9 {0 e
8 v# v4 X# Q9 G: T- ;----------------------------------------------------------------------
' W$ N" }& ^ g1 @6 X5 u: D - ;音乐播放处理6 V" k/ t$ [- o$ A3 s. ^* g q6 V" ?4 A
- Music_Clear_Process
7 i `/ V' n' Q0 r! N - .IF Music_Clear_Addr
5 ~% w( k% H: q: i& c" e. L - JSR Music_Clear_Addr
, \) Y9 ^% F1 y/ V4 h" D- E/ ], ] - RTS: v# @( U3 R9 P* r$ w
- .ELSE7 F3 s7 W3 d$ L/ H8 z1 f# j
- LDA #$1F$ Y" }: B' d& z0 I/ E3 n/ K
- STA $40156 f- W% x6 M7 b! L; y3 o6 X
- LDA #$00: b; p/ d8 h0 X. l; b3 y( f. w8 @ q
- STA $4010
. e' R- g* ?4 H. t8 t# ~( T - LDX #$00
- u/ c1 Q+ ?/ Q' I - LDA #$009 W+ ~' f3 T6 x$ u( T7 U2 j
-
7 `! E; r& u( Z: s6 G - .Music_Clear_Zreo_Page_0
. u9 W' M* C2 w6 f - STA $00,X
. O Q% o# M/ V) ` - INX4 h' J5 [' y1 L/ Q! I
- CPX #Use_Zero_Page_Begin
2 s& }! C7 c9 I& \) f, ^3 P; o* o" i - BCC .Music_Clear_Zreo_Page_0# O3 H2 ~, ^) ?- \$ P
-
+ N9 Z* x! X; a4 l1 o - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
L- L! T" r7 v - .Music_Clear_Zreo_Page_1
+ \' u% J4 u8 h5 ? - STA $00,X
7 R. d9 u5 @& l. n - INX' \! J* T: d& g' y
- BNE .Music_Clear_Zreo_Page_1! M- i$ X0 g; H2 O2 r& I8 r
- : r- N: V/ x; P
- Music_Clear_Process_1
# a# r% {* e- E3 W$ ? V - STA $0600,X
h# n+ h; z* z6 ^ - STA $0700,X
& P) K2 O3 {6 i3 M; G - INX
2 T: Z% A8 u7 H6 G4 O' B - BNE Music_Clear_Process_15 J* w& C" K, n: y- Q z) Y
- LDA #$10, Y1 l2 i6 r; Q! e% ?) m
- STA $40006 {2 Q' x M2 H" d
- STA $4004
$ ~. F9 r- ^) P# S o - STA $400C
% d& W! F9 ]+ z2 |( B# i* \" m - LDA #$004 `( _2 @) i( t+ M
- STA $4008% V( _. {: u( i4 v: y
- LDA #$0F
1 s6 ^; G. _* }" X - STA $4015
, T1 S/ E$ X0 \% r - .ENDIF
- x/ |2 I: G: V -
6 V. u" ^! R. t8 j; \, }8 a' g, H - RTS; i6 j0 z6 Z, M* k7 y! t! V
1 |' T# Z. M6 w4 I, u- ;======================================================================3 W5 M9 m8 P2 K& M2 |" g% H
- ;重启处理8 m |" O1 e# S6 l% n9 D
- Reset_Program
( A: X0 n% n ], [6 V! ? - SEI
# F" [0 F- h- Z - CLD
- Y q/ U g+ C. W# J: T - LDA #$00
0 I$ M& P/ y* W$ J+ ] - STA PPU_CTRL
4 m5 F1 I. S" m# S3 m& d) I2 I2 } - STA PPU_MASK. \9 M/ g# l4 b @+ G$ l
- STA JOY2_FRAME* L; U+ j J% ?) x
- STA APU_STATUS2 F+ h% q) u+ Z
- % d8 O# C9 q7 f, L/ [0 Q
- ;等待屏幕准备完毕
* Q! `1 c7 W2 {) Y, @ - LDX #$02
3 ?0 w" m0 L3 J0 x7 p% T0 r: a' u - .Wait_For_Screen_Ready& _: G6 Z+ i8 A2 Q' V1 s6 @7 M
- LDA PPU_STATUS8 `4 I3 J; S9 K. y( u
- BPL .Wait_For_Screen_Ready
; X! j6 ~2 {/ C+ }" ` - DEX
3 l$ F6 A5 D! q0 p8 E# u - BNE .Wait_For_Screen_Ready+ H4 m& T1 ~6 `. f6 D
-
M- U1 j+ p% X+ p- X7 @5 U - ;清空调色板
6 c, `9 Y0 j- ^2 S - Palette_Clear& f7 ~ C3 H: F2 f; O; W- m0 r0 k9 f2 [
- LDA #$3F1 Z9 i# v2 V' s( p
- STA PPU_ADDRESS
5 E8 a# I; \4 K3 W' H. f - LDA #$00" d. b. v& q5 M, K
- STA PPU_ADDRESS
/ W9 [; U8 b5 W1 V Q! }* e - LDX #$20
8 X1 T. `' K/ D - LDA #$0F' H n& w- W, t* T; Y5 S0 d! R
- .Write_Data
# Z+ h8 p7 u( \$ O4 ~$ X6 T7 B) {' M - STA PPU_DATA* {, N( }, {0 R: M1 a( F
- DEX' z; `4 L7 S( X1 G, X
- BNE .Write_Data
" O! q, U1 t. P2 H( } - 6 _4 m# l' q4 Y$ S: @9 P
- ;清除声音 $4000-40130 L! |& X& G3 A: M* i& e8 z
- LDY #$14
: a7 i5 X; P& _ - LDX #$007 b9 F- [4 o0 \+ M7 G- k
- .Sound_Clear
8 Y; D* F n2 o: m1 Q7 W - STA $4000,X" ?) u5 `" {4 q* r( |% T
- INX
$ |0 l* Y+ p& e. S2 v4 X - DEY
4 ]+ P2 y4 [2 m1 L; `7 t7 W+ s0 N - BNE .Sound_Clear
! o, o3 t( S4 {. p - ) r6 u! `; k' b6 k/ k* E
- ;清除 RAM $0000-07FF" e# v8 }7 U+ o. s% a
- LDA #$00
4 z" d! B2 \& q; P% N - STA $006 }" H y b$ ^3 B
- STA $01* H. o# m* z5 R8 ?) G
- TAY9 O% l* H w1 | _0 S; {: T
- LDX #$08
" Q$ \8 d! C! s, q3 C - .Memory_Clear
6 I4 {5 H6 ~ Y. a - STA [$00],Y
( \. `: `3 R ]" d - INY2 u" J) X. O- z# C; v6 B3 D9 W6 t
- BNE .Memory_Clear
: A0 p. ~) k& k- n2 N - INC $01
* i3 E' K0 w w* E% L5 M8 J5 D- T: V - DEX
9 d' h, h+ ?4 V7 r* d - BNE .Memory_Clear
" d5 a6 ~9 m# w- b$ Q - : m) _3 e# X9 a8 G! a
- ;精灵缓冲初始化% X7 n3 L" A) g$ F( J+ o0 g
- LDX #$00
9 z% K+ q' o* e& f8 k - LDA #$F8
4 D& G p+ n" m! B1 g( u7 r( s' s - .OAM_Clear5 O. B) g* k/ |# L0 H: b F+ M
- STA OAM_DMA_Buffer,X
, }6 a6 u4 D: }$ K- Q - INX% J) f, G7 h1 V" s' n
- BNE .OAM_Clear" s) [! Y3 H0 Y" [# C: L% J: ]
-
' E* e+ s; a5 w8 N - ;栈指针初始化7 \ ?0 a7 N' x8 U0 n
- LDX #$FF2 \/ T1 Z! |0 m" K$ G
- TXS( ^1 ?0 c; x. E0 t
- 1 s8 _0 e8 o2 x B$ P( Z
- JSR Nametable_Clear;命名表清空, s9 n$ x4 F) f8 C% V9 p! `. P
- JSR Palette_Init;初始化调色板缓冲# ], c% j8 ?7 F+ ^( ~3 h& E! \
- JSR Static_Text_Init;初始化静态文本
+ t$ @7 z6 ]( k: D - 3 Q) Y2 f5 B( N: L+ }+ n$ ?, g
- LDA #MUSIC_ITEM_TOTAL - 1) g* n8 U0 n1 A; z( r* N4 G5 o; l
- STA FC_Music_Max_Index
: j4 Y. o+ M% Q% A/ @ - $ W0 T1 J4 r, I# _
- LDA #$1F
: W: P- i1 a; d' n1 F - STA APU_STATUS) a% J4 G& g( `7 i9 o8 V
- LDA #MUSIC_BGM - 1
( ^4 o* Z1 z0 g2 W( a* F - STA FC_Music_Index
* g- [" t+ B3 s - JSR Music_Init_Process;音乐播放
4 }1 T+ d$ a% R1 ^& J. V+ } - " V3 w; b7 `6 Q( {) f L
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)5 M. n% r7 k/ L# z
- LDA #$1E
6 T+ E4 W+ k& N" M5 D: ]+ ` - STA FC_PPU_Mask_Buf
, ~! C; a/ p6 Q% L3 s -
% r; i/ X% J! s" z7 i - ;启用NMI处理+ r9 U2 }2 |& o
- LDA #$800 C S4 |8 @4 Q7 @/ ~% p
- STA PPU_CTRL1 j$ W$ g( O5 Q' p+ X; s1 y
-
" X) R2 Z* O3 \8 i( f9 l - ;程序循环, 剩余工作交给 NMI 中断处理5 J# `+ W) @5 X1 w7 y* }
- .Loop
- N" q: x* F1 I1 W) C6 h# S - JMP .Loop$ N- j8 p+ r* S; D
- $ t) C3 A/ F, K# I) ~* A$ p
- ;======================================================================6 G& o; O3 r1 j9 H: m) f
- ;不可屏蔽中断处理
9 Z7 B8 J$ A& F7 z, c - Nmi_Program' s4 P+ E3 k2 _ o. z& I
- PHA
( K2 ~* U3 A2 W& v2 P4 n/ ^8 [. i - TXA3 i) U- k# S- V) F+ K! Q
- PHA! y, O6 N5 G* q$ f
- TYA6 y0 {) A" }! G! n& G% ]
- PHA
W) S, a: m$ n# J: z( t/ ^3 T8 } -
8 w8 m k( J2 p: G0 W- V W - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( ?8 k7 A2 a. _' l - 7 X5 X: H. D0 O% I* [$ Q
- JSR FC_PPU_Procrss;PPU处理
$ d Q) f% z% d - ! T F6 v" k3 d% d1 u1 A
- ;精灵内存更新5 e ^& d! N9 N" ]: X1 s3 t( P
- LDA #$00- o0 u. A8 j" a# C6 p, M: \
- STA PPU_OAM_ADDR
4 u, p" r- X T7 l; t# K: L - LDA #OAM_DMA_Buffer / $0100
" g+ A" u4 k* ^6 y2 {, M - STA OAM_DMA u7 y' q8 M! a' |, M
-
7 h( N3 F- [2 ~5 ~! E7 [ - JSR FC_Gamepad_Process;手柄输入处理$ C4 E t$ l! _/ `$ y6 p
- JSR Music_Select_Process;音乐选曲处理
# W3 p& \+ s* d" E4 y! _ - JSR Music_Play_Process;音乐播放处理; h7 }# ^3 ]1 t: T( _- S0 P
-
9 b$ M7 V# K8 d8 \3 @: H - PLA
$ b6 J3 D' w3 V4 h4 w! l0 E - TAY' U, s" A. \* ~$ Q* h* a% `
- PLA
5 O* O( s8 ?( ^4 O - TAX" K2 x+ ^4 ]: Q: y
- PLA
; A, W6 o! b! q3 V. t
, R9 V" L/ q- {" Z7 m- RTI
: g: m6 f( Z( C
8 v* j2 w! G% W" E" Z- h0 M- ;======================================================================( @" R3 y" {! t/ [1 O( E
- ;请求中断处理
. Y# Z+ S' X3 x5 p/ f% m/ M - Irq_Program# q' `* s, k) d7 P# l: ]
- RTI& R) B: L* k9 h/ z* I2 K
- & w. S2 L2 ~* A$ N/ [4 Z% L5 Z2 a
- ;======================================================================
( p5 s' }8 b% x2 e/ b0 J* ~" k( L - ;中断向量表! O1 N; }- N" x2 h
- .ORG $FFFA
: I5 Z# W/ M; t& H/ o! }$ W9 d - .DW Nmi_Program ;NMI触发时执行
& w X0 W" ?: ]$ s4 l/ j - .DW Reset_Program ;载入ROM时最先执行
& j4 Y" G( u3 y- z: _ - .DW Irq_Program ;IRQ触发时执行' R2 v: k; L$ S: w; p
复制代码 ! E8 f- \( o5 M5 a+ v) u- c
' ^, p4 V9 B$ @6 O' \
, w: V; _* M, n# T" m
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|