|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下. V2 [6 n, r& C6 f& J

$ u5 v& I2 W, p# w% y0 b以下是主框架代码:
# ^8 \/ s$ U' Y0 t- ;======================================================================9 N' N( z9 d6 Z: S$ k0 f( _: S# Q
- ;文件头
4 U7 A( ]: `5 u4 P3 Y p - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量+ l' n! f: g; b7 ^" [& Q
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
0 L+ M$ _" u0 c. p - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码1 K u5 @! a: ?9 s/ o( |
- ;======================================================================
( Z' G6 x2 X* v3 J7 L8 U - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
6 I# G' Q- r2 d. R - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
x/ o8 W% Y8 n. `2 l - ;======================================================================! ]4 n. `6 X* \( e. t+ N# s, g; w
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
9 Y( F- N2 Q9 s' V% O - RESET_ADDR = $E000 ;主程序起始地址9 _- i7 f) G6 {! A5 s% N6 q9 [4 Q
- ;======================================================================3 l" D) t. j: T {6 ~
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB: x& s; @& k0 T8 Y) ~
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB! F4 x x) u3 h
- .INESMAP 4 ;Mapper号 (0-4095)4 H2 [/ F+ p8 I! q
- .INESSUBMAP 0 ;子Mapper号 (0-15)8 K. M8 [5 e D6 T
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- X( ~3 i" F% V) p
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! ^3 g" D9 x! p - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
0 G- I( X* R; f - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)/ E6 X$ `' k8 d* N T
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
5 q9 d0 n; J6 z9 B/ u5 o2 l - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)3 e n2 m; A/ y# s% ]6 Z, Q
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ W( E. b! r& I/ w7 g8 ?; x - ;======================================================================
' W! P3 f) F) B% Y0 C7 ^ - .INCLUDE "fc_demo_config.asm" ;全局配置
+ [$ F8 d' h$ ], V6 Q2 } - .INCLUDE "fc_demo_constant.asm" ;NES常量1 ?- i' u; d( D, x: J5 x! K
- ;======================================================================3 k' m! F8 l- v
- ;音乐配置
- C ^/ C4 V6 R. ]: W - .IF 0 = MUSIC_THEME
& z* P8 n+ d+ u; L4 {$ R- L& C" _* y. T - .INCLUDE "data/music/Gremlin 2/config.asm"
: c+ p/ g2 R. G5 t9 i" s6 Y - .ENDIF
2 j$ j; Y; \/ [4 ?% u - : @/ v ^9 j, y8 s( Q
- .IF 1 = MUSIC_THEME! Z* t9 H* M. I3 l0 ^) o# _, m0 P
- .INCLUDE "data/music/Raf World/config.asm"
* L J7 J; ^9 M; I( ] - .ENDIF
6 R# J% s3 F4 Q1 G -
2 U- G6 U7 N9 f {6 ~( q1 x - .IF 2 = MUSIC_THEME
0 ]. F- r- `9 Q( \ - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"8 C4 I% ~' h4 U$ ^( ?
- .ENDIF( O4 @3 K: l. w4 r1 e
. K8 Y) L) i. Y8 ~: r5 v3 Q0 m- ;======================================================================7 `: _" a( G- l; r; | ~9 n
- ;引用CHR图像数据) Z' d' ]& O6 b* p$ W. N1 _0 E2 h" t( e
- .BANK NES_16KB_PRG_SIZE * 27 r+ O n* m* L" p% C5 T- T2 \
- .ORG $0000
: V9 @5 K" V6 b+ L! P% o1 n - .INCBIN "data/bkg.chr", b: d8 H% `& P
- .INCBIN "data/sp.chr": s( y4 b2 y3 N( _4 F! s# J, R2 ^
- " P: v" [6 z2 E9 }1 [8 e
- ;======================================================================
/ S: P" j0 m$ c, `' V - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank: I5 J+ k4 N: t g
- .ORG RESET_ADDR
5 ?) x! Y+ Q0 l$ f - ;======================================================================
7 e$ E; | z2 H! N/ s - ;引用其他源文件
! ` L! r7 g- ^% J$ {9 A2 [ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理! R ~* \8 x1 P7 \
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理5 m- l+ u" c3 n# w7 d, a4 K
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
4 `, c2 w9 A3 e - ;======================================================================
$ Q8 [( F9 V3 `+ J0 I8 U" a - 5 m9 Z' U. |2 I+ N: [6 O X$ V$ w
- ;======================================================================
" [4 z& r2 A) u8 q2 G7 ` - ;等待VBlank到来
6 H! Z, a3 _* Y- b. ^( z$ q - Wait_For_VBlank
- J2 R ^% g& N% e - LDA PPU_STATUS
' n" X M% ]' g( E - BPL Wait_For_VBlank
( T/ Y3 L1 r7 s- U9 [ - RTS
; ?2 j( W' h! I5 o
; c* u" F/ z8 S- ~- ;======================================================================
; h) K- x% N3 J5 D1 a" H6 J, N9 w( _9 _ - ;调色板初始化
" J% q9 D6 k- o - Palette_Init
: k! K: j- ]6 q( Q) Z - LDA #$3F
! i- I# ?( [9 n' B - STA PPU_ADDRESS; }' N# J& O1 F, W' l1 _1 b2 m
- LDA #$00
! b( M% F( k$ p( b1 \1 a+ F3 H3 x - STA PPU_ADDRESS/ ?1 {- g/ N. p, w9 ?
- LDX #$009 W- R( j0 w8 e5 @& e* B- @7 _ s9 t
- LDY #$20
) }9 Q9 L6 G" f: B - .Write_Data
( Q9 Z! \ u# `& f) a! ? - LDA Palette_Data,X) W, ^. H/ X$ P9 q) }/ b. f1 b& g
- STA FC_PPU_Pal_Addr,X; l0 D( g1 w7 B- S" x# Y5 m
- INX: Q z% b7 }) _+ w3 ]1 }) y
- DEY, z0 p: p; [0 f2 _- o/ H2 e
- BNE .Write_Data
4 m- V, z* S. L - .End9 h/ q1 |& |1 O' a, K2 ]
- RTS
, _/ u3 p7 q3 R# e4 y \ c; ? - ' V2 o4 S, r' M
- ;----------------------------------------8 f5 w1 y: b& u0 N" Y
- ;调色板数据; T8 `% _ c3 Z
- Palette_Data& M% e$ h; \* Z5 `
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B; J7 n1 q3 g- U- ~! B% ?, P
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 228 b( |( \7 A" R, B9 W4 {
-
, L' P3 g- [+ ~9 m. x7 y - ;======================================================================
# `9 y- x/ X+ t - ;命名表清空
# O: H" I# n. l" i - Nametable_Clear9 E$ M7 P, V0 D& T% I" `! h
- LDA #$20
$ `# }+ e. O8 i, q6 j, k1 w! W - STA PPU_ADDRESS6 x+ N9 Y' ^3 N- G ^
- LDA #$00
5 m" ~) c( c7 o L - STA PPU_ADDRESS
$ C2 E' U! \, ?: B. ~, [, j - LDA #$00
4 w: z$ r0 o; w, @6 ~' ?! y" N" t - LDX #$00
3 `9 m; | o1 k# X `6 D - LDY #$08
0 N& T7 v2 \/ P: I7 k - .Write_Data
( m4 G: v8 R; ]) `3 a5 P: O - STA PPU_DATA
: ]5 y" C( m8 u0 i - INX
C2 r2 A& A/ l( K - BNE .Write_Data1 j# c4 e; \* f% }
- DEY
! `6 s4 `/ a: B# T/ U - BNE .Write_Data7 s" v; m: V, P, Q( _
- .End0 B' N3 K5 Z+ V9 N* i# K- ]
- RTS% m' R; F% e1 ~' ^% F" e+ F5 D5 o
- / n! }8 x, f/ B& }, W$ T6 R
- ;======================================================================; Q# g5 x: ` V0 L" E
- ;音乐曲目切换3 G. u A4 Z) g+ a# W% t& I8 F
- Music_Select_Process
$ J$ S8 X& Q0 a7 r7 F
' z0 `9 }( y: }3 E0 Q2 ^- .Pre_Music;上一曲
: p! I9 e! e- K9 i - LDA FC_Gamepad_Once4 P9 q. C8 {6 U6 h
- CMP #JOY_KEY_LEFT* L" ^4 [# n& P, X3 m
- BNE .Next_Music1 I8 ?& S2 ]( v
- JSR Music_Play_Pre
/ o+ A5 ^+ J1 |: A5 H - .Next_Music;下一曲$ Z! @. Q6 s3 j9 Z0 o
- LDA FC_Gamepad_Once, o; i& x* k0 L9 h, T0 W5 |1 D
- CMP #JOY_KEY_RIGHT
4 |7 A1 J* o' _# @. D# f - BNE .Next_10_Music: {" E$ {$ M1 _& A" H: N
- JSR Music_Play_Next
: ]5 o- m2 s/ m - .Next_10_Music;上10曲3 ~4 M4 N7 ^% [
- LDA FC_Gamepad_Once1 H- S6 b# T. [5 T
- CMP #JOY_KEY_UP
# m: E8 n0 ~! Y# T' v - BNE .Pre_10_Music: U9 i- f6 c: ~
- JSR Music_Play_Next_10
- O7 f k, T2 ]4 H; b( Q - .Pre_10_Music;下10曲
5 g! q! p- e; ^/ H9 F - LDA FC_Gamepad_Once
4 o% O- `9 r. g m - CMP #JOY_KEY_DOWN/ d# L2 }1 {$ D1 A$ c# b8 O1 L
- BNE .Reset. h- ~- H0 m* N& S" f& {
- JSR Music_Play_Pre_10! b% p3 p; @9 j! l$ H
- .Reset;重播当前曲目
0 K9 s, I2 [6 [0 w+ a, H+ {" j - LDA FC_Gamepad_Once
; F3 U2 I- j$ { - CMP #JOY_KEY_START
* B- L1 X6 H, [. y1 } - BNE .End
& o! Y9 J( N( R R: s5 q% Z A6 q - LDA FC_Music_Index
0 a+ R: M3 z+ f: E# D$ Z9 i - JSR Music_Init_Process
. L+ Z3 {5 s3 p, F) S: Y& Y - .End' f p+ b* j+ ^. x
- RTS
' E( [% `% H% s, E5 l4 y - 1 o2 |! d; i# S) [! {: P V6 s# g
- ;----------------------------------------------------------------------
6 o: }9 a1 n1 {# v - ;播放上一曲
0 e' `) V, \' q8 J- X - Music_Play_Pre: T: Y; n6 o* ~6 Z8 U
- LDA FC_Music_Index
/ d0 f1 v! v0 y- ~' B- c r - BEQ .End3 X- U! x0 K. o2 J/ w4 Y! Y
- DEC FC_Music_Index
* U$ c; @5 l3 l4 Q( w. _ - LDA FC_Music_Index, W5 J8 i2 N4 ? E4 s$ I: T
- JSR Music_Init_Process
, k- l4 P" c6 Z1 Z& W5 H; W - .End
/ g6 g- b/ X! L/ p& i, E* k' M - RTS
& ?0 p) J" o0 a# l$ Z; ]2 ? - ;----------------------------------------------------------------------
% Q7 X) g! B$ O, E - ;播放下一曲# A2 _7 l" m3 n- h
- Music_Play_Next
2 \6 w; d' N1 z, }8 K- @0 r - LDA FC_Music_Index
9 P# U6 Z! _0 [' U - CMP FC_Music_Max_Index5 u/ n2 ?1 c7 r$ T d
- BCS .End
$ b& V6 @9 H" d - INC FC_Music_Index
8 x1 f9 ~* }" y# r - LDA FC_Music_Index
# ^' K2 H% K% j6 B$ H. X6 M - JSR Music_Init_Process5 Z/ X- Z( Y. i9 l
- .End* O8 q+ ^) q% Q# {
- RTS. B) U8 e- S1 I7 p" C6 R) J7 I
4 n4 ]. {3 R) C6 L' [- ;----------------------------------------------------------------------
1 m# Q" E( G( x n6 m( x/ j2 k - ;播放上10曲
}" g. c3 n7 m. N2 |8 k3 T - Music_Play_Pre_10
9 E) E) c8 W! l - LDA FC_Music_Index
) S) j: [$ a% ^+ c' U+ ?( L$ E- Z - BEQ .End
9 N4 e5 w9 t: G' l - SEC! b& M% f; Y/ p
- SBC #10
" p! C9 b! g+ M6 N, `/ J - BCS .Pre_10
' G& W' P; D3 x w - LDA #$00
* [. N$ y5 j8 P% w - .Pre_10
+ |! t/ t, L: l" o* y - STA FC_Music_Index
2 R2 d! a B/ d0 k9 W - JSR Music_Init_Process+ a. {7 N; M3 k4 I. L
- .End4 Q. R6 e6 {+ X$ f
- RTS A& t% K c) F5 W) s5 i4 ]6 z
- ;----------------------------------------------------------------------9 g# J" X3 s% P, A
- ;播放下10曲1 }! J/ j: k: s4 \: o) R
- Music_Play_Next_10; B, C* w; m+ \0 t# w7 h0 o
- LDA FC_Music_Index& a1 \& o2 K' g, ^3 Y
- CMP FC_Music_Max_Index }# |% {# b3 u: I; ]+ L7 h
- BCS .End
: U" A7 ]. j2 ~! Z8 y* R - CLC
1 z9 y$ j8 D/ m9 J9 |7 m - ADC #10
' k4 M: b# Y* y0 J; v9 b/ f$ d - CMP FC_Music_Max_Index
, N8 V- r3 m( \# E# y) q4 b - BCC .Next_10& ?- p. P, z1 T ]
- LDA FC_Music_Max_Index, B9 }: d. r1 i) [8 B
- .Next_10' y0 G# |4 U/ l5 e
- STA FC_Music_Index2 w* j/ }3 F& i, R
- JSR Music_Init_Process
$ r& Z" y( [. T4 z) @5 c4 l - .End. ~3 q, P$ P+ }( l- Y
- RTS
% J) @, v l% z* g8 ? - $ A: q7 l5 N% \
- ;----------------------------------------------------------------------
# ^" a! O+ v4 F5 T) ? - ;8位十六进制转3位十进制制1 p, ^) {' v0 q) Y2 @
- Hex8ToDec. l) f* f$ N9 I- e. D
- STA FC_Dec_Data_17 S4 Z6 b! w$ y1 V7 M! b
- LDA #$00
" k% j& o& s' v - STA FC_Dec_Data_100" P/ w' K. {( N0 n" V3 e
- STA FC_Dec_Data_101 O2 [ G- R+ A- Q% z
- LDA FC_Dec_Data_12 V- |0 S+ x3 r1 u. Q: M
- .Convert_100* j" r( L: w, @5 r/ e8 x% `6 ]7 U w
- CMP #100
( Y# n2 v4 ~' _1 ^ - BCC .Convert_10* n5 \0 J$ K9 A
- SEC
9 z4 e4 H" B& h" { - SBC #100
. {6 q& s6 O7 h* l3 s4 m R - INC FC_Dec_Data_100
* \2 z- z7 ~( J6 R$ ]0 \" k% w - BNE .Convert_100; C! ~! x: w/ e( S6 c1 Z, P, r
- .Convert_10
/ B" L' b: |) }" L& A - CMP #10( X, p5 D3 P. o9 w W _/ ~
- BCC .End
2 O- ]+ U( E) ]7 I* M - SEC$ W' v# b. J( }& R' }% F
- SBC #10
& k1 m3 e5 n# w7 Z5 k - INC FC_Dec_Data_10) ^- g8 K; v7 `8 A3 m
- BNE .Convert_10
3 k1 @: W( g! F1 x3 W5 J! N" t - .End
% Z8 O% ~1 u1 G+ m( h# i - STA FC_Dec_Data_1, @) [: Y* R& S$ H, l1 r
- RTS
X/ p1 D: Q) n# F4 ?' b: w
) t4 W. r. ^. e1 G- ;----------------------------------------------------------------------
" i" H$ I& q. Z( j C - ;显示曲目信息- G) P" a8 d" W7 { G2 Q" o* q- ?: @
- Music_Info_Display+ e; Q6 Y7 ]: t& P8 L) c
- LDX FC_PPU_Buf_Count1 o2 @( {0 m+ J- d2 p
- LDA #PPU_WRITE_MODE_CNT_LINE
t( s5 E* n2 g - STA Use_PPU_Buffer,X1 z$ H( v* Z. o t1 o* D
- INX
& J; C0 V2 C4 B' I6 d$ E - - U& a* `0 g0 q( }" N) o
- LDA #>MUSIC_INFO_POS
- e2 t8 ?/ j7 E: m - STA Use_PPU_Buffer,X" Z) k- i c. M% i9 h! c
- INX. p6 Q9 N: P( }2 L% ~+ b% O
-
) w; R0 d" U& L0 s- K7 s4 M" v - ;居中
! z7 b& v: m/ J3 n% S% { a! \ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
o7 e" E, ^# x6 ~2 G0 l - STA Use_PPU_Buffer,X
' _1 t+ K+ A. i! ]& E/ E - INX5 y7 [1 ]6 {6 @! X
-
1 |& {7 v/ Q9 `1 A - LDA #$05
" j: i. C+ }8 t& h - STA Use_PPU_Buffer,X. W0 `, o: h& m. p. A
- INX
: A8 E9 Y5 E7 p+ B o -
: R4 y/ J& K' b2 e: l: G* O - LDA FC_Music_Index. n: ], a3 F& V
- CLC; l- h, m- v# b1 e. w G
- ADC #$01
* {8 }# ?8 I& v+ I - JSR Hex8ToDec. U( N( o( W q$ j# P5 J
- 0 b# J5 {% c8 i; G( |
- LDA FC_Dec_Data_10$ [* _. c9 ]; I( ?8 B& j
- CLC
, m& Z) [3 G+ U* t - ADC #'0'
1 G/ [2 N3 Y8 S# Y q1 w - STA Use_PPU_Buffer,X, v, m% l6 t( ], s- ?/ U
- INX
7 o3 x5 b3 H" e, h4 n: Q -
p% ~0 H9 a6 O8 F - LDA FC_Dec_Data_1
* R6 x5 q7 I8 X' m$ P+ t - CLC
: P8 h6 t4 w7 }" u5 @* F# c - ADC #'0'
& g( f5 c. J; [; w0 S* n - STA Use_PPU_Buffer,X3 e$ z1 @( A8 l$ y, H
- INX" @' n3 m4 j0 q3 m4 E! j; y& |
-
" [2 Q% a A- A - LDA #'/'/ z$ A+ C3 _! O$ ^: | M
- STA Use_PPU_Buffer,X+ c4 N! y0 M; Z
- INX/ y0 y, A4 r! E, d
-
4 h, S+ x- N! r5 V; b - LDA FC_Music_Max_Index8 X# u& X7 o. `+ y
- CLC
' B+ d& s L! w- k0 U4 A: C! u - ADC #$01
- \/ q2 _8 n3 i4 Z, H* f - JSR Hex8ToDec* u/ z M) a4 ~; ]0 Y d7 s; K
-
: ?# m, w0 n/ N: {0 ~( b4 o' ` - LDA FC_Dec_Data_10
- Y7 @8 C/ w) p8 ]0 ?5 w - CLC& L. E' y) J) e% `0 ~) G
- ADC #'0'
9 F( W% G( e, X8 J, U9 G+ Q - STA Use_PPU_Buffer,X" ~3 V! R5 P# i! h
- INX
' L) ^: L9 X T! i' q& z+ u -
2 w& I# G& d( G - LDA FC_Dec_Data_1" e* h) W3 @ b \6 B0 G
- CLC0 ^9 M2 y8 M; d6 E3 q+ m
- ADC #'0'
: ]6 B8 J1 `2 a' M - STA Use_PPU_Buffer,X7 ^# V' r4 @$ X/ W, t/ A+ y6 S
- INX% B; Z4 n9 s3 F6 _1 z: ]- a( ^
- ! _/ W+ ?; ?+ }: o5 }) s
- .End
; {3 J( Q! s/ e) Z, {1 t9 T - STX FC_PPU_Buf_Count
# h4 P) f/ s5 K/ _" h9 M* Z& Z - RTS
4 ?9 p/ U3 I' @ - # k. E* T1 f- W) _2 S) c" X% ^
- ;----------------------------------------------------------------------" M3 b7 _) b! H* p. t1 i
- ;音乐曲目初始化处理. m' J$ j: O$ }. ~4 c4 @) v6 n
- Music_Init_Process
$ y; R1 o# J9 A+ i& H: f - PHA
8 L/ b# G' V( {" S, n, a7 B - JSR Music_Clear_Process
6 i- Y3 V1 R5 B - LDA #$1F" R: H* L9 S# D' F, [
- STA $4015
9 Z0 i" d) o! o w2 w2 |1 j% _ - PLA
7 { q' H+ \" T, ~" j - JSR Music_Init_Addr; L6 S& j8 ^- _6 f
- JSR Music_Info_Display
2 B* P6 Q% Z& c! G/ g - RTS
5 |5 i: V, n. X* [' e
+ z v% J# `8 z3 y& J4 B- ;----------------------------------------------------------------------
" H' `& c9 u% d ^6 X" T - ;音乐播放处理
3 E- _, n. i2 Z) I; i - Music_Play_Process
8 n& w- }2 J# T5 J) u9 \' c' M - JSR Music_Play_Addr
i1 T' e$ T$ L- q' s6 b! G - RTS: m! R8 L# U% x
- 9 T# E; T/ w" B( q
- ;----------------------------------------------------------------------
$ q1 m2 a9 Z1 r A' Z - ;音乐播放处理
* B* i4 _# P4 c, S: k3 j - Music_Clear_Process
7 o. A8 s+ z& p( t - .IF Music_Clear_Addr
3 d5 M# S: E0 b1 A3 D) a- T7 O - JSR Music_Clear_Addr
% ~1 v9 j% y ?/ Y8 s" i - RTS
* @* C3 m4 o X; } - .ELSE- V0 V1 m+ _! B9 q g# ~- r
- LDA #$1F7 x8 S" S8 P$ q% L' ~' F# C
- STA $40159 ~9 j2 X x( C* ~
- LDA #$00
% H* R/ ]% n/ k: \9 ^0 d - STA $4010! l; C7 C8 L2 b8 U
- LDX #$001 m. o) x4 u1 p: {
- LDA #$00
4 ` K2 N, {- M+ l -
; O; C5 _& V' M) p; ^0 ?/ g5 C - .Music_Clear_Zreo_Page_0
4 K5 e0 F8 [9 Q% F - STA $00,X
3 `; K3 D1 h6 j - INX
, Y3 y) r$ G" w) N6 g# ?# T3 f - CPX #Use_Zero_Page_Begin
' R6 A" Q) O& v - BCC .Music_Clear_Zreo_Page_0
1 ]* h q2 Q, {& {9 T: d -
+ p6 U; R& w: t+ p - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
: O* k5 ]: ]' _7 o' }; s4 W$ n8 ] - .Music_Clear_Zreo_Page_1
) K R3 A' R0 p; D6 l* D - STA $00,X
o5 C) i& N5 d" B0 l - INX+ e1 z) T* O' g8 W9 U0 a- j
- BNE .Music_Clear_Zreo_Page_1
) b- o$ {4 e: p" s+ A" P2 d - 4 b$ ]9 s1 b2 K9 [ b( w, D2 |
- Music_Clear_Process_1
2 t; @. P6 f1 D% f. o+ t - STA $0600,X
- S5 _& T; W- D% X# X7 k2 l - STA $0700,X
1 J, l C% ?9 E+ ? - INX
/ n1 ^* k; x. d - BNE Music_Clear_Process_1" C$ U: b8 [% O9 d: q, ?3 E& X0 Y
- LDA #$10- R/ }+ Q9 {( g6 @3 K$ E# W
- STA $40008 L/ v* Z! ^6 |6 [
- STA $4004
/ f& T3 {. k/ E! U* h - STA $400C: q% R2 a5 L3 l
- LDA #$00
: y% X- O. E; h* i# K - STA $4008
# {& @# I1 H; u }! X& @% W2 S' n- Z' G - LDA #$0F$ m2 B" ]4 g: J4 Z! i& T h5 y
- STA $4015
8 y8 i& j. v! x! }+ d; S8 I - .ENDIF
' n0 u: n% e9 ?! \0 { - & a. B) \6 I" A) z5 N
- RTS
1 {: b/ [3 H# h - ' k$ {( Y' D; W2 U2 {' G S
- ;======================================================================
' R0 Q3 i4 {9 Y7 S) E- A3 Y - ;重启处理; A! k4 A: i8 n/ R+ E
- Reset_Program4 D0 d5 K8 n+ g$ t- S
- SEI
; b+ t5 ^" l5 r& z - CLD/ O0 v# C" W, m1 S; G# t
- LDA #$00
! x0 }1 H4 v% F5 Q - STA PPU_CTRL
7 v/ l2 o/ C% w% h7 i% J7 ? - STA PPU_MASK
4 C# C) o4 t) G( D+ }. U - STA JOY2_FRAME
1 G, J) L: a1 m - STA APU_STATUS
. }; l0 Z h$ r* t3 _' h6 @7 ` -
3 g+ h3 M0 g. T5 d+ p' [- } - ;等待屏幕准备完毕
" E( M1 {% x! c( m4 g4 e - LDX #$020 d6 T$ H7 t$ _3 c. H
- .Wait_For_Screen_Ready
. T3 M4 p: W C; M; Q - LDA PPU_STATUS
$ i3 R" ^4 k5 B( R3 {6 p% S! N; L7 } - BPL .Wait_For_Screen_Ready
* C4 S) i% d4 O# @ - DEX
9 a) u+ I/ V d w" T" B+ t6 a - BNE .Wait_For_Screen_Ready" E9 z' ^! q5 C' f) a8 Q
-
! L$ m! w- y8 e& u1 F - ;清空调色板- @7 V y; P9 A3 d$ \
- Palette_Clear1 i9 J! @! y8 L( I% X
- LDA #$3F
2 z" ~* P: N; Z- V - STA PPU_ADDRESS
0 I( |9 T- | b: J6 | - LDA #$00
; X" W# x5 O" R# | - STA PPU_ADDRESS
( O p, N$ H% z( X5 ~3 \ - LDX #$205 [. f' S7 G7 _' i( a
- LDA #$0F4 z0 V4 d, W" o$ x2 }5 t3 }# o; O
- .Write_Data( H1 I: M0 T8 C2 q2 F4 n0 g) u9 m
- STA PPU_DATA
; g# Y" m7 b0 t5 J! Q - DEX
" g. _7 x/ a4 |6 l4 O, Q5 P; I* C - BNE .Write_Data7 X& D B5 i* [# Y# g) l
9 d; F# `# h, P6 L M- ;清除声音 $4000-4013# X2 F: C; R. k% B, }0 h
- LDY #$14* ?8 o$ T4 M/ b1 g7 n4 b C
- LDX #$008 O( Z/ V# [* X/ ~
- .Sound_Clear
+ S/ Z* A6 g# X4 w& X - STA $4000,X
+ m( Q+ J" P O5 ^+ O7 z - INX
- ^1 o+ h5 \5 {. b, d( n* n( Q - DEY+ R& A5 {! m- x- v8 K* N: ^
- BNE .Sound_Clear
! c7 }& p, ?) p0 v - $ f P6 g0 r$ q) f% ]5 C& U
- ;清除 RAM $0000-07FF
# Q" D- N1 Q. ~ - LDA #$00
$ @# G8 n( b; \5 U, ` - STA $00
4 T) B* i9 I, w9 U6 h p: w' p8 I - STA $01: ^# ~! V- ]& C
- TAY, \5 \& u' X5 {- O& e
- LDX #$082 L: B$ e5 e Q
- .Memory_Clear, I1 o" f" {" G4 T" Q! x, N
- STA [$00],Y+ Q6 ^" p% Z% W1 e( o
- INY; `# G- Y/ x- @5 F0 H
- BNE .Memory_Clear
1 u) p: d8 C$ L3 o* V7 ?1 f. @& Y# C# \ - INC $01# Z+ ^8 r9 C7 ~- m" x' x- b4 ?& ~
- DEX+ X$ r* c \+ S# u* r
- BNE .Memory_Clear
* r+ `+ a$ |' f -
9 O' b- i, E" L3 A - ;精灵缓冲初始化& ~/ W7 s9 ~: T4 m
- LDX #$00( S- d$ c3 B9 D0 E8 [- ]
- LDA #$F89 b1 I* @/ z9 R2 e% A D: y: h
- .OAM_Clear' j0 ?$ J' C, i# h3 W
- STA OAM_DMA_Buffer,X8 W; a9 N; g* O7 x2 P
- INX; L% z7 A u1 n
- BNE .OAM_Clear
! R) x- g: K! c( X1 I+ m* R -
9 K0 |$ e( E" ^5 O - ;栈指针初始化
9 h3 f7 H8 u7 ] w# }$ A - LDX #$FF' y! t" p* h# Y
- TXS* }6 u$ a& Q/ s/ J. A/ O2 L( j
- / N3 i) D* Q% n8 Y
- JSR Nametable_Clear;命名表清空
: W2 K( w7 n7 q7 g - JSR Palette_Init;初始化调色板缓冲5 t/ ^8 W- j; x$ F! z5 a0 k
- JSR Static_Text_Init;初始化静态文本4 E4 L5 G( G# b; e
-
; Y) ]/ V+ L# L - LDA #MUSIC_ITEM_TOTAL - 1( h$ _7 H4 G0 T: k
- STA FC_Music_Max_Index. o ~$ f2 n) C) v; E' R( P
-
+ e- q6 _6 v8 F V0 g8 M1 ~: v - LDA #$1F
9 ^% ?7 e; r2 Y7 Y% D - STA APU_STATUS
+ H; ~6 N/ I2 X/ C% f0 F - LDA #MUSIC_BGM - 1
4 G' v; L- n6 q - STA FC_Music_Index8 A+ [' h& ?6 N( S/ P$ I7 Q% \3 M
- JSR Music_Init_Process;音乐播放
4 X5 n6 D& u& H' O" r! a* Q3 c! I -
4 @' G, V" F# L# { - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
9 r1 t( H. T; b - LDA #$1E n0 p2 q9 e/ o1 Y3 o
- STA FC_PPU_Mask_Buf7 n6 m6 k3 D3 ^& g# e
-
, j" L) ~9 b3 q+ X: I8 h - ;启用NMI处理# D! h6 Y/ ?% t* R9 y+ w/ {. s% G
- LDA #$80
1 M7 ]6 F2 @! z- T) A( A - STA PPU_CTRL0 n4 g$ h/ g2 X
- ) u- x( Q3 \ O0 e
- ;程序循环, 剩余工作交给 NMI 中断处理3 J5 }1 k' \. G: ]# L# b% x5 V
- .Loop
& P/ [/ l+ Q" I. B, x0 V7 c - JMP .Loop
% ]2 C6 k2 q* X - ; b8 |5 ?+ n/ f/ F# I& ?; i$ `& {
- ;======================================================================" D6 R2 g* W4 Y$ ^# n! w. K
- ;不可屏蔽中断处理
/ W# z$ t( X1 n" ^ - Nmi_Program
! p3 h7 D0 `! H8 ^& I - PHA6 k% e8 Q8 N$ h
- TXA4 [4 l" F9 }. j3 K5 e% ~. t9 w
- PHA
* A/ f$ {# x$ f: h, P- a$ x" ? - TYA
( z/ F, H# U) h; C$ p1 `3 A - PHA/ m1 A) w0 g* B- I
-
% B5 C4 Q$ h$ F0 B* g/ X1 B - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
R/ d$ a) D3 y# }3 M -
- x9 q+ Z5 C+ Y5 p8 L) X - JSR FC_PPU_Procrss;PPU处理& s* t9 }6 w. \- j$ W
-
2 ]5 z. b! u' v! w - ;精灵内存更新
2 C9 x- p# V* Q& w A4 V' e h& U - LDA #$00
7 i9 O5 c# V; S - STA PPU_OAM_ADDR
! f; R' `* v, f1 L - LDA #OAM_DMA_Buffer / $01008 v, i3 c6 {# A* g' H
- STA OAM_DMA& Q, [1 |" j \% W; D* P+ k
- 3 j* s, u+ @8 v: a& T4 s" ?# L
- JSR FC_Gamepad_Process;手柄输入处理: r y ~& N" a( K" Q
- JSR Music_Select_Process;音乐选曲处理% R! F# m; Q. Z3 j7 G" L* W
- JSR Music_Play_Process;音乐播放处理! J' ]' Q: m1 x' M0 J* A' C9 s
- - w+ F5 |- T! p& j
- PLA- P! P& k9 h7 R4 G0 U% V; V; ?
- TAY
0 u( y% L [) Q; K' U* N - PLA; v4 S' u5 k8 [& v1 `1 h8 V
- TAX3 y0 k H4 m1 ]! }5 }
- PLA" ~" S5 r/ ]2 ~, H
- ; [/ X5 E9 P) |, d
- RTI4 a# D' P( a$ C1 [) {1 t
- $ g# Y5 S$ w' D( M! _# S5 G
- ;======================================================================
" G& g9 p; U0 @ - ;请求中断处理' V6 v _( @% I, f( S) N
- Irq_Program9 J0 ~5 \! w$ ?
- RTI* Q3 N" z0 k; {' s6 I K9 Z8 }
( ^/ D9 ]; E" S0 d4 y- ;======================================================================! F) \& N0 u8 I/ M( m: s: l7 z
- ;中断向量表
6 ?8 @5 d4 t+ x2 i7 G7 H$ w - .ORG $FFFA
3 y* S4 T7 u8 e* q& C) ] - .DW Nmi_Program ;NMI触发时执行( V+ i. F' C% k% e" t: D0 R9 j; l
- .DW Reset_Program ;载入ROM时最先执行! M" w: Z" [$ e0 e; V9 W
- .DW Irq_Program ;IRQ触发时执行) I8 i; O3 K/ |3 Y9 K
复制代码 * q. t. {6 N( N' c0 j1 [
$ e0 y7 Y X3 p8 C# Y Q) h
4 Y! E7 j, Q0 y5 z: N( N/ O
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|