|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下5 W, G$ @# B- ^& m- [3 f
4 L9 F# W0 `# E+ Z, y
以下是主框架代码:3 j/ {+ T6 ~ K0 V( o* z
- ;======================================================================" b! _0 d: w& q7 q: M
- ;文件头, `2 H e5 C! L8 S! i
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) d9 J8 i! T: M& I6 u$ | - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
5 |9 ~8 |/ g" V - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
1 s- r6 T) Y( u$ r# } - ;======================================================================
' X | I+ V: s/ M* T6 F% l+ f - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 27 L. \4 u ~. @, E# ~, F5 Z9 Y
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1 R. G- O2 P( n0 J& o* f- j' c! h! z
- ;======================================================================
8 K2 t# A0 x+ s* c - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
+ p) g5 \+ r" a. i - RESET_ADDR = $E000 ;主程序起始地址
3 Y8 }" d" o ?0 f) y' V2 h - ;======================================================================
0 C, f& j; S+ r; s - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
- z3 `. \: {3 J0 G7 L: h5 Q. B - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB: W( C+ C; p) j$ m- }0 t9 r: B
- .INESMAP 4 ;Mapper号 (0-4095); D6 i9 S" @, d; }8 P! {0 ]
- .INESSUBMAP 0 ;子Mapper号 (0-15)8 B, l* c7 j/ l5 u
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! c8 J1 g* n( ~: h8 ]2 d" n! M - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
2 _' Q2 v" \- E& X - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
' \& `, ^, h9 R# W% J7 j - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数): [- V9 ^3 t$ ^/ `
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)+ R* B9 J$ d8 y9 X0 [3 T3 X
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
5 {8 a1 F$ K9 Y: H$ Y$ K, A - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)8 q0 \# N& }4 d* K @
- ;======================================================================
* {7 U( d6 `7 n - .INCLUDE "fc_demo_config.asm" ;全局配置0 |: R) G0 u2 c; `( |$ A
- .INCLUDE "fc_demo_constant.asm" ;NES常量9 t! u2 V' o% z( G& b
- ;======================================================================& i2 u! X5 @) o8 G' E9 J
- ;音乐配置$ e( B! Z; m5 D @
- .IF 0 = MUSIC_THEME ( u3 V& Y2 O" \& C" n- s/ g- Q
- .INCLUDE "data/music/Gremlin 2/config.asm"
4 r1 m, S, k. { c1 F - .ENDIF
; n9 ^0 S; X" S) O( Z% S+ B - + p* x# @8 ?, h. _' X+ Z
- .IF 1 = MUSIC_THEME
0 D- ^! M% I, h4 K* I - .INCLUDE "data/music/Raf World/config.asm"
: j0 F I d+ w/ @" n+ l0 n - .ENDIF
- ?2 i" v1 `* T& v( R2 M -
4 {7 M \% q6 x - .IF 2 = MUSIC_THEME
+ B. ]7 ]6 Y* n$ b7 g2 e% } - .INCLUDE "data/music/Ninja Gaiden 3/config.asm". Y# f; g9 R$ x
- .ENDIF5 v3 c! \6 h) G2 P x4 _" n( `
! {$ @4 r4 P% i+ {* X- ;======================================================================
% _1 d( F( k' ^9 K - ;引用CHR图像数据
5 t6 V0 }6 s' W$ P - .BANK NES_16KB_PRG_SIZE * 2* t' g1 d5 a4 |/ H* O
- .ORG $0000
c9 F/ |' ]3 J4 F - .INCBIN "data/bkg.chr"3 n O% f+ h }5 O3 j. L& _
- .INCBIN "data/sp.chr") `7 P# c* u. n( n
- # H! `! c* a0 ]4 R6 T8 R
- ;======================================================================, A! q" p1 w8 `
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" u9 P" ~ S' k4 T( P) ~
- .ORG RESET_ADDR
( X% {4 J% i+ T! p1 q% y - ;======================================================================, b2 K1 g8 Z* q$ ]* K
- ;引用其他源文件
) X" ], D2 B/ y2 F0 Q - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ c; }4 L2 K5 ~& z6 c - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' d* O% w8 O" u& F
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理+ S. k$ `- C8 r" A9 c- x) |! _
- ;======================================================================
- [6 g; M: r9 ~, f - 1 o! V) q- _' T9 O3 i' S6 R, R
- ;======================================================================) O$ g5 F2 q- _- p1 u9 P! P
- ;等待VBlank到来
0 y1 d2 U, H- } - Wait_For_VBlank
o* }& J) r5 j P. u9 t. l/ R - LDA PPU_STATUS
' h- ^" {3 i- D+ o6 D4 a+ F6 g - BPL Wait_For_VBlank+ R1 @7 e0 r( K2 e
- RTS. B7 b" ~6 R) B' D5 g1 ?+ d
- 0 l7 i7 _# u* Q2 u: m3 g
- ;======================================================================
6 O1 Q$ k, T8 A0 c8 I7 ^) f E - ;调色板初始化
w: b, d8 g6 y4 ^/ ^" | ^' {$ y - Palette_Init9 M8 h# S9 m; Z; ?3 g9 o8 g
- LDA #$3F
, H6 p" n4 j& X. k( A, A - STA PPU_ADDRESS
; ?' f! m& U8 N" J - LDA #$005 b! p. v% `' d9 m( |3 h9 z
- STA PPU_ADDRESS
5 W' V5 f1 v4 r' k. a$ X+ B4 }# r - LDX #$002 N4 T, \2 f/ b9 H
- LDY #$201 i s, \8 T1 {9 `; z, a' c
- .Write_Data, L7 l N; u, I! l% L
- LDA Palette_Data,X
7 J0 ~2 ~ U# a - STA FC_PPU_Pal_Addr,X
& Q6 x' u# W3 s+ b; W - INX t/ C; b2 j5 ^
- DEY
. I. |, d1 D7 H b9 [* \: u - BNE .Write_Data% `/ G2 Q$ y+ q# F
- .End
% D' p; w* @8 l+ f0 Z% H - RTS
G! Z5 D) n6 q1 U/ F
( k0 |" `7 K* V h! f3 ]: S- ;----------------------------------------5 k# t& E" j0 }7 m3 W
- ;调色板数据/ ? u: ~ R3 s' V
- Palette_Data
; J4 g0 t3 \; E: R! H - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B7 K$ m. J/ b I
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
! r ~; y1 ^3 G- O' g: D2 X+ k4 @ -
8 z8 n- g" ~$ d - ;======================================================================, N( g0 A0 p' o. y
- ;命名表清空5 h* v' y& I: Q' {
- Nametable_Clear7 P7 R) R% [( b7 o% A
- LDA #$20! S6 v0 _; _, U6 B5 R
- STA PPU_ADDRESS# u" g4 N3 f, S- ^# W
- LDA #$00# m+ J+ ^) v8 ~$ m
- STA PPU_ADDRESS
* u& j8 A0 ?/ Y3 A. ] - LDA #$00: F, Y$ a0 m! w* n' N" s
- LDX #$006 t$ y4 S# Y- M s" j$ |
- LDY #$08
- X! @6 d; I2 r; r/ Q; v - .Write_Data1 [: G0 Q1 Z* ~ z
- STA PPU_DATA
8 v% g$ J" w4 l v - INX
/ K; ?0 J5 P4 M) J7 x) e - BNE .Write_Data7 ^- r% z* p7 T6 n: g( _$ D- f
- DEY- x* L1 V4 T- ]" I1 H6 a5 o C
- BNE .Write_Data
6 W; N$ D+ u2 W; T - .End
# b( z0 C: a) J6 @5 b5 [, ^ - RTS
) z$ ?; b' h7 U# v1 A - & k1 w- G4 `5 Q" [# E0 g
- ;======================================================================5 R9 ]9 X6 w) F( k
- ;音乐曲目切换
. Y' |4 Z# o2 [* l; Z3 N s: t - Music_Select_Process- n& C6 a1 i% ~
- * Y7 T2 d( h/ Z" J: W: a+ v& w
- .Pre_Music;上一曲
$ O5 a0 S! v1 \/ z6 B% ]% Q - LDA FC_Gamepad_Once! I7 m/ n6 a4 ~3 n# ~; Z+ N. Z
- CMP #JOY_KEY_LEFT
; f- G, i# m# _ - BNE .Next_Music
% w9 e! [8 `4 j% ~/ `! q$ P - JSR Music_Play_Pre
. D, J5 Q' _9 v, B! \) l' n" T - .Next_Music;下一曲
" I- p9 t! G: Y+ a5 p3 D" H" H% k - LDA FC_Gamepad_Once
: m" m8 j4 j8 G/ y4 L' s$ l$ e$ i - CMP #JOY_KEY_RIGHT
$ {- E2 t" q9 Z1 z6 \7 m1 [2 m - BNE .Next_10_Music
: O& L6 u' }7 G - JSR Music_Play_Next
5 H" X7 t( d/ J. e- @% m - .Next_10_Music;上10曲) u" G! p7 A5 n% Y G
- LDA FC_Gamepad_Once. ?$ v9 A% q: i8 |. B
- CMP #JOY_KEY_UP' x5 q: u& k; V7 x
- BNE .Pre_10_Music
4 y8 T, U) r8 o$ ^1 N' ` - JSR Music_Play_Next_10
* A+ W8 N ^) Q/ u* c8 ^ - .Pre_10_Music;下10曲1 |$ J% [1 r( e( T$ p, Y
- LDA FC_Gamepad_Once
$ N8 T# l# a+ j5 `5 Y) @- H - CMP #JOY_KEY_DOWN! R: B0 v2 [+ ]; t w
- BNE .Reset
; [0 n% d* q# p, X - JSR Music_Play_Pre_10
2 R- c" ]4 _9 [3 z" d - .Reset;重播当前曲目
- Z/ j& `: F2 a% I' {' C' T - LDA FC_Gamepad_Once
6 D4 j, i1 Y4 Q% e+ V$ e - CMP #JOY_KEY_START" o5 ~/ p& |4 @& w9 G
- BNE .End. Q5 N" u+ {6 Z0 Q. H: i3 M
- LDA FC_Music_Index% h* ~1 n. p% S0 R, F/ M, ~9 |; C2 \
- JSR Music_Init_Process* h7 U9 a: A& a2 _
- .End
! ^+ {, ~/ N, B ^" T - RTS# [8 S8 Z. s; Z) F% ^' f0 L! g7 N
+ G/ G7 f" \) u, z8 O8 M- V, a- ;----------------------------------------------------------------------
4 ]' H( S( q6 I& t) W4 P' m - ;播放上一曲4 Z$ |- [0 Q o8 p
- Music_Play_Pre, L0 G5 d9 j# M
- LDA FC_Music_Index! ?: I8 a) G4 o
- BEQ .End
! Y& W# s6 m4 G8 T. |* x' ]$ `7 [ - DEC FC_Music_Index
! A/ J" `) G+ ?+ p8 f* H" v - LDA FC_Music_Index
. b" b( \7 n# [8 U0 r - JSR Music_Init_Process
9 G- D! |" a; L$ y - .End
, a6 Q. S- a4 K. @" L# A - RTS- h# E. \( v% Y; y) I8 u
- ;----------------------------------------------------------------------; x& @# `9 g) ^: s. ?
- ;播放下一曲
9 I9 u; `' A$ y+ i, }9 [4 K - Music_Play_Next
* O8 q7 A* Y. a: Y! u$ E2 k - LDA FC_Music_Index
; g1 B! p; n! Q0 c" A - CMP FC_Music_Max_Index$ u; o+ O& _) ~& D8 ]
- BCS .End
3 a: S4 ~$ U/ z3 q" O - INC FC_Music_Index
7 }6 _1 c6 \/ W% h( F3 F- w - LDA FC_Music_Index
4 ?" \ P) I7 C9 K5 I - JSR Music_Init_Process7 S" D# M+ n# r
- .End
6 E1 l8 S$ p1 L, C' p# k4 L - RTS; f) Y3 |' y9 O! z- G
+ E+ N/ j8 B7 p2 I- ;----------------------------------------------------------------------
2 G0 ]9 T7 v. C! f6 j% P - ;播放上10曲. k. ?) ^3 q" ^
- Music_Play_Pre_102 i( l2 q0 h0 U+ v8 U
- LDA FC_Music_Index
' ?: u% N) t: r( b* C m! E7 U - BEQ .End
6 K: n* j# ]6 k1 D% }3 Z - SEC$ j* z3 O! }2 e: _7 a F
- SBC #10
- s$ [, ?0 y6 B9 q0 t - BCS .Pre_10 S5 ^$ A* \# Z( \
- LDA #$00
m( z* t6 t" R - .Pre_10( B* \9 P7 \5 z9 n A
- STA FC_Music_Index
9 F: u; F: ?! m* \2 Q2 h. m - JSR Music_Init_Process; F' K9 c. i% Z0 H( a9 n
- .End4 k% Q' r2 R1 ~+ E
- RTS6 ` K. s* y$ r- c0 s+ {2 M
- ;----------------------------------------------------------------------
# k0 l$ V( H4 Z# z - ;播放下10曲1 X/ A+ P3 {% ^) N c/ Z
- Music_Play_Next_100 U6 l D: w0 r, e) V
- LDA FC_Music_Index; J% F! U$ o* X$ a
- CMP FC_Music_Max_Index: h3 H7 a. [* n! U. o" Y
- BCS .End
! I) k; I: O( d, Q. ` - CLC. _5 U, U# D3 }" ?1 |
- ADC #109 ]5 o$ J9 N# u) J0 ^
- CMP FC_Music_Max_Index9 b) N+ o: t4 _1 p& [$ U
- BCC .Next_10
9 d7 w& u, z7 M - LDA FC_Music_Max_Index. v3 W' d' T( R* n, ?3 A
- .Next_10% K: z2 }- S9 U7 O& g
- STA FC_Music_Index$ V' N2 r7 E: C6 {) M' ]
- JSR Music_Init_Process, m# h3 f7 n/ g' j4 t
- .End: }( {8 E: ~: ^: D6 j
- RTS
# I1 A6 I; K1 M4 G L& w: w
% }' u# Q1 F5 k& @- ;----------------------------------------------------------------------
1 g% ?6 C/ b. L& E' X+ A8 p/ L - ;8位十六进制转3位十进制制
9 r$ U8 f1 h9 \ Y' q% m. S - Hex8ToDec6 d( t7 {; X0 x5 e( c0 i7 D0 c, n
- STA FC_Dec_Data_1
9 s& G s9 y3 Z% J - LDA #$00
$ o3 D+ N2 Y( T+ N# B( @8 V+ p - STA FC_Dec_Data_100
( s0 G2 m2 _7 Z; Q! _4 J+ Z( ^ - STA FC_Dec_Data_106 q, n2 O9 _& F5 v& m; o; Z
- LDA FC_Dec_Data_1
: }0 u( q5 M3 O2 S4 h) J6 E - .Convert_100
3 F' t$ e- ~ A- n/ ]8 v6 \ - CMP #1003 I3 s$ x# c7 w4 Q j4 p: |
- BCC .Convert_10
( B' I o% D5 C9 W - SEC- R3 H A" ^, o9 Q t5 {
- SBC #1006 {. a3 I1 c- O1 U, g/ S. G2 W3 d* Z
- INC FC_Dec_Data_100
0 D" Z& m w" c9 q7 I- ~ - BNE .Convert_100
8 a" Z8 y. X. Y) K9 F7 f - .Convert_102 l' P2 t$ a" D. ]) S0 j; u
- CMP #10
; s1 b8 Q, h/ b: x* q; @ - BCC .End
$ B, G# F5 ?4 k1 l3 W* f - SEC- X2 P( e8 o: U! M' l* |3 x5 C
- SBC #10$ s4 X4 }: n3 x: y( ^7 q# @. `
- INC FC_Dec_Data_10# l! y9 e0 |3 ] j Z3 i$ [
- BNE .Convert_10
. p8 R' T' J% |2 U9 K; h - .End
4 y+ a0 U" `/ e, n - STA FC_Dec_Data_18 c/ Q2 V# H* J6 \/ u2 T" L
- RTS
4 {* l, \0 h) ?+ p
1 |+ n7 B% o" P: k0 j1 M. g- ;----------------------------------------------------------------------/ @" z# G, R7 X" A
- ;显示曲目信息
6 T1 V8 l* [7 M) o0 m3 L" _ - Music_Info_Display- u- E* C8 j. S4 B& z% B1 B" z" O* q7 ?
- LDX FC_PPU_Buf_Count% ?+ o! u; X5 |# Q0 L5 D0 Q1 |! A
- LDA #PPU_WRITE_MODE_CNT_LINE
% M7 D* J9 {' k - STA Use_PPU_Buffer,X$ B5 t- J" I2 [3 R3 Q
- INX8 F( X: H9 g# m! y# r* G
- + _ ]( E; K3 D
- LDA #>MUSIC_INFO_POS
; L% M/ Q& j( o5 |' s6 c' s - STA Use_PPU_Buffer,X' m* J. k; _! G8 ?; v4 L1 ~; B
- INX3 x. K2 U7 `7 m, Y* A s+ p
- 3 ~1 @, m0 Q3 }; I$ P
- ;居中
9 h9 Q, d B$ v- v - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2: H, P9 A4 Q) U* j' l9 a3 |
- STA Use_PPU_Buffer,X
7 v5 a& Z. [3 D t% d I" q5 o - INX
8 L6 e5 [5 r! |/ ?6 }. W - ! B! M/ u; y& z: \, O
- LDA #$059 e0 k' |8 \$ r/ j: b r0 A- L. E
- STA Use_PPU_Buffer,X$ c( V2 w7 q$ K- D: ]
- INX
+ w3 f$ |0 o8 { - . S: y* W) l' @, ~. J5 Y* M
- LDA FC_Music_Index) \8 V2 r6 o+ t9 \
- CLC
6 M9 p9 [2 w5 C( |6 {1 _+ z - ADC #$01
. X$ L5 E9 I ^1 Y1 ^3 Z - JSR Hex8ToDec& g0 P/ V+ Q" v- h7 m3 |4 t
- 1 u& b) L' N- o b; c# B1 b
- LDA FC_Dec_Data_10+ P$ h Y+ Z1 \
- CLC! g k* v# T. Q9 e5 k1 Q* t
- ADC #'0'
3 s- J: k4 v. r2 h, m: M9 G; C- G8 { - STA Use_PPU_Buffer,X
& h$ {: ^+ }' i1 y9 i7 Z - INX
W, L) [) u1 d# ^/ \" x; a# q) ^ - # Y3 x$ ^8 P0 m# x0 o- ^" {
- LDA FC_Dec_Data_1: n0 P8 k' P6 u9 _& n H6 ^0 d* N
- CLC
# Z$ s! F i' D5 o - ADC #'0'
, o/ m6 X1 H: f. E - STA Use_PPU_Buffer,X1 o- \+ s$ H" ]% Y' I0 X
- INX& u' z$ V/ ^9 I, S* p- @! t2 }: t
-
. q! O1 q4 x! g% z5 K& P - LDA #'/'; |3 B! G5 ^' x, B7 L8 }% N# S
- STA Use_PPU_Buffer,X: `' C1 W0 ^& `+ Y! ~+ V& u& t \& i
- INX
2 w' T/ o$ A; ^+ X; V -
; M! u I9 G+ p F2 t, { - LDA FC_Music_Max_Index% K, o# Q6 s7 q- s! L! I
- CLC! N }: W4 {* K, c9 R6 R( \ S. ]8 ]
- ADC #$01
9 g V: _/ j @& L" M2 w! @ - JSR Hex8ToDec
; ]0 T* i7 b" P& F. h ` -
' b1 p7 ?4 r( M+ H0 b2 H3 J9 ` - LDA FC_Dec_Data_10
4 Y5 B3 K% |) j# A. K$ v - CLC: i( |* s1 H6 p5 U5 G
- ADC #'0': e8 K2 _' C3 l6 {" O& A. G
- STA Use_PPU_Buffer,X
- d+ d: M: v# s; w - INX
: ~9 y Y% H o# K - % R8 T) a' h+ R) \/ c! J0 B- Z
- LDA FC_Dec_Data_1& n' e) s' m2 A& z( I4 U8 Z$ j
- CLC
9 \ G9 O) A( u% v9 `: _ - ADC #'0'( ?2 A8 `; \! b0 q: |* x% k I
- STA Use_PPU_Buffer,X
) O& l0 i8 R! u; c - INX
0 M5 I5 K, r9 s% [- G+ j! [6 Y7 [ - % Y J+ ]: U* m% A+ j
- .End
: J" n3 l$ W/ J- M8 C( @: H) f - STX FC_PPU_Buf_Count2 a6 `: o, E. _5 ?5 e. w
- RTS
/ C8 t3 P* n/ h/ c1 d3 m8 E; m- N - 4 ] S# \$ |+ K) ]. l8 f3 x
- ;----------------------------------------------------------------------
, e4 c! f" a s* f9 D - ;音乐曲目初始化处理
4 i% Q" ^% f+ S M - Music_Init_Process$ S$ L$ W! s3 x L& B
- PHA! b# D7 m2 U& y
- JSR Music_Clear_Process
$ l) D/ @/ z# \# E4 P: W - LDA #$1F- n" F# d" ]; |6 ?1 R( W, y5 k
- STA $4015
. B: K& q4 k3 m$ ~" l/ I - PLA
" O( _* N& t: z# ~ - JSR Music_Init_Addr' l+ z' ?& A) w$ g' |7 Z/ r
- JSR Music_Info_Display
8 Q8 q' ]* O& F1 @& L9 P" ~( G, a - RTS
9 R. u( R7 \9 z: t6 J4 \) b$ s2 U
" u j) u+ R5 ?8 R7 m N: x- F- ;----------------------------------------------------------------------: k5 |0 Q K# _( B1 H9 f9 d
- ;音乐播放处理
: U, N7 y" g& ], }9 ^, T - Music_Play_Process* Y# Q- O+ w' m9 m+ H1 i/ d+ x9 r
- JSR Music_Play_Addr r/ E) h1 c5 |
- RTS
# q/ ^8 ]* B: R - & G; P4 W& D3 `. c9 \# b
- ;----------------------------------------------------------------------
- F. v" c$ S2 z2 _" ^. ] - ;音乐播放处理) t# A6 j: c# s; x6 Q
- Music_Clear_Process
' `+ K5 u6 e- G: g - .IF Music_Clear_Addr( V a) @8 F) ]( [; V; i, b
- JSR Music_Clear_Addr: V9 H4 f9 o1 Z7 O0 c8 ?
- RTS
- B( L- |1 w# q2 \ - .ELSE" V+ C K! v9 L, W- C+ t7 }: e
- LDA #$1F- o1 [% J4 C4 y: Y+ G# n# C/ P
- STA $4015
2 L. u0 H* T- H. o - LDA #$00
' C J8 x- O5 u7 X3 ? - STA $40107 Z1 O d e2 r" k
- LDX #$00
4 o# B5 }: }- [ q" c2 T0 T - LDA #$006 U; x8 J' V% z5 d1 o3 h, N
-
2 f' ]7 X1 j/ u - .Music_Clear_Zreo_Page_0
6 T# V/ ?( u& o$ } - STA $00,X5 K: R: h% O* d& d
- INX0 P7 g5 ?+ e3 H6 i: x: L
- CPX #Use_Zero_Page_Begin4 w% ?2 w) ], ]7 S
- BCC .Music_Clear_Zreo_Page_0
8 Q H( Y: K9 x* c0 ]- m -
, M+ i- G" J8 T' \( u+ R - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size5 E2 `6 Z, [+ a/ ^" t
- .Music_Clear_Zreo_Page_1; U. b1 _7 i& \
- STA $00,X
4 N+ ^: _0 G, Z7 d/ |9 [4 } - INX* v- s, d$ {+ z; h8 }6 V: A& a
- BNE .Music_Clear_Zreo_Page_19 ~6 x4 j! O0 n
- ( e7 r5 _1 h: q0 z
- Music_Clear_Process_1& ]/ O& o) u" [2 v! ]1 E, h
- STA $0600,X
2 ]5 m' _; S9 C - STA $0700,X
- S: X t0 q6 b* O1 p4 o, ]( r5 J6 @ - INX
" P- M7 K$ V |% N7 M* K# j - BNE Music_Clear_Process_1+ N4 o. \) V4 e# u# }" ^. V. a+ x
- LDA #$100 s: e' i8 K0 R0 H. U/ Y
- STA $4000) G+ }% t3 O W5 ?, q1 K: _- [
- STA $4004
1 S, B* y4 j A. u7 c ^2 c - STA $400C
0 t: ~! e" a3 G+ e - LDA #$00
l2 l' G. F9 O4 P( c9 j - STA $40087 y4 p0 G0 C3 H. _9 R$ P9 m
- LDA #$0F
' Z1 s* W0 O: t8 W- I! Q - STA $40155 A7 a0 ?- D& R! e
- .ENDIF
1 ~" P! [* ^: a: w5 u8 @4 n$ }% \ -
% w" _. o; C, o% c - RTS; d3 } p4 ?4 L
! i8 i) s! U8 o$ a! x- ;======================================================================$ m1 ]# O" ?$ |3 w
- ;重启处理
. {6 @) d3 @% b' a: K( x. N5 A6 `$ H H - Reset_Program) ~! C. [& S0 U6 y e& _
- SEI
9 z7 I1 t' L8 Y1 ^* K0 V - CLD
% s) M( r: g5 S* B5 p - LDA #$00. c4 a7 j0 y' N" r- G% L, P
- STA PPU_CTRL1 _0 W7 N- l$ ]7 z
- STA PPU_MASK
+ L! R, w+ W0 U$ J. E - STA JOY2_FRAME% {8 ]! H% C4 ?3 Z5 a
- STA APU_STATUS
4 B, Q0 ^( [7 a7 M - 4 M$ \3 g$ ]6 t8 E
- ;等待屏幕准备完毕; v8 e$ a4 L7 K* D6 E; U* Z% s
- LDX #$02+ m. N* C6 f; R, U/ [( P% |
- .Wait_For_Screen_Ready
7 v; H: ^# W( A% o2 l; J1 r - LDA PPU_STATUS3 C$ w$ u& D+ g5 M0 M( s$ F
- BPL .Wait_For_Screen_Ready
5 n! b# M5 T7 E3 F - DEX' \' h9 S4 h, \7 D
- BNE .Wait_For_Screen_Ready- H- b( ~+ S" L
- 6 ?9 w: G* U) \* i( e
- ;清空调色板6 S3 a: g) R1 }8 K) [
- Palette_Clear
a8 V1 U( N& n, H3 d) Z0 w3 f8 z' J6 s - LDA #$3F# u( B, ?; X- P6 q2 X1 u$ V
- STA PPU_ADDRESS( D3 d; z% ^) l7 O
- LDA #$00. v$ Y' _1 `% S+ S; h
- STA PPU_ADDRESS ~9 N) F7 Q8 e8 s
- LDX #$20
3 I% i$ I3 ^+ [1 Q+ w - LDA #$0F. O& R) W$ E! L& E* R. V
- .Write_Data! _% a; `1 @, }( h* d4 ]
- STA PPU_DATA" G% [6 I. q# q' @
- DEX0 w' u/ \4 O& v; Q; h
- BNE .Write_Data0 w" Z2 l5 @, V/ n( a
7 p$ E- V) k9 Q! D- ;清除声音 $4000-4013
' |2 J# ~2 N1 ]% p - LDY #$14- m! G) {2 ?: D- D0 T6 t% ]9 Y
- LDX #$00
- X; ~5 f1 T" c I - .Sound_Clear
3 ^( B: m& u) G R$ J4 t - STA $4000,X
8 ?7 f+ f0 i8 l+ b' E5 X - INX6 Z$ _9 A# L0 ]5 M9 ^& W6 ?1 U
- DEY
. `# d) `9 P* w - BNE .Sound_Clear
+ h* x! g' F4 Z9 H4 K0 q2 ~ - * Z3 w) ?, x8 ?) Y. t' F' Q
- ;清除 RAM $0000-07FF
3 T X i4 _6 I1 |" F E2 L5 [ - LDA #$00
8 M5 b' W/ [$ C0 `7 ?# H9 g - STA $00) {9 r# R' I4 D+ |: ?, M! s
- STA $01+ F, Z6 o' s5 w7 P8 e! B/ E0 u/ N
- TAY
6 V; J2 @3 B9 A" L/ o' O - LDX #$08
% t6 c; t) Q8 }2 X1 }. Q Q - .Memory_Clear+ Y h6 R; E' [, Y( v
- STA [$00],Y
$ t: ?: s `5 K- Z; B& S/ _4 K; W - INY0 y, \; t3 n B- [+ ~) E, W# \% e
- BNE .Memory_Clear& g4 B5 ]$ T1 [8 K% U2 k8 e
- INC $01- W& R. }' G7 l/ \! B1 q/ y
- DEX
- \4 n* j. N, D; A - BNE .Memory_Clear
8 w- y; e% H' A3 z - 3 k5 ?( A% o9 j
- ;精灵缓冲初始化; P. E0 w7 v4 p) F1 ~; @
- LDX #$00
1 V- w F" s8 H2 a9 U* \ - LDA #$F8
' _* N$ N& c' Z" P2 w - .OAM_Clear' {3 x3 g' N/ v B8 Z3 w3 P
- STA OAM_DMA_Buffer,X. j& Q0 `$ `; M' G' ^5 Y$ d* O: k) l
- INX
& }# p; r! x/ ?( C' b& r - BNE .OAM_Clear
/ ~& Y' V) i' P3 ?# P -
( J9 [3 T! n4 g8 W7 D - ;栈指针初始化; X" r1 O9 x2 w! }/ F
- LDX #$FF
" D- C" W" o) E9 n6 m2 ] - TXS0 [: I. w! I& @) ]$ h- H
-
* z9 I0 W! X# b, f% K: L! T" ^ - JSR Nametable_Clear;命名表清空0 r4 ?, i9 p, b! [+ w, ?
- JSR Palette_Init;初始化调色板缓冲
. A4 q% v. b4 u# N; j& C7 t - JSR Static_Text_Init;初始化静态文本
' X8 t7 l0 i0 D ~$ l6 C7 W5 z - ; w2 v- E& c- \/ a) c! u; O
- LDA #MUSIC_ITEM_TOTAL - 1
5 W+ L5 Y5 D! V& {% h: i6 n - STA FC_Music_Max_Index
( ^- _/ i8 @( o0 ] -
5 v: S7 B2 L" k6 x! z( X - LDA #$1F
$ ^! A; Z9 f, E - STA APU_STATUS0 {! d( t, J) c! m3 `
- LDA #MUSIC_BGM - 1
1 T4 C/ ?; I" f; d$ }4 b" P4 V - STA FC_Music_Index
* B7 X$ y& |$ v" |+ Z - JSR Music_Init_Process;音乐播放
$ t! V" s6 t8 t7 s4 K1 h3 O - + m' f; p- q u- H) e
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 O8 L$ m+ c% [$ N. s/ I! L( V
- LDA #$1E7 z+ w7 g( s# E; T
- STA FC_PPU_Mask_Buf
4 Y, Y; a/ h2 @ - ( T+ t1 n0 F) G+ ?$ w2 L
- ;启用NMI处理1 Q4 w' n' `: Z! X) U
- LDA #$80) L, t: r1 ?& B4 \7 I K
- STA PPU_CTRL
7 t( @' q: x7 c - : n" d$ t. h# L) z& L3 W! q9 r
- ;程序循环, 剩余工作交给 NMI 中断处理$ S @# w$ z; o- C
- .Loop
( _) c% Q0 d4 L2 Z+ M: m& t - JMP .Loop, W% {* [4 g2 N; x
* N. I3 \7 w! l$ v& l+ {- ;======================================================================. t/ J; g. i$ u0 L
- ;不可屏蔽中断处理+ M9 |% M6 l T
- Nmi_Program
- p$ T6 F4 }) J' F - PHA
3 }) `6 ?3 z; H! l; V f9 _9 S - TXA
9 r, _6 L8 c6 r! A3 c9 i - PHA
; x; T A* k& n% U# s - TYA/ ?7 O0 p6 f6 o# }( X# c v
- PHA0 M# ^& X- a! t7 p
-
5 P2 J$ l$ ?2 R' O - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
2 s* `% s# `; A# e! K -
5 ~0 F' V C+ ]. D - JSR FC_PPU_Procrss;PPU处理7 l) {( t. Z9 u) U% P; E
-
: f$ p' @9 X! s" G8 W6 @# L- P - ;精灵内存更新
% i# s/ D3 q, R( B- I9 e - LDA #$00, ^2 O' M/ @5 w2 h8 r- y
- STA PPU_OAM_ADDR8 ], ?; r9 T" T: n4 L6 _3 Y
- LDA #OAM_DMA_Buffer / $0100
5 U/ C/ X, D u; I" j - STA OAM_DMA
' m9 s, k- y* X+ ]) g! p+ H - ! B2 l/ c+ e" u7 t
- JSR FC_Gamepad_Process;手柄输入处理9 ^! \8 t [0 r8 ?) I9 r" m
- JSR Music_Select_Process;音乐选曲处理; E: v4 N& J6 K! {: b; G
- JSR Music_Play_Process;音乐播放处理7 y) h& T! l+ T5 a# q! c' m
-
( ]( |9 g2 I$ D3 {/ M - PLA2 [; O% X5 d7 @1 ]+ J
- TAY. B; Y" I) {& R- Z
- PLA
/ A. I: S$ q) O, ?/ ^: R5 C - TAX
4 g) \2 F+ n8 x - PLA
6 [* v7 e* ?/ T5 N; X1 V - / h$ y6 }* H; y7 R2 E1 t
- RTI3 h( m @' e& S9 j j/ W5 c
3 F2 I" } _8 e7 Z* w( `; S/ }- ;======================================================================
2 @' W) ~/ m) _+ t0 s6 p' K - ;请求中断处理. J0 \; u% |7 w% y- V% d3 z* [
- Irq_Program8 q3 r* F' _9 ?' [
- RTI: S, Q0 [# S* n) ~) y
F/ U7 s' c; A- N0 }- ;======================================================================
1 X" h+ r9 N; @4 } - ;中断向量表
4 s% ]: b+ d7 X6 l1 |9 q - .ORG $FFFA
% _' l2 h( j# F) E - .DW Nmi_Program ;NMI触发时执行
- Y& | ?5 i7 X5 s& ? - .DW Reset_Program ;载入ROM时最先执行
; K6 x. A9 O9 h0 S. q6 |- L - .DW Irq_Program ;IRQ触发时执行 P7 P/ C @# e$ W4 O- ]9 ]
复制代码 7 R; _2 p: U. i% |* b @# b
/ n. N& t9 K% W% x2 _9 a; C
7 t- w$ u: j& ^" `2 J# }
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|