|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 H4 n _& R5 h1 Z
3 |) I N/ c6 j, m F( ~
以下是主框架代码:4 D& r w e9 \' a' S# P+ \
- ;======================================================================
* d! i3 J( v: ?6 m B; \ - ;文件头5 Y' A0 J D# E( m; _
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量# {' P6 X2 D" \6 m3 |
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
( B6 A G" |, i v, ]" ? - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
: g4 c( O& ?+ k& p - ;======================================================================
g) {% [- B3 N ~, O N - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 28 A3 u S% G+ B5 f6 t; |# V
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1$ S$ c7 ]9 |7 b5 Q7 _8 t# O
- ;====================================================================== i0 D d% q+ C h/ d8 k
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
: q# |' U, @3 H# S$ S& a- M% M - RESET_ADDR = $E000 ;主程序起始地址. S- _' q W+ d9 h+ k
- ;======================================================================! S2 p, D7 u) N D [7 q- A/ L
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
$ Q" p8 ]. G" v/ V) r - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
5 \- k, G. V" _# } - .INESMAP 4 ;Mapper号 (0-4095)% c1 J6 q8 R# h/ y2 P) I
- .INESSUBMAP 0 ;子Mapper号 (0-15): ^" X! B7 c9 ~5 f
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)4 G7 p* c8 F1 U( R3 N! O5 N5 s. M
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
- m* @- e. O+ t3 { - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
7 h9 G7 @# K/ \" ~ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
6 x) Q, }7 @2 o$ [+ a& F+ Z - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
$ f Z8 l0 z! P$ b7 I* r0 n - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" q3 _" |0 G5 C( _$ Q7 Y
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ d# J6 _; n5 Q) t( F0 p& ?2 v# w - ;======================================================================
" G8 o Z% A; b$ j- t; s1 |& J8 }7 M - .INCLUDE "fc_demo_config.asm" ;全局配置: [3 e) X( Y/ _. o- \ K; y8 M) A
- .INCLUDE "fc_demo_constant.asm" ;NES常量
1 c2 n3 I8 ^: @. m* c, N5 M - ;======================================================================
1 q7 Z' x1 Z3 ?+ y" y - ;音乐配置9 [. C) \, f) T: y. n% D2 P# c' \
- .IF 0 = MUSIC_THEME 5 h4 k8 F' f5 f& U5 ?
- .INCLUDE "data/music/Gremlin 2/config.asm". J- { x6 D$ l, ^" J& W6 F* ~
- .ENDIF0 g, \) k. k3 c* h2 L- z) I
- . y( G3 O' u2 O) w9 L
- .IF 1 = MUSIC_THEME( i8 J" l" }; o
- .INCLUDE "data/music/Raf World/config.asm"8 U( v/ g7 ~; P2 t; o" D6 \3 `
- .ENDIF
5 E; ~7 c& o% ]5 Q: D -
; o5 ?8 j$ G; v. `0 U - .IF 2 = MUSIC_THEME 4 l& M% C* X% ?; u- g7 \- r4 x
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 z9 a: i) N7 d& W0 z* |2 B, e - .ENDIF
1 _# d& a6 S; R% m! Z
& d5 r4 s: n; X! |- ;======================================================================
9 q) I& Q2 J" A6 S. Y/ t - ;引用CHR图像数据
5 V8 o. C- Q4 d% B# ~4 z5 ~: K - .BANK NES_16KB_PRG_SIZE * 2
$ E% w. I3 C& N( Z7 | - .ORG $0000
/ `0 `# j* c/ ^9 g+ k7 Y) ] - .INCBIN "data/bkg.chr"
) B# T; j# R' x# @, @+ S6 l - .INCBIN "data/sp.chr"
- u6 t3 Z* C" @3 L8 c9 r- o; g - 3 K6 w& K- H' ~/ m' P5 h0 y
- ;======================================================================
4 |& i! y2 b/ @! K" Y. p - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 k3 P* x3 G0 y+ N+ U; |# v
- .ORG RESET_ADDR3 A) V! M; m) q3 Y
- ;======================================================================
6 l+ y6 C: e' | Y5 C0 R2 N& {" R - ;引用其他源文件8 M8 t' Q4 m7 t7 ?3 b- X% n
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理' G! o0 O8 n9 d2 [# M' [
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 g/ S6 H$ r1 q9 {) G3 z$ q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
$ X V4 @+ O- B. F3 E! v* W( J' i - ;======================================================================
; {! n( N3 Q( T. W9 K: A! x - 1 I. P; R( C5 n: f* m5 {
- ;======================================================================
/ v9 l( {0 b. G. a- U0 G; ] - ;等待VBlank到来( v; {2 G' [' x5 y0 Z4 D
- Wait_For_VBlank
: q' X5 v. e- h3 c; j8 k' C - LDA PPU_STATUS* E+ s$ Q7 N- L+ d- d5 m
- BPL Wait_For_VBlank
# S7 L6 m; O* X/ I# p+ { - RTS$ ~5 ?# n5 C+ X& x0 v; w
- ; x+ I$ ?! w, U$ Y! g
- ;======================================================================
4 ~% c* p4 r' Q$ Q - ;调色板初始化
( j# K; h0 T1 R - Palette_Init- l4 D0 u3 E1 R- O
- LDA #$3F* D# ^" M4 @' \4 D: ]: D/ ]
- STA PPU_ADDRESS: E7 u3 [$ Q# h$ A* M3 r8 p
- LDA #$00: i) v3 O: I' W! }7 B/ P. Q
- STA PPU_ADDRESS8 t/ b7 p+ D$ X% w# Q
- LDX #$00
4 }0 x. [) g- W9 m7 s - LDY #$205 q% c3 n- h, I0 S" w3 f
- .Write_Data
% A! n, s0 Y. V1 h - LDA Palette_Data,X- f" A$ C" @9 t- |5 w& p# n
- STA FC_PPU_Pal_Addr,X
. \$ q) T, ^- c+ Y! I& b - INX
7 i, @/ h! g1 z3 d9 V. | - DEY# r5 ~% s4 d2 d$ t/ s
- BNE .Write_Data
* x# @9 O' [( ]1 f - .End
# [) T* ?" ^! \( ? - RTS
! i, w2 I6 Z, ]8 e - ) b5 B; m$ O" T* G' p$ [4 i [ s
- ;----------------------------------------
, }# n& w; f1 H6 h. D1 k# E - ;调色板数据$ d( b/ Y. ^, }- L' A/ x, s+ t
- Palette_Data H3 V7 o$ {; c
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B$ h$ F% S( f" D) n7 ~
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
3 v! E# Y( j) S$ Z - 2 [+ |: K5 b5 s* \
- ;======================================================================) z- h/ W: H3 h& |
- ;命名表清空 a! }; E( c' ~& n! H- l% N
- Nametable_Clear
- h1 n, G# Y [! ]& W n - LDA #$20
4 w* d* k" c* o; `0 a& o& c( h) _ - STA PPU_ADDRESS3 [9 ]0 W" d' g" w: z4 [( C
- LDA #$00: ] W) N/ j! [$ s! h* Z2 J+ \, Q
- STA PPU_ADDRESS
& r7 ~$ @% K* Q; j - LDA #$00
% x) F/ R" T) W/ L - LDX #$006 y a# _) \, G6 c( I- b1 S
- LDY #$081 l$ N0 a; o* _4 y6 ?
- .Write_Data- @0 M% Y# x( n& w5 e5 I$ N
- STA PPU_DATA
8 I8 l3 ]3 U' y: D: L - INX( O- t, B: O5 {: f: T! C1 {: Z
- BNE .Write_Data
0 \: r4 w1 z# I% ?7 {2 ~ - DEY) s7 P$ a( N1 X7 u
- BNE .Write_Data
7 s( {0 ]) ~2 F9 O' N9 W* i0 V - .End
+ ?, I \ e, {3 h - RTS
# z4 G( X- k( y" ~) d' Q
2 y& q6 G. O+ _- H) B- ;======================================================================7 g) A% Z/ X/ D* G J
- ;音乐曲目切换
. a, x% r w+ L! \. d9 p - Music_Select_Process8 q. P5 x, r! z3 } o
- 1 J, v" j+ t& |1 p2 n
- .Pre_Music;上一曲5 O/ ]7 P1 k' i& n
- LDA FC_Gamepad_Once
- r8 y7 D+ {3 \ - CMP #JOY_KEY_LEFT1 X) ^) \2 ]2 a; R4 [4 @1 ?3 d. H; R
- BNE .Next_Music
# n Y* M- d! B' @ - JSR Music_Play_Pre2 ^( @# t1 }+ ~( G7 c
- .Next_Music;下一曲
7 N+ r- v+ b- f - LDA FC_Gamepad_Once
% i2 F. J9 v3 I4 i7 d - CMP #JOY_KEY_RIGHT. \) q" R( @. _9 k* C& f
- BNE .Next_10_Music/ f% C: n' \7 B$ v) J
- JSR Music_Play_Next9 R# t! |% }$ b7 |7 V* t
- .Next_10_Music;上10曲% d4 |( S8 ~- d5 P
- LDA FC_Gamepad_Once& X0 P( H8 f. |" u I8 g' r
- CMP #JOY_KEY_UP: r! c0 l& ~2 W- b
- BNE .Pre_10_Music7 C# E( Z* f% y: R
- JSR Music_Play_Next_10
, e6 v; W! |, y1 M3 l# B - .Pre_10_Music;下10曲
, G9 |: y" x) J4 b( Y# s1 w9 Y - LDA FC_Gamepad_Once8 S+ ^/ p4 V$ W P; r0 E7 q( z
- CMP #JOY_KEY_DOWN7 a. T6 k% c2 J; Y6 |
- BNE .Reset
8 { P4 i% i* a3 O - JSR Music_Play_Pre_10( K/ R4 R$ Q J Q( o( g% ^$ V
- .Reset;重播当前曲目
( Q8 ^+ a+ Q, A! B1 H* k/ U( v - LDA FC_Gamepad_Once( c) A. N. T4 N
- CMP #JOY_KEY_START( w* w+ e6 J* ^8 i
- BNE .End$ {0 l2 C( a6 C& v9 x' D% K. j, C
- LDA FC_Music_Index
& ]) Y o$ D/ V' f* m* e/ f+ ^7 X - JSR Music_Init_Process8 v; F& x% H9 B" E9 z4 X0 p1 X
- .End
! e- M# `+ T7 \+ p - RTS
1 n: _0 F7 Y- i5 Q) ?) h! L( C
1 d5 D3 |& [7 N* \: M6 A- ;----------------------------------------------------------------------% a+ H$ S& Q- f# q: g# X0 D! Q' j3 ^
- ;播放上一曲% m( U4 v1 F4 |; n9 ?" X
- Music_Play_Pre' T" E: U8 W% b* y) [
- LDA FC_Music_Index
. Q9 V& ~8 u, U. L - BEQ .End
3 x; s5 T+ F2 @- X$ | - DEC FC_Music_Index
) ^, l; z3 X( ]% {+ S' \5 ] - LDA FC_Music_Index! a$ h F; B1 ~2 {
- JSR Music_Init_Process
0 _' K5 | A2 P9 o' N7 C - .End; Q; G ]% V0 v; l$ @$ Q) {7 L
- RTS
/ G" }: b; ^' S; w# D( ^4 u: } - ;----------------------------------------------------------------------
, x* c/ l* K$ D - ;播放下一曲9 g8 f* V- ^, Q2 K( }" E4 r X9 m
- Music_Play_Next
3 M) I5 ^ {. ~) O - LDA FC_Music_Index) h4 v9 l# z6 S$ V. w! Q
- CMP FC_Music_Max_Index
1 E: u5 |3 e7 r; H3 I' {+ z - BCS .End
" f! Z9 j' @! S% {9 L: w/ U - INC FC_Music_Index$ _/ o! l) p( c7 L' p8 W3 z( `
- LDA FC_Music_Index
& b8 x: S; B# K7 ?$ ~& z( s& F - JSR Music_Init_Process8 M y# K/ o& Z
- .End
5 e1 `% b* e$ M' E0 [) o3 J" V( I - RTS
5 k6 m6 V ^* Y3 `+ b$ `0 J - * z: `0 V0 ~8 z2 Z
- ;----------------------------------------------------------------------
# l' M5 g" F/ f0 ^$ B X0 Z - ;播放上10曲
+ R5 j* M4 ^# ? [+ c, ? - Music_Play_Pre_10
3 M& l6 x+ o l - LDA FC_Music_Index
0 K, `6 D* E! C- f9 M - BEQ .End
% ~& A1 a8 X P - SEC
4 c8 }5 ?1 H/ o j1 Q/ f( } - SBC #10
7 h! N3 K( o. n/ i9 ^5 K- F' ] - BCS .Pre_10
" O) |5 Z: ~# @, H" ^5 C3 z - LDA #$00
( z. {1 g) _: i4 U; X5 J - .Pre_10
+ M5 ?% N8 q0 ~2 S8 V0 z% n' e9 A; R - STA FC_Music_Index, K* p* l" ?) ?4 k i
- JSR Music_Init_Process
?* l$ H7 ]8 c& g2 Q - .End! m3 k' I: D; E T9 K
- RTS
4 T; x3 a; f* ]4 ^0 _' U - ;----------------------------------------------------------------------
$ W1 I: h& P) Q1 t0 w - ;播放下10曲
3 P6 `! v4 j' E7 t, [; z - Music_Play_Next_103 O4 A; M. f" X1 a3 h9 @( V# V
- LDA FC_Music_Index
, m4 e1 ^. b! P- }4 W P - CMP FC_Music_Max_Index
0 h2 v! `2 M' F - BCS .End
# s' s5 e4 h: b; g7 V' _ - CLC% @. c* q' [7 m+ p9 L
- ADC #10+ `1 {! @3 G4 E1 V: e$ B
- CMP FC_Music_Max_Index
2 z5 H. _' D/ k2 O- Y4 j - BCC .Next_10% i2 H$ S( D2 C0 Q4 p& x" B
- LDA FC_Music_Max_Index/ j( M% u" W. h/ j- S5 v$ }4 z
- .Next_10; s# n# L% A6 ]2 C; h$ l6 ?
- STA FC_Music_Index7 C: y# s+ \: x1 A7 e
- JSR Music_Init_Process
* O% `! {7 W3 r1 c8 W1 y - .End
, W( w; K/ B. V) K1 ?. m, I7 x - RTS, s1 u# F' ~9 _3 b7 a1 j5 F6 Q
* j7 c3 p( ]# j# `1 y- ;----------------------------------------------------------------------) C; F0 G5 y: u) S
- ;8位十六进制转3位十进制制" |9 U. O/ q6 l- r2 [
- Hex8ToDec
& c( [( Q+ z* @4 S, B - STA FC_Dec_Data_1% c+ g! b( g9 a4 m4 k1 f
- LDA #$00' C) v$ U$ w; Y
- STA FC_Dec_Data_100
8 Y L& \% I. E9 ` - STA FC_Dec_Data_10
: |6 M7 l/ V: S0 s- P - LDA FC_Dec_Data_1
1 l; j' [4 ~" V. |$ u - .Convert_100: L/ K( ], [4 R! x( k8 |6 V, B
- CMP #100
$ D2 Q/ S5 w" O" P$ Y. q4 S - BCC .Convert_10
+ g% ?0 B& V8 G0 T - SEC
. v2 ^8 L% ] G- F9 \& c - SBC #100
8 D5 Y9 V$ | _" ^ - INC FC_Dec_Data_100' m* C! m# _1 S) E# ?# s* y
- BNE .Convert_100% H9 ~' D, e7 _0 L; l$ c* \
- .Convert_103 H% Z( t3 |2 q$ x7 f
- CMP #10: I( e: n5 I! F* ?5 n# l8 @
- BCC .End
7 C/ a7 U* D4 b& V- P$ n - SEC0 G8 I, p7 G. ]/ Z* q: q( J, W# M
- SBC #10! m0 u ?" ?! ? z
- INC FC_Dec_Data_10
- J% `( i, {" p) s; y - BNE .Convert_10
/ y" p7 u% x2 S/ Y6 L3 [: r - .End9 H; `) F0 \4 y5 I6 j
- STA FC_Dec_Data_13 t/ M) E. b1 A( P# k* r8 {
- RTS3 U& {; M w& K8 C3 e9 H
- & S+ z+ Y- ~0 _8 F+ p
- ;----------------------------------------------------------------------
- r- H5 l8 u4 V! @* r - ;显示曲目信息
7 U/ X$ C6 i9 s( A - Music_Info_Display
; B$ g6 n9 H0 V) ~9 e% Z1 ] K - LDX FC_PPU_Buf_Count u7 j1 y5 b7 T
- LDA #PPU_WRITE_MODE_CNT_LINE
3 F2 l6 h0 Y" m7 U1 f$ F - STA Use_PPU_Buffer,X
" r7 c: t; R5 J: V4 f - INX o/ P: @; X$ t+ t
- : a& f' X6 R8 j& n5 a0 M4 ^
- LDA #>MUSIC_INFO_POS$ W( z" [( `/ c9 S
- STA Use_PPU_Buffer,X
% S% f4 d4 G, W1 S' ~& {6 S* v - INX9 X/ G3 ^: Z5 h h( k
- 9 d0 }( P7 M$ }2 i
- ;居中
2 M; @$ f; n$ b: }& W( C - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
/ r9 j0 j* ~8 t2 W: O# O - STA Use_PPU_Buffer,X9 y* Z# O5 l& B# K
- INX
% r- G a/ [2 j1 [3 u; u6 U -
# k5 w: o6 N! R7 U - LDA #$05
) J( H: q/ y1 F. I4 L3 g - STA Use_PPU_Buffer,X$ s- s% [# F5 h! z$ l/ N/ L2 l
- INX5 m& S3 r; Z7 h" h2 a
- : F& l; ] Q* ~6 R$ C) w
- LDA FC_Music_Index1 l/ V; I5 c8 Y$ [; A
- CLC
" s5 K( \ g. w; ^, |5 q! i8 F - ADC #$01/ g6 K; F! K- u' J* q
- JSR Hex8ToDec5 X P9 w3 k: Q8 q
-
) M* w @ R' o7 F% `. @, Z7 q - LDA FC_Dec_Data_102 M! O- Y6 k% V. w, i
- CLC- Q' F' h6 ?& T
- ADC #'0'
# f. @- p; ]: g! o - STA Use_PPU_Buffer,X
9 T0 T3 ]8 V) B: r! A - INX( s4 F& G; w/ g) M( @
- * C3 { _5 ^" i8 a% j( F
- LDA FC_Dec_Data_12 P: p1 {3 z% d
- CLC
( |: J5 x; b1 M - ADC #'0', [* @& c& [" g$ f
- STA Use_PPU_Buffer,X3 V# D8 @3 }- d7 I! \6 E
- INX
, o! J9 u) r/ p. I7 G- C- h - ! ]% `7 c* I! {7 f1 C
- LDA #'/'2 R5 m1 a( J2 V- f
- STA Use_PPU_Buffer,X) V# E% d& P9 r+ L0 B9 m+ c
- INX
! P4 ^- y$ R7 Q8 t, {5 c/ t -
. C+ ?1 T* P J - LDA FC_Music_Max_Index
* L9 K6 ^5 D/ L6 C7 J - CLC
1 ?/ C2 v( a5 A, Q6 @ - ADC #$01
$ n* Z( j" R6 s6 c$ s+ `' c - JSR Hex8ToDec
2 [; a U% m6 M! P - 6 P2 Z) |& a3 s8 I8 @& U+ i
- LDA FC_Dec_Data_103 w7 ?2 Q' ]2 z7 v/ }# V
- CLC8 r6 k: _9 m% r J& ]7 o
- ADC #'0'
2 ]0 V3 T0 `) O, i - STA Use_PPU_Buffer,X
* l9 ?% i1 P) h" `2 n6 B! p - INX4 t1 w7 N7 d1 y& n, g
- ! Y0 [% D- i% l; z
- LDA FC_Dec_Data_1
0 f* A7 M! D6 I6 D" H - CLC
& x) l2 X& {/ a- [, N% U - ADC #'0'$ i7 f; u& p: y% X3 W9 A9 M3 s
- STA Use_PPU_Buffer,X
5 ^1 t3 V2 e. a0 l$ X# W - INX
+ i8 v' ^) e+ I- d# n - 4 L# V$ n0 m* A6 M* H
- .End
4 s5 ?: P+ }1 P( X - STX FC_PPU_Buf_Count# D4 \" v: ~9 r* P7 _0 ~
- RTS
' g" B' L1 h+ G x* P. O" ^ - 6 T$ z, l# X$ K9 l. C6 }
- ;----------------------------------------------------------------------
; Z2 l: ~( _& \7 P. S6 U4 F - ;音乐曲目初始化处理
% r# ]1 P# r) ~1 D - Music_Init_Process
% g+ i6 `( O2 N. h. J7 | - PHA
7 |5 \* J3 W) d - JSR Music_Clear_Process6 e( _- J) r: O8 c B! v" I$ h9 T
- LDA #$1F
( Y0 E$ o* {' Z4 v' B( y, w: w - STA $4015, k) _3 h% M4 C4 W; B4 e
- PLA
* @% F/ y8 o( Z* k& s" T. Y - JSR Music_Init_Addr
2 z5 u; a& w# K! P" b - JSR Music_Info_Display
# i: k+ J' i4 f' e4 M2 g - RTS
% N. e4 i( m: ^- j# }* }3 z0 T' D
3 V- \* t: ], X- \/ ?6 U- ;----------------------------------------------------------------------
) g+ F. Q& w5 `/ e+ U8 r - ;音乐播放处理
$ v3 i. o$ P! D; b - Music_Play_Process/ X1 X( U4 w! H* c0 X5 b
- JSR Music_Play_Addr9 x: y- q: |( W) z
- RTS) {2 d, w5 n/ g& D0 P: D% K( ?+ ~
- 7 c7 X0 A6 W- J) \6 x
- ;----------------------------------------------------------------------, }" z) w4 ]) T4 M- M& v% v1 {
- ;音乐播放处理5 [- }' L- `, L$ o
- Music_Clear_Process8 a1 W* w2 f8 {3 M# i7 l
- .IF Music_Clear_Addr
; z* u( v: S: @$ g- A% x - JSR Music_Clear_Addr4 f; _' O: f$ w! z* q( _
- RTS
8 I: v& a& i. N; w4 m* a - .ELSE! K' N# ]' V9 g- y: ?, x
- LDA #$1F9 |4 C; ]% j3 y3 X) f1 _
- STA $4015
) l' h$ v- g; j+ k - LDA #$00
3 c/ a. Y( \/ R% ~# n - STA $4010
$ u3 S- n: j# b! _+ k - LDX #$00$ m- }3 t5 |1 [, z# ^8 _
- LDA #$00( z' K7 m" V' _0 Z7 F8 `
- 9 u$ D: ]* p- [9 y/ o
- .Music_Clear_Zreo_Page_0
) n2 c, f' q" ^. ^+ b# s - STA $00,X
. D6 k9 F7 F% E$ V! E, r' w6 j- P$ ^ - INX
9 I- t/ X- l6 i) z7 M - CPX #Use_Zero_Page_Begin. d3 z% X+ O3 |( m: k. e
- BCC .Music_Clear_Zreo_Page_0
! n' x1 C" H7 q1 z' D! o - 4 V5 \5 e; i" V5 b7 V: F: {7 h! }4 b
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
& C8 D& T3 ` k+ T: [ - .Music_Clear_Zreo_Page_18 w3 X7 \/ T' u& t/ i: u" J
- STA $00,X
& K1 U8 M0 {. H' A9 E! e - INX
0 r. i! y% i- O1 Y; v - BNE .Music_Clear_Zreo_Page_12 B! w/ d! _( D0 H& A# _) ^
- ! h0 l: i9 O p8 \
- Music_Clear_Process_18 D6 r I3 J7 r: `1 |* q! S w
- STA $0600,X9 L$ i5 v$ d. A6 p
- STA $0700,X/ W" B0 B( K. E- y0 z- i0 ^
- INX
3 \% ?: @ Q5 I9 X5 t9 L0 k - BNE Music_Clear_Process_1
. {. o2 r. m8 L7 t - LDA #$10
! Z4 I/ w7 |' |8 F* p/ g* }9 l - STA $4000
3 U( l$ R$ A' f. N! a - STA $4004+ K% {; L$ |4 u" g; a
- STA $400C
- T$ D" A/ R' F" { - LDA #$00
" _; R& n1 I0 {8 }+ S - STA $4008
2 Q) Y# T5 F! K' H5 K- M - LDA #$0F
0 ^+ u9 x# `: k; U5 Y - STA $4015
) v& ~5 K1 p0 w6 F7 e. z; H - .ENDIF8 R/ _6 }7 N; n* C. U4 ]: w0 C
- 1 ~* s" o5 n9 m8 {$ b$ z; ?1 Z2 J7 N
- RTS
8 T) d) v+ K* J }+ i; w* b9 h6 e
% S: B7 H# o0 }- ;======================================================================
0 j1 c- ~ f9 p4 @0 C - ;重启处理
& P' s' ]8 C6 ]- u: e - Reset_Program z' [$ @$ Y8 w V9 l# k
- SEI
# y; O2 X! Z! R2 X6 H - CLD
) C0 U6 x, o. k/ h7 _ - LDA #$002 k6 k# b4 R+ ]5 q. d
- STA PPU_CTRL- Q: _, n* e& C' t
- STA PPU_MASK3 a7 z" f( G9 a' W3 n b
- STA JOY2_FRAME+ b; N' q2 f7 ~' _- l* Q( S
- STA APU_STATUS- ~9 @; Q+ x* }2 H5 X$ `
- + }3 A+ [% S" ~/ A
- ;等待屏幕准备完毕8 f3 j7 y" D4 F
- LDX #$024 R) [, f0 F4 J$ S6 C7 L# }4 W9 f+ U
- .Wait_For_Screen_Ready0 S+ u7 K/ |: n! e+ R! H+ U; s) H) r
- LDA PPU_STATUS6 i2 b% F3 e4 A( c8 l2 A3 K) a
- BPL .Wait_For_Screen_Ready* |+ J$ _5 t: m7 y
- DEX
$ A# p. ~5 D8 x2 P - BNE .Wait_For_Screen_Ready
4 L( C- C. `& I5 p% R) [' }! Z -
) v' ?, n6 t9 m- Z4 v S6 t - ;清空调色板9 P4 `1 i: t; @5 ^$ ~& Q- M# C
- Palette_Clear# g4 O! k( K/ K& z6 }) A' q
- LDA #$3F
+ m- b( G$ L4 T! b - STA PPU_ADDRESS
* L" C9 U& C6 N - LDA #$008 ^; a: z+ t5 [& I' c
- STA PPU_ADDRESS) E. m' z' M* F/ x8 n* w
- LDX #$20
* U6 H% n! _6 @8 g6 I( w) K - LDA #$0F
6 [) ]- x8 ~- x( O- }% ? - .Write_Data3 Q" N8 V: g1 [2 y& c) ~& N& L+ x
- STA PPU_DATA- _0 |8 U+ d z2 o/ k
- DEX
5 M& f% m% Y, j - BNE .Write_Data8 s* n+ { y4 U" `+ w7 a" K
- , v) |: A% x( X/ V* I
- ;清除声音 $4000-4013, \6 i1 S5 E, o* G3 n; h+ A
- LDY #$14
, X2 h2 `* U" W5 R) g - LDX #$003 t" N' c ~# Z
- .Sound_Clear4 H+ p5 o1 z* ^, _ A. Z" {9 i
- STA $4000,X
& E+ Q! Y) A$ x+ K - INX
, g6 a5 F: w) H b8 t. u7 T. {# T& D - DEY
* _: X8 j( o0 Z, K7 a - BNE .Sound_Clear
3 U9 q+ |1 X: [6 s5 I4 K -
) F& P# |0 C1 n, W, B7 }2 e, L# w - ;清除 RAM $0000-07FF, o$ a/ {5 _; s9 q: u, Z
- LDA #$00/ ]; z0 i Z E2 h
- STA $00" `3 q5 ]; F$ E7 ^
- STA $01) q8 L% @( P) [3 e
- TAY0 z1 G9 V) b( c. \/ l
- LDX #$08
: M% G% S/ [! E) t8 r' z - .Memory_Clear
- L. Q0 I, G# T, O) S1 E* X - STA [$00],Y
" ]$ L9 o7 o9 O5 h - INY
+ N' W/ E/ e9 ]/ L0 ?: N+ R - BNE .Memory_Clear
2 P! [0 R, s+ C. o4 ?) ` - INC $01' F/ m$ \* g6 V$ Y [
- DEX. M9 c# k q, Y S" t: \8 A5 Q7 S& i+ S
- BNE .Memory_Clear9 J, f4 E0 ~7 k
-
- F/ @ R5 |8 L3 T! _$ C3 I$ e - ;精灵缓冲初始化
! l/ O& H4 [4 f7 o' j; n2 v' K; E - LDX #$00$ `0 G) s" u0 {9 ]2 r I2 n. b
- LDA #$F8) T1 l) q/ h+ x' I
- .OAM_Clear
4 v: P0 G1 I: @ - STA OAM_DMA_Buffer,X( Q0 e9 [% p* _* V$ X8 o9 A
- INX
% B, h/ [! h7 z* Q8 i - BNE .OAM_Clear
) H* h# P9 r4 {7 g* P% x+ d -
6 h2 b9 [- _$ h6 J9 }, A( Q - ;栈指针初始化
+ t+ k5 V) R% _" O - LDX #$FF
( l' ^* m$ g# e9 A F5 j3 c; k - TXS- b5 Z/ O1 n+ g; k" x
-
6 s: V- ?& F% i. E* V - JSR Nametable_Clear;命名表清空7 W1 b; l: d& H& G1 `" s
- JSR Palette_Init;初始化调色板缓冲1 f) ^$ f# f, a3 O, M$ F) M; P. f
- JSR Static_Text_Init;初始化静态文本
0 B/ n8 Z4 a5 J - 6 C, w: i! C* s$ t c
- LDA #MUSIC_ITEM_TOTAL - 1
4 }4 X$ @) p+ X3 i8 N/ O3 a - STA FC_Music_Max_Index( I! r' f$ ]: W3 K
- 8 J( E @! T5 E9 q3 j
- LDA #$1F( |8 Y$ _* [# k4 O9 q
- STA APU_STATUS( T- t! a% L; j, [
- LDA #MUSIC_BGM - 17 s" i& _1 `1 t* d: ^0 t6 ]( Z! y" C
- STA FC_Music_Index7 D# G- D; h0 A9 c6 q9 _
- JSR Music_Init_Process;音乐播放
0 a9 J2 M4 z+ ]' m: ?: G! i' y -
8 Y( J$ I @0 W - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)- T9 b. |0 \( n( V! U6 B' N, C( m
- LDA #$1E
$ \' x/ w- C; z& `( y - STA FC_PPU_Mask_Buf
$ W/ I* j, x: E -
5 s5 e' S/ N! k0 [! A8 Y: k - ;启用NMI处理
y! `8 Q1 y5 e J9 G7 u: M% S% X - LDA #$80
* d4 I$ c/ X1 d( K' F - STA PPU_CTRL
! V( k* f/ ?) T& }; w) l% K - , g) b8 v, k3 L: [! K0 o
- ;程序循环, 剩余工作交给 NMI 中断处理! u' Q0 @* ~0 N! S4 E q
- .Loop
, g3 z2 h7 |0 |/ Y, ^2 }# s - JMP .Loop- Z: F) G5 _/ S- ^; t$ g. b/ s
- ) U4 i& x# ~; q
- ;======================================================================
* Z- v8 l, @& @- a6 v3 t - ;不可屏蔽中断处理 u5 a: X5 H6 {% Y" e
- Nmi_Program6 M) B" E# M3 ^# I
- PHA9 W5 I" \* T% \8 @; x1 b$ T2 p
- TXA! e; A7 I% h! {% J- z/ F1 R
- PHA
% Y! Y& m" G, q/ C3 a* Q2 l m - TYA
5 L4 q h4 T& B, v! h3 j% \& o - PHA
1 V$ ~# D. }: D1 ~8 d3 g& C/ o% Y -
. }* R8 c( v9 H# \ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位* D$ e2 l1 I0 G3 j2 \
- ( J9 c1 C9 Y: i7 `2 r8 v6 L
- JSR FC_PPU_Procrss;PPU处理7 ]; K3 C; l9 N1 z7 p/ M
-
3 A9 ~- B. Y; ^1 P" s( j - ;精灵内存更新0 d M( K; p/ j4 K; E% W
- LDA #$005 K% v$ _ t/ s4 e0 q
- STA PPU_OAM_ADDR" Z0 O* [5 h6 |; H o, y/ j/ i
- LDA #OAM_DMA_Buffer / $0100
' V+ U# N9 c% @' j8 y5 f0 T0 _% G - STA OAM_DMA" f/ v/ Q# u Q5 Y( C" @' i
- 1 ]+ g3 Y$ }% ?; I8 c
- JSR FC_Gamepad_Process;手柄输入处理
5 s. q" I$ {" E- `8 l - JSR Music_Select_Process;音乐选曲处理' u/ V$ w; q, b
- JSR Music_Play_Process;音乐播放处理$ Z& b" Y8 N! N. |
-
+ O! s" e, h+ H: o$ ?+ r - PLA
( F5 Y/ Q) ]9 ~* R - TAY$ _! ^2 }$ e/ t! @! i$ V
- PLA
, I4 ?4 `+ L0 |4 m/ H8 P2 X - TAX$ v: @! S' Z( l# f* K9 x
- PLA' G& i6 \. ^, R2 D. b4 U2 e
- 8 C- ~ s- g2 K( r; V( R1 \. \1 U
- RTI
3 L$ x/ w4 Y: h. S! }: `* N! e - 8 ?4 f0 Q+ w4 K5 L8 b6 j/ F
- ;======================================================================$ C% F$ S" w/ x/ d3 {1 y1 {- Q; P$ l
- ;请求中断处理
& M. u& N3 J4 v# m( b+ w! y+ _ - Irq_Program% z0 l6 a& U0 W, T9 N. f
- RTI0 s2 u, |* k. a& }2 k* i
- 8 t( T9 J* v0 L; y
- ;======================================================================: t8 ~" b& u0 c! b
- ;中断向量表
) t2 a7 Z/ n( ?; k% | - .ORG $FFFA1 p7 y& ?& `5 ~/ g! X- m9 r
- .DW Nmi_Program ;NMI触发时执行
* D6 j8 I/ \+ t5 ]: I$ f# d - .DW Reset_Program ;载入ROM时最先执行
5 f5 v7 A* g# @. |( N2 H- i' J( W - .DW Irq_Program ;IRQ触发时执行$ `0 w ~ _: c7 U
复制代码
' ]3 a/ J+ B3 ?: A& \' t
3 k- i6 D! j o4 ^ t" d' F+ l- l' ^! j' Q7 f
https://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|