|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下3 E+ _9 v- X, b8 N

- l% y2 P* J& {) D5 |) m6 m以下是主框架代码:; @8 y! S$ q, J0 m
- ;======================================================================
4 d; @7 b- c* f$ D - ;文件头
3 R0 X8 e) W) L- Q" R - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
0 x5 M, E$ O/ V& |+ R - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量$ ?; i, K3 |" r
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
* M4 V/ X# N4 B! b' k4 N) P - ;======================================================================) x4 ?- v' g# g
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
) B7 ]0 J. P' K2 P - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
8 x! A; ?% N# R - ;======================================================================
& \% ]9 x* N: m5 A( D' j' M. r ` - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
4 I3 n% J7 U5 w - RESET_ADDR = $E000 ;主程序起始地址4 |! a1 s( p. m6 d$ S
- ;======================================================================
5 h# D5 S. q& v8 }' Z - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB1 u1 I/ k: U1 s3 @2 f4 k# @$ X
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB/ ?- v! V) g# Z- h0 k* N0 }
- .INESMAP 4 ;Mapper号 (0-4095)
/ k, b& a5 I8 t, q9 Y - .INESSUBMAP 0 ;子Mapper号 (0-15)
, m2 @1 r3 o4 P' W( b4 r - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏): a& ?: t0 E* i, B& Y* c0 Y. [0 l$ E
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! p( q. V# ?+ W& t" P' }% E5 N, B# G - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
: x) r0 B8 {) p8 S4 M1 o! c1 p# u5 _/ O - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
4 K2 I: o7 e- w - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)+ D. j6 W) O6 ^$ k; a! S- m
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)! O2 P1 w) b. j* B+ H
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)1 b5 g3 a$ k# s" X
- ;======================================================================
' G4 t9 @7 U7 J$ |/ W0 w+ s - .INCLUDE "fc_demo_config.asm" ;全局配置
$ z! q2 a3 @$ d - .INCLUDE "fc_demo_constant.asm" ;NES常量2 ^* ]9 ?' G6 S0 s4 k- P. G) g
- ;======================================================================5 b4 q8 D7 k. |
- ;音乐配置5 n( n& R0 c4 u# g
- .IF 0 = MUSIC_THEME , D) l( c5 O/ { s8 y7 O
- .INCLUDE "data/music/Gremlin 2/config.asm"
; V, U3 @% j% N8 B6 i" ? - .ENDIF! \( b+ I R3 T4 I
-
( F' a- C& s6 [! c- a - .IF 1 = MUSIC_THEME. _" j& b; q# q% t* }
- .INCLUDE "data/music/Raf World/config.asm"- B, @) l* @6 f( `% i# {1 ?
- .ENDIF
# u! V; l. T2 p! Y0 \3 S -
1 M2 K' x3 n; m/ W, F - .IF 2 = MUSIC_THEME - y2 u& _0 X$ V3 ~
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"4 d4 b* k9 r% a1 O9 ~% ]
- .ENDIF' B8 u, [, [# B# b
9 p$ m+ M- i6 A- ;======================================================================
8 ]0 x8 T6 I* ~% E8 R9 z - ;引用CHR图像数据6 _! v4 y9 Y& k; T p/ o# X
- .BANK NES_16KB_PRG_SIZE * 2
3 y$ u9 }- w- S* a6 R7 ` - .ORG $0000
2 x3 l3 b L5 r, W" q+ I - .INCBIN "data/bkg.chr"
; u) `6 r- d* ]4 p t" ]8 T" k - .INCBIN "data/sp.chr"7 m0 Z8 Q% [7 o: @- ^
- + g, G1 u5 U, E3 X; [/ c" d
- ;======================================================================7 G7 P* J L- c
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
9 W* t: T5 \0 _3 q - .ORG RESET_ADDR6 G2 T. W/ T; ~7 ]3 h% a
- ;======================================================================
8 C/ }- M9 o9 h1 {0 I, o% T" x - ;引用其他源文件" a, B3 Z1 n9 U7 r3 l
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理6 E6 Z$ F' w Y7 ?
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ d6 y; `2 d0 u; h
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理* T5 l* `7 P! ] W5 u; ?7 m1 |
- ;======================================================================
0 P& R5 ?8 V P; o$ K1 V3 n - ; {7 P& X& J6 {& g
- ;======================================================================7 f$ n5 ]0 X# b2 b. e/ A
- ;等待VBlank到来
$ b& A5 X! I% K - Wait_For_VBlank5 c/ u# {9 S: [
- LDA PPU_STATUS
2 Y/ `; z( A# J D' [; ]( C; m - BPL Wait_For_VBlank
* s% M- B! X w8 { - RTS$ f9 Z$ d& O( `/ u: J3 o
/ D' S- X0 ]7 J3 E. G- ;======================================================================
3 y4 }$ r6 N5 w& Y9 K( R% k- N - ;调色板初始化# f0 |! |, y- `7 w6 z
- Palette_Init
' g) C4 b0 Q" J/ K - LDA #$3F: h) ^$ k2 k2 G _ {) m0 n+ I
- STA PPU_ADDRESS7 K5 p6 Z* h/ p8 V, \& b% C' l5 D
- LDA #$00
$ E" {, f! y( q) c5 c; r1 Z - STA PPU_ADDRESS$ J5 Q2 |8 o* b& O+ h8 B1 `
- LDX #$00
) a* a: N2 S# n" W: U2 Y0 k - LDY #$20
- `- T% M& E% c( O2 [ - .Write_Data* l( l; {# P: m. _; T4 h: b
- LDA Palette_Data,X. _* y) [, z: A
- STA FC_PPU_Pal_Addr,X
# n, `5 I" D6 u- ~' P - INX H3 Z' C9 Z- V/ d# `$ ~3 X+ F9 ?; @
- DEY- [! Q( o2 m* R# |4 S
- BNE .Write_Data
% E% P! O) ~8 J - .End* ]0 Q3 K% U; |& _: G: Y
- RTS
! _0 l- _8 G H' s - 8 z! F$ w5 A! x( g1 b) k) m7 k7 t
- ;----------------------------------------
! X% u3 A, V" W( A T& y# K- ~ - ;调色板数据" d _: T7 m( U4 s7 c; j
- Palette_Data
1 B% e! s2 n7 h1 L- T - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
: z/ x' W2 T N" N1 u2 o7 k - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22, Y9 Z, L+ }9 @; N: O
-
) a* _( G8 |& s3 A4 K - ;======================================================================! F9 b! b% r6 ?( Q7 W
- ;命名表清空
* \9 [2 N; H: i# c - Nametable_Clear
! r, C4 j% Z1 S+ ?/ ?/ b - LDA #$20
, f3 `% l# m5 O9 ?+ n - STA PPU_ADDRESS% A1 L% w9 f7 E3 m/ D
- LDA #$00- A+ s1 p1 w; `$ \2 n
- STA PPU_ADDRESS
! u: E% M) I: F8 G0 e+ k7 L - LDA #$000 E4 _/ n) I3 {6 n$ F) m
- LDX #$00! J. y: X9 e; P2 T5 C! L
- LDY #$08
% D- d L0 H$ X) n( x9 T9 G - .Write_Data, F. H" Y y3 A. f+ g, r9 {% C: I" H
- STA PPU_DATA4 ~( B& L$ L) X% k+ m# c3 g$ m! t
- INX; [1 D0 D& }2 x2 [! S3 ?
- BNE .Write_Data t9 @! z% U4 r4 l2 Z
- DEY; _6 p1 m% R0 J) a8 B/ o) [6 `
- BNE .Write_Data
# h) Y3 b8 K3 v( V" a0 e - .End
1 F( r) |* @. q: a* F' t- A) ? - RTS+ N( Q1 Y6 ]* ]8 T7 s9 `
- . r# }0 E3 \5 p! e
- ;======================================================================, W0 _) V* h( D) H9 \
- ;音乐曲目切换
8 `8 l1 J: r! `5 r) I# N - Music_Select_Process
9 x/ {5 @0 y" F7 d! N2 {. i
! J Q8 K) p. S! J2 C- .Pre_Music;上一曲
# K; P: ^" w3 G9 W5 B2 X8 }& g - LDA FC_Gamepad_Once
5 _) b6 o# N$ G4 V6 N ` - CMP #JOY_KEY_LEFT7 z% s( P- U) a. K/ j
- BNE .Next_Music
1 G* a) K8 K% s e) j5 I - JSR Music_Play_Pre
" h5 t& ^; b+ S" ~, C7 i - .Next_Music;下一曲' n+ x2 r0 T! J; s" j$ e m, Z8 ~
- LDA FC_Gamepad_Once
/ s6 h" T7 D2 R+ S w$ @# L8 n - CMP #JOY_KEY_RIGHT
# L1 ]9 n0 G% y9 a - BNE .Next_10_Music( n4 p! M8 j5 e3 f7 L
- JSR Music_Play_Next
3 F* t2 V$ t! H. e/ [# S - .Next_10_Music;上10曲
/ b% P C* d. S/ o4 J - LDA FC_Gamepad_Once% [% _# B: J; W, s. I' G: H, |: Y
- CMP #JOY_KEY_UP
) V, p7 c+ o* G; w$ D; W5 ]1 X - BNE .Pre_10_Music- ]. R1 z5 s7 b& E' c8 I) @& A
- JSR Music_Play_Next_10
( ]+ C: F$ z! K. T+ q+ f - .Pre_10_Music;下10曲
& c' o4 X8 q) d; A/ y0 T! f - LDA FC_Gamepad_Once
% O, G$ X- u" B2 Y! [ - CMP #JOY_KEY_DOWN
: _$ l" v5 y# u3 y - BNE .Reset; W5 Z$ E a: W D6 U
- JSR Music_Play_Pre_10
0 J6 S/ \ U# N6 z) J( K* _& L - .Reset;重播当前曲目
$ m: _; J3 y6 K" |+ [1 M* ]7 d - LDA FC_Gamepad_Once( g$ E0 ~, w6 z! y) ^
- CMP #JOY_KEY_START& g# S) V, b0 V5 I
- BNE .End, O4 V8 I9 s2 ?7 t
- LDA FC_Music_Index
( X( ]9 [. x& D9 S - JSR Music_Init_Process% K/ d" v( Z; u6 O8 N$ s4 n
- .End
9 ^) } n) Y; C% o* l4 e - RTS' E, U" R1 S0 V- H* I
- 0 R1 g" [* `# W3 j' L
- ;----------------------------------------------------------------------
! D' b7 N* c, F - ;播放上一曲) Y- z- `7 q8 B' G# x
- Music_Play_Pre& O* k' c( H1 c2 k% v/ b
- LDA FC_Music_Index
3 d. d: b$ n5 e6 q3 Q+ D, L - BEQ .End
t. |! x) C n! ?/ j/ m - DEC FC_Music_Index* l. R1 E+ U0 c/ i, P: c& ?! o
- LDA FC_Music_Index/ H+ { [) z m* q7 B
- JSR Music_Init_Process- r) t0 w! I% n8 s3 S
- .End. J/ o+ M0 C* \ z% M' u; Q8 ~! ^$ M
- RTS
3 B( @$ q H/ H - ;----------------------------------------------------------------------, ]2 u6 t. d* s! }* L- P H
- ;播放下一曲7 W5 _2 W1 g* B+ l- y+ q
- Music_Play_Next# B( h7 _5 a6 i* Z& c* |2 a2 l& B
- LDA FC_Music_Index, U, u& s7 A9 A& ]& \3 f
- CMP FC_Music_Max_Index6 W3 G' I4 M+ s ?) J% n8 y1 j! z
- BCS .End
+ S, i' x3 y$ [3 J* ^& |2 @ - INC FC_Music_Index) I" S2 Q- }: n* `
- LDA FC_Music_Index4 K5 u5 @$ g1 _) n$ }3 t8 J9 C
- JSR Music_Init_Process
( w1 e/ i! _5 ]1 [4 B - .End3 Q' k3 ` W3 Z, b ?5 v
- RTS
) ?. c# n3 d: C: o( U$ ^ - * K. ?% o4 ]* g+ ^
- ;----------------------------------------------------------------------; R$ p! X7 ^1 T1 @
- ;播放上10曲9 B$ y$ u7 c: j7 P/ [7 g, M
- Music_Play_Pre_10# }6 e) i6 Z: w
- LDA FC_Music_Index% `; u3 ?. x7 {
- BEQ .End
Y6 k5 g! N: t" V1 y - SEC
S! G; K: D7 B. ` [9 z& r3 L - SBC #10
1 ~$ K, M+ \4 N. m% i - BCS .Pre_109 }+ B- B: @& A
- LDA #$00
& s0 w: B, z4 |9 N7 E - .Pre_10
2 D1 A% a( ]+ ?% S% b% p - STA FC_Music_Index1 _/ h4 b& Y' V# F: x4 u% ^8 ?
- JSR Music_Init_Process- A& T* @* C- \9 n* w" @! s
- .End
$ K, ?0 p* e: G3 g+ K - RTS) {' x: B( q6 Y: C1 w
- ;----------------------------------------------------------------------
& A% S2 ?* q4 z- Y# r2 y; N - ;播放下10曲
# e! @9 ]- W' e$ z, B5 e; g* ?0 v6 Q - Music_Play_Next_10
M U/ A6 m8 z' U - LDA FC_Music_Index
5 G8 A2 h2 a9 G" Q7 @7 U5 l - CMP FC_Music_Max_Index
8 J7 H4 ]; ^2 g$ U C - BCS .End2 m+ J# S8 G2 p5 e& e& ^( e( t
- CLC! ?9 e" T4 ~! R
- ADC #10
1 a6 [ V+ I/ C$ Z - CMP FC_Music_Max_Index: S3 n) P% [6 |; V, R
- BCC .Next_103 Z& B; M' g, \" C, {2 h
- LDA FC_Music_Max_Index
0 u- J* H3 n8 e4 r! k- j" A0 K - .Next_10
% b" U+ A( C4 _, W' i - STA FC_Music_Index; Q/ X9 n- d* J5 r4 b' k
- JSR Music_Init_Process% t3 b" ]" I5 e# r, \( x- ]
- .End
( S# i3 n' a0 t' T" I6 a - RTS, q9 y$ D; h: `/ |# Y4 n
& ^' c4 \+ k8 k7 {* x- ;----------------------------------------------------------------------
/ D( k( z; L; @% Z - ;8位十六进制转3位十进制制% F* n" l! P+ j
- Hex8ToDec
A) d- S" K$ \& M) @ - STA FC_Dec_Data_10 j4 P6 K) e. a; v+ L: m
- LDA #$00& p9 Z5 m3 x j2 r
- STA FC_Dec_Data_100
3 a! }7 R1 ^0 a5 ~0 Y G$ k - STA FC_Dec_Data_10' e% {' E- a( D, u( [6 S
- LDA FC_Dec_Data_1
" X% m4 r# P- c) A9 C0 z" M* h - .Convert_100
3 g0 d# g) M8 |* J% l4 V$ r - CMP #100
+ o% M% |1 u9 a- y8 B; x - BCC .Convert_10( L, {( }/ C( W. d
- SEC5 y- G5 l8 a- s$ S, G% [$ y" d
- SBC #1001 r/ y8 e5 q4 p7 {, ^: [
- INC FC_Dec_Data_100
* A5 d+ r3 a6 }9 F8 G1 j" p U: W - BNE .Convert_100% {' l8 ~* | ]+ S
- .Convert_10
5 [2 }! o% V W4 N `" K - CMP #107 m [% G/ h& B
- BCC .End
( [* ~! G5 q0 u - SEC
& N+ g' p" ^9 Y) I3 L, w, ]3 J1 H w - SBC #10
- I) ^7 N4 [; r$ i6 d - INC FC_Dec_Data_10
( \" z) p+ `# ^& O$ I2 ^6 q - BNE .Convert_107 w# | E: ^0 ], m! q2 [
- .End2 m7 Y+ V5 i0 X: R
- STA FC_Dec_Data_1
3 g0 `+ P& z0 u" e - RTS
; X a& C+ z `' f+ ?1 T7 v- @
4 ~) E! _1 j6 ~9 G4 Q4 w- ;----------------------------------------------------------------------& E9 n( N/ X9 h, l
- ;显示曲目信息 Q( W* s6 R( y0 G
- Music_Info_Display0 z/ [$ Z5 C5 ^: c% v$ e2 E' ~
- LDX FC_PPU_Buf_Count
' n' H1 w4 |4 r# q8 X - LDA #PPU_WRITE_MODE_CNT_LINE
, I5 B" a% o( e3 K* f- i+ U - STA Use_PPU_Buffer,X+ K2 a' D3 C3 G0 m7 L J, @! I
- INX O& Z" `" K+ _* l. A' @8 z/ d$ L
- " r1 R$ Q& p1 ~
- LDA #>MUSIC_INFO_POS
$ I; C" m, w+ C: b# b$ { - STA Use_PPU_Buffer,X
1 z! S. G$ E# Q+ r) e3 y - INX7 s. M, X) v8 w( o6 ^, y l& ~2 O; Q
- ! W0 p7 g) W7 D& k- @
- ;居中* A! h! [8 f1 i" ^: g/ U: I6 z
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2# {8 s4 ]9 u: V' [) ^7 }0 E
- STA Use_PPU_Buffer,X) {+ F$ s W# d* G& ]; ^
- INX; h6 }7 V. B7 o* B' J
-
5 `! b! H3 K0 A% i& ^ - LDA #$05
& K! d8 X3 O$ e" e$ W/ a* V$ y - STA Use_PPU_Buffer,X
6 h7 [/ V5 [; ^& E/ C& Y& C - INX: r7 {2 b7 u& \6 d4 H
- $ S" u. P+ H8 N9 l$ r
- LDA FC_Music_Index; a$ I" w( X% J' ]5 p1 c0 z
- CLC: p" `& ?; m8 B; J) F6 a
- ADC #$01
( ^ |! w$ O- R5 g0 f$ w9 [ - JSR Hex8ToDec' \: E# m: ?7 {6 \) B4 d( m; ~# A, f
- , G. x2 ?3 k, y8 ?
- LDA FC_Dec_Data_10
( h& J R$ l9 H% N. [ - CLC
: T+ f# T2 n( ^/ o$ N - ADC #'0'( |/ n5 C) H& u* b0 _
- STA Use_PPU_Buffer,X, _" b$ a1 m: W9 _; b1 h: p
- INX
- u% c4 C' e5 ^# ]; l2 z! n2 l -
& T6 Y$ M2 ]5 v; G* T; ~# y - LDA FC_Dec_Data_1* B( ?& ~4 r, k5 f
- CLC) T" A2 [$ U) U- B. `+ h+ e1 F
- ADC #'0'
! |# X+ Q+ c0 I( [7 S- o8 U& s0 K4 y - STA Use_PPU_Buffer,X
3 t8 {- h" U/ t# u: V2 x, x" T, s - INX; Z3 \" U' z9 S* K% S7 X
- 2 S- s: v; m, H0 [8 i
- LDA #'/') F- u* A5 j: x Z! b
- STA Use_PPU_Buffer,X1 g3 q1 V* u A# J
- INX
' A' Z& t& g+ S, R; d -
1 p. k j l' l; y% Y% T8 _ - LDA FC_Music_Max_Index
0 ~, I: \: }8 e, V# g4 S% _ - CLC
9 b8 N' a2 K7 B' D* Z+ M - ADC #$01
" k( Y* M/ y- E9 N( Q9 t - JSR Hex8ToDec
( u) s, N) U6 j( ~* C$ [ -
+ O9 a! @5 O' Y/ M- C6 s: w3 I - LDA FC_Dec_Data_10+ Q* Z5 l+ s4 D$ r
- CLC
2 B6 i$ V/ ] o4 A& u+ @ - ADC #'0'
4 L o( s% m6 k - STA Use_PPU_Buffer,X" a3 b: s2 \& _' \( @
- INX& \5 Q* W3 `$ F+ {/ \8 _0 i. [, B! @
- * g1 k: P0 ]+ G* I* {# i
- LDA FC_Dec_Data_1( A" {' z% U$ b/ q4 \8 \, C
- CLC
; w" W4 k' v, `. ~: @, c - ADC #'0'
3 h- p# [: C* M" T# d - STA Use_PPU_Buffer,X
1 Y/ [; J6 U& a% Y4 T8 J. v3 | - INX
7 W9 g% t1 A8 K# m; k# S2 w/ j - 1 f T5 L f7 O; O: W; d
- .End
6 C4 o, K. i: L! R9 V( m - STX FC_PPU_Buf_Count
# h# W7 Y: l, b/ o. q - RTS: t5 }+ c) T( B! D) n# f
. y8 ~/ t) G% r- ;----------------------------------------------------------------------9 j) A0 B6 A/ ]- q$ {! P$ x4 a) G
- ;音乐曲目初始化处理
. H/ T; L4 r+ H! q% O - Music_Init_Process
8 ?4 h: `9 y( N# z5 v - PHA1 y5 a B f; h1 a. S' J% @& P
- JSR Music_Clear_Process
# J' c' e: f8 N; S! v5 } - LDA #$1F
2 K' F- N( K6 L5 j) G - STA $4015
7 p) t3 r1 N. H4 I0 o, H0 J. T - PLA
, a `7 a* B# ~2 ] - JSR Music_Init_Addr7 w( }* U. y4 Z, }
- JSR Music_Info_Display
* L( s1 R# D. j: E5 h! M" } - RTS& T; P- c$ P: c. Y) V( h. i
- # L* x6 C, r5 h$ o- d
- ;----------------------------------------------------------------------
. \4 y5 Q1 b8 P* g+ p - ;音乐播放处理
$ b5 a8 Z$ B8 ` p+ {$ L" G* P - Music_Play_Process9 G% g* j# h5 ]+ `: r* ?
- JSR Music_Play_Addr
+ K) F1 j; {# l( W* u" A3 e - RTS- u: A+ l7 d4 X9 `1 T, N
- ( Z, c+ a g( O6 i; b, G- I- v
- ;----------------------------------------------------------------------, O+ Z) ] l. T7 t) Q0 h; Q
- ;音乐播放处理# U4 n2 X0 U$ g% C" J/ r
- Music_Clear_Process
0 Y% Y+ J9 c, g7 a3 K - .IF Music_Clear_Addr
3 x- @2 M; [6 {% o6 A0 P4 ^ - JSR Music_Clear_Addr1 e+ B8 s6 }6 Z% R) F/ _
- RTS: Y' q1 L, i; n1 H
- .ELSE( N- ~5 Y. G g/ {3 F
- LDA #$1F
$ U+ N/ d) k, ^% a- R0 d - STA $4015
1 M) I5 r+ A+ q8 C" R - LDA #$00
: `. h4 W+ y } - STA $4010- h F: j) N1 A: N6 C3 K7 v, \
- LDX #$001 E H1 z d0 N4 J2 E% Z0 |
- LDA #$00
+ N3 l' C# g _- c -
' x, Y# d" w& o9 I5 I - .Music_Clear_Zreo_Page_0
3 n% O* A8 t! U; K' h, ?) Q - STA $00,X$ J1 H5 y) h4 T! |
- INX1 k% p% [" N' e( [! n$ i3 x
- CPX #Use_Zero_Page_Begin
1 B1 |& k* q! W+ ] - BCC .Music_Clear_Zreo_Page_01 |' R0 d0 L1 a- C
- {! i Y* E: K! ?
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 H9 [& `9 e5 o) x! }/ T* w- a - .Music_Clear_Zreo_Page_19 O. x( D! ?" K' G# A1 k
- STA $00,X6 T) O' T4 M; k
- INX
$ d9 b" @3 A1 |- u0 p - BNE .Music_Clear_Zreo_Page_1) [1 {+ w# m) B8 X7 A+ T# g$ V
- 8 l W4 N3 L7 z
- Music_Clear_Process_1
1 N `0 A; E; |, N3 e7 ` - STA $0600,X: H: s( L, z" z3 T
- STA $0700,X
! p$ G* y& l- ]5 O# { - INX4 l a0 s0 _8 A- ?' ?
- BNE Music_Clear_Process_1% p; ]' S1 z- {
- LDA #$10, l+ J, P) A5 g6 L* M% `
- STA $4000
. y' ^8 U8 @8 o1 y. N+ U - STA $4004/ W# v" |* d* e% s
- STA $400C
4 K2 ?7 k; C; u% ^" R) z5 o+ g - LDA #$00
# ^! C2 V% @9 Y" l7 l' C( }; X6 R# h( } - STA $4008
* I- [/ ]$ H: F: @" t( Z - LDA #$0F
* N& l/ d) N, Y3 D1 {3 {3 F3 r% P* E - STA $4015% }9 R! S# z% B$ ^( f2 c
- .ENDIF; s6 Y* C8 p; p& |8 o
- & o& E+ t$ y' q" p4 [, k' U: R
- RTS
1 d; P+ r, e% s: p
" }" |( x+ ]3 T- ;======================================================================
) g- x6 r8 @. x1 x5 }7 R& q: E - ;重启处理
- Y" E! C0 p+ m3 `, g1 E7 W - Reset_Program _8 R6 g1 i1 \# G
- SEI# Y) m+ n& P- @6 O* r' v2 |' c2 P
- CLD4 o. v7 ~4 G; U n
- LDA #$00
, o6 \' R k$ D) S- Y% q2 n - STA PPU_CTRL$ k+ t0 G% j" h7 F7 |7 t
- STA PPU_MASK
$ P' e3 Q+ o/ b* a - STA JOY2_FRAME
2 g# K1 a8 O) \, P9 R' m - STA APU_STATUS4 A9 g8 _4 Q9 n8 @2 `# D
-
) t( {7 }3 j/ V4 j - ;等待屏幕准备完毕
% y3 q( @. C; Z5 u - LDX #$02
: |+ }8 o( G( u" ^& V! N1 |, a - .Wait_For_Screen_Ready) P: V8 d4 ?6 o3 t" Z( R
- LDA PPU_STATUS' N2 v8 ^' ?/ E. k+ h! Z7 j
- BPL .Wait_For_Screen_Ready, J1 d. Z! k$ `, ~. E3 A
- DEX+ w0 t% L; u: v2 O
- BNE .Wait_For_Screen_Ready& [5 {9 N: T" M" r
- 5 E0 K' a g4 _# H
- ;清空调色板+ _ f1 f# V8 ^
- Palette_Clear. q3 ?9 j: N3 r2 K: U
- LDA #$3F; p. k% O, P8 I. e, \8 v
- STA PPU_ADDRESS
5 p; B3 U# M1 I* \* I: u - LDA #$00
, e6 _; J/ ]2 u, w6 ], H7 Y - STA PPU_ADDRESS
( B h- l2 @& \% |( S8 ~ - LDX #$201 c; c1 ]! j" v" C6 `5 B- i0 T2 b# J
- LDA #$0F
) W& c+ |3 M. Z9 H/ {$ d2 Y" i: C - .Write_Data$ n7 }3 K7 e6 F8 d1 d( W% j( B! P
- STA PPU_DATA
D o( C, m: y$ Z - DEX8 J1 O- f% u4 r( ~7 A7 Y/ Q
- BNE .Write_Data1 s) h- J" s4 P
- : B6 q( y- Q6 T6 K3 n1 Z5 K0 [0 f
- ;清除声音 $4000-4013
" J" W2 D. E2 o2 t7 e, |# ] - LDY #$14
1 |- M+ G" |) g; J+ Z- q, @0 Z - LDX #$00! ]- P7 K; ?& p8 b" i: s
- .Sound_Clear5 F- G1 H. I# b: I( F
- STA $4000,X6 _( d J- z" j8 f8 x$ n( D
- INX. ?! x9 `6 R7 c h' ~! Y5 r
- DEY
* ?* d) m% P; i7 e# d& M - BNE .Sound_Clear: O, ]$ [0 t! x6 ~; l! k8 a
-
0 q3 w8 W+ V+ a" |( ?' d - ;清除 RAM $0000-07FF2 z6 I# H5 Z8 z B2 k. T5 o
- LDA #$00: K7 |! ]! d/ g( Q8 J, \
- STA $00
$ F, K( X: M! V' n K, d - STA $01
7 ?" m7 v; x! w - TAY3 ~% Q2 a7 _, T" u
- LDX #$08
+ r6 J# |# E0 [. G8 q - .Memory_Clear, ~' o8 ^' j& g! T7 m
- STA [$00],Y
( w0 |5 Z2 |) @4 L- d0 g$ T - INY
1 F, S5 f; d5 N6 O/ {" O - BNE .Memory_Clear. a, B* k: t; {: U( R
- INC $010 z8 h6 \4 f6 f' T& X% l( s! d. N
- DEX
0 e; t3 K% e7 C t! z! ` - BNE .Memory_Clear
# Z* ?: Z9 ]8 M/ p( D6 Y% Q. x - & y8 v0 i& @- J
- ;精灵缓冲初始化
9 V. y0 [; n% o. b5 w: M - LDX #$00
n* H) J0 S" A' Y - LDA #$F8 N ]4 w- _' s# N+ ?+ R
- .OAM_Clear- G; [8 @% Q s( I5 J, x* v n
- STA OAM_DMA_Buffer,X
1 g9 }4 @- |: k' J - INX) F$ B7 n$ |& p5 \$ y7 f. w
- BNE .OAM_Clear6 \, ?; j; s' h1 f) t
-
! b: `; b2 o& h& B- }! T* F* T - ;栈指针初始化
( O7 Y1 c' A+ K/ } - LDX #$FF* l8 U& [$ O a6 y* x) d
- TXS$ o) H2 f5 J8 T) f
-
' K, K5 y' d$ k; {: S) C0 B% J" { - JSR Nametable_Clear;命名表清空
, t% B( q9 L8 V - JSR Palette_Init;初始化调色板缓冲
# G" B! a$ {! q# F2 M - JSR Static_Text_Init;初始化静态文本
/ j+ ^& n) _5 m - 4 y0 M3 Y( k, I) N! P. r6 W' a
- LDA #MUSIC_ITEM_TOTAL - 1
+ O+ [3 I" M' l - STA FC_Music_Max_Index. Y2 e& w# A) C* e8 ]
- 4 d- Q: k U" J$ r6 A: Y- n
- LDA #$1F
* V; W9 Q% x$ x; X! }# M* Y% n) y - STA APU_STATUS
5 {, d( o# U; V& `) D - LDA #MUSIC_BGM - 1
4 w/ i0 z. `2 ?* x - STA FC_Music_Index1 s! [6 J' I( G* ?; [' [
- JSR Music_Init_Process;音乐播放5 b0 W/ w& N4 I7 B
- ' h: P( K5 l4 a& d* M; m
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
; E5 E9 Y0 U8 D3 d( X$ W - LDA #$1E
0 H! c& R% e2 N' U# q. j - STA FC_PPU_Mask_Buf
* c _+ H8 {* {# s- h r! N& S; t - / v, y% R$ Q6 o* @; t. t
- ;启用NMI处理
' O6 s9 `( _$ ~+ L! K; d" Q - LDA #$805 U* S7 U j0 z5 Q; |$ W# o
- STA PPU_CTRL
. Z0 d8 v4 o" `, { -
2 M: r) y9 T! V% |4 ]7 } r9 p$ ^ - ;程序循环, 剩余工作交给 NMI 中断处理
: F% N1 E5 W9 \$ e1 r - .Loop1 y" `# M$ A4 O* f4 r+ H* X* h% a
- JMP .Loop
8 E3 A! J$ C8 Y0 d' ]) F8 ~
8 j. A2 ]2 g5 j# i& l- ;======================================================================
/ }# q$ S1 Z8 I - ;不可屏蔽中断处理: n+ Z0 r s6 G- ]6 Q' V! Z6 E# X
- Nmi_Program
4 M. O* {1 P( T4 F0 w1 R - PHA
& J" F) f+ O7 Q$ x3 C - TXA. F: |9 m6 e) B* K! b
- PHA1 j# m- v' h( `; I
- TYA0 t9 K: q$ A( Y1 l
- PHA8 s- L+ d1 K- G# M5 p
- ! f- H+ A8 B+ c$ l0 d% `
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位: N ~. H6 \2 R: m$ I
-
0 u7 b, W _& W* ~3 x! P - JSR FC_PPU_Procrss;PPU处理6 ^" [! R8 F- M
-
6 y+ p9 b1 X7 |* J/ u9 j5 X) Q - ;精灵内存更新& n5 v) e9 v2 C% P- W
- LDA #$00
6 R5 V( T1 B8 G$ S0 _ - STA PPU_OAM_ADDR
% h8 U. g9 h c" F6 v - LDA #OAM_DMA_Buffer / $0100/ f+ W& A" S: _* ^
- STA OAM_DMA6 n, E& N( H4 k c/ B
- W% s' z8 f! u0 ~. }; q5 g. B# }
- JSR FC_Gamepad_Process;手柄输入处理" X4 |' X% `, W2 r
- JSR Music_Select_Process;音乐选曲处理7 }+ k1 K6 b3 ?1 `% q
- JSR Music_Play_Process;音乐播放处理
1 i0 K6 g- }% u' [% r/ e - ; X' o: ]6 ?% h5 V- p
- PLA1 g2 }5 d& ^ |0 n& G9 B5 ^
- TAY* ]% V4 `- M( l+ A' c& a0 M
- PLA+ |- c3 I! L6 B- ~
- TAX2 \4 [6 t. r% |7 E1 Q! E9 I; o1 s
- PLA
/ Z' g; b* d- L7 r; R - % l2 s2 A2 }; u9 [. { r" S: O7 w
- RTI
% ]: n+ ?& ^6 `" ?- X0 v% D
8 @ H& a/ v0 L7 G' U* B! t5 l- ;======================================================================
: ^' i+ s6 v. Y- w- f% l Z. \2 P' E - ;请求中断处理
4 j% K. y6 m1 A: l1 u) k - Irq_Program6 }1 G, u$ z( H. V
- RTI
) j9 G3 H, F' R% [: W
6 L" h" Z( v; h- ;======================================================================9 d+ l, v R- ?5 m2 z0 e
- ;中断向量表
; ~+ |! i* B) b/ t) l - .ORG $FFFA
* j/ d( N J1 C+ W9 N0 |5 ~ - .DW Nmi_Program ;NMI触发时执行* Q3 r( n7 ?( O; H! H$ x8 `% m4 L6 X
- .DW Reset_Program ;载入ROM时最先执行
7 Y# j" u7 M2 Y1 s5 d - .DW Irq_Program ;IRQ触发时执行( s' @) h6 k! }4 A9 D7 O! {. q$ Y
复制代码 / d" \: r5 x! \6 A
5 S9 i8 t! `, U" _( L: M+ m/ t: n( }8 H. r+ _3 I+ ]1 a/ N
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|