|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下% H8 B, u9 C3 A

7 N- _; E: v. t以下是主框架代码:
! X& u1 N1 X6 m+ n- H- ;======================================================================. [) p+ a! g! o9 e
- ;文件头" O$ C2 G5 @3 ]) `
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
& r0 M _& z; k6 Y" H - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 b/ \* F! Q: f6 v
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码4 t$ |( g. |9 E4 J' U% m4 [
- ;======================================================================1 a {' R& s" T; n' _. V2 R
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
! S6 h9 X! {! C4 c" H5 Z6 k - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1/ t+ l9 w$ G6 ^, k# l9 {# ]0 V
- ;======================================================================. G) w7 H4 [/ ]/ Y$ s; G! \2 A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
+ a6 i: L( L L) e( Z# l - RESET_ADDR = $E000 ;主程序起始地址- Z2 J0 T2 ^4 b5 V" O
- ;======================================================================) x. Z. [# e" g! W r9 a
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
1 ~: \2 s0 K/ K. U) [) A* Z - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( M5 A- d: }( r# X
- .INESMAP 4 ;Mapper号 (0-4095)
( O- }9 {% |3 l) K/ v/ X& ~7 d - .INESSUBMAP 0 ;子Mapper号 (0-15)
5 u; F: i2 Y) j+ v - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
- W# p0 A' y' b: s - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在) V: q5 G" A$ C. ~# s3 ^1 q" L) F! y
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)) H. [& ]1 x- {) l/ k# k f
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)- q. f- b" b1 Y i
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)" m4 u7 k& v: @. j* k4 `# O
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)- Z& G) R0 v. l; l* ?( k
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
$ S5 T9 h9 x1 x/ w& [: g8 N. R - ;======================================================================
& b$ u( @) R$ O/ s2 z - .INCLUDE "fc_demo_config.asm" ;全局配置
) J6 P" F1 ^. b - .INCLUDE "fc_demo_constant.asm" ;NES常量
% Y, x4 p2 p4 T) | - ;======================================================================
! b; U3 o# C9 R+ Y4 m3 y6 e - ;音乐配置
7 k8 e8 m- A1 ~9 O; ^5 J - .IF 0 = MUSIC_THEME 2 j& `4 U5 Q2 Z% |2 f8 n- z
- .INCLUDE "data/music/Gremlin 2/config.asm"
. p4 R0 h2 f% A/ b& w, Q* z - .ENDIF: H. p- n; U. P# y) Q) Y
- & v# [7 ?9 I$ j2 V, _
- .IF 1 = MUSIC_THEME; e6 h# w }# o; s) x! v/ O
- .INCLUDE "data/music/Raf World/config.asm"
+ J) K9 z" C' C a$ i, f - .ENDIF
V$ f% o8 E- ^6 w9 e -
+ M3 l9 J5 H# r! b) B - .IF 2 = MUSIC_THEME 6 a6 m- B( j* I7 b% R* `! e {9 M
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"+ X7 R A& B/ u( _5 L! `/ s$ h( r
- .ENDIF4 A- u& e/ ~' A, E. u) _* |2 d8 f
* }* L+ w3 Q# y- l! i- ;======================================================================
/ F4 R+ E0 {$ _6 v% e - ;引用CHR图像数据, |) @% Q3 J& I& V. q
- .BANK NES_16KB_PRG_SIZE * 2( g" ^$ ]: z1 }+ V ]
- .ORG $00008 x! }" ~( U1 o/ M$ @4 h% h* E
- .INCBIN "data/bkg.chr"+ H, O1 p' e$ C; Q8 G
- .INCBIN "data/sp.chr"- O) A" V! B9 Q
- : d$ a0 n' [' L* {* u
- ;======================================================================- u, L1 c B$ I9 _+ ]# ^) S1 U
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
$ p" n) h" A) B - .ORG RESET_ADDR0 g. M7 l# @$ c( c: x7 r! B
- ;======================================================================" [4 C6 n7 J: P: H* G3 o; D3 u
- ;引用其他源文件& D) ~/ V- j5 e9 N. A$ D
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
* g2 w) N- F8 K9 } - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' }" P8 W& g5 r; ^$ R3 l
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
( z( O* O! i; s - ;======================================================================
' X c. p# U) m: t - " W/ D. Y r% h5 Q+ [' N6 B
- ;======================================================================$ S$ G; j& Q5 w6 a
- ;等待VBlank到来
: H9 D+ Q7 f9 [ - Wait_For_VBlank/ {$ B& i n/ F8 j! c
- LDA PPU_STATUS
! M" |# f1 F5 s% ]: H$ h2 W& u' y - BPL Wait_For_VBlank
5 ^* y) h$ q9 ^ - RTS) L0 f- S+ m4 E$ a3 o3 B* n
7 o: E& c/ q6 g/ l2 j5 J- ;======================================================================' u$ @9 E4 k \% ^
- ;调色板初始化5 e+ T5 `6 A u. n; \
- Palette_Init
6 z& M' T7 l& R: b7 j) A - LDA #$3F
; Z2 w4 |0 _0 G$ Z* m4 D - STA PPU_ADDRESS
' n/ Z5 [/ o0 j* W8 ` - LDA #$00 ~6 \* u. t/ w3 U9 ~: w: W( T
- STA PPU_ADDRESS3 N9 d& b& D* j8 W
- LDX #$008 ^7 ?( S. w1 a; |4 V
- LDY #$20
/ L" h1 i/ @- n) @6 p: U - .Write_Data
3 G& {' U8 `/ I6 d6 n - LDA Palette_Data,X
3 b% x" R( b/ R, Y2 }* x# G - STA FC_PPU_Pal_Addr,X
0 R# |) ?& i2 c& G- p - INX$ D0 I, g7 r$ r; g; G
- DEY
f& l3 G( ^8 l" D - BNE .Write_Data
1 c* Z8 g d2 t% z - .End
6 V* l- x; j. _- t - RTS/ Z! O L9 F/ X( R) [6 ?9 f
) Q; d7 T; g+ a5 S3 I. c& D$ T- Y- ;----------------------------------------5 T! L5 m! ], E9 X' F
- ;调色板数据
8 T# Q" D7 k: P! p! W- S - Palette_Data
; u4 N4 A/ `5 A- W; Y - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B4 I" b8 y6 C3 n, V4 n
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 228 M( S$ m8 n0 J9 o- ]
- 5 ^' H9 q! q0 N" I2 a2 N# U4 Z
- ;======================================================================( a) `5 u& w& X5 C
- ;命名表清空) P, w5 r8 v% a v) a/ m4 Y
- Nametable_Clear4 [ d5 i# v, L9 l: L+ F' f6 H
- LDA #$20% v* E0 [; \& v( q% ]+ z0 g
- STA PPU_ADDRESS
6 q3 e8 Y' N y) ]( t- C" R - LDA #$00
5 P5 B6 A: Y! J& P0 l s - STA PPU_ADDRESS
% F& X1 G4 c) d" H8 V9 R - LDA #$00* t. A# b# R6 x6 a( J
- LDX #$009 k# H& h6 ~0 Z x2 E5 w
- LDY #$08/ @6 a1 u, V M3 T T( r4 k
- .Write_Data
E% `2 w+ \! v8 Y9 g r, b7 g - STA PPU_DATA
) R: J% n. m7 J* B% A! E3 t) ? - INX) I2 w& }3 s/ S5 }0 E, l) }% b
- BNE .Write_Data
( {! T* T; ]1 ]# M- u4 O! { - DEY
* g7 o( |* W: b% q ] b - BNE .Write_Data
) q- i5 a, x/ p* K5 v1 a5 { - .End' i: P# ?, B5 [. _
- RTS5 U2 c0 ^: R# U, N o* b5 P
- ) m! @2 b) ]* z. a7 w2 }8 Y
- ;======================================================================! A0 k, k$ A8 m$ N/ j. f8 _4 H
- ;音乐曲目切换- K! ^& W3 z8 g& t
- Music_Select_Process
6 |) I7 }2 a" }# b. |5 { - $ z& f- _' }9 o1 @! m$ D0 H
- .Pre_Music;上一曲; C* Q* \0 H* Z' k
- LDA FC_Gamepad_Once" R0 Z' d+ Q: i4 V. {) C+ S* J
- CMP #JOY_KEY_LEFT( J5 n0 t( t% B- c! p) A8 A3 l4 m
- BNE .Next_Music: K$ s, x d9 U. X' A5 A* {( {3 o
- JSR Music_Play_Pre+ \; w+ p$ |( z1 n1 I1 V
- .Next_Music;下一曲
! Y( ~: D1 W, J$ n( e - LDA FC_Gamepad_Once
+ b) z) o1 `' Z5 J - CMP #JOY_KEY_RIGHT
5 C. M; E6 I, a% p: @) \/ E - BNE .Next_10_Music9 \9 e9 Y1 G6 z' K
- JSR Music_Play_Next
, ]3 i: ~( W5 B9 }2 g* y - .Next_10_Music;上10曲" y* {; e5 N0 E* H& E
- LDA FC_Gamepad_Once- g0 o' ]( ^% I7 j4 C
- CMP #JOY_KEY_UP
* P3 j. a" o# a) h, P8 s - BNE .Pre_10_Music
/ ~8 z* n% R2 `( d - JSR Music_Play_Next_10# R, P7 @$ X4 G Z
- .Pre_10_Music;下10曲- }. R5 A3 G0 K" _
- LDA FC_Gamepad_Once% K! S4 \+ ]# I+ t: B0 t+ `
- CMP #JOY_KEY_DOWN, v7 ^$ h7 X' f% g) ^" p3 X% p8 t
- BNE .Reset
' ~! Q6 X+ }9 ]% O% {) [ - JSR Music_Play_Pre_10/ {! J5 V U( P. K& J
- .Reset;重播当前曲目/ g1 E0 x/ d5 g; [) d% R" y" a( Y
- LDA FC_Gamepad_Once
& G8 s2 j" m1 M( y; |3 s - CMP #JOY_KEY_START3 [0 }9 \% D v, J
- BNE .End, L! z5 X6 d5 t$ ?' W
- LDA FC_Music_Index
1 e! B8 r$ R- e. o0 x. S7 E - JSR Music_Init_Process
4 s0 S- G; Q3 J - .End
$ t5 I- t$ f0 v; C. ?. @6 Z. @" M - RTS
# G- |1 K$ o- o) G1 \' E' m - 0 H/ z1 Q" H* l, V
- ;----------------------------------------------------------------------
! H( o3 }4 \2 j, G, ~ - ;播放上一曲
4 h+ c: \/ N# z' Z) E7 V4 p5 |4 A - Music_Play_Pre* V# [& P" e W# E7 H
- LDA FC_Music_Index
2 h8 P0 l) f4 q2 Q- u" z/ H - BEQ .End0 R) M0 e2 ^9 X, z8 h
- DEC FC_Music_Index
1 k! r- P& n' S6 n - LDA FC_Music_Index
5 p9 t# T1 n i# d. }+ g - JSR Music_Init_Process$ T5 [6 W* u- ^/ A6 G
- .End) m7 {1 j" ?. ? g( R# r
- RTS$ U7 e) L$ A) m0 V
- ;----------------------------------------------------------------------
0 M3 s1 N( b+ ?2 p2 {6 k - ;播放下一曲1 F) N5 S; l1 ]( U7 T
- Music_Play_Next- \& P0 C9 { c1 K
- LDA FC_Music_Index
- m& A5 a4 B/ J7 O+ k# | - CMP FC_Music_Max_Index: [. Q; V# b+ j
- BCS .End$ n5 r) V5 c; h! I. c. j7 G
- INC FC_Music_Index6 f8 {' n! j; f$ j. }; f
- LDA FC_Music_Index4 T! _# f' ]+ o x g6 V
- JSR Music_Init_Process
) X9 j" o3 |$ a) v* S I - .End$ W. ]( X6 }2 P- v- U- F2 f
- RTS
( M/ x: t. b1 J* E+ y) L - 8 C0 b3 R7 D& f4 r; v
- ;----------------------------------------------------------------------5 T4 X" ^) t& b- h4 E& P+ S6 {7 |4 d& W
- ;播放上10曲* A# @- [. g* o8 T) i- X+ t
- Music_Play_Pre_10) Q" g/ @5 k8 n$ E! U, [
- LDA FC_Music_Index
0 f0 t( u! i* H+ O) z/ N- @ - BEQ .End
J) L+ P, G! b$ E1 g/ w! n8 O9 {4 ^ - SEC
! c) D. y8 Y8 q - SBC #101 `( N6 U0 I4 b% ^
- BCS .Pre_10( S" U6 D7 Q: z! N9 k* {* T
- LDA #$00
5 N1 f; O# a" Y ?3 { - .Pre_107 v. s4 ~" D% T% x( R+ g
- STA FC_Music_Index
. u+ I+ i2 x9 q - JSR Music_Init_Process) Q$ S5 |5 \" T0 h( _# G
- .End6 Z0 F4 k$ R* N' j5 f0 @& A I
- RTS6 y( G5 s$ H" Z0 X+ {6 w6 h' A( C
- ;----------------------------------------------------------------------% j p' O! B+ n" A' `# b2 H
- ;播放下10曲
5 r% w5 }6 r" X/ W+ h - Music_Play_Next_10
. b A( c! \) |$ t. B - LDA FC_Music_Index1 t8 D& x, u( r4 M& K9 P( i- h) o
- CMP FC_Music_Max_Index$ _: D/ G0 C0 |. ]; E# F$ N. h8 Y
- BCS .End0 ~0 O' D Z! O3 n! T: D
- CLC
q. T: H* b, Z$ g' d( v$ H - ADC #10
5 G% [1 t& x% ] - CMP FC_Music_Max_Index
! r/ J& U/ q5 s8 v - BCC .Next_10
; W% J4 g7 [, g6 L5 O - LDA FC_Music_Max_Index+ L0 V b. u/ F( r$ [
- .Next_10# C) ]& C$ K" p% K6 W/ u
- STA FC_Music_Index4 m6 E. v" S" h$ ^+ m
- JSR Music_Init_Process
6 n$ s [1 F" ^ B* h& S; K - .End
' _0 d3 d4 T+ K7 G$ K - RTS' Y& V4 [( v7 z
- & Z& B! t* m, d/ R' Z2 F
- ;----------------------------------------------------------------------
3 c$ _: O2 _' z$ w - ;8位十六进制转3位十进制制
, l/ @3 _$ B: Q. R1 ~' T - Hex8ToDec
- _" o0 s& ~- g6 Q2 f7 A - STA FC_Dec_Data_1
6 G. ^4 c8 S! x; j - LDA #$00
9 a6 [3 |: `' L: i" a - STA FC_Dec_Data_100
( t, e- o6 E1 y1 x& j, e* m% z7 h4 r$ Y - STA FC_Dec_Data_102 e, _2 ?* [' P1 {2 j) E, [
- LDA FC_Dec_Data_1
; y# |7 A0 n# l* H( u$ _ - .Convert_100: v; B4 |* H: N3 w8 ~$ T
- CMP #100 n: d# s- L1 J$ H. \3 ]
- BCC .Convert_10
& Z z$ k5 h$ }& e/ w2 r( m" i: [ - SEC! ]5 x8 V! B3 C# M
- SBC #1007 y4 V3 x! A2 t2 X' ?1 _& I
- INC FC_Dec_Data_100
' G. @- j, L, ^/ ]. {% p# u! j - BNE .Convert_100( O% i2 ?: v- j+ f
- .Convert_10
2 j1 V$ C9 Z9 `. e+ y( J7 C - CMP #106 }- k) m5 z, W3 i. e
- BCC .End
$ _/ U7 d+ d0 c( l/ i0 T2 Y - SEC% o9 h- q1 S" z& Z3 G6 e0 b
- SBC #10
8 b& x0 L# |) O" I6 X - INC FC_Dec_Data_10( K, T( y* r' [1 I, g/ n- ?$ C
- BNE .Convert_10
& K5 X. D7 M E% h% M3 u5 H - .End; J0 D1 x' m2 W9 b
- STA FC_Dec_Data_1& U/ v9 [) D* L
- RTS
' W4 V! X5 t q) {2 H" _ A1 _6 b - * z9 q# x6 o- ~: @$ z6 n! N
- ;----------------------------------------------------------------------6 r5 f8 V9 Q) b, |
- ;显示曲目信息
# \6 s0 B& K# _: s f9 s7 } - Music_Info_Display* a/ x0 x0 j( n& \2 F* N5 [. q
- LDX FC_PPU_Buf_Count" L" @3 j* t0 E4 [( f* j; D! [8 o" K
- LDA #PPU_WRITE_MODE_CNT_LINE+ H: s6 X6 k1 C
- STA Use_PPU_Buffer,X% L+ @ r K2 R9 H; N
- INX
; z8 F( E U( p, U" Y - 4 @/ m6 r" r: r0 Q
- LDA #>MUSIC_INFO_POS
, ?/ |/ x/ n# K+ M: Y! t* } - STA Use_PPU_Buffer,X5 {/ w: j8 H0 u& ^, e9 I
- INX3 B4 `% t& h& [2 m7 W8 L
-
$ ~" r8 _+ I2 w- L - ;居中2 ?! Y( ~5 Q+ p: Z
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
# ?5 O& D; k7 P3 r# Z+ Z, G7 f - STA Use_PPU_Buffer,X! q) k1 L& [4 D: G8 T' I/ ?
- INX
/ w' l5 C/ H# t" F - $ s1 J5 ]; d2 @2 x {- w8 e
- LDA #$05
+ v% l' B- ~3 R8 I. o' c - STA Use_PPU_Buffer,X
2 V, d( h4 D: N' r3 U9 g0 B0 O) x - INX# f( O* F: B' b6 o. d: q
- 1 a4 m9 V1 `( f' [' X, O
- LDA FC_Music_Index
* N0 p- W0 b9 @* b( G - CLC# D' g: q P$ S
- ADC #$01
' `7 V- ^! n( | N$ t - JSR Hex8ToDec& r8 g/ g& e+ N/ p5 c* f
-
. {- U8 [# E( _% v5 y Q( M; X - LDA FC_Dec_Data_10
! j) ]" \4 n1 n$ S& H, d - CLC
5 L" o5 }& i) E4 |" |* _" \ - ADC #'0'
! C. k- |6 I5 s - STA Use_PPU_Buffer,X E3 m# N2 Y( I: u7 A2 b7 q; Q
- INX% n4 t& ?: U3 f/ L
- ' _8 A; q. b2 Q# T5 L
- LDA FC_Dec_Data_1
* K0 D* e4 W! w( v" b D - CLC7 N, u, L! J# {) B1 t( }4 K# _
- ADC #'0'2 \% C7 z+ C' G% G2 ?0 _
- STA Use_PPU_Buffer,X1 t9 e' S8 t9 u& ^( A
- INX. A, |- Z; v2 s+ S6 n8 p2 X
-
/ B B/ f4 o; O! d9 C/ W* H1 O - LDA #'/'- P" y1 q5 [+ E/ U% u1 o- z
- STA Use_PPU_Buffer,X# F- X4 P9 @& E( f! |
- INX" R3 b+ h. {& s2 a8 C! I
-
) d. Z {# h H5 D' x - LDA FC_Music_Max_Index2 s! m3 J1 a) L% P$ q$ O, C
- CLC1 f9 c6 x" _) j% r
- ADC #$01/ J+ d- w5 X) Y2 X$ X% W' g: V6 {. V
- JSR Hex8ToDec" r0 `, v/ [( q) D5 k8 W) J0 n
- 6 K1 d0 u Q2 W! X |
- LDA FC_Dec_Data_10
% ~4 r; Q7 B$ r- r- w - CLC6 \% l- E+ N+ a
- ADC #'0'
/ ]5 v' Q {% Y - STA Use_PPU_Buffer,X1 \2 F/ V4 h* i2 d8 `) v' ]9 V0 Q$ n/ a
- INX
* X" g+ f* U0 ?) v' H -
& @$ I7 o2 ]$ f( V5 U - LDA FC_Dec_Data_1
1 }" _3 a9 b6 e# n3 I! C) ~ - CLC/ f' F* @/ a5 M" ]' n" o* D" D
- ADC #'0'/ l$ |; C, a4 y% ?8 J
- STA Use_PPU_Buffer,X
: W/ a3 o8 U5 a# a- A - INX
2 B9 F& A: z+ _, r: Y. a -
; L5 g; T: e% t" C0 m - .End
3 A1 X. | w+ P) t - STX FC_PPU_Buf_Count2 ?* h" h3 Y7 Z0 G
- RTS
& U8 `, C0 d1 L8 c0 K ]6 H
& \7 j+ R: e$ w: m2 |- ;---------------------------------------------------------------------- T) N7 ]4 h8 A e: C- N
- ;音乐曲目初始化处理
0 F; \5 [& e* t9 L - Music_Init_Process( `; m2 S: y* g, X
- PHA
/ {! A9 F* v% P5 y2 @ - JSR Music_Clear_Process
9 T: j& z; j3 p# _! f) q0 F - LDA #$1F- _) U$ m7 n9 G. p
- STA $4015
3 }& w- I) X7 } - PLA" v: O" r0 B9 O) m
- JSR Music_Init_Addr
( O* u# u$ W3 z. I% n( d U0 l( ^ - JSR Music_Info_Display6 ~2 s% Z( ?; K, I u9 m8 D
- RTS* m9 n% H4 z2 p: U; a: }* {
) Q; ?: }. k: Z- ;----------------------------------------------------------------------
2 f& K; I+ `' w" m6 o% X) j3 E - ;音乐播放处理
* E2 n8 E M& n6 X - Music_Play_Process
) h6 O9 v V+ \. e' Z5 V0 } - JSR Music_Play_Addr0 Q% U) S, j! @- s, F9 c
- RTS
' K- n0 }' A0 p4 i. |0 j - & w" m2 T$ X- \% r1 a
- ;----------------------------------------------------------------------0 t' @$ f: C: u9 Z$ e* \: J9 ]
- ;音乐播放处理7 f* c$ R0 z; c, ]
- Music_Clear_Process/ [0 L) _. a; M
- .IF Music_Clear_Addr
5 n! J. C" @8 Y) _! o - JSR Music_Clear_Addr! O& `% g- J; h
- RTS
8 S, g" ]9 U* \0 ~+ u E - .ELSE
! ~+ q1 b. p! k, C - LDA #$1F" Q6 j% B& m5 M+ e
- STA $4015, J; I( [- O: B6 R
- LDA #$00
$ v6 ]% d: P1 K# R$ @ - STA $4010( ^) I# I! r# }; S" _. m
- LDX #$00! Z+ r- M( W8 l8 ]- k; B
- LDA #$00
, V" l! U3 H; S9 u$ O, D -
- _! B: ?+ i1 f& B - .Music_Clear_Zreo_Page_0
: Z! p5 x' b3 k8 r0 W - STA $00,X5 l7 j" e) f& z$ k+ o& ~
- INX D+ A8 H* m* x! Z
- CPX #Use_Zero_Page_Begin
+ m0 k& y4 @( T; O - BCC .Music_Clear_Zreo_Page_09 F( U- N& A% q8 M N8 B- U( D. y! y
-
- s3 e( a. {$ n - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size# u5 ]* c7 p5 q5 w9 g/ s& C4 \
- .Music_Clear_Zreo_Page_1
9 p1 N g8 `- z - STA $00,X$ A8 ~9 |1 S' N+ {4 ] m" [
- INX
# d( j: r+ `0 O6 H1 x: Z - BNE .Music_Clear_Zreo_Page_1: o; ]* W+ Q/ u3 B7 T, |
- - A2 d4 G! J0 T, Q
- Music_Clear_Process_1' S E- Y' G* ?7 U S" t
- STA $0600,X
o2 y$ D2 M" J, b - STA $0700,X) Z! z& N1 h' U' k4 [# d5 h3 W4 t
- INX! T& Z: a7 |/ \ R
- BNE Music_Clear_Process_1
# b. T% M5 W; E/ R) g2 [9 F# V - LDA #$10. _2 |& G, `4 u( t
- STA $4000
+ }7 r* G' e% m4 x - STA $4004( r" ?% n! h3 G+ M: O6 e4 v# g
- STA $400C$ X2 v( _" f5 i4 @$ }
- LDA #$00
; m8 u8 k8 `4 C/ _- [- o, V# R0 k9 W - STA $40089 c3 W* T8 e5 Y
- LDA #$0F
# V* Z8 L* f. j$ p - STA $4015
& X5 c/ ^1 a- G' N - .ENDIF7 Q8 _! _3 H8 f q% u
- 4 a% d1 r: u$ n8 |
- RTS" r; Q5 M7 q! W8 E
- ! y3 U8 w$ c0 ?9 _
- ;======================================================================+ |* @3 J7 _8 J, e& {, R+ j
- ;重启处理
9 E! z( T" v) Z9 }$ ~- s( W - Reset_Program
! Z7 h, M' a0 Z" u- E4 k% t, W - SEI" }9 D7 ~6 j! }& u4 s5 w0 f
- CLD
/ F3 @' s- Y ~# r, I, r+ b% l - LDA #$00
[1 n$ e3 H, Y! O. n - STA PPU_CTRL0 r! P. L3 D* H( g7 I& N7 [% P
- STA PPU_MASK
3 Z% {: O* j* V+ b3 A - STA JOY2_FRAME
: G+ ~1 u5 V* b - STA APU_STATUS
! V2 K7 R( `5 s: K4 ]8 f2 O - ( N; o6 s# ?1 M& j2 |+ J7 M
- ;等待屏幕准备完毕, ~0 ?4 m9 X. h
- LDX #$029 ^& Y# Z9 _5 y- b
- .Wait_For_Screen_Ready
' i C" u! A8 V! O4 s' M* ` - LDA PPU_STATUS
8 M1 w# {) m9 H/ M# C& A - BPL .Wait_For_Screen_Ready6 ^" M9 x1 u0 S4 t
- DEX
: d5 f) g! c! ^. A - BNE .Wait_For_Screen_Ready! f3 V k( {. |1 \
- : D6 M6 A- a1 t/ d/ g$ S/ S
- ;清空调色板% W2 K4 K& J$ {" L' V# L2 ]
- Palette_Clear5 } i! n& i- `! Q/ |; j
- LDA #$3F9 p4 F6 H( F3 H& P4 E$ u$ i" M
- STA PPU_ADDRESS% y! A2 R2 y2 N: X# C
- LDA #$00
5 ^6 b0 V$ r0 I' R6 m( \9 U0 I - STA PPU_ADDRESS
9 ]# i( X. X9 o/ Y- A - LDX #$20' B! A- b4 v3 e9 h; z; W9 n/ m% n, ~
- LDA #$0F
7 d3 V2 i& n5 z/ x - .Write_Data7 z- E; q2 ?' s! R ^' p
- STA PPU_DATA; ^6 E- O( n) @/ C6 N+ Z5 N
- DEX
+ n; R6 u$ d, S. k# u0 D5 e) o, ~ - BNE .Write_Data6 J; I3 x# t t: [3 A$ j
- - y; Q2 m0 s* w W, R# F) `) f
- ;清除声音 $4000-4013
6 q, n }. M# \2 K9 g - LDY #$14
& j7 m! s: X1 X' c - LDX #$00
$ e5 R( Q1 `, Z# X - .Sound_Clear
/ {! ?2 M9 I V$ v- Z6 Z% G! { - STA $4000,X2 d; C& j& T3 M0 b* d4 n
- INX
" [' O. G4 R1 T. \. Z - DEY
# s( U( F2 }1 A. m& D3 m - BNE .Sound_Clear/ r$ V0 t9 B! e& I5 c
- ( x2 Q6 s: u$ B) C, h
- ;清除 RAM $0000-07FF
4 J3 B- K# |. h' f, a) ` - LDA #$00
( B$ R2 w4 C% C* K - STA $00
8 a0 [- _; h1 i* D! n s - STA $01
2 }- h5 U/ U; t6 o8 i - TAY
* }0 J5 W1 e3 L( s - LDX #$08& r6 X; @) T' w* Z" v
- .Memory_Clear
6 W) S6 P# `% L% J! i9 J - STA [$00],Y
/ \9 \5 I8 K( J - INY; C; C/ r9 t1 G3 c1 y
- BNE .Memory_Clear
* D, p( ]- X, S - INC $01; }% d3 K0 h( x& t$ V/ B
- DEX
$ ] J- Q1 o1 N; G8 R8 w - BNE .Memory_Clear
9 C: K9 o. u# X- F% a: Z# w9 c -
6 u, b: w: {' {. C$ p, [: j - ;精灵缓冲初始化
$ @7 x' `5 K: L) `# S+ C - LDX #$000 k7 P8 I, U. o8 c$ w4 A
- LDA #$F8
# | C# a& d+ ` - .OAM_Clear
% W: i- {: z K7 ~. y$ ]8 y9 H6 { - STA OAM_DMA_Buffer,X
+ ~8 d9 `: f2 f* B - INX
2 D& Z6 @, ?+ h- T+ v A2 f - BNE .OAM_Clear
. c: o5 K V& J1 ? P - Z3 N, c0 Y: T6 k$ f
- ;栈指针初始化
3 K) G, ^: f4 S0 m5 W2 N& R - LDX #$FF
5 e z: {, w& m6 X7 V3 t' T - TXS
" E+ N! Q |4 V% I# G1 Z4 k - : j# A' m: c+ z, \0 z W
- JSR Nametable_Clear;命名表清空
z9 w( k% r) `3 _ - JSR Palette_Init;初始化调色板缓冲" H9 j* U* U8 r$ g
- JSR Static_Text_Init;初始化静态文本
9 ]* @) c. C. C - 1 O# | m* M Z& E
- LDA #MUSIC_ITEM_TOTAL - 18 f7 O( m, r u; x
- STA FC_Music_Max_Index: Y# ]9 W; P/ j, y* x( {
-
% z$ h9 d, y& G4 B - LDA #$1F; X4 P2 l' h/ z7 e
- STA APU_STATUS2 k. ?& l0 z* X: M4 B
- LDA #MUSIC_BGM - 1) ~4 X& N" p+ U: _2 m, U* v. w
- STA FC_Music_Index
1 T7 p( z/ f6 X. }% z$ w - JSR Music_Init_Process;音乐播放
2 D' q$ n4 V' r -
* B; [. L( `: t) `' }- { - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态), Q1 d- S( k$ |
- LDA #$1E
! x5 m% {" b+ @) W7 f - STA FC_PPU_Mask_Buf
, b' b& ]% h* \2 I- I; T - 3 K1 [( J1 ^. b& w: }
- ;启用NMI处理 m. D- K9 B% E3 i# D; B6 u
- LDA #$804 A; @' y9 V8 f; @- R
- STA PPU_CTRL
* x- W: `& T- O$ X5 E3 D - 1 {9 _6 f3 O' {6 r# m
- ;程序循环, 剩余工作交给 NMI 中断处理
+ g6 X& u) t9 U3 l. c4 I, J, P - .Loop: k+ _" p- z, s. ^9 {5 F
- JMP .Loop
% l! t' _7 K/ o) P - : C- g6 F0 P& e8 Z0 ~
- ;======================================================================2 }1 r5 n; } s( [6 C. b
- ;不可屏蔽中断处理
/ ^5 K. I% w9 g$ g4 L - Nmi_Program3 S1 v1 ^+ T# p& w$ k, I
- PHA
& r8 P: z0 \, b1 D - TXA' y A4 O6 t Q6 S3 ]* V& U- R
- PHA
0 } O5 s: g% E- O1 s9 w( a - TYA; a8 q7 k0 h" e( L2 B% m
- PHA
6 @( ]" s4 D7 J3 S6 a( n -
8 q9 [2 Q: k0 c( x) z; {$ t) x3 P1 k - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
' F Y& K9 \9 B - W( Q" V7 u# h P# h" X0 y& w& D
- JSR FC_PPU_Procrss;PPU处理# c& a! O- u5 D" p$ n
-
3 s: F. A* B' U2 q - ;精灵内存更新
" U6 m: ~' Q2 U( P/ I - LDA #$00! g \, j9 ?. R7 \: K6 G1 f
- STA PPU_OAM_ADDR
' k$ e- d& C4 U+ Q' O$ J - LDA #OAM_DMA_Buffer / $0100% Z- J( h. Z4 |0 S! \
- STA OAM_DMA
: g- X- J! s. [1 N8 c6 |. B -
7 c7 o9 [4 H: J, Z4 E; o - JSR FC_Gamepad_Process;手柄输入处理
. }( G* x4 n1 V$ \4 V2 i2 ^ - JSR Music_Select_Process;音乐选曲处理
, Q& j) z) z9 |$ K5 }. ?; S. E - JSR Music_Play_Process;音乐播放处理
- ?5 d% R _2 l, ]! | - & n4 o Z# n& _$ |
- PLA7 C# I5 x4 m6 w
- TAY
5 f) ^* c7 h, S) p5 l; t+ J X; p - PLA
' p) m6 E) w+ F8 | - TAX
& ?) B3 P- n% v) x- d3 \ - PLA
+ M5 d* `7 t2 y) r4 a
3 D& [4 q$ L; Z) M1 w- RTI) D. v# K6 Z. I8 i Q/ Z
& D6 K u' X) [- ;======================================================================7 V! M" `1 m C6 v; k
- ;请求中断处理- G( w p/ D, K6 X7 \% V
- Irq_Program/ }3 H+ `( m; T' I& t1 b
- RTI
: Y9 E% @* F4 `) i2 h8 J+ L - . Z- w. r8 h" K
- ;======================================================================
! t2 \: a- x. [. X% ? - ;中断向量表
* m$ ?" E3 G( c% F+ q - .ORG $FFFA
' Y3 ?* S% ]( k/ H+ S% m. x - .DW Nmi_Program ;NMI触发时执行
" i' ?3 A+ @$ x5 \) Y - .DW Reset_Program ;载入ROM时最先执行/ J, X& v( M# q& [( f+ w
- .DW Irq_Program ;IRQ触发时执行
+ V9 G8 O1 d, J2 R/ Q/ z
复制代码
5 g) }& d# f' N' _/ ^: l4 ^( x
3 F: r: d6 @/ Q1 v( p! {
" f9 T, c. u- X* X$ Bhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|