|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下+ l! E/ ?. a) a- i4 @- }

0 r: `5 Z3 }- v( j以下是主框架代码: C6 T0 a. M6 X- U( o
- ;======================================================================
, @0 u+ h! E* ]7 f0 @, u# E2 V6 t - ;文件头: h+ a5 k/ x+ _+ \# r6 i! j, l: |
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量% E8 K+ i$ v* h: m2 k) S4 ^1 f
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
2 \1 @; i( [( Q& v! \& E - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
5 _( R/ X2 |5 U: ? - ;======================================================================
3 \' O4 S1 e. n# l. f- S, N - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2$ Z0 C4 Q# D, t6 ] T
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
2 w; P* x- T2 ~3 P6 W1 v& v: } - ;======================================================================/ K2 p' {) m4 S/ e: F
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
5 K; A4 ^6 P9 {/ w' [( T - RESET_ADDR = $E000 ;主程序起始地址
) g! U. k" G }. N - ;======================================================================/ k! Z* \8 n+ M+ i
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB" ], V5 F P% `
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB$ A, d) ?9 Z) s
- .INESMAP 4 ;Mapper号 (0-4095)
5 F6 O% o; Y0 ]- G4 a# h- M( i - .INESSUBMAP 0 ;子Mapper号 (0-15)1 W/ p8 A8 Y' e5 I
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
7 B Y. ]' X4 O4 z8 p/ {$ z) x - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)" y+ |3 P4 b+ d$ f% X
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
) x& J* b1 a1 I8 M- V4 m( d% c - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)# u( c L2 `/ J2 E8 J# ^1 u" w
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' d O$ b* y' f0 ^; A5 \
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
1 V5 [% C0 D/ ~1 y0 o: w - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 T' s3 K7 w& A6 G
- ;======================================================================
u( q+ o: A e& a) e - .INCLUDE "fc_demo_config.asm" ;全局配置
8 r+ f! l$ h) n- d - .INCLUDE "fc_demo_constant.asm" ;NES常量
8 A% R# J, z# \. c$ `7 M9 P3 o - ;======================================================================9 D+ C$ Z! }- U0 T* x
- ;音乐配置
. t3 ~- w) Z$ P- n - .IF 0 = MUSIC_THEME
! S& Y9 t2 g: d+ x3 \1 j - .INCLUDE "data/music/Gremlin 2/config.asm"/ e3 N9 G) Q1 ?0 b% d& p0 S
- .ENDIF
2 f# N$ T1 y9 v H/ N& \; B% g$ w - ( p5 [# M/ A2 o
- .IF 1 = MUSIC_THEME8 M" [) I' J8 H# p$ g
- .INCLUDE "data/music/Raf World/config.asm"
/ n& n& \* T% v, z, }% j* `1 l - .ENDIF
# i8 Z& @7 H! w6 \ -
0 Q0 ^/ H4 M& ~$ w" p4 [6 h" i1 b( \ - .IF 2 = MUSIC_THEME % ]9 q" ]2 ?5 U6 {
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"5 t! q) H9 O; S# B
- .ENDIF8 i4 s% f$ s- N m+ d
- 0 L2 C2 n% z" r7 b
- ;======================================================================
7 s3 \4 ^5 @( `% C - ;引用CHR图像数据% }8 j3 Q+ M7 k) s
- .BANK NES_16KB_PRG_SIZE * 2
* {6 ~; |8 k# Y0 ^/ R# S - .ORG $0000. b$ \7 c3 N8 P# E. o4 ?+ [6 K
- .INCBIN "data/bkg.chr"
3 y0 E$ l! Q0 {, Z - .INCBIN "data/sp.chr"
& T4 K; v: o" `8 i2 J' @3 r- A -
( a" B! w5 p) a& B$ \2 a% c - ;======================================================================
* o+ H; u, a5 R" t - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank, l' {& l7 P8 R( F8 c' F! W; O6 W: ~
- .ORG RESET_ADDR" _$ @+ x7 s+ V& R; r, }
- ;======================================================================4 k- V6 b" ]0 N( [( D0 w
- ;引用其他源文件; v3 r0 T! _( _! u3 ]% l. K! M' z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 i$ V9 ?' |. q
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理) B( d; m6 t* p" q4 I+ U
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理# r5 ?3 H! C3 w6 B
- ;======================================================================; S0 M5 M* `, X: v6 i0 Y% n V; f$ b6 d) m
- 8 @7 o. b& L4 ~
- ;======================================================================
& q5 c* y; V- ~2 `7 C! J) p - ;等待VBlank到来' F" B# X- _/ F8 v4 x6 i
- Wait_For_VBlank" Z) `8 t* m m! X& P# H
- LDA PPU_STATUS3 x. c+ T- r& W! H' Z" }5 p- h& m
- BPL Wait_For_VBlank8 u3 I: p1 C0 T
- RTS
- T: V' Z# Z; R$ O! A - & D8 @5 x1 k. M p/ q
- ;======================================================================5 U' \$ m0 s* a0 \' w+ D
- ;调色板初始化0 O5 C Z/ A0 f& m2 B/ H
- Palette_Init: @: V* { `( _/ [9 J7 {
- LDA #$3F) f* }% \: ?) L
- STA PPU_ADDRESS+ C$ G% A. k/ N/ W3 V. o( z
- LDA #$00
) T4 f- S3 X4 ?: j9 y - STA PPU_ADDRESS
9 k7 V4 m. N+ w - LDX #$00
}! m' O6 \7 T% ]5 J - LDY #$20
6 U+ C" s1 }" g5 d" o" L5 j - .Write_Data
9 W A ~, f9 n, X; Z - LDA Palette_Data,X
2 e* z( Q/ x/ W/ c) @' ? - STA FC_PPU_Pal_Addr,X: S9 E5 ]" [; O1 p9 n+ b( L! E
- INX- v' f2 `# N6 X& u d$ L
- DEY- ~! K3 o9 e8 ~( a- G: t3 L
- BNE .Write_Data
) F( I$ X4 n: Y3 p9 g - .End3 ~# l2 Z* i+ x l9 h- `) C$ q
- RTS5 r. T8 P- A V: E
$ e2 R: k1 V8 v& u- ;----------------------------------------0 S# F8 M1 B \, Z9 ?
- ;调色板数据& e' q( H8 _5 B( Y E
- Palette_Data% W r2 w) M: U7 v9 x+ z/ E
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
, O' ` U% r+ u6 ?1 G5 x+ p9 w/ Z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22' x: v7 l/ J) z& G
- , M! u( S8 D! }, Y# b
- ;======================================================================& \+ H& j/ e4 P- q
- ;命名表清空
: _- D# Y' y" w* z* a - Nametable_Clear- Q4 L. c8 ?+ ]/ Q
- LDA #$20
( a7 g; U# K5 I& ^2 p - STA PPU_ADDRESS( `- r5 ?3 r, ?7 V: u
- LDA #$00
3 y" q, v/ x( w4 t5 r - STA PPU_ADDRESS( g, s% w# R$ r
- LDA #$00
, v" h9 a5 y% z7 Z8 o4 H1 u* L! M - LDX #$00, Q* Z: H* s/ T3 p
- LDY #$08' T. F, p, C/ k. u
- .Write_Data* K4 t% t4 H0 ]7 b1 y8 e3 ~
- STA PPU_DATA
' s( L' j7 `/ t. p - INX
/ @; w# L& E. _( w - BNE .Write_Data
( C8 H; S0 q( @- M- r5 v - DEY2 b. e- ?& F$ l* E) Q8 c
- BNE .Write_Data
. ?- n# Y8 J) a - .End5 }0 f a @% r! t) a( ~) a; g
- RTS$ \' w$ G9 L: Y
- 3 @* w0 a& g+ v3 M! }% Z8 v3 b0 Q
- ;======================================================================
! V; c/ f3 B, I* A: D& R4 v4 j% v$ X - ;音乐曲目切换* r* j# Y: x$ C% v9 f
- Music_Select_Process( \1 Q3 w% n. [, R- n6 z, d
, ?4 I% Q# r" j; E- .Pre_Music;上一曲
! x3 @% @6 L/ F4 l/ `$ t v - LDA FC_Gamepad_Once0 G: z8 @- v$ X: ^& d" m5 y- b
- CMP #JOY_KEY_LEFT: J/ x6 z9 M G6 h3 e7 _
- BNE .Next_Music
3 u* B5 Y! L, u" T0 q4 g - JSR Music_Play_Pre1 m) G4 b ^# [
- .Next_Music;下一曲
0 c2 u) U2 ?9 u/ p4 W( G- C* r - LDA FC_Gamepad_Once% I$ l# {9 A5 G% J
- CMP #JOY_KEY_RIGHT! @6 m0 L. e- U8 k: l; @
- BNE .Next_10_Music" b2 k: T( L" e7 D4 n2 u
- JSR Music_Play_Next% H$ q8 v1 Y, F) B7 c5 `" f& e
- .Next_10_Music;上10曲/ n( C& E! |; u% K
- LDA FC_Gamepad_Once! y! n( e/ d4 [9 w8 Q
- CMP #JOY_KEY_UP' u* r6 H( h/ P9 H4 B/ R% m
- BNE .Pre_10_Music
1 i4 R- U* T }/ ]( W - JSR Music_Play_Next_10
3 P% [: m; _ E - .Pre_10_Music;下10曲9 O) Q6 r- l" P, \7 l
- LDA FC_Gamepad_Once
, g% f6 G) j6 W - CMP #JOY_KEY_DOWN
3 n0 l1 E P* {$ D; Y; V5 e) d% o. l - BNE .Reset
+ {! D- C( p O5 {- s - JSR Music_Play_Pre_109 l& g) Z+ ?/ `; t' H5 Y4 M
- .Reset;重播当前曲目
3 V# M+ Q) t! V% G+ i - LDA FC_Gamepad_Once/ H/ t7 K s9 G+ ?* z/ V/ U8 B0 j
- CMP #JOY_KEY_START& }( a: d% U/ Q. s& U
- BNE .End y. B: A) N$ ~& N
- LDA FC_Music_Index# R z) _/ \: ]* N' g
- JSR Music_Init_Process
, I8 o, b( m' ~% z - .End
, e, G) [" j0 f/ R1 w - RTS
3 Z6 u$ H! k- M. ?9 l& ?& ^
. k5 P u5 [# n- ;----------------------------------------------------------------------
' W7 K! k8 q2 M2 M+ g3 T w - ;播放上一曲& b" T+ [2 g7 `" }* H. Y3 r+ D+ I
- Music_Play_Pre
/ ?3 z- y: o1 e; c+ w - LDA FC_Music_Index
0 J0 J9 p' ~8 q! g% { - BEQ .End
- }5 B, q8 J! W( F( g - DEC FC_Music_Index7 O0 O+ ]* |0 X/ w
- LDA FC_Music_Index
9 K6 B0 m1 S: Q _% ~ - JSR Music_Init_Process( ?% @ X" P% _
- .End! j; b1 H$ l$ W8 D6 g1 f7 N
- RTS3 F$ k! T8 p+ A8 n
- ;----------------------------------------------------------------------/ V* O) }' p" v, w: [8 d) w
- ;播放下一曲7 C$ t0 Q- J; s
- Music_Play_Next
- d4 q5 n8 n! I) \% o - LDA FC_Music_Index
1 z3 ?0 [( Q6 `+ ?( s - CMP FC_Music_Max_Index
; P& `! D/ _) | - BCS .End0 M4 e9 l3 K$ J9 A$ i
- INC FC_Music_Index
' t% j0 [+ I8 u( n* F - LDA FC_Music_Index
3 X7 K0 J7 f u$ R2 N9 I) D - JSR Music_Init_Process
( D+ O( \" o% y; o' D' l! Y5 W% U - .End. @! t8 V# q' D4 y, z L. w: [9 J
- RTS
3 Q# P' K1 |! ^( D0 o
8 ]0 i% F7 r0 D- ;----------------------------------------------------------------------
, n7 s6 {# w( P( z - ;播放上10曲8 d( \; c1 g, N3 o
- Music_Play_Pre_101 C- q! ?- g8 [; a; E/ X
- LDA FC_Music_Index
; O* C9 Y5 q& h" z# N& S - BEQ .End% U) h. W& k* [+ F
- SEC9 [! _2 N( e: H2 }5 O! M$ l4 ?$ i
- SBC #10
% { M2 D3 B9 Y$ ?# Y$ @) F - BCS .Pre_10 m1 `0 y' k$ R
- LDA #$00
3 c$ `3 c$ T) f' @ - .Pre_10
( Y K; l, _2 D/ ?) [& ^ - STA FC_Music_Index
% s; T, q w4 g# Y: F& O) X+ d - JSR Music_Init_Process
3 y3 z$ x+ M( M7 W: `$ K" I' l. T" a( I - .End z+ ?9 t X! n8 m. l+ h0 [, m
- RTS
: V. [, _) s d* y4 m - ;----------------------------------------------------------------------
1 m" l% S2 Z; R3 A3 s, I# u; c2 z* J - ;播放下10曲
: T; h5 h% X! h, ?' D9 q) p - Music_Play_Next_10
* t0 }. |2 U/ K1 ~! x; {; C - LDA FC_Music_Index
; ?1 J) w1 g) o8 H1 q( x - CMP FC_Music_Max_Index+ r- i/ _2 P- ^4 O. B
- BCS .End' q4 H% _: V" w
- CLC
/ z3 J1 S( y/ N - ADC #10# p( }9 c W, m
- CMP FC_Music_Max_Index9 K! b2 }) k% T; [
- BCC .Next_10
, k3 w2 C- N/ L4 N" P - LDA FC_Music_Max_Index K; h" S" O: ^, m0 E9 T
- .Next_103 v4 @0 t) G6 {7 ~+ G! e
- STA FC_Music_Index. l" O( d- O+ g# o6 D
- JSR Music_Init_Process- G0 ^: t! C+ N& b$ S7 | m
- .End. n! x; P0 Q. x; k0 c3 d0 }
- RTS
0 [0 h+ B/ q: T( b- h" {
4 s0 h- k! I3 y/ g7 ^- ;----------------------------------------------------------------------
; S9 q$ U5 l6 v8 s7 l) r0 D, j' T9 t. R - ;8位十六进制转3位十进制制
/ k7 g. t/ e# B+ E$ _ - Hex8ToDec/ ]8 i1 I/ {, s) O
- STA FC_Dec_Data_1
k& b A/ Z( h$ H' U - LDA #$00
: V0 ?2 M6 v. }# D# A - STA FC_Dec_Data_1004 M3 c0 @7 l0 x/ V) g
- STA FC_Dec_Data_10 }& I3 Z; P) _
- LDA FC_Dec_Data_1
4 K: O! C7 N% E( O3 D - .Convert_1001 p3 }9 s1 X# ?8 N% {+ |2 x
- CMP #100& j5 L6 B7 p6 M, u8 u
- BCC .Convert_10
1 j5 h5 G1 l. [, W - SEC1 i9 T- W4 M' D4 r
- SBC #100
n" s; c$ c( {6 A - INC FC_Dec_Data_100- Y1 D4 [8 ]( X( V6 a- t) K i. e
- BNE .Convert_100
( G, o9 i& Z' c% W- t6 ~& W5 [; y - .Convert_10
` P" k& O- C( B - CMP #10
( u- j. V, N) g5 w% t - BCC .End3 y, \) Q2 T5 O- |0 o
- SEC
# v a6 y9 ^, C - SBC #10- b; [4 f6 @& |4 ?* c0 e
- INC FC_Dec_Data_10
% z$ y3 v0 Z8 X/ z' \: H - BNE .Convert_10
+ k1 A; |# p/ q, f8 @ - .End+ |' q2 [$ ?3 Z$ Z5 m+ ^
- STA FC_Dec_Data_1
, n ^& G. K, {/ B - RTS% N9 K# B, t4 l' B
7 u# r# z( x' A$ L; X% f, H- ;----------------------------------------------------------------------
5 ~3 e# `! e) Z - ;显示曲目信息
4 ?) t+ j, Q1 g. |+ x0 m9 U - Music_Info_Display
( u2 N$ k4 J% H! \: t9 ] - LDX FC_PPU_Buf_Count4 V: K6 \7 V" g7 x7 J1 i, B
- LDA #PPU_WRITE_MODE_CNT_LINE
' @, [9 J. c! b) s - STA Use_PPU_Buffer,X
9 D2 v. a7 j$ L* \7 q; V) z - INX H, k8 i6 m: c, M, `
- + |+ x6 @1 s& G; ^( z
- LDA #>MUSIC_INFO_POS
0 `6 m/ x, P+ f, Q4 j9 j2 L - STA Use_PPU_Buffer,X' [0 Y; S) M! N3 `
- INX
' I! L" x3 w6 |! q1 m3 R -
6 c. g- `- o' \) r* Y, P4 O - ;居中
7 O8 t4 b4 v4 v! E; d; \ b - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
4 u) ]' V1 \- T, m& U# X - STA Use_PPU_Buffer,X7 y1 ?( l7 [7 ~
- INX% e) c7 H1 W7 W
-
: n3 v* [7 H6 I0 j% z$ b. B! Z - LDA #$05
. N; n# c, N0 v: G: } - STA Use_PPU_Buffer,X
l$ B- x( n+ r) s0 F/ Z: @1 a - INX- o" c O: x P, U) |" k9 F/ |
- 5 d, N: x: ^& Q/ @0 N
- LDA FC_Music_Index
% _$ z. m! A. h) Z0 C$ K" } - CLC
q/ p' `5 B3 R - ADC #$01
1 N9 ~2 N$ G3 r& p7 ~ - JSR Hex8ToDec
: }/ |6 Z7 ~4 U* Y0 I+ u! J0 X' R - 9 f2 l9 F; w7 }% H5 X
- LDA FC_Dec_Data_10
& o, q4 L- W; g8 q4 V - CLC |4 Q! v1 ?* L8 M! P( m
- ADC #'0'! h9 N2 D" N0 g5 g
- STA Use_PPU_Buffer,X
$ w, E2 f1 g: @& V/ ` - INX
$ j7 H# e- [8 r" L7 n2 @' X - 5 o b( m. n* J+ r4 R6 f
- LDA FC_Dec_Data_18 x! _4 @, a n3 C" C+ a4 ]! l
- CLC4 L3 _) N7 [5 Y5 g" W
- ADC #'0'& r+ ~% _; S' b0 c5 F, ^$ \. N. R
- STA Use_PPU_Buffer,X. k2 Y: ^" G- C# P
- INX. y. c1 A- l" D
-
! y, @' u# X- @3 n( H, \7 M - LDA #'/'. }0 i" T# S S, x7 ~/ F, |
- STA Use_PPU_Buffer,X! W& W+ q( J- @% I
- INX
4 o4 z& G6 X. _+ N* i" \6 j. f - 9 _6 c) g0 Q2 W+ e( |2 g
- LDA FC_Music_Max_Index
. t/ s' k$ C! q! r/ E6 i/ v. |' k - CLC
0 y' f# A- s7 S9 d% a' H. f - ADC #$019 f. l* _# s) @3 B; ]
- JSR Hex8ToDec
+ U$ p: K- x$ O4 Q3 \# @8 f - 6 b) L% M6 z1 H) \! e" B$ o
- LDA FC_Dec_Data_10# [) I2 ~' Y, R: a8 G
- CLC
) ?: L: p2 b' ]0 t8 o9 Q% R - ADC #'0'
+ L+ I6 j+ t. V- w3 G3 N" {( d - STA Use_PPU_Buffer,X1 i- p- [' V% z. e
- INX* X. W2 w7 p y* q
- 4 _$ S: d+ Z( ~
- LDA FC_Dec_Data_1
8 F# A3 E4 I/ r* v+ G! Q' I - CLC# A, Z& ^" J' H& t& J
- ADC #'0'" h9 G- r+ U" i* ~/ X5 V
- STA Use_PPU_Buffer,X
- f( N( B3 O1 b$ q% o" c - INX# B/ w6 O G2 r4 T1 G
-
, M+ m, k# g* Y) k - .End
7 K }3 Q% w; U: R7 h' h - STX FC_PPU_Buf_Count
8 s2 ^5 F" X' h8 E, z# G - RTS" p2 |, Q9 C8 K1 E1 v) ~+ A
9 v6 N4 }8 {& C4 `0 v- ;----------------------------------------------------------------------
j' g7 H; m) ?- f - ;音乐曲目初始化处理
9 G+ s$ H9 E( k. X - Music_Init_Process2 `& e& B/ T) q a
- PHA
# m1 f' }; L {! i" y - JSR Music_Clear_Process5 _/ C" [' ^" D: @ _. D
- LDA #$1F4 [% O. R' v6 \& f ^, {
- STA $4015
" E6 ?2 c+ Y8 h1 {+ g - PLA3 k6 [# Z o; y% }8 t
- JSR Music_Init_Addr8 k6 `1 P3 J+ z" i
- JSR Music_Info_Display
4 h8 y1 }: }* U- q' u: m - RTS
' v! {8 M4 ]1 R' O7 {3 \ - 1 {9 p6 z0 F# A) x) }7 Z' O9 k0 C
- ;----------------------------------------------------------------------
, v2 j0 M: q' H2 [' _. ^ - ;音乐播放处理* Z2 E( Z2 q5 Q- [/ v
- Music_Play_Process
# n6 p# r# i) l' r# G - JSR Music_Play_Addr# }% C& d& m' K0 J% `$ ?5 w
- RTS# I, a+ Z Z# L7 L( B, B. e
- 6 T3 {: _" Y4 X, j" { X
- ;----------------------------------------------------------------------
- t1 o' a1 i% `- C) y - ;音乐播放处理
! h1 a. k) |" O/ m* x+ O) x& _% o - Music_Clear_Process
6 j) \- e8 k7 l! H a - .IF Music_Clear_Addr
( H, t1 x* l2 A( _ - JSR Music_Clear_Addr
9 M1 ]0 P" a8 H! @& V - RTS
- T: H$ c6 l) n* ^# I - .ELSE) Q/ q5 c; {: o, p+ ]' i1 ^
- LDA #$1F6 p+ `- r5 k, n: C
- STA $4015
) { m1 s: h2 E0 q8 T - LDA #$00
! e7 G# @8 a4 u0 ? - STA $4010
- v. ~0 N+ a& X$ u0 Z d - LDX #$00' B* X0 [, E) q2 ?0 J& i3 s
- LDA #$00# B' c3 N) s/ ~7 \
-
# ?7 o1 B$ O( B - .Music_Clear_Zreo_Page_0
1 i* N% z* p; i; R2 j( I - STA $00,X" \2 v- Y1 t `; ?. }
- INX* s2 V! s8 r8 ~0 Y9 j @) Q
- CPX #Use_Zero_Page_Begin2 ~" k& s4 `* ]$ h! e" R
- BCC .Music_Clear_Zreo_Page_0
6 R& n/ M W3 f - # W" u" C B$ s! T' O, {/ [' I
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- T: T. d: m) B
- .Music_Clear_Zreo_Page_1
. \9 |8 m" ^( g; G; N, @5 B' Q4 r - STA $00,X# Q: r$ h3 x" E$ R
- INX
! m' T& q: B( H8 C - BNE .Music_Clear_Zreo_Page_1
' o( i3 z( z' Z: g1 |' P2 c* E2 S5 A -
- `& R# A6 O$ m, [ - Music_Clear_Process_1" n: u$ n( M7 e9 ^; S2 [% @
- STA $0600,X5 ^8 h* |; F& r. G
- STA $0700,X" y8 _ ~0 ]) E8 T7 P+ J
- INX7 W7 f% D* X4 `) @& K C
- BNE Music_Clear_Process_1
) N O. S6 ]4 U# A! Y1 g8 L - LDA #$10; M8 R7 S; T3 l) k/ q
- STA $4000; Z. M- R5 p+ A
- STA $4004. w% G7 Y u8 N8 E
- STA $400C
: {, S5 Z0 P& K - LDA #$00
% o, x+ L2 s4 q, i8 K2 y4 _# b/ H - STA $4008
, L. R) Y( m; |, K' f$ u - LDA #$0F8 Q; j1 I. ~/ D+ i3 i
- STA $4015* o2 C4 @. V s0 p! }. T- E3 Q
- .ENDIF* Q0 T4 W! a- M) n2 u- q
- * E( y# L% b' b# M& s0 n
- RTS8 | V. H) V0 h
. u8 U( P: z$ J# {% q b5 V# \7 I- ;======================================================================
: @$ e( u: d. E* f( n - ;重启处理
( A" E: `. {# u- o* Q; V - Reset_Program/ I' z C; T- H% @, l$ R8 ]
- SEI* j$ q7 E) n0 }4 t+ `. a; v
- CLD
0 T% a/ m6 I9 T% K% ~9 g - LDA #$00% h |8 O, ~2 a
- STA PPU_CTRL
, Q I) Q4 Z. h* Y( G - STA PPU_MASK
- _( O: O+ R/ B9 I* w$ S - STA JOY2_FRAME
: J/ f- T$ g; T - STA APU_STATUS
& E' z e' ?5 ^& M Y$ T -
; }( W/ U# `8 ]& O0 i$ A - ;等待屏幕准备完毕
. k/ J; T; G: Z9 y U7 N9 E* z1 \ - LDX #$02
& f% u B! Q" _: l- B6 c - .Wait_For_Screen_Ready/ ^$ V& U( t7 k1 s& p9 t) N# r b. r4 D
- LDA PPU_STATUS" g; `7 g* W9 v
- BPL .Wait_For_Screen_Ready
9 w/ J) p, u3 f( z - DEX
" q" L1 ?) M8 ^/ w - BNE .Wait_For_Screen_Ready
+ T$ r9 U5 J4 q' m! u3 [/ _ - % |7 u$ d# c1 D2 v. \) Q e
- ;清空调色板8 u- Y ~8 K' p1 b+ }
- Palette_Clear% _! j% Q- B5 Q6 p$ i
- LDA #$3F' m5 g. k, W: `/ Z# U
- STA PPU_ADDRESS2 X- A$ j, l0 ~! c
- LDA #$009 M6 r1 Z. s, S X
- STA PPU_ADDRESS* x- g& D( T" n; l1 G4 @
- LDX #$200 `- E+ l* X; X6 R0 h! b
- LDA #$0F( b7 N6 |5 G$ U$ r+ }
- .Write_Data
1 g8 w2 R5 u0 \6 h. b+ U7 X8 y' B - STA PPU_DATA/ S+ X1 f8 S: l a, k" z
- DEX C# k0 T0 `- e+ Y6 `
- BNE .Write_Data
) ?" Q* H" V( d. ` - : V( B. h) n" n, ~ n3 V
- ;清除声音 $4000-4013
) P* L9 ]4 e0 D" V: ?( Y+ B+ \ - LDY #$14
, u3 C# L( `, x - LDX #$00
. ?+ O _- d9 O( ~/ H! J# F' | - .Sound_Clear) P& h+ W; E z
- STA $4000,X4 A! I3 w5 Y7 o# M T' ]
- INX
2 S' |- Q9 @2 _9 W/ G. e7 y - DEY
! o1 G5 i% a3 j- {- Y - BNE .Sound_Clear; f* }" c" j: D# d. J7 Y6 ~
-
2 a8 p& e% u; n& s' J) I - ;清除 RAM $0000-07FF. {$ k: n9 @" A) {( Z2 V2 g
- LDA #$00
) o5 |$ R& Z. N# t# I$ O+ n - STA $00, w" `0 o) r5 ^: {
- STA $01 ]( k! a4 e3 i- P; a/ N- E: z% `
- TAY1 c; w5 B$ L: j$ N0 q" I
- LDX #$08: `# v! X% U/ @
- .Memory_Clear
9 J! M7 Q+ ~6 N L( p+ \! e6 D( M - STA [$00],Y
$ @2 ~: A' k, _ - INY I% V( R; i+ p
- BNE .Memory_Clear
. _" ?4 p% C8 S - INC $01" t6 a- z- k; F( }9 Z& V
- DEX8 P \) e$ I& s1 U1 d1 j* [
- BNE .Memory_Clear
+ H8 B9 \+ O u; Z' M - & ]! u# Q% C, U6 G
- ;精灵缓冲初始化3 k5 G/ E9 H9 w2 g! P: V
- LDX #$00
+ M1 ?6 H3 M& K4 w' g9 S$ f - LDA #$F8
6 f6 Z! u. X/ ]0 g9 h - .OAM_Clear- m8 G) B2 E" Z+ y, P
- STA OAM_DMA_Buffer,X/ U- @/ E& J; u
- INX. _9 g. H; g y8 T# v
- BNE .OAM_Clear, b* Z! v+ Y/ i$ g& q, |0 r7 r
-
' H! E4 u' d4 k6 c3 H% H - ;栈指针初始化5 ]* A. i5 n, @5 l$ g
- LDX #$FF
: ^: j1 i3 V4 X - TXS! s" S! B: w, V! ^2 g8 e9 r, d) S
-
* o- T1 C4 [+ M) V, F; [3 H - JSR Nametable_Clear;命名表清空
" S; `0 U1 o8 B. R - JSR Palette_Init;初始化调色板缓冲" g- H1 c# H' m+ x0 F5 h8 s
- JSR Static_Text_Init;初始化静态文本8 L# A; a2 L. ?" Y9 u+ P1 t2 N9 o3 q" k
- ( H" F2 ~6 R7 n8 T* i3 O% q# O
- LDA #MUSIC_ITEM_TOTAL - 1
- y3 B2 @+ n) X [4 G' [ - STA FC_Music_Max_Index
# d# c s/ I: ]$ j- o k -
7 {8 L3 X; V9 H" v# @ - LDA #$1F0 v5 P( y+ X* V4 Q. [& ?
- STA APU_STATUS
5 T0 Q. R0 d- U, V9 c - LDA #MUSIC_BGM - 1; }% |3 V- ^$ j) M5 `
- STA FC_Music_Index1 u- [2 V# s6 P M' ~( @; M, {& `
- JSR Music_Init_Process;音乐播放
9 f; c6 z& A1 E5 u4 j - - H6 H$ i# t, M; ~0 ^$ x! H5 T
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)3 {% o- q- s7 [% t: r- M
- LDA #$1E/ d* j2 X/ X+ W( p0 l
- STA FC_PPU_Mask_Buf
% F) H$ d% ]4 s6 i -
1 b/ E1 E! {" q9 u8 L - ;启用NMI处理3 Y9 S. B9 _1 g- p. V3 V
- LDA #$80 J. s/ |' _: Q; N5 a m
- STA PPU_CTRL8 J8 V+ u. k2 T( f |7 U
-
$ I2 W6 `, ?8 e! r! {- ~& | - ;程序循环, 剩余工作交给 NMI 中断处理& x: r. U, o& k& M1 M( w
- .Loop
2 d, M0 J, P9 r7 L I" I - JMP .Loop
$ I& d" U/ u1 M* w( o - 5 b/ ]& ? v8 L6 F E) G3 s7 q
- ;======================================================================
+ M$ F+ U1 \8 e% C& P - ;不可屏蔽中断处理
g: c& g# z6 o4 K: P& N - Nmi_Program
8 H* V/ f0 H* @& l8 z - PHA
% T9 z, Z5 Q1 d9 C - TXA
Z6 c9 v. t# M& ]$ y - PHA% D+ W+ P9 X+ E3 Y# V) w# B) ~
- TYA
6 U8 M2 y" X( S% Q+ n+ d - PHA& x; L0 g* S o M
-
" O( @- j& P- G - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
6 {- R6 W. ]4 E3 x, `4 x3 W$ T0 z -
# [4 Q5 B, Y0 q4 x0 e8 R$ x - JSR FC_PPU_Procrss;PPU处理/ b3 P" m7 ~: z. P- E
-
7 k1 H; t, Z. Y' ? - ;精灵内存更新- g1 ^) n! t2 L
- LDA #$00! s0 w1 V9 [* R) a( ]
- STA PPU_OAM_ADDR6 L' K$ f9 U, G+ E" [) b
- LDA #OAM_DMA_Buffer / $0100
. p& Y3 }- @1 B* [5 a4 Z - STA OAM_DMA
_* ]+ _/ p9 F7 {0 J- `; | -
" u( `3 W) K7 |5 m, m: Q% p& q - JSR FC_Gamepad_Process;手柄输入处理
- z; c; m$ A9 {: Y - JSR Music_Select_Process;音乐选曲处理
6 l7 J% P6 y, r: d/ K. c' D8 Z - JSR Music_Play_Process;音乐播放处理6 N. z% N2 I" Q0 \, Z: b" t
- 6 f( }, Q: N7 R1 o J! O' w$ U0 ~
- PLA
5 L a! f+ y( _ - TAY
# ]7 f4 w# @/ q7 L - PLA: o' f! K3 w2 E4 w! E( D$ L: U7 E
- TAX0 h2 D* h7 o, s+ F8 {, e1 w
- PLA" a! C$ u7 [, ^ P3 {
) E& c" R5 ~" ?& {- RTI
5 s$ ^, Z8 ^# P4 [, N9 s - - ~: p7 l9 x- {" a' d4 U2 s& H
- ;======================================================================
" j& i2 A9 Y' R! H - ;请求中断处理
6 | m6 e P, V - Irq_Program! j6 ]& [. I2 u/ a: S) U; X
- RTI, J2 }# h2 L0 V+ {9 R
- ! l# m+ r0 b/ M& h
- ;======================================================================
' u8 p. c3 v1 t% N: i" y" e - ;中断向量表9 E, Q( S( h: z1 z; ]; \5 V4 i
- .ORG $FFFA, t# C$ q# K6 J
- .DW Nmi_Program ;NMI触发时执行
& C/ A n/ ~* T& o; ~) Z! q - .DW Reset_Program ;载入ROM时最先执行5 _8 U8 w. \; {/ m( m0 g$ ]
- .DW Irq_Program ;IRQ触发时执行0 g- Y, b; H/ D8 T0 `3 \$ b5 f
复制代码 $ } E# m+ M" f: ^: F# F
1 q# u% J- s! d) f6 W& F4 ~
/ s4 }. C* k4 p; Rhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|