|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
9 D1 _& b( i' b7 _& L1 j3 w2 X9 _ , s; \ G- _% `- a+ u# c4 u
以下是主框架代码:' ]: O2 O1 W" W2 ?7 h8 ^
- ;======================================================================
8 I# u# H" V; o' g/ t' g - ;文件头+ ]' k0 ^1 d- X& v* s
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; d3 A& } w6 q( f- {+ x
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
- d a+ K4 }' L - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码$ j; r0 P6 A0 s
- ;======================================================================
/ g/ q% r4 z4 @9 b7 w0 }* I g @) ~ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2, K7 \2 p! a9 E* g) a) _
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
3 o. C. c) i4 L: q3 r - ;======================================================================
( u& w1 C, @ g: M% Q ` ` - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
3 u6 }. u* T; ^; e2 f+ } - RESET_ADDR = $E000 ;主程序起始地址
9 u7 w9 e- R: `6 R8 n% p - ;======================================================================
8 U3 J' q3 O* L" Q - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB3 [& V9 H1 ^2 {7 M8 A" B" l* M$ Q
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
! L5 o |) D" Y9 `' K( ~, q - .INESMAP 4 ;Mapper号 (0-4095)4 a, t9 Y7 \/ g# M
- .INESSUBMAP 0 ;子Mapper号 (0-15)8 w. D( M* R% F* s) }: f9 [9 Q
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! w5 h! |& `9 r1 ?6 v - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
* l- N: K2 \# M - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)+ r- A# A3 K5 V& |, R
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
7 B( r1 c& r3 N8 _/ W8 b) h - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
, c: ~7 I/ h/ Y- X) C! Z - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
% H7 _! H, F& F+ ] - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 W& |3 v& m' x9 r0 c
- ;======================================================================& n" o! o. x$ }% F! |. ?0 {
- .INCLUDE "fc_demo_config.asm" ;全局配置& m% Q% {" i/ j, p% f
- .INCLUDE "fc_demo_constant.asm" ;NES常量
1 @2 c4 q: M; a) X - ;======================================================================
/ D0 c" {* `# {% N2 Z* q' R$ Y - ;音乐配置
4 N5 z) e2 D ?, P8 U! M o5 V" q: Z - .IF 0 = MUSIC_THEME 3 z3 Z* M5 B: V) D, i6 b/ S
- .INCLUDE "data/music/Gremlin 2/config.asm"! a% _1 P+ Z- `. ?- ?7 `4 Z/ p
- .ENDIF
* w, C2 h# q/ f- V# k - 9 `0 P' r& b$ N- q, K
- .IF 1 = MUSIC_THEME
% B- F. E2 |! n0 V$ h7 }6 ]* Y - .INCLUDE "data/music/Raf World/config.asm"" |. x( R) w/ k1 y
- .ENDIF; V& Q! U0 z/ J! [, A C# m% i8 r4 l
- ! A9 e; i8 u+ X
- .IF 2 = MUSIC_THEME
( C# J; L9 V2 K$ B$ I! z5 N8 w - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
1 D7 ?* G' a5 O$ ?$ y - .ENDIF
/ u# A% |3 B; L' j3 E7 j0 G - 0 S1 z3 s( n6 f V8 |* f
- ;======================================================================
- U" z# h9 c( { - ;引用CHR图像数据7 j) n% k8 A- ^8 b' Z2 M+ S5 }
- .BANK NES_16KB_PRG_SIZE * 2
* }5 X- c# F7 M - .ORG $0000; e% c$ }& R& z
- .INCBIN "data/bkg.chr"" o+ w' B9 M5 j9 x
- .INCBIN "data/sp.chr"$ ?$ \4 v6 P# w3 c9 ^6 p
-
& d. k4 j6 \/ l i( y& a - ;======================================================================
0 J: J+ P# Z; R* }* w& q1 W# P - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank# m: x( U0 e5 t2 W" ?* F: a
- .ORG RESET_ADDR
) a! ^) j0 o8 Z, z" h - ;======================================================================, T- u; w& O8 u" k
- ;引用其他源文件
5 \) E# e" x% j B7 E9 b - .INCLUDE "fc_demo_ppu.asm" ;PPU处理) w, i: L; w M; x
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理0 ?! T* e. _" M/ e1 y8 G. T
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 i. X. B, `$ o" f% A+ s - ;======================================================================- |; k" u4 k: C- r+ J/ I* g" k' C
9 T1 g- [0 F* f! G- ;======================================================================
. v+ z5 @* U- _" j2 U2 x5 r - ;等待VBlank到来
! ?3 t) D$ C! A8 I: b, _/ q - Wait_For_VBlank
8 L: \. q+ _' T6 i6 d" U5 m+ d - LDA PPU_STATUS
$ ~) [+ Y+ T% u+ Y" C - BPL Wait_For_VBlank
/ X" d l/ |/ v4 d, _; E: Y - RTS
# A. @: @# b, Q! e; u
. s8 O; q! S4 U, e. A- ;======================================================================* X# B0 W( r' A
- ;调色板初始化
% I( {2 S, j. S8 C1 I: o - Palette_Init x( o1 j# E* v/ ~8 D; l1 E% a& x
- LDA #$3F% x' P$ M1 S7 q" y! ?
- STA PPU_ADDRESS) t0 m, n0 k* ~, C+ K6 }8 n
- LDA #$00, }0 l9 M+ o7 t
- STA PPU_ADDRESS
) c9 O2 [7 a4 k* S - LDX #$008 p/ p( ?3 y/ j$ E: y
- LDY #$20
5 M) A. X# ^ m8 w7 {+ N( O - .Write_Data
4 u/ ]7 K# m3 Z7 m: U, v - LDA Palette_Data,X
5 T% T1 j0 a" @2 q. B5 ^ - STA FC_PPU_Pal_Addr,X
- m7 N1 N( c( f5 _3 U( } - INX8 X/ a5 d; ~8 W4 ]+ i
- DEY
X0 B5 }! ?1 D: Z1 U, c I - BNE .Write_Data3 ]# }( F' ]% }: t! p
- .End
! `* l+ Y5 }+ W* J - RTS
7 D9 o$ e4 c4 H0 M4 O% _
3 v# ^8 G9 O5 [% p! E# s6 \; o1 k- ;----------------------------------------
- _6 F: W# E5 C) D* h - ;调色板数据0 Q! _% w0 t& l8 |4 f, R% y, T3 R8 O; D
- Palette_Data
. ~6 G M* m6 r% Y) l9 \ - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
9 q& J- ~& ]4 g l- I* x1 e p - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
6 F" T+ ]; x2 \. f& H; `; n% |! n - 2 `, H* E" K( E6 ~3 t" M( R: o( B5 _! g
- ;======================================================================) ~3 h _9 ^6 L7 M9 e' P: J0 U/ ~
- ;命名表清空
8 F( P9 Y9 h' d& G$ d* w& y - Nametable_Clear
. Y2 k& G5 a+ E. v! h4 u( U - LDA #$20# r& f$ `3 g: v# ~: I
- STA PPU_ADDRESS
9 ^/ J- p' }* g9 w [- i3 K - LDA #$00+ p& e9 o3 {0 k. u
- STA PPU_ADDRESS3 J8 k( C9 G' g- |; r# _
- LDA #$00
- b3 f4 |- I: u9 G0 `+ B5 x; K - LDX #$00
$ s; e! {: K$ `! j% ~9 M8 N - LDY #$084 M1 p* r3 n' f, r# s- r
- .Write_Data
1 P7 p6 q+ u$ r# i" Z3 S3 c - STA PPU_DATA7 [ f1 e9 X. N+ I$ o1 M
- INX+ y% b& B" [7 P C- ~( y
- BNE .Write_Data6 f& {! g, ]( V: B5 b
- DEY
( l# o! U& f9 O5 T8 X+ m - BNE .Write_Data Z* j- @3 I; \& Q+ ?3 K0 C" ^' _
- .End
6 l$ p' Y$ u! y - RTS( p- X0 ^5 y2 b+ d
- [+ ~. Z) w9 B' |6 p4 V, K- ;======================================================================
$ Y, z0 s9 q! a - ;音乐曲目切换
" E( J3 G! A, z4 x" o! E* y - Music_Select_Process
# _6 v1 m. D+ |( C - 2 a, o# H8 w) |' [. ^ A* C; E1 _- D
- .Pre_Music;上一曲. |5 a) C& P% K0 n; Q) V
- LDA FC_Gamepad_Once0 ~% e" L% p, j! j/ e7 u
- CMP #JOY_KEY_LEFT- J0 v9 i- p5 W2 c
- BNE .Next_Music! X w8 Y3 e8 t( O$ A
- JSR Music_Play_Pre0 H$ M" \3 C& |( c" v# F
- .Next_Music;下一曲
6 U# i8 R$ ]. P; a - LDA FC_Gamepad_Once t# P" b4 r0 p
- CMP #JOY_KEY_RIGHT( G4 k r$ e+ d" i+ m; Q n; o [" b
- BNE .Next_10_Music
6 S; l9 f2 F2 C7 m9 R7 p - JSR Music_Play_Next5 G# @' l& m- U3 g; `: f5 u1 G1 c
- .Next_10_Music;上10曲
: d- k% _/ F% r4 t1 x - LDA FC_Gamepad_Once
5 J. Y# r7 J7 C8 _; f( l - CMP #JOY_KEY_UP8 s- Z5 s! g1 S y
- BNE .Pre_10_Music
+ Q! | \/ d+ f6 V2 z- R; N) Q" b) A, s - JSR Music_Play_Next_104 U& {% |+ M2 M
- .Pre_10_Music;下10曲6 [! B) w M' L% X0 V- b9 N
- LDA FC_Gamepad_Once. c! i# x0 p0 I6 s1 h1 Q4 a, o
- CMP #JOY_KEY_DOWN
- m( l/ Y/ a8 `- a1 s7 G7 l - BNE .Reset
4 k' N( o$ Y4 h6 Y6 X! d' X - JSR Music_Play_Pre_108 w3 E; Z2 M8 R1 W* h4 ^9 O
- .Reset;重播当前曲目5 ^7 Z3 \6 b8 C* W( ?
- LDA FC_Gamepad_Once$ s5 @9 x& X% z% g7 _+ O
- CMP #JOY_KEY_START
% G5 C8 d4 F1 ~- |1 v/ H+ \ - BNE .End
* I2 G$ E+ d) m# K3 g A7 C - LDA FC_Music_Index' P, H& k7 j# s; [' `4 e [
- JSR Music_Init_Process, r* ]* L. u+ ]' @8 q" o
- .End
7 N O. F6 |9 N# P+ Z - RTS/ U A# n: m0 {, p, G) o: S, Q4 h
- 3 V$ ]' ~( Q& O' y3 l
- ;----------------------------------------------------------------------) R- ]0 G) H6 f+ _$ C: Z0 E
- ;播放上一曲4 q( [; ~9 L. d( A
- Music_Play_Pre
) U$ N( Q+ O- i# \4 U0 L5 L T7 M - LDA FC_Music_Index! p: {+ J w) V; d: e3 W
- BEQ .End9 S* u; k$ r( Y$ n
- DEC FC_Music_Index1 s4 V6 Q& [' Z* w
- LDA FC_Music_Index
. `8 a4 s/ `! x( f& W - JSR Music_Init_Process: l5 s( c" b: v! g
- .End* P& @3 a4 G6 w ?) z' J6 v" V
- RTS9 O a7 R2 k$ J ^
- ;----------------------------------------------------------------------& ?) f) i: O f. g. a1 S6 I
- ;播放下一曲3 U( D6 m! U9 ]" S
- Music_Play_Next
9 k% E: ?/ E3 R& ?' H7 S+ H/ y- ^ - LDA FC_Music_Index
# m( M8 \; F/ ~" g - CMP FC_Music_Max_Index
+ n/ b- z% b" b% z' N7 s - BCS .End
9 m1 K9 L5 O6 Z. u - INC FC_Music_Index
4 h+ ~, H( ?2 I/ O - LDA FC_Music_Index+ [4 t4 c% G) w+ V' Y2 L3 T* V2 K
- JSR Music_Init_Process
/ i6 m, C1 i( I1 L - .End$ L5 m& U( {$ m; e3 C
- RTS/ Q6 v) V$ i! ~3 T. ~
- ; c3 _( E+ H% x. |2 k B
- ;----------------------------------------------------------------------
+ g/ Y$ L/ k3 j7 M# k - ;播放上10曲" A$ _1 s. V3 x! |1 q* m
- Music_Play_Pre_10
% E( ^# i$ I) A# g - LDA FC_Music_Index) L6 b& f. B+ X0 |, N% [
- BEQ .End( N, `+ t* u3 R( Q2 c
- SEC
+ y/ Z7 }- @9 v! Y& Z+ p1 e - SBC #10 }( @& M- ~0 [
- BCS .Pre_10
+ g/ j, W; Z! ~4 d+ i% J - LDA #$00) _; P: u4 S9 z8 S! K
- .Pre_10
1 C, G- t$ v7 i' P - STA FC_Music_Index
" {$ }, r' r, L4 o' ?4 ~ - JSR Music_Init_Process: ?/ y% L6 R! Q2 B- C
- .End
8 M, q9 Z* q) p- j1 g# I: l - RTS2 S( r. |4 A+ H5 a5 R( J
- ;----------------------------------------------------------------------$ ^9 v3 b/ R- e, g
- ;播放下10曲
/ B- z: a# v) j7 Y9 p6 f+ w - Music_Play_Next_10% w7 R8 H5 O5 ^! q
- LDA FC_Music_Index
% X3 z$ d& b4 k5 E# V - CMP FC_Music_Max_Index8 d2 N: R+ U$ M) V* F
- BCS .End' L: [. o2 Z8 O! i* V2 `. i. E' Z
- CLC# |( q3 t, a8 z# W: O
- ADC #10& u; O5 D) H7 x5 @& g
- CMP FC_Music_Max_Index: n) @; L; L8 l$ V3 \
- BCC .Next_10
8 g. ]3 K# R7 Z7 f# N1 b - LDA FC_Music_Max_Index* B2 Q% \9 B% e, u
- .Next_104 H# z! J% V, f
- STA FC_Music_Index) Q' v8 V1 v5 c# Z( L
- JSR Music_Init_Process
# ]% ]& X6 S+ b6 Q* V* r& \" d - .End
2 x9 [) `; K$ i7 s- K: q+ b - RTS' Y. M9 ]( G) s4 c& V4 v5 S
* L; A. i9 ^5 B- ;----------------------------------------------------------------------( A% [" S1 B4 m" I! ~. {
- ;8位十六进制转3位十进制制
8 O1 U7 L4 m2 {7 F( d ^! m - Hex8ToDec
# u' r% G$ c0 z: r& I - STA FC_Dec_Data_11 Z8 Y9 P" y0 b" S' }: H0 @
- LDA #$00
( c# Y5 A0 o! @ i6 | - STA FC_Dec_Data_100" K9 h+ V6 ]% ?! u
- STA FC_Dec_Data_107 {0 u3 W% Z/ _9 M; [
- LDA FC_Dec_Data_1
! R+ A) G, ?9 q- s) r - .Convert_100* ]5 I) Z+ e/ h
- CMP #100
) o* f8 F, g+ l0 X4 X( s0 r6 Z - BCC .Convert_10" `& c0 i L, L/ m/ W
- SEC
$ U& L$ k! I J$ h5 S - SBC #100
4 i& O- h' |, W% Y - INC FC_Dec_Data_1007 ~; p+ q, x3 t
- BNE .Convert_1009 F! v8 t6 M7 N
- .Convert_10
1 u4 Y" K8 @- o& A - CMP #10
1 V+ @' l0 A! f; j- U - BCC .End
5 |0 F8 n8 Q' X - SEC! O$ t2 p6 L' \! O8 U; ~8 ?
- SBC #10
6 B, T+ \0 a) P( y! N: B - INC FC_Dec_Data_105 b1 _; e$ }7 F. N& i
- BNE .Convert_10
$ Y/ z" c8 I, x - .End
' Q1 _# _" t$ X7 m) ?/ K - STA FC_Dec_Data_1* [( |, R. S" G4 _0 Q
- RTS
3 F& }9 T+ \ U: o1 E& S0 r* v( y - $ v0 _' S! G1 i
- ;----------------------------------------------------------------------
0 v% K$ a/ [" J# {8 R2 M1 e - ;显示曲目信息
% M4 g) O! i4 [ - Music_Info_Display
4 ?7 O% `$ D$ S( [* J; b' _ - LDX FC_PPU_Buf_Count
: m2 Y6 [. a6 R; i% {* I - LDA #PPU_WRITE_MODE_CNT_LINE
4 j) S0 T- Q2 ^, _- y - STA Use_PPU_Buffer,X) M' C; N9 X( F
- INX4 R# u+ u" z4 |
-
- }( m `, V' m' x6 u) Q9 C4 a - LDA #>MUSIC_INFO_POS
+ L0 U: S' H: U8 i$ L - STA Use_PPU_Buffer,X" T( h' r. I/ j6 z
- INX" x$ _0 C1 Y( l1 F+ m% j
-
( E2 p7 Y! i$ \- p3 t5 T. V - ;居中1 K$ m. [% J& Q& O: |" J
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/29 Z9 [# I& _0 g% r4 T
- STA Use_PPU_Buffer,X" t' J4 C( l5 i* Z) H4 S
- INX |/ D& ]$ s0 T5 u6 f+ J% R
- 4 S! o6 y( p) @3 W
- LDA #$05
3 Q& R8 g0 J* r1 h' z# E - STA Use_PPU_Buffer,X
/ A8 w; Z# ~, [2 D" G" y5 O4 m# u - INX9 e0 J- P! S6 ^
-
7 H& R5 R4 P* m5 X3 @0 p' L" ]6 @$ W - LDA FC_Music_Index
1 d/ F6 z& s% m - CLC* w+ a8 d* r2 e: G
- ADC #$01
& ]# Y. L$ n ~5 J) I( M$ J - JSR Hex8ToDec4 D' t8 w3 V( ]9 \! e1 {
-
- i. ]; d: N# q, g2 H# ]6 b# v - LDA FC_Dec_Data_10, |7 `# J( Q( X4 U' k: S
- CLC3 b* R, H4 I& |+ J9 ?+ I, ]$ A$ P
- ADC #'0'# E" }; t& p8 ^0 ]
- STA Use_PPU_Buffer,X5 T" d1 T3 g' L
- INX
I7 E$ {: @" y* q* B1 t -
: u; F1 g: ~" d0 B9 B3 t - LDA FC_Dec_Data_1
( w& J H1 i E. N. ^$ Z: { - CLC
& H& D/ v, P) F - ADC #'0'
5 f! {" u$ u3 V! ], e# ` - STA Use_PPU_Buffer,X
" v' T5 y2 Q+ w; Q1 m - INX+ `# ]; N. A- X6 v" l- `% s
- 4 q! K6 \& {1 l- }% ]! G
- LDA #'/'5 {8 _" [( J% O! V; G, u
- STA Use_PPU_Buffer,X
5 N& ?/ {& F' {+ y' k - INX
; h2 r, F& p6 u$ F. G/ K - * a: ?6 N, y5 ^! k" x
- LDA FC_Music_Max_Index
9 Q9 K9 V' Z. s' X - CLC8 o; Y6 l/ e. ^% M6 v% H
- ADC #$01
# e" P/ r) U f$ u; F - JSR Hex8ToDec
7 b- n: O- e1 A. y- J- a+ I0 v; A -
( g/ }% v; t/ X$ D, V - LDA FC_Dec_Data_10
8 v% k% X& ~( D6 X5 P - CLC
" K7 F7 v5 u- w, D5 s% ? O) j) C5 W9 n - ADC #'0'
5 |( ~0 B& X* i. a" w - STA Use_PPU_Buffer,X. Z+ U/ n1 E N+ g" x7 Y z( _8 a
- INX
& A3 E) {& |2 K' n- n -
$ v4 }3 R3 {! x( n/ h- y6 I - LDA FC_Dec_Data_1
: ~ j( L5 m( O7 F3 P0 d - CLC
/ R: a" i' d" d. S/ G - ADC #'0'8 h |/ k4 p0 M0 C/ P
- STA Use_PPU_Buffer,X
$ m6 S; I- {6 R% R; o# d; \ - INX
# _- Y$ `2 t' j% \( V" f - 6 w% h' O5 u# L8 o6 w* I$ z7 ^
- .End
- `& B+ [6 g* }; x5 U( |# o2 G - STX FC_PPU_Buf_Count5 k% ?2 c. g/ H& j$ Z+ d
- RTS4 d0 U* y* I2 T7 L9 N
0 _% q! g: R* r2 A2 N* J% W0 t- ;----------------------------------------------------------------------
9 J6 L c& v2 N; Z J) r. Y8 m2 L - ;音乐曲目初始化处理
4 ]4 ~9 y6 c2 f" g3 m( c: L2 p% x {% ] - Music_Init_Process, N) ^8 O0 p. F, g% W9 j
- PHA6 Z) C: q" y7 [- `& N' X7 ~6 Q. L
- JSR Music_Clear_Process4 U. S0 q) O& s: k B
- LDA #$1F
( e- T: L' D/ n" t - STA $4015' l1 J4 F7 a* J A3 V, Q
- PLA8 w2 [2 ]3 a/ ^/ W" {+ p& J
- JSR Music_Init_Addr
% N S& G+ |5 l u% j& U, v; |* C - JSR Music_Info_Display8 d1 m; f( \- l$ j
- RTS
9 `( S2 ^) k) Q& M* I8 M - $ N/ x$ X8 }# I3 o: s h
- ;----------------------------------------------------------------------
" _0 }+ l( q* E - ;音乐播放处理
& B1 y. G* X) P4 Y - Music_Play_Process
+ x+ I6 z5 `5 O) p - JSR Music_Play_Addr
1 L+ w8 G( F8 Y# z* o; N - RTS* S9 I& Y* X1 j" `5 f# z+ M5 X
- ( o- |+ {" ?* t- v$ H3 N
- ;----------------------------------------------------------------------
% Z" ^1 O& N; {: b - ;音乐播放处理4 V! C( I, g3 N( M0 |/ j
- Music_Clear_Process$ X1 ^/ x( n1 b& O5 j( p4 Q' ]- ^
- .IF Music_Clear_Addr
7 u% f X! {9 z8 n* D1 ` - JSR Music_Clear_Addr! I, {$ A- c) i* J
- RTS& I: v, X) ]' k6 v, r, M
- .ELSE6 Z0 A- O$ g- \, I
- LDA #$1F
8 l2 ] r9 E0 [& J4 O. y+ C - STA $4015
) E+ Q5 ?: q1 Z( I2 E - LDA #$00
7 U2 m0 @& b; E - STA $4010
- ~$ { v4 Z6 N* n& w v - LDX #$004 ~# Q0 e$ w% B/ Q- ~* s. J$ Y
- LDA #$00' Z2 L/ k, o- J. E6 I
-
( U! s: z5 A2 \# i, P/ U, D - .Music_Clear_Zreo_Page_0
" Y$ N! N. x( w% f - STA $00,X
. y h9 S/ M1 j8 U2 B - INX
) `' |2 H! x6 q) h0 R - CPX #Use_Zero_Page_Begin$ l# d4 [, S9 n6 O& @* D
- BCC .Music_Clear_Zreo_Page_0
3 u3 u, z9 U) |* m5 N7 O -
, a* q" q- ~3 b: e, U - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
" i7 w/ ]4 c: V - .Music_Clear_Zreo_Page_1! K, J5 ]$ a Q$ B; l/ x5 V6 `
- STA $00,X
1 y5 u# S% H' A - INX- Q& x5 t! m4 W# x! Q4 O
- BNE .Music_Clear_Zreo_Page_1! b$ S: F) p \7 X1 {
-
% D7 f6 d/ z8 i& w: D6 ^ s - Music_Clear_Process_1$ e+ ?1 ]2 a! l ~6 f
- STA $0600,X) {8 a! v5 z3 Q* I
- STA $0700,X! d* w$ x: I, ~5 _7 J/ h4 X7 L
- INX7 h& T. `4 _! h# }# k' r
- BNE Music_Clear_Process_1
7 b) [7 ~6 \7 z4 O. V- } M2 F - LDA #$10" R) _$ g$ k" \, h# e9 ]
- STA $4000
$ G, U4 F# k: f; | - STA $4004
. [7 _3 a- h1 [/ z* N - STA $400C, S* C0 \' x* P# d
- LDA #$005 a7 r' U7 n4 ~9 F- E6 S9 b7 v$ `
- STA $4008
5 s/ m1 g7 K+ ]% ]9 C - LDA #$0F
# j F' z" M" q/ O/ z: E, ]; X - STA $4015" g9 Z2 @, l6 }) X6 R# s% Y- s
- .ENDIF |/ X8 t. ?: U3 n: a. u
-
t8 u) u8 q3 _ - RTS! h) T1 C: s0 ?
- # {+ h4 c0 m7 t# i6 k8 J, N
- ;======================================================================
! |4 m9 e( o% l I - ;重启处理" C8 G, M8 f1 [ q
- Reset_Program
' f* u7 |/ { _* y% ^) w - SEI' X, ^4 H3 H# ?5 U* g7 O" a
- CLD
0 f; \( K8 Q" s3 [" o* [ - LDA #$00
5 b$ |5 y4 I( i6 D8 r& l! C - STA PPU_CTRL6 d1 B' Z/ N1 Z+ L- |
- STA PPU_MASK
8 J5 C! [6 ]' D: H j - STA JOY2_FRAME" |* M- L( \& m5 P+ u
- STA APU_STATUS/ k' ]3 G3 C3 L8 ?
- : r; p% F; M$ X7 f# |# N
- ;等待屏幕准备完毕
' _ A, Q$ H/ K9 p6 ?9 H2 G - LDX #$02
( z6 S5 W& {4 y- b; K - .Wait_For_Screen_Ready: @* J& b: b9 N
- LDA PPU_STATUS+ \ N7 F6 P4 T+ M2 Z9 {' F
- BPL .Wait_For_Screen_Ready
# M! F( j; B$ X2 S - DEX4 S) s U# n; P
- BNE .Wait_For_Screen_Ready
9 ]+ w/ N' O, R y -
4 V, @+ j' B, E' I - ;清空调色板# h! K* H# Q# K& m; g! W/ M$ g) [5 x
- Palette_Clear
7 I; M% p* ]5 G/ f# D - LDA #$3F
- v q1 m- F8 A# E - STA PPU_ADDRESS: b) o# A' l1 J# q/ _) S9 Y6 m
- LDA #$00% _8 b. [5 T+ C5 v. j- @8 \
- STA PPU_ADDRESS
2 y# [: k1 {0 b3 F" c - LDX #$20
$ Z) n/ u9 @& n+ e% V+ \ - LDA #$0F
' y( e. w1 m7 s& ^ - .Write_Data
4 r6 ^+ t$ w1 L+ Z1 e+ P - STA PPU_DATA7 o: M6 h5 _4 q3 L# P- z$ a J
- DEX
, s Z* {9 h/ q$ |7 d - BNE .Write_Data
0 ~1 \4 b1 _ h2 d& s$ a
. X+ F$ m8 A( `8 o9 Y- ;清除声音 $4000-4013
1 j% G X8 c+ v - LDY #$14$ E5 n9 m: B% w2 ~* N
- LDX #$00
9 d' ^$ n9 b h - .Sound_Clear
$ j+ _; Q! B7 T' W- ^6 C - STA $4000,X& G; I( H. ]3 r$ C V, w. f
- INX7 s. C; y) J0 j' U# i/ o% G& R
- DEY
6 u6 H, V( Y) ?: L R0 i5 B( b - BNE .Sound_Clear' R4 m, t' y% z
-
. J L& p- g- ~9 y5 |0 Z - ;清除 RAM $0000-07FF
/ [: @: e8 I0 H - LDA #$00
0 V o9 p* i9 M* i+ V) O! C3 g - STA $00
`8 r2 x# R: f' b! X - STA $01
) y4 C2 G0 U, R* \% I6 p - TAY
+ L0 h- H6 ` K8 a. V - LDX #$08# o5 G1 L3 A) j r
- .Memory_Clear6 O5 T# s& i2 b7 ?0 g7 @
- STA [$00],Y% r5 I& H2 r" I& L1 k! n( `( B- z" ?
- INY
$ [, d+ m5 o& u( _ - BNE .Memory_Clear
& e% ?5 [* k, }# n; H5 @: @: l - INC $01/ h& ?1 ^7 N1 X7 I
- DEX
4 B' D' v! G$ n' d - BNE .Memory_Clear
7 X- x' g( E' Q) T- w: p -
7 n" Z0 U2 w" q. e - ;精灵缓冲初始化- P$ w. N+ ~$ @
- LDX #$00
, Y- l* J0 J3 `! b( v# |' s; D& } - LDA #$F8
( z0 K; \# X2 b* [4 N% |6 `4 C5 J1 { - .OAM_Clear
4 y( L' ^; u- ?' E+ r9 |0 T - STA OAM_DMA_Buffer,X
. a, j6 a8 Y c+ m9 k - INX
. I2 \5 q5 j: a( M4 ^6 Z - BNE .OAM_Clear
! n( K* M- y: K$ \ - 4 u/ V+ T( S: \: \" L7 L
- ;栈指针初始化
( ^/ v4 P+ D9 V$ N6 B. {2 r) l - LDX #$FF9 N q- G# D1 D+ Q3 g
- TXS u4 N+ d8 X5 |# C' ?7 {$ e
-
; }6 \# _# k, M( l - JSR Nametable_Clear;命名表清空
1 F5 J0 H% p8 V3 m - JSR Palette_Init;初始化调色板缓冲
6 P& }+ ]' ~8 ? - JSR Static_Text_Init;初始化静态文本
+ }. p! g5 {9 X. d$ X8 N# v; t -
; }' _+ E8 I8 G+ W - LDA #MUSIC_ITEM_TOTAL - 1
" \1 t* [: j+ V0 R, v! @ - STA FC_Music_Max_Index- j# h; f8 P: s+ |# b
-
1 y3 q' N4 A' a; L4 _3 K! H - LDA #$1F
; t: k- o4 k9 O: l7 [, R: V/ [& c" q - STA APU_STATUS
+ J( u6 k$ q: x$ n! ]9 j; U - LDA #MUSIC_BGM - 1
. B: _6 J9 \1 z: m; \, } - STA FC_Music_Index
& P8 }/ e5 r/ {3 y: s7 V - JSR Music_Init_Process;音乐播放
9 I2 ]( ^& J& V) k0 o8 ] -
/ T" T, k' B0 q& e - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
* k$ u, N0 n2 e2 t - LDA #$1E* i$ b' y3 w/ @$ C# Y1 u
- STA FC_PPU_Mask_Buf
+ h" @5 F% P8 w: r5 @3 a$ {0 I5 M -
7 S$ h8 q- u$ I" b - ;启用NMI处理4 C( { E( z' H2 k: f+ v
- LDA #$80
1 U% w' y* Q1 }+ o3 C: t - STA PPU_CTRL
* X- c7 x& V8 ~ r5 b, p6 J -
" k) g- R! t! N9 e. E: W - ;程序循环, 剩余工作交给 NMI 中断处理
0 _- b" p# H1 Z' W* ? - .Loop
! _9 ?. D# v3 X - JMP .Loop
5 a/ L5 h9 @. F$ A" s" ~ - 9 }8 b2 c7 B6 {4 D" |
- ;======================================================================
% k$ n. d) Q8 T- G/ I9 w - ;不可屏蔽中断处理
( v; q4 a% L% m X - Nmi_Program. C+ J5 S, K, U! n4 C$ ^( t
- PHA
; g2 O. \( j) d - TXA
/ n4 B* ~1 _* R/ L1 C - PHA
4 q" | Y5 ^; M- |9 D7 b - TYA" }3 Z/ l2 E0 H3 Y
- PHA
: ]& C; z+ ]# b+ Y u; q - % D9 p# Z! A0 ]
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位: W' \7 e% q: S7 f5 K
-
7 H6 i9 e( D0 @7 D9 h - JSR FC_PPU_Procrss;PPU处理5 e$ }1 R" f: Q
- 0 v3 G* Y$ ]7 e2 p3 Q! Z: i% a
- ;精灵内存更新
( O% [6 V/ c! d# K/ U- f - LDA #$00 b# O5 C" U/ T1 q2 q8 u Y0 Z
- STA PPU_OAM_ADDR0 T. U) P u1 e* @1 G' a
- LDA #OAM_DMA_Buffer / $0100( W, ~2 Z* ]* v; B" m
- STA OAM_DMA
8 R: Z: W. X/ t; O3 V% E6 P - 1 g' A! G$ U; }6 N- m
- JSR FC_Gamepad_Process;手柄输入处理4 z. s3 _, i1 l& `; \& s
- JSR Music_Select_Process;音乐选曲处理. k( L8 M& b8 R
- JSR Music_Play_Process;音乐播放处理" h" C R; V% C6 t2 |
-
# a: v, c! b: X& | - PLA
" s3 X1 Q/ L( o$ `1 z6 Q - TAY: Z. b- V0 w( q6 v. k% E: m
- PLA
1 \! b1 I8 W% `5 L% E! R; H - TAX8 @0 I$ N6 p- \0 H, S1 p& _
- PLA3 N5 z3 T/ R ^( ?8 X: I
- # `8 c f/ t" k& Y j$ d9 l
- RTI, J+ [1 ]- t& w: l0 d; b
- $ v, A. M$ t& F' ~% I* `4 g/ n
- ;======================================================================9 F6 W* O O' t8 E5 a; ~
- ;请求中断处理
2 J' o( x) p4 i - Irq_Program
/ o3 y- H1 R. v; Q" s5 _ i - RTI
) v1 ?$ i+ j9 E$ P, U - 5 ?4 h o( H3 M) o# x% N4 T
- ;======================================================================
5 |1 ~' z' ^+ k/ ^ - ;中断向量表9 u! X f+ v. ]- k" o5 w4 T* a
- .ORG $FFFA- ^ `0 S* m( ?+ G
- .DW Nmi_Program ;NMI触发时执行
, k" f4 {8 l% N m0 c9 z - .DW Reset_Program ;载入ROM时最先执行
! ?& e( U3 J. l: T& @) n - .DW Irq_Program ;IRQ触发时执行
1 x7 _9 ^. b& X$ s1 Z5 E
复制代码
5 F% u! W8 W! b' K6 G/ @ B( j4 q1 M3 r8 }3 f
P! T& V! t4 _
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|