|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下5 h9 e, z5 I2 I. R) Q3 q. u3 h

T" c7 [3 z! |- J以下是主框架代码:
+ |: A4 P [4 B" K; j# B- ;======================================================================
' v/ l/ J0 C) a; H - ;文件头5 Z8 i" n9 O6 P3 O: R& Z
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
: b/ |4 R/ N' |/ @ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量6 a0 F: N0 n4 I( h% ]7 a
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" y8 z6 E- c2 r4 ] - ;======================================================================( q7 K3 `" S) ~1 Z8 N& `) m" v" x
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* K1 X7 }& |: Q: Y9 F0 j
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1+ y( Z$ q3 _9 q4 b) q
- ;======================================================================
" ?0 s- H# g+ [0 ~% i" o: R+ H - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1 Q1 h0 c& `2 k% _7 Z- J# q+ l
- RESET_ADDR = $E000 ;主程序起始地址
# \6 A& P3 M4 ^8 W- |1 b% b& U - ;======================================================================' v$ @; `4 c3 N4 Q! F* L6 r: S1 b
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB6 V* T! x. b2 ~! ]
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
/ B6 L/ s* ~7 [- E3 K, d - .INESMAP 4 ;Mapper号 (0-4095)
' m8 |- }& F" @. K* j - .INESSUBMAP 0 ;子Mapper号 (0-15). `- s- b, y: P& Q
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
5 ~, E- p' N/ l( E - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)* ]* w8 v/ n0 S. r, I
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)+ S! G" u8 `. m5 W1 r: \% H
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
; j( h. A( |5 b - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' m/ J/ X8 I! r) l% `
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
" ~+ F0 Z% c* K& n) [ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)' H* B5 }8 v: Y% }& }
- ;====================================================================== @4 `. {- o A% _: z* G
- .INCLUDE "fc_demo_config.asm" ;全局配置# g$ p; K& `! K% Z9 f, d* b
- .INCLUDE "fc_demo_constant.asm" ;NES常量4 f3 }. y2 C% u7 v% A" L
- ;======================================================================
0 D, e; v- G2 i2 F* | - ;音乐配置
; j4 `3 A s: M, X+ d! Q - .IF 0 = MUSIC_THEME
) s5 G \6 ` ?( L' O0 f! \+ i. d - .INCLUDE "data/music/Gremlin 2/config.asm"# Y8 s& Q2 H4 Y0 {3 ] i
- .ENDIF
2 q" ?4 n5 B, _5 }0 n* ] - P( R% Y" ?0 g; @& X
- .IF 1 = MUSIC_THEME2 \4 x7 P7 \) w) z/ Y) b5 w
- .INCLUDE "data/music/Raf World/config.asm"4 W/ x8 \8 p8 @ N( D# I) M! s
- .ENDIF* `8 \$ R# i( T" q5 C
-
/ N' N0 @" v1 G3 x/ g( t! Q5 F - .IF 2 = MUSIC_THEME
) {' j5 l7 `, f$ z - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
9 m2 e' _9 m! Q* K. ` - .ENDIF
6 ]; G C. W3 P, k - p: T% [3 D4 |( ~* m8 i
- ;======================================================================
' y$ n2 e; W; {- l) f- Z1 z - ;引用CHR图像数据
" t% D+ s G T& D, Y$ K - .BANK NES_16KB_PRG_SIZE * 2' X0 D7 {4 @9 ~: E
- .ORG $00003 x2 i. G5 O. ?
- .INCBIN "data/bkg.chr"; R$ ?' c, C. z$ B! |5 X- E; o
- .INCBIN "data/sp.chr"- ?) R# x$ S& e' s. X, O, P) Q
-
- k0 g# Z) t) ?+ E% H6 Y - ;======================================================================
, s/ O$ o. W0 E# } - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank3 t; z8 s. E4 q* z3 J/ `! X y
- .ORG RESET_ADDR
# o! g$ k$ D1 o$ I1 w - ;======================================================================7 C% x7 B5 i: E& u- }
- ;引用其他源文件
0 b0 _, ^9 E3 I' x - .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ [, [( W$ n f( c2 W+ p
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' N% F Z7 j; Z! w* g: y7 u
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
% ^4 p! U/ L' ~; a- W) ^& e - ;======================================================================
0 N7 }' J4 @+ F8 U8 f3 o" X4 T
* r: g* S6 J! a! {5 _/ P- ;======================================================================
4 ~) q. J- I6 p1 d+ |# O - ;等待VBlank到来
6 a8 a( n+ H% ~+ o7 @. q - Wait_For_VBlank
. d, \5 j% j9 u" q; v - LDA PPU_STATUS8 A% Z3 ?5 J' z1 B
- BPL Wait_For_VBlank4 A8 x- I5 v L( o1 q, X+ |/ I
- RTS g7 j! v& R7 M" Z& F5 e5 k
9 `; f. Q1 a+ \6 e, b( V- ;======================================================================
/ y/ S; |6 `0 b" R1 r' ] - ;调色板初始化
3 B8 ^7 c9 C% Y+ p* z1 g G - Palette_Init! v: V$ K7 i+ y. [ N
- LDA #$3F
/ X5 b5 L& A8 s - STA PPU_ADDRESS
- D$ I, E9 K- }7 F; P8 d+ c2 ^' Z - LDA #$00
' P, G# W% f. ] - STA PPU_ADDRESS
+ h6 G8 k/ B* |) Y4 K* W - LDX #$00
( X' d2 y0 V6 e# l - LDY #$20
( l5 ?0 j9 O1 n. `" T - .Write_Data
( \5 ]5 A- Y d: |* W - LDA Palette_Data,X
3 p0 \0 T) b2 W& ^# `4 P - STA FC_PPU_Pal_Addr,X
& `; U) T0 i; q* U3 [3 |2 C - INX1 @- Y2 Q1 y4 X$ V* P
- DEY, I' P; \# q# q' m+ v5 i
- BNE .Write_Data9 h' ~! a' C! w! \! o3 M" c1 S
- .End
5 o& G0 I2 u6 ^ - RTS
- x9 A5 B! I- B. K - 1 f3 _" U, c( p- E( h$ J N
- ;----------------------------------------
2 [* O, r/ n3 w6 ~) h- F# k& c - ;调色板数据7 K* K& u1 e- p7 ^2 ^
- Palette_Data7 }0 G8 n# o S& f, x+ A
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
7 Y! ^+ D9 ~2 h# P6 A - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; I0 \) R& B6 N6 F. _# b! G0 l b
-
4 p2 O4 r4 i c5 w - ;======================================================================# A7 e3 ^- H l+ e1 T
- ;命名表清空/ q$ Q v6 l' Y8 e% Q6 b4 s
- Nametable_Clear
& M' e9 C/ {- _- @& _! u! ~ - LDA #$20* w" n* G, h: d) j* w7 \
- STA PPU_ADDRESS
0 z6 W, M* U2 R" n7 E - LDA #$00
8 T6 w" A& h5 E* m. x: N+ T; Y! y - STA PPU_ADDRESS* P g: R& n1 X5 u" {$ m) @
- LDA #$00+ m/ R$ q5 h9 t) V9 ~) G
- LDX #$00' z6 Z3 g6 ~# O4 p+ k' q- U
- LDY #$08+ b4 H5 s! v" s) }
- .Write_Data* W0 [& H* E7 K& ~ \
- STA PPU_DATA
* f: w# T8 K1 z - INX
& r; A/ o) s" V - BNE .Write_Data- H/ s$ L4 \& c' M7 }6 ~
- DEY
4 B! P( L3 h2 s# [: ~+ X: ]7 ^ - BNE .Write_Data! E Y9 L- [' r/ q+ g, V/ x
- .End
- }. S) J( F# B' H - RTS
8 G/ ~% L" K, n, r6 C
" E' o) g1 a" c7 R% o- I6 s- ;======================================================================
# c1 q8 n r9 d( k* q" ~- b - ;音乐曲目切换
- u1 u( M( ^% t2 a; d - Music_Select_Process
6 G) r m2 m8 H( u# X! j. `
1 L, `6 B8 r% U* l0 B- .Pre_Music;上一曲& [3 {$ M1 L" S' ^ I
- LDA FC_Gamepad_Once ^& m7 M- G0 S& W) |* C7 _
- CMP #JOY_KEY_LEFT& w+ O- a9 |7 u. M9 N7 v+ I
- BNE .Next_Music+ m. O; y, N$ o2 R9 O2 F
- JSR Music_Play_Pre" b0 ?, j. C; e) n5 n6 I
- .Next_Music;下一曲
. q8 q; W9 W$ l6 J. Q/ P, K3 v! e - LDA FC_Gamepad_Once; R$ Y+ x5 F& y4 ?
- CMP #JOY_KEY_RIGHT1 [) ^- |6 B4 ?0 ?3 V
- BNE .Next_10_Music
+ A2 g; p8 r& _& x" m - JSR Music_Play_Next: D+ v+ q. h$ U
- .Next_10_Music;上10曲
, \) w7 X0 y+ T" r; E$ J - LDA FC_Gamepad_Once, H* G: f: Y! K+ J
- CMP #JOY_KEY_UP) I9 k. L3 }! ~9 `9 |" K
- BNE .Pre_10_Music& x# w; ~' p5 k* k
- JSR Music_Play_Next_102 I0 I" f( l* H+ i! O
- .Pre_10_Music;下10曲/ m; D' O+ t3 n; F
- LDA FC_Gamepad_Once! E2 ~: n( e+ W; k$ Z; K& {6 R
- CMP #JOY_KEY_DOWN
: @% F0 z$ |( T% \4 e9 o, H - BNE .Reset( u. g P! k, [
- JSR Music_Play_Pre_10
# m& q: {! Q* Y9 X* C+ j6 S& w' p - .Reset;重播当前曲目8 c; @+ n1 K7 i, K( f) N( G
- LDA FC_Gamepad_Once& B$ S8 p$ d6 M7 c6 E4 Q' Y
- CMP #JOY_KEY_START) Z6 \3 P4 o( i4 q5 X" w7 _+ x
- BNE .End
' e* g( n$ l0 f - LDA FC_Music_Index
7 e0 }6 \( ?1 j! k9 H6 U$ Z - JSR Music_Init_Process
" S1 f% e" f+ A% F - .End
" T9 m+ s( e7 e - RTS( b7 i0 R7 T# s s( T- } L
- " X) T$ v$ e/ n( B6 @
- ;----------------------------------------------------------------------3 [8 v0 }5 k, v
- ;播放上一曲
0 L1 Q9 t6 w7 N% }& l; A - Music_Play_Pre- T0 N+ `8 K, u# f. z" O0 A
- LDA FC_Music_Index
5 m. d, W+ T/ `% [8 } P! E( D M6 u - BEQ .End
7 x* ?" ^0 W" R: e8 A - DEC FC_Music_Index
% y" e3 U. Q) W, [8 ~ - LDA FC_Music_Index
( Z! q, P% P/ H' O! | - JSR Music_Init_Process. j5 o4 T& \8 e( f# j: ]5 r6 ^' P
- .End
( T* b# n4 W. y* @% m% x" T6 R m6 B - RTS
! m4 c$ u+ r5 M+ q - ;----------------------------------------------------------------------2 T- L7 v I( u5 z" H; Y! @4 W9 {
- ;播放下一曲% P/ m) u3 q3 h+ I
- Music_Play_Next& W; [1 O( O( a1 Z+ Z* [# }
- LDA FC_Music_Index$ K6 D- F" P- c) |0 Z {! }4 f
- CMP FC_Music_Max_Index, ? {& a+ v0 r* q' Z
- BCS .End
0 X# [1 F1 L& \- z" G - INC FC_Music_Index
: a0 D$ J- W2 j1 G - LDA FC_Music_Index* l; b, q$ T" \5 b0 P
- JSR Music_Init_Process
! Y! k0 }! f+ ?8 [, s- ~( C - .End
. e0 S) z# P$ N; E' R - RTS
, ~& U/ E& J* p* g
- [5 I: V, Z5 f2 Z- ;----------------------------------------------------------------------
) w* g5 u7 O2 t - ;播放上10曲
% s( y$ k+ e3 c; R$ O' L - Music_Play_Pre_10' p% f$ [$ }+ V* s& h2 t
- LDA FC_Music_Index, }* l4 ^9 N# C' P2 B
- BEQ .End
$ \# s& O( u, x6 K# |! i - SEC; h: k* W+ Y+ W# r0 p- |7 Y4 i/ h
- SBC #10
( V8 M/ q/ X) e7 J - BCS .Pre_10
( W% A/ p9 |1 W - LDA #$00& \/ k& e1 H0 |- F
- .Pre_10
3 b% K. w$ f. s9 ^* S6 \# r - STA FC_Music_Index
) M) Z1 m( y1 n0 \; ?" |. k - JSR Music_Init_Process: Z' r9 x9 s1 X% C# z6 O0 Q( k/ l
- .End/ R$ R, I# C7 o+ M8 \9 K! j) ~
- RTS! b- t8 a" O& k, O( }6 b7 E
- ;----------------------------------------------------------------------% \8 Y2 t3 B3 T9 w
- ;播放下10曲
\6 Q( M T; ^; W - Music_Play_Next_10
% I( G. @( E" ~9 j+ a r' ^ - LDA FC_Music_Index
" p8 o. b- Y" v - CMP FC_Music_Max_Index+ V) z' M, A0 p$ p: U/ Y5 i3 { M2 ]
- BCS .End
! c, H" N5 H: `( h7 @, D3 _ - CLC
! ]) H" P0 d4 H2 \% @ - ADC #10' D, A+ j) i7 ~, W3 |
- CMP FC_Music_Max_Index' \, c: \, X( t& ]
- BCC .Next_108 d9 c: p- L/ C) v4 H8 J
- LDA FC_Music_Max_Index
6 ~/ d9 D8 o0 E6 |. _ - .Next_10: o0 [. a3 F, x; C& n9 E
- STA FC_Music_Index: Q: s% ]. C. F/ w6 s
- JSR Music_Init_Process4 Q# R% L2 a1 O j- ^# U9 \9 J$ v
- .End4 w4 G- N+ u5 D" i
- RTS- C( r: \# n: ?, i
' L. S& `* R* F7 \1 D- ;----------------------------------------------------------------------
$ t7 d, g$ M# U - ;8位十六进制转3位十进制制
& n. b" e, f" x( _( v - Hex8ToDec' o+ r& n2 t( t: X' ]
- STA FC_Dec_Data_1
) y7 K L" z, K( _# f - LDA #$00# V# u3 @6 Z3 O7 g
- STA FC_Dec_Data_100
" u. J% V' G5 K' f0 B- f$ S# } - STA FC_Dec_Data_10
# o: _/ v: q& N) o8 A& s - LDA FC_Dec_Data_1
% ^4 }2 k( a# z. s( z3 B) x+ K& W7 b - .Convert_100; @/ u5 y) m0 G
- CMP #1003 y3 E0 m7 k2 K, F9 v
- BCC .Convert_10' c! D' B+ X$ M5 N: L6 _/ D
- SEC1 s* @5 x. k$ g' ^
- SBC #100
2 _% l" M0 d7 c3 s7 n3 N" o% J. Z' b - INC FC_Dec_Data_100
# G0 u& ]7 y8 D) k& Z: p - BNE .Convert_100
$ C. R6 S# G+ C - .Convert_10
, C+ w6 y' d6 y" f, G& G- u - CMP #102 ^, B' I' j* \( n8 C. H; R. w
- BCC .End8 W$ ~7 P7 ?5 \& I
- SEC
( Y$ c+ f( n& L. _ Q8 [* u! N5 C - SBC #10
; A+ t! S! H) V# _) ] - INC FC_Dec_Data_10: { p$ P$ z8 r. K
- BNE .Convert_10
4 r+ ?' P) Z3 p! H& B - .End
^/ v+ U3 P+ L5 `7 k1 @ - STA FC_Dec_Data_1
+ r) N% [1 B5 X5 L+ _% S6 K - RTS
" J) m- D9 u, W! G' g; D& a- E - / T. W0 ^: @& [& d& E' e7 m
- ;----------------------------------------------------------------------
$ H/ Z* T* |1 h5 I* O/ q* u - ;显示曲目信息2 q% ~# ?2 K. q: G
- Music_Info_Display
1 k* G: q; d' R - LDX FC_PPU_Buf_Count
2 M" ]' T$ ~8 E; l+ J7 }& U2 [ - LDA #PPU_WRITE_MODE_CNT_LINE
+ I/ P, T) E' j& I- G: t9 O* y" p - STA Use_PPU_Buffer,X
8 x f6 {0 z) |; Y - INX
9 x$ Y( l' B; U& A8 t -
# n6 E7 \4 Q$ y& r - LDA #>MUSIC_INFO_POS
4 Q2 G: H0 h$ H6 Y! r! O& G2 z: I - STA Use_PPU_Buffer,X& i8 S3 K5 A2 d9 j* ~( b N
- INX
: ?- w" T; P: m3 ~ - , ?: ^4 l+ c/ D3 [2 d
- ;居中
2 p/ w% z# z" F - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
, ` a- L1 P3 H - STA Use_PPU_Buffer,X/ f4 L* q9 }& s# A% i
- INX) P/ v& ~# ^, u
-
- _5 A, b; C, d7 c" {2 S" o/ } - LDA #$05
. z) \( V* \9 D% s% L" r2 l - STA Use_PPU_Buffer,X: }6 j& \5 a7 A( R3 t! m {
- INX4 q/ C+ b+ R' l* {- | B
- 6 r- \$ C" K+ v: k# S
- LDA FC_Music_Index1 W1 W( k8 `. Q# p8 v+ |
- CLC# x: ^* y, _' R! D! {7 I7 J
- ADC #$01
( I Z$ l: F; X5 {1 w - JSR Hex8ToDec0 c0 v. V/ l3 O ]+ f! I3 A
-
% @3 b7 }: t. o2 N, C2 A' K! p - LDA FC_Dec_Data_10
6 S$ s# e, v, u, W; N+ C: ^ - CLC7 o% Y' u( R5 V) w h
- ADC #'0'3 \$ V+ J2 t, ?, {) [: B
- STA Use_PPU_Buffer,X: g+ ]: K# c. b$ g
- INX
, @* d& R2 J! Y# l& L* Q -
5 U' F r2 O- v3 X# ^# f - LDA FC_Dec_Data_12 F5 F {% C+ Q, k' q
- CLC
4 u- x8 a8 B: j$ z - ADC #'0'! }, D( Y! M$ x/ t
- STA Use_PPU_Buffer,X& @5 U" n: p' i' e& u+ U0 u0 v4 O
- INX
+ |: [1 b6 a# @+ c7 Z7 F - * F& i, M6 b$ O8 N( `0 L9 R3 g9 y
- LDA #'/'
w2 \! j4 o) G$ z8 C - STA Use_PPU_Buffer,X& c( `8 K3 D) @# V7 Y9 W: o
- INX5 t9 _ t5 |' r, `
-
" m% J* s8 w) G+ U - LDA FC_Music_Max_Index4 B- w9 C4 n+ c
- CLC
# a0 d7 l+ I. ^9 N - ADC #$01
- \- H# A7 Z4 F, y. `: x - JSR Hex8ToDec3 T( _4 B5 y: {1 C! P
-
( O5 C: r$ ]" e S7 T; I8 B - LDA FC_Dec_Data_10
+ s. y2 P( ?; V( W& b, F# C9 V - CLC
+ Y3 ^ [# ~: H) B4 u - ADC #'0'' w) M' F, n7 C; z) i# i
- STA Use_PPU_Buffer,X
. D- X/ M( d l' B1 h- D - INX
3 b& Q7 h! L6 i* B8 g9 b -
8 p8 V# _$ g y% R% j - LDA FC_Dec_Data_1
: B$ U3 q4 Q2 Z. H - CLC
- z5 w% P4 z' u* w0 A+ w - ADC #'0'" N; ]9 ~& T% r& C+ V
- STA Use_PPU_Buffer,X
; Y" H! R+ O3 t. z8 N1 N$ h: |% G* I - INX
; V q% j) E/ F- s -
6 M: ?) \ t; B3 ~! Z - .End
/ C# S) H( n' A1 i+ |0 m - STX FC_PPU_Buf_Count
1 [ ~: U4 Q8 |2 `6 i2 q, S - RTS. F( U9 |. l' D. |
C$ z2 I9 s9 _! [, A% [" @- ;----------------------------------------------------------------------0 E! _( D! E! L% v
- ;音乐曲目初始化处理
; v/ U4 y' U0 q+ N - Music_Init_Process
4 a4 m. \/ A9 l, j8 m - PHA
; A5 a4 L4 Z2 W$ }5 ^" J' |1 c# z - JSR Music_Clear_Process, s1 ~ Y4 B/ B8 _
- LDA #$1F# K' Z* w5 V8 H4 h# q& \ m+ o
- STA $40159 U' K' `7 t1 b! T: |; i6 b- j
- PLA
* C, y2 D* _ B' G0 M B - JSR Music_Init_Addr p( v+ o1 z/ @
- JSR Music_Info_Display
$ _2 B6 Q h8 L+ T+ |3 j - RTS
$ u* z( h! A* r% I! }6 n - ' z' U/ T1 a$ V) v- F# T4 D
- ;----------------------------------------------------------------------
5 D% N: X+ E4 M% [0 @: L - ;音乐播放处理' ~7 y; h" p x7 T0 ?
- Music_Play_Process. [# U; C3 O* t9 f
- JSR Music_Play_Addr3 H( ]$ J) u3 N" R+ V v
- RTS
2 m0 _! o5 ?5 G# a: z - ( W7 B2 l+ Z- H$ t! M' a$ q
- ;----------------------------------------------------------------------3 m; c R; K5 A% N" _
- ;音乐播放处理, }) K: {. O; a: l! ?
- Music_Clear_Process
4 @0 |% X9 I% Y2 E7 x - .IF Music_Clear_Addr. \" t6 t8 A2 I+ N$ W3 d
- JSR Music_Clear_Addr
$ ^( h" c7 h" I - RTS) ^) f& {6 B3 F l/ f6 T
- .ELSE
! A5 J* U5 S/ s' o: _ - LDA #$1F
" P" e* N% P/ B- i& ^ - STA $4015
9 g; T! \( R7 `8 p - LDA #$00
9 `- Y1 K2 C+ I2 f! S7 @ - STA $4010/ N3 @7 P1 A8 ~& j& q, m, S# Y3 T
- LDX #$00' O8 n9 e0 @/ M u: W* L
- LDA #$00
5 V& C. x2 o: Z# {! }0 |4 X -
$ y0 ]# o. `( i4 O6 m% Y - .Music_Clear_Zreo_Page_0
* \5 h' q! I% Y5 L. y - STA $00,X# V5 @' a; Z0 x: z
- INX$ m7 M3 K2 w" t. D1 b8 W5 b$ w
- CPX #Use_Zero_Page_Begin
+ a: ?* `( E' ^* T* u - BCC .Music_Clear_Zreo_Page_0
& X' v) i4 O; D, A/ o" @ -
. @/ F) T' Y4 u! ? - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
, s v7 f0 H9 |1 N4 B( [ C3 B& |1 c - .Music_Clear_Zreo_Page_1% m( q, l0 i8 r* [1 ~$ L9 V& q
- STA $00,X; X/ j0 b. g) X; {- {" ^* I% s
- INX' E5 x( B$ H9 Y/ O
- BNE .Music_Clear_Zreo_Page_1
U g/ E) z, j/ u4 P! X+ R# R -
1 c3 e; q- f8 K9 [- b8 k; ~ - Music_Clear_Process_1# T" m6 v" p) @2 M
- STA $0600,X7 k1 ?6 E' b/ f% L/ e' f4 ]: C
- STA $0700,X' J F C) T7 ~+ @
- INX
& m9 |3 N4 m \/ K# H - BNE Music_Clear_Process_1( }/ j& A; P1 m1 M- E1 F$ v+ @
- LDA #$103 N( C% o* k o/ o0 u
- STA $4000$ q3 p5 r2 s+ N p+ }" b
- STA $40040 p7 k( ]4 z& z& P5 U1 x) R! s- x
- STA $400C
- K9 A0 A* I+ l9 W* U - LDA #$00
7 ^: u3 m7 k/ U i7 M$ u5 z - STA $4008* l0 d8 Z. p2 A
- LDA #$0F
0 F# }8 x+ o; n+ ?* C1 v8 e - STA $4015
$ [3 E7 z1 x0 N& j( l2 H# p4 O - .ENDIF8 j% x% A: h- u. M2 I
- 3 \* T7 S# d+ L9 w
- RTS
, C2 K" v/ Y$ T' N% [3 x
' L$ `- n5 J- h7 q9 Z; d/ n T7 a- ;======================================================================
+ C7 b; B5 K2 j' ?) y - ;重启处理
) `8 `% O1 P# P5 Z - Reset_Program
, l: v. y2 [- N2 q+ @ - SEI
4 J! u. s8 ^( R* x' W8 n - CLD
+ u( @3 f8 J/ d - LDA #$00' [ v8 B. j) m7 E$ V+ @* ^
- STA PPU_CTRL2 H8 y: M! E o. v' O
- STA PPU_MASK
& A: G6 y0 d9 N- G8 C3 D - STA JOY2_FRAME
) \4 G* _* b. n% X: @ - STA APU_STATUS7 m* ^0 l& c2 Y' x+ w* r3 G
-
1 L9 N3 p% v+ t9 Y5 ?6 P+ z# O! _ - ;等待屏幕准备完毕
2 ~8 V1 ]$ X6 ]! }/ j - LDX #$02
: ] G8 e1 {* l, M# h - .Wait_For_Screen_Ready5 ~* p5 O- _: D) }
- LDA PPU_STATUS9 m3 d3 W+ z0 ]4 {2 z1 |
- BPL .Wait_For_Screen_Ready1 ?1 k7 y5 l& l9 |2 [
- DEX
" u6 D2 }( T4 l. P3 a0 Z - BNE .Wait_For_Screen_Ready! G6 E9 I2 ~3 [
- : Y1 i) {1 e, E* m2 h
- ;清空调色板
, a- i4 D2 z8 C3 x) e$ {. g - Palette_Clear
$ N, n" Z( m+ P5 v" |* @ - LDA #$3F
% [; k$ A$ W. m$ |' h% U8 L1 H! ~ - STA PPU_ADDRESS$ ~3 N1 k( J/ v, S
- LDA #$00
# K) ~, J1 |$ |% b6 m& z - STA PPU_ADDRESS
/ g6 s, h' X% ~+ t3 x - LDX #$20
0 y* ^/ w! q7 W& F( | - LDA #$0F& A: a5 _) c) E. r
- .Write_Data: q6 B0 L" y. X% R
- STA PPU_DATA
* a/ q( }4 Y7 Q x7 U6 S - DEX4 s8 \1 A& e0 g' X. f. i
- BNE .Write_Data
; \" |9 X) ?: Q& N. ~, ^; _0 d
% h3 [9 Y1 J* T0 n( }5 w- ;清除声音 $4000-4013" c$ M' I$ H |/ N
- LDY #$14, }; C% ~0 V( M5 P0 U
- LDX #$001 f, U6 F5 V! z/ O0 e9 \( }; s
- .Sound_Clear
2 R1 Q% j2 ]( K: l7 f6 I* Y - STA $4000,X
! |; Q: n, ], B# S6 U - INX
5 k: r( s* |) R0 D2 L$ s - DEY; Z, ^; b) t: b) v0 X
- BNE .Sound_Clear/ J8 ]; \1 n/ `. F$ Q8 F4 H
-
+ [3 c; Z, U' U0 P( C# Q - ;清除 RAM $0000-07FF W/ P8 U: E7 w
- LDA #$00
9 m4 J; R0 r2 p& N! w7 R1 H - STA $00" I+ s8 G" _' e1 u; [. c' u
- STA $017 A8 K8 }7 l. {0 Y2 e" n4 d
- TAY
0 ^7 e" v/ f* L - LDX #$08) Y6 ]. f! i; [' \* U- ~ J, J
- .Memory_Clear
) E1 D8 d/ h- h5 a - STA [$00],Y2 m8 Z- e& e2 j
- INY# M, {5 }) r' M& R9 U* q
- BNE .Memory_Clear
8 o2 K+ X6 T) x' d& [1 Y5 Z' i - INC $014 P3 y+ F( y3 [' I# |
- DEX$ A y* T5 }, d. S2 P' H
- BNE .Memory_Clear
0 t$ M/ y9 k' |7 Q: }! ~ -
% b* h5 B, l8 }1 ~6 R, H - ;精灵缓冲初始化$ Q# f: `! A* U- x3 d
- LDX #$00
9 x. a1 q8 k: p% t - LDA #$F8
) {% i0 K9 r' B6 {. @ - .OAM_Clear, T8 X) A9 b6 m% w* |2 }, w' w: d
- STA OAM_DMA_Buffer,X
/ T$ I0 [% m; W7 d* I - INX
' \2 N& h* y8 B% H- k - BNE .OAM_Clear
7 a3 N/ i9 t9 J q - - J6 ]! L/ a3 v5 D R2 L" D2 r
- ;栈指针初始化
; `9 i' Q. Y$ @: S1 ~- I - LDX #$FF
3 P) R3 ~. E4 a% ?" D* g% H% R2 r - TXS6 W" q( H5 D2 x( [
-
P# ~+ b) o& C# h4 G: o/ W0 o - JSR Nametable_Clear;命名表清空
" A( K. f7 I; j2 Z8 c - JSR Palette_Init;初始化调色板缓冲+ q0 ^: p+ i, D5 n
- JSR Static_Text_Init;初始化静态文本
8 H; ]0 x* j! @ -
( U. d( r9 s' B' V: N: k - LDA #MUSIC_ITEM_TOTAL - 1# |1 d) x' v1 U2 {; r, Y
- STA FC_Music_Max_Index
1 A% J* l" W! D# W' ? - 2 u1 P% {4 ^+ S8 J5 \ b6 N0 D
- LDA #$1F
* y7 t- \, F, M* x$ L9 u% Z: k1 v" o - STA APU_STATUS. n! u: R; J" e6 B7 Y3 m0 b5 Y6 O: t6 k4 m
- LDA #MUSIC_BGM - 12 Q, _, |7 o; P
- STA FC_Music_Index. P* f" N+ H, W8 p0 R
- JSR Music_Init_Process;音乐播放& g {& z. a& x9 Y
- ( q9 Q$ k# @: }7 T6 T$ p$ g
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)- ^0 l( v3 R+ Z+ U, ?
- LDA #$1E
0 T8 q6 N/ v, _% B9 ? S% h - STA FC_PPU_Mask_Buf
4 b* s+ y/ O8 W' ?+ w -
$ g3 S2 U d2 N. z0 T2 s - ;启用NMI处理
, k4 {2 |5 z5 Y - LDA #$80
5 {5 C4 _) y5 a7 n2 [7 q7 [- D - STA PPU_CTRL& D. W0 P/ c& d& ~7 G& X. |
-
/ Z% b2 l+ B% K! y/ w# e4 i: i - ;程序循环, 剩余工作交给 NMI 中断处理$ @9 u8 u! q+ P" w1 t
- .Loop! A; a& x4 H( e5 O: ~7 i2 U. O9 O
- JMP .Loop
' z3 h0 m5 G/ B* z - R' k' ~, F0 ~
- ;======================================================================3 Y) ] |) e% I* B. W
- ;不可屏蔽中断处理
/ d0 f( p" ]% t) u) a7 q( v - Nmi_Program
. E4 R$ P) w% H, Y' h - PHA
* E8 F+ s5 n% ]) i7 E2 Z - TXA
$ b* N' U: v! G) D - PHA( f0 h# l2 a8 ?+ |2 c- h
- TYA
- K Y+ e) w2 n4 ~5 @ - PHA
% O( x+ l+ C. V' V" F. v -
6 U) Q: A6 r m' G! @; }5 P - LDA PPU_STATUS;读取使得 PPU状态寄存器复位) n& d6 c0 `" r; O
-
V+ s9 G! ~3 G- q/ a+ M - JSR FC_PPU_Procrss;PPU处理8 {* r& v2 C. _+ Y0 H
- 4 e) `4 K% e) I5 b3 F
- ;精灵内存更新4 X( v/ d8 F1 r9 \* s4 F3 @
- LDA #$00+ V* k U. t" f
- STA PPU_OAM_ADDR
0 y4 U* ?- j1 j1 o' c% `; V1 P - LDA #OAM_DMA_Buffer / $01000 R# A' Z: a( W! z: s2 W. Y# ^
- STA OAM_DMA. B5 i) I/ ^& c+ |' \
- : W p( R/ s9 }* N5 P
- JSR FC_Gamepad_Process;手柄输入处理
. F+ x+ K$ c% R6 W( |9 l: u- c1 ? - JSR Music_Select_Process;音乐选曲处理
" N/ Y7 e" ^( Z! a8 m - JSR Music_Play_Process;音乐播放处理1 p( B& y3 k' t" r
-
9 H8 q- I; t% x3 t0 n, t3 Q5 ^( s+ V - PLA/ ^$ Y$ v/ a4 P2 w2 U
- TAY$ B! }& H/ b0 h6 K; A/ S
- PLA' i' u' `& a0 f2 ?' N% d& {$ S& P" p
- TAX5 m# \* S4 t" p, D0 Q
- PLA8 O6 g; e6 i1 B( J/ P. D8 I
- , @, `- m# u- S9 W( A
- RTI, K3 g9 I* C" I9 C0 x
0 K" h9 J" u- E; F$ t! n2 }- ;======================================================================
8 K- u3 t* N6 u. L" \' n' ] @ - ;请求中断处理
' w7 L" g( T0 G6 w M - Irq_Program
+ f& Z& F O, f. s9 x - RTI" a9 I) K+ m+ z0 t% { C
- # l# v- b& P y8 E9 }7 I
- ;======================================================================
4 d _, [' q) n8 n5 z - ;中断向量表
% t3 U# d8 k2 }9 { - .ORG $FFFA
D8 o9 H- J* ?- A' t2 e/ _ - .DW Nmi_Program ;NMI触发时执行9 U# q& C" G4 [2 j+ }. r
- .DW Reset_Program ;载入ROM时最先执行
# x6 K+ R7 U& s0 J$ a+ i - .DW Irq_Program ;IRQ触发时执行
% G4 L: e. Z! T# Z
复制代码
8 C! H: e/ B5 r# p$ O. J
. {+ a" |* ?. t9 n& m$ ]
& T; l% r1 P% w) k9 p) Phttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|