|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下' s- o) U8 L. A8 V0 J% ~! [" F

0 u1 V8 ]! m! h$ f4 D以下是主框架代码:" }- ~7 c& Q5 p1 K' p- \4 x: U
- ;======================================================================
* Q% R) f5 l/ z$ C ~- _# q8 O - ;文件头6 k6 ^+ Y8 B& D* D# C1 e
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
, X0 |) b6 R# b0 T+ o! C - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
1 D+ }9 Z1 V2 l3 l - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码; L* A* h# j1 `7 H/ e. s) J
- ;======================================================================
6 v( \! D) d0 |( L - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2, P8 q- w' Z7 r& k, A9 [) f
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
. |9 l ]# E6 k, D7 G# l6 p - ;======================================================================
6 q5 x% Q/ K2 o4 P - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 14 x2 Z4 z5 J) O3 M: Z
- RESET_ADDR = $E000 ;主程序起始地址
( F2 M0 h5 Z6 i8 Z" x3 a - ;======================================================================& a1 S8 @! X. Z5 N# v
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
5 t3 F/ Z1 u; }& d - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; b3 t$ t6 _5 \. j
- .INESMAP 4 ;Mapper号 (0-4095)7 a% R( @, o; E' ^0 {
- .INESSUBMAP 0 ;子Mapper号 (0-15)
' T2 Z. j- J& q0 u* b3 |" V: ] - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
4 ^) ]. G# B( N0 h' ?5 G' j! d - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)0 V O% P. J/ D* k
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
% I1 V$ X% `- N4 ]. R$ b8 D+ _9 V$ u - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)" Y. S6 R7 \5 O! d& Q1 i
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)- T# i% v% t" _. ~- Z8 [1 y
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)9 v. c' Z- c2 c, t3 N* b5 {
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
6 q) v5 ?2 |7 g: x* [+ R3 H - ;======================================================================, h- `7 R9 Y( z' W# ?/ m. M8 `/ s
- .INCLUDE "fc_demo_config.asm" ;全局配置. b# `. J M0 r( i0 w3 Z, y
- .INCLUDE "fc_demo_constant.asm" ;NES常量9 w# l4 R& W V
- ;======================================================================
- n- R+ H5 q# V+ o7 ~( \' l/ W - ;音乐配置
3 W' ^' C- U3 k1 X! l. j% g - .IF 0 = MUSIC_THEME
* B8 x7 e9 }: a% b* [6 s - .INCLUDE "data/music/Gremlin 2/config.asm"
" Y% W% c: N# s \, }2 x - .ENDIF
8 U; V% O/ n7 D/ u -
, }! N* L- u1 [3 G+ a - .IF 1 = MUSIC_THEME9 o4 a, a/ |" V% [# j' v
- .INCLUDE "data/music/Raf World/config.asm"
6 s' U" ^; z0 ]9 a8 z0 ^% g - .ENDIF
2 c q$ m2 v) I -
' L! @4 y. i/ a& l( T - .IF 2 = MUSIC_THEME , M3 O$ Y! x* n6 n$ ^7 F+ \6 b
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"5 ?! [$ D( W& \: F. V
- .ENDIF
6 I4 ~1 z/ O6 r9 J: i7 f+ D9 U - 0 {4 V! ]9 z% W1 W: g
- ;======================================================================9 @" l: S1 I$ A K
- ;引用CHR图像数据
0 M, M; C4 g; f$ r) X. N% G - .BANK NES_16KB_PRG_SIZE * 2% F, h: n! H- W
- .ORG $0000; t. Y$ S1 g8 L/ m0 m2 a
- .INCBIN "data/bkg.chr"! d& U+ v$ m) k; w p O2 X
- .INCBIN "data/sp.chr"
& V- k5 ]6 g* F! Q& D8 ~# ~/ l - + C1 }$ X) r8 i6 u# o3 m
- ;======================================================================
' l: b8 w* M5 N% j" J - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank4 m" k# H4 S9 v5 y, k
- .ORG RESET_ADDR
. m3 L s2 [; \6 B9 e( O k - ;======================================================================
6 l# d0 e+ _/ @( y: D - ;引用其他源文件, b- P; W6 T( o& Q/ Z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理' s. g7 h. c# P
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
2 V% O; \( I/ t* S5 F+ m/ a - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
/ A: [" G q6 ], d - ;======================================================================7 O% i% {7 d& V! p |' Z2 ^
- 6 m( r, C2 \6 w. M# K
- ;======================================================================
8 E; x( O& y5 k. l. i - ;等待VBlank到来) V$ J* j6 J# k5 @% i
- Wait_For_VBlank/ o& ~" c: {/ A o% T
- LDA PPU_STATUS6 n% v* e' y1 J* n! B6 u' }% Q
- BPL Wait_For_VBlank
; l- X( i5 ^7 B B( l/ k - RTS; Z2 K3 T& t$ n7 F
- $ c' b: q+ z$ a) ~9 b
- ;======================================================================
. y% ~% b; j; h7 v* r9 q- p/ U - ;调色板初始化2 y' ~: X6 n: _: ^! j2 F: g4 g% S5 [
- Palette_Init: e; I3 }7 Q1 \! x8 x: q: F
- LDA #$3F* [9 C) J1 _/ a6 U
- STA PPU_ADDRESS; o8 ^4 L) @/ D, B! N) b6 Z( l
- LDA #$00
* y4 N1 U/ ]7 B) X) X S, E - STA PPU_ADDRESS
4 V" N" U/ d) ? - LDX #$00
* t" Z2 F, Z6 b4 R1 `' {- [ - LDY #$20: f; k0 S! Q: f0 E
- .Write_Data
9 x6 X6 `7 U2 D6 T/ D5 f - LDA Palette_Data,X
& U* D' G" W0 I1 V T7 r" y1 R) l1 D+ k - STA FC_PPU_Pal_Addr,X
5 L- ~9 |; r; i H! H" Y - INX
8 D1 D* }! t) [9 J4 ~" B - DEY
; ` [2 M: w7 ?3 q5 v - BNE .Write_Data
$ U3 |5 |1 `4 D0 i7 T% W K9 W - .End Q5 E) P' D! H& W6 n9 _7 B
- RTS
; @/ n+ K o$ g) ^. c" Y7 ^# W2 F8 t - ; f" }! B$ G/ v% ?
- ;----------------------------------------
/ ?, L% h1 L5 w. P$ X6 Z - ;调色板数据
6 C6 ]5 ~4 i4 g, f - Palette_Data5 R# }0 h9 x) [/ ~8 d. \, M& s8 f$ y* c
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
. a# B& m, R2 @3 n - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22, y- s0 I) a. `1 f
-
4 x5 e. @; w7 n* s+ {. R. b7 Y8 [ - ;======================================================================
' ?% ~0 T% \% C- m- ^0 I - ;命名表清空) ^( |- f9 ^' j6 Y( I3 W% |
- Nametable_Clear
9 I! b2 R0 M2 E - LDA #$20
, L _ U) P; |2 C% d - STA PPU_ADDRESS! ]+ t5 g/ O) `7 f9 v
- LDA #$009 j/ L: c& |3 P- E4 T! b; T% U
- STA PPU_ADDRESS. x2 w1 O' I$ {* l+ u, Z2 _
- LDA #$00
2 `6 r/ L( W/ ~& E& h' j - LDX #$00
# P, }8 p+ ^( _/ F8 d4 y - LDY #$08" \; ]* q" Z3 |, k/ g" [- b0 u
- .Write_Data
- S; M# ^6 C( p8 h - STA PPU_DATA# K& H; Y+ ^5 Z+ d2 }4 b
- INX- p% f! q/ Y( J4 d
- BNE .Write_Data
3 F0 ~0 s9 @/ I" ~1 ^! q) F - DEY! Q t" P8 `& M
- BNE .Write_Data1 T7 y' r2 v: n: [) s7 l) R
- .End
+ y2 Y. }5 W4 C# {7 O - RTS* \( o' F5 _* M; H# t
- 7 i5 G" y1 _6 C
- ;======================================================================
" M+ `: a' U! ?) i3 A# A - ;音乐曲目切换
8 N) o' o# `" \9 _- w - Music_Select_Process( F5 H: j$ C+ N. c' M
0 ~) L7 L7 N4 C4 z* M$ r- .Pre_Music;上一曲6 q( R$ X, y" K: c0 T% u: Y0 w
- LDA FC_Gamepad_Once# v4 E2 r, }/ L, z
- CMP #JOY_KEY_LEFT9 }9 h! M; l- [. A& Y, p% }- ]
- BNE .Next_Music
, A' O) U1 |( h1 Z1 C" y, x7 b - JSR Music_Play_Pre
1 _9 F; S8 Q# e* {$ F - .Next_Music;下一曲
; k- O/ z% l8 G+ z1 n# L8 y) {. ] - LDA FC_Gamepad_Once6 S& Y) Q0 ]: ]8 {+ k
- CMP #JOY_KEY_RIGHT
k, K& E- i6 p( y5 D - BNE .Next_10_Music
5 n" E. O/ g! @0 B# n - JSR Music_Play_Next
1 _0 }* Y' P; g" S- E' G; x7 m: Q - .Next_10_Music;上10曲
5 w; q# h5 D$ @( T3 K - LDA FC_Gamepad_Once
1 z' a8 z5 Y" N# |2 a - CMP #JOY_KEY_UP
z" M! M$ b b2 v - BNE .Pre_10_Music
, @0 p; ?1 t9 _( ~9 F; M- A2 Y - JSR Music_Play_Next_10' R3 M' l) _% i: d2 ?; J$ P
- .Pre_10_Music;下10曲 M n$ \2 Z8 q: u
- LDA FC_Gamepad_Once
* L7 e& D2 l1 @; O - CMP #JOY_KEY_DOWN% H G# R Z( O6 X1 o' b' q, z
- BNE .Reset7 M+ Z- s4 J2 F0 v- g4 e
- JSR Music_Play_Pre_10
7 b% K6 a' [: h+ G3 j - .Reset;重播当前曲目% k' {6 [4 f, N& K
- LDA FC_Gamepad_Once
: O' T' O7 q9 _* a - CMP #JOY_KEY_START1 P# K- u. P. e( O
- BNE .End3 Z. q) e+ W( S1 G2 H
- LDA FC_Music_Index
7 C9 \! \ ?3 T2 _ e - JSR Music_Init_Process
; x9 t9 A5 Q0 ~, j2 } - .End
9 P9 g- A& S% @* t: U! P" [ - RTS+ n" k1 g" }; r/ Q! t ?( X0 u& j
- 6 \& b# O2 j5 H3 q q* s: p5 {
- ;----------------------------------------------------------------------" q! B. X" i* E. Q4 B7 y+ l
- ;播放上一曲
% T1 |# O; E1 z0 i - Music_Play_Pre' g/ {; X" R% n
- LDA FC_Music_Index
0 s6 j. _' J$ R8 y/ u' C3 Q - BEQ .End$ v5 P+ B* j- t$ J, |# T7 W$ O
- DEC FC_Music_Index
! \: V3 P$ l* i* R - LDA FC_Music_Index
+ I# J! e x8 e6 p - JSR Music_Init_Process
0 F Q& q; j% c% Q' s4 v8 q b7 [ - .End/ } l6 K# z" w. }3 E1 x' i/ Q
- RTS
" n! L; t0 d: \5 ?; d; _0 c - ;----------------------------------------------------------------------# d: u5 X5 j# S: i' B
- ;播放下一曲: {# v2 O" c/ L: {4 ^9 d
- Music_Play_Next- Q7 t+ e V: P/ m
- LDA FC_Music_Index
# _3 y/ v1 A3 r( i - CMP FC_Music_Max_Index
1 z1 @: S4 U. b4 P, b1 X8 w5 ` - BCS .End
O h7 s8 G5 c. s - INC FC_Music_Index
( E/ I1 J0 f7 a, V2 h' ? l - LDA FC_Music_Index' T; V' p* p2 l! f
- JSR Music_Init_Process
+ t3 ~3 b! Q# H1 L3 v) n6 v% w - .End
! T5 I5 \3 o1 [: g5 ~) y - RTS
% `/ E& x) r8 {: @ - ; @# V8 v; M: ~6 b8 V7 M- f6 {
- ;----------------------------------------------------------------------
0 y/ G) ^% [0 x - ;播放上10曲
$ V+ R0 P* i/ B2 c9 z; p - Music_Play_Pre_10$ X7 @& m4 h$ R( o' @+ C" @# ]
- LDA FC_Music_Index
0 K: a9 R$ u+ j$ B7 X% y1 M - BEQ .End
6 X, ? f; A) T3 U4 O - SEC" o, a7 V$ Y, P" D% f: m1 O
- SBC #106 Q+ A7 t" x* \
- BCS .Pre_10
2 a. _' A9 ]# v* c2 r - LDA #$00
, d( n) Z6 i2 ^* P# I( u - .Pre_10- D5 b7 b$ ^5 y2 e. u
- STA FC_Music_Index. v7 }7 Q, y7 G
- JSR Music_Init_Process
% e# ` [; }# H# A" A7 C" D - .End
! X) \* b" z2 A6 I _+ T - RTS
+ d' w9 W3 c6 R& ~) U7 U$ | - ;----------------------------------------------------------------------% O2 h/ g* N; Y6 ^4 w/ x
- ;播放下10曲
! U4 `+ i+ A; H! W: A* b* |: M - Music_Play_Next_101 Y; q3 i2 S& U1 \1 S" w1 U3 A5 a
- LDA FC_Music_Index! r5 x @2 L6 B
- CMP FC_Music_Max_Index
X' a2 [/ D+ K- i, r6 L0 t% { - BCS .End
5 g# ?; g6 Q1 t0 `, }3 g9 C - CLC% g( U9 W2 P1 k3 P! o6 D
- ADC #10
& d5 I4 G4 v; Z+ D, J - CMP FC_Music_Max_Index/ v. z1 n) V; X" F$ U6 E
- BCC .Next_10" p# J# ?9 ]+ F7 ` k" z3 r
- LDA FC_Music_Max_Index
" s" x9 h2 N( q j& a* ^5 N - .Next_10
2 M V- j$ k7 K+ m" K' W7 P - STA FC_Music_Index+ p9 {* A1 A) q4 I+ }
- JSR Music_Init_Process
' ~9 s+ R# O- c9 D - .End
, Y) A# k8 k, K8 E - RTS/ A2 l- T7 S1 n
/ k) O9 W# r* l, |% u- ;----------------------------------------------------------------------! [) \9 L8 H7 U* @% \; k- z3 u1 s! I/ M
- ;8位十六进制转3位十进制制: g3 O) n4 p) b
- Hex8ToDec" ^0 n/ d# x/ u/ N% H7 x! |& k
- STA FC_Dec_Data_1
( s6 f- @$ p3 @5 p1 ` - LDA #$00
8 L; d. B7 Z3 x# x$ n" [5 _ - STA FC_Dec_Data_100* Y) V8 C% P2 z6 \, y/ G
- STA FC_Dec_Data_10
9 O9 N4 U O. z) t$ y6 s3 k! U' E - LDA FC_Dec_Data_1
1 g1 D6 T; y1 v* M - .Convert_1008 x" B( b3 _1 l# [: R2 c
- CMP #100
* x& E% Q5 Y3 T( s3 G3 j - BCC .Convert_10
: a1 f$ K1 {9 ~# f8 j0 P! t$ g. Y - SEC
& n' |" N- a( |. ^0 J/ c0 h0 b - SBC #100
6 ?) y: `# ]+ H" N6 _6 @ - INC FC_Dec_Data_100
5 @; ]; A1 d# Z2 `' [: A - BNE .Convert_100/ Y- X7 ~- R0 J8 m6 I" y) ?
- .Convert_10
$ l0 r8 T R# I ]! U& W% @& P - CMP #10
8 C1 @' y$ u/ u' C: g; h - BCC .End$ q1 }4 {: E0 Z: j6 y
- SEC
, y6 i4 @* K) ]8 W; C5 ~# [ - SBC #10
. [% _ {, f# M* z - INC FC_Dec_Data_104 |( t3 H: F/ s
- BNE .Convert_10# X4 r c/ G2 L" q, k1 G! O5 |
- .End b5 D7 U6 o$ a: N9 ^& M
- STA FC_Dec_Data_10 J( \1 G$ }* O. G
- RTS* q4 u! X: u/ i' i+ e
- ) }9 F. l( s# u q5 G
- ;----------------------------------------------------------------------
! F* W |' K9 }: O4 f) \ G6 f3 O - ;显示曲目信息
- A; s# w9 |* }$ j, A2 g* x' v# L - Music_Info_Display/ E8 z$ H3 g5 i; [1 H
- LDX FC_PPU_Buf_Count7 H8 P5 q4 u# ?4 I% h; v
- LDA #PPU_WRITE_MODE_CNT_LINE3 C- ?1 Z% ~- v* c) I3 ?: e
- STA Use_PPU_Buffer,X, X+ p7 ~( X. P5 @. K& U5 L9 P
- INX
, W) r% K( t0 b1 {' Q: N# a- b8 ~ - 9 i; A B- a! P
- LDA #>MUSIC_INFO_POS
$ I& Z$ r" d" C$ T - STA Use_PPU_Buffer,X
4 {/ z$ d: c9 m8 W: { - INX
6 u) T( B4 [ v. m4 R - : _+ x. _' B0 ~. t& o; p5 E
- ;居中
- r) } a5 b ?7 o) L' e8 }; j - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2- n+ [$ y2 ]1 x
- STA Use_PPU_Buffer,X, b/ S# C* o# T
- INX
8 T2 j8 v l+ v6 \% L -
, r, S" y2 v" Q. Y K' S4 { - LDA #$05
$ r: n* W- c+ }! T1 c - STA Use_PPU_Buffer,X
( _9 a& U) Q3 I) K - INX
+ j; F$ b! C, y, \# \; z: j -
6 `3 Q& n. O4 l3 p. t0 \# {7 }- S$ U - LDA FC_Music_Index
6 Z+ Q' R3 B+ `" H) v1 X - CLC& V& e5 m; D" S7 Z! B* z- j
- ADC #$01
3 y5 w& t$ O& X9 h8 j - JSR Hex8ToDec
5 r; e P$ C+ C/ X- C - + T2 L* m1 r2 f& L
- LDA FC_Dec_Data_10
A, F8 i% Z' y o - CLC G/ ?8 C6 D: A$ ~
- ADC #'0'
9 m% \" g8 J7 e' b; x* X9 ]# y+ C - STA Use_PPU_Buffer,X& X1 i) B x7 L% C
- INX
' y' b7 Z* d# Y, g8 _ - - Q: P' V+ u: l4 ^: t
- LDA FC_Dec_Data_1' W4 ~7 D1 ]# X! _9 a& a7 v
- CLC
) X9 c* \/ w) h2 M k' k: D# t - ADC #'0'% ^! g, _4 _ G5 w! U( n
- STA Use_PPU_Buffer,X
% u( o- x/ F3 s" W' m& D4 I! B' Y - INX
" d* a" a+ _# I -
; @9 z! ^4 E; k+ E - LDA #'/'% [( a: S# M0 z8 b; z& E
- STA Use_PPU_Buffer,X
2 W/ `" d) S+ x2 a7 [4 F& c - INX
3 l8 r. h& D7 H! E3 b7 [ - 3 s) {4 `4 O W% h; H1 q! `
- LDA FC_Music_Max_Index5 [) K [* E6 V/ h, k5 h' ~$ S
- CLC& q% n5 ]9 `2 X( i# b' m* V+ s
- ADC #$01
' q" z0 P' N! ` N" n i% \ - JSR Hex8ToDec* N: c, o" K" }& F3 U1 p
-
9 n5 ^; d! S4 L5 I - LDA FC_Dec_Data_10 D7 y& |) T/ t# y' t& D4 Q
- CLC
: l! c/ a4 [- t, }+ a& } - ADC #'0'0 ]3 n0 x% L2 E1 `
- STA Use_PPU_Buffer,X+ a( _2 X; p0 K8 l
- INX3 n' i( }5 ?. i0 [9 k5 P
- ) v2 n7 r" s, N! l7 Q$ m
- LDA FC_Dec_Data_1
( R2 }5 Q$ E0 I - CLC0 S" Q+ s/ Z6 m2 e
- ADC #'0'
- z. f" S: @ p) A& P3 Q: n - STA Use_PPU_Buffer,X
% ~' X- V2 U" ^3 E$ C% a - INX
" P# ^7 {% k0 O3 \( Z -
1 A$ m* r( [* D - .End
. B w8 ?2 ?7 p - STX FC_PPU_Buf_Count1 o$ [; |4 ]! Z4 h
- RTS
8 d8 U A, M9 O( I - " d* `8 g4 ]) y% ^" S
- ;----------------------------------------------------------------------& l4 n( T+ c+ f0 u2 h$ w% y
- ;音乐曲目初始化处理
# `, n# D" h. g- f1 @2 w: _ - Music_Init_Process, p4 c9 l. A* f& k
- PHA' U8 W& ?5 p ^
- JSR Music_Clear_Process
1 f; Q+ A: ~; Q7 J k8 \ - LDA #$1F6 E9 j5 x" |! E6 L
- STA $4015
* ?0 c8 t8 k) n+ C6 ~$ v* e" Y( Y - PLA9 l$ i- N. G8 B7 ~2 _1 C
- JSR Music_Init_Addr
/ p: T1 T6 Q: j9 S0 X/ B4 M7 g+ l - JSR Music_Info_Display# R# M" }& M! t. F0 ^ B
- RTS
' P7 W9 U4 D# ~6 d# ~" B - 6 n: V# F- h; d- @
- ;----------------------------------------------------------------------- w5 r C, z6 d) _- L$ I
- ;音乐播放处理, L9 @* H. K2 E0 H8 W" N
- Music_Play_Process
4 a/ C, I6 z; r( K - JSR Music_Play_Addr9 f; d1 U- @7 `. V2 ]& d$ o( L
- RTS! C7 P1 W8 b6 b# L x
2 R; q% w, T$ p- p- ;----------------------------------------------------------------------
5 F- t7 `( v! s* k' i. @+ M/ ^ - ;音乐播放处理
" y5 Y' L6 T" I7 t0 i0 T - Music_Clear_Process6 U4 k7 A* M6 o
- .IF Music_Clear_Addr
8 t; U5 a3 g$ y1 ] - JSR Music_Clear_Addr
5 G4 B- L* }4 { C' P( o/ X2 [0 f - RTS" y" g( B" X7 r& p8 S
- .ELSE
c2 o( Z: l2 D - LDA #$1F m0 g p+ T4 v) x% F
- STA $4015
" a! i0 l w4 p- l - LDA #$00
& O& L/ p, L( A9 m - STA $4010
# j/ i' K5 u4 e0 [7 V9 l. w& V; ~. o - LDX #$00
' @( i% ?" |1 J - LDA #$00
& d$ B. R" E5 M8 S3 \7 r -
2 f' V8 M1 v. T- X% _! R* G - .Music_Clear_Zreo_Page_0
S1 h2 n5 p4 R' y. I1 j - STA $00,X
2 U3 u- u; F9 T - INX
- v: y% C; s0 \7 | - CPX #Use_Zero_Page_Begin
$ h3 ^6 j! Q, R) v - BCC .Music_Clear_Zreo_Page_03 k. N0 f3 D3 o' f- s7 |0 P6 v
-
4 k3 n0 Y0 @' D - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size5 ?# i R& U* t: ~7 Z( Q
- .Music_Clear_Zreo_Page_1
8 _& _; \6 a W+ h/ r - STA $00,X7 W# H* ? I. n A* y B* c
- INX
/ l' K5 m/ j- G - BNE .Music_Clear_Zreo_Page_1
, [0 j4 D: V4 X. u - $ C& o" l/ }9 d5 M7 L* z% k. Q. y. q
- Music_Clear_Process_1
3 x9 u. b0 I2 |8 K7 K - STA $0600,X5 d U" C! S" U: g6 M
- STA $0700,X" E3 N; l: O+ }2 G
- INX
: _5 j$ K% s& D7 R* y - BNE Music_Clear_Process_1
8 S B- N( b% g$ Q8 G - LDA #$10
5 z: w: Z3 H: U$ C* s3 W& v- Q - STA $4000# M, N# h) t. B. w6 Y" C- F+ ~
- STA $4004
) l/ H0 y( A: @0 g" F3 K0 ^ - STA $400C6 S) b. {$ w8 }
- LDA #$003 S, _' ^0 U7 u
- STA $40081 ?0 d% z: Y. I! s E, f3 Y" U
- LDA #$0F
3 j8 \1 w9 C, _ - STA $4015
) C0 N6 c9 I f4 q0 S: d - .ENDIF5 j/ _, s' [$ x4 _5 @" Y
- $ v+ y& G9 G, [+ A
- RTS; r3 q7 X0 ?0 h' z/ X& s
- 7 w9 k& J2 B5 n$ L% h+ J' j
- ;======================================================================3 |; ~: P, s$ X' U; } K* S
- ;重启处理6 R+ N+ I( v- H# r l
- Reset_Program6 M4 p$ e' [- ~' W @ d
- SEI
( x$ Z5 m p6 Q; b/ _, [8 a - CLD4 z( R5 I7 u. B5 }! [$ B% O/ Z
- LDA #$00
0 j0 m6 H, V0 p" D - STA PPU_CTRL U# a9 }! I+ T. E6 }# b
- STA PPU_MASK
4 Y7 A0 p7 t: i$ q8 F - STA JOY2_FRAME# _, W& ^3 n& {) y
- STA APU_STATUS
; C; t$ m9 v" G' e& J) t8 f \ z. f- o - e" c+ P+ v. [2 Y, M- i
- ;等待屏幕准备完毕! c+ R, r8 v8 \0 m: p0 i0 n
- LDX #$02
2 u6 A9 g) [' p* d' l1 o - .Wait_For_Screen_Ready
4 ?& Q! L- o3 K: R - LDA PPU_STATUS
. d$ E9 g2 ?3 k. u: X- ] - BPL .Wait_For_Screen_Ready
# U- j! v" d, \. u; k6 |* W7 Y - DEX
: ?! h6 ]7 E' Q& X! y - BNE .Wait_For_Screen_Ready
; m" H- h; }5 E7 |0 c0 p) B - # c, }/ _* ^: Y0 G* r' u
- ;清空调色板
! ]6 M( u; f1 Q; g% a - Palette_Clear
$ F8 `, O2 ?* y$ a9 U4 [ - LDA #$3F5 y- F* I: G& \# l- t0 I6 t' _
- STA PPU_ADDRESS6 U# D9 r( _* M1 v: O
- LDA #$00
8 ^7 U# i7 r4 ^ - STA PPU_ADDRESS
) k+ y z* t6 j, m7 y- i$ k. l - LDX #$20' p8 T* [) {7 H. O$ S1 k; T
- LDA #$0F
% e8 Y, z6 X$ D8 @2 |4 I - .Write_Data
( s& I( q1 w; X% m7 X - STA PPU_DATA
, A" G9 ^0 Q+ u - DEX
, ^8 d$ k) i( ~# `: r3 a5 C9 d; W% d - BNE .Write_Data
; u- p4 T6 X& J% ` - 1 @- u; S# z& [" l4 P; ~$ p
- ;清除声音 $4000-4013: x& j9 a" a1 P( Q$ [ g; Q
- LDY #$14
. L3 z. M9 \) |: x+ Y j3 u - LDX #$00
5 @" t6 |' Z. [9 x - .Sound_Clear2 g0 I& k8 a5 `" u
- STA $4000,X
c$ I3 ~: G1 E% D - INX' x2 v# S8 d4 K7 C* Z6 \& x% T- \, ]# F
- DEY
7 ~5 l: L" ^, Z; m# I - BNE .Sound_Clear T/ B7 N+ G3 Q* m9 j8 X! _
-
/ U: v1 V3 L+ [% g% W- j: l: |) | - ;清除 RAM $0000-07FF& T4 z+ P# |5 M5 L
- LDA #$00
U. t, l3 O+ q- [* S6 g6 C - STA $00
9 |4 R, d% N3 R5 v) C. P - STA $013 L) `9 n, T: d* `4 o
- TAY
' o" ^7 J/ K( n& N. l - LDX #$08) C2 u/ @; w" h6 M' U( u. f% [
- .Memory_Clear
) K9 _+ F# o1 Q: B$ Z+ G6 L" h - STA [$00],Y6 R$ _- O+ m4 v2 n/ m( N
- INY
: x4 ]8 @7 Q: o - BNE .Memory_Clear6 o* w8 Q) V' e- \- S* _
- INC $01) n( z- \1 _* ?& ^% [2 y
- DEX* M8 _ S; x1 G8 A, `' i" }) O
- BNE .Memory_Clear
, u. Q+ [7 O$ n# s; d | -
# g0 J1 `$ A8 W - ;精灵缓冲初始化# V& I3 l8 w6 j8 s
- LDX #$00; a% d2 w5 ]$ u7 G. x
- LDA #$F8
( k" ~! w; d+ R H - .OAM_Clear( K* X/ M! l2 B3 ^
- STA OAM_DMA_Buffer,X+ o/ N: {- J5 ? g9 `8 Y' b/ d
- INX' B2 k% `( V y" F8 Q
- BNE .OAM_Clear
- J+ c3 ]! r. ^; u' {- s -
" M4 p" M) K- ?( X* g" [ - ;栈指针初始化: \6 b: m" q$ q/ j
- LDX #$FF
2 K7 r/ |, y% ]3 p. v$ ? - TXS' a6 j1 Y3 w& Q' u" ^+ |
- $ s5 j) J7 y9 u) V
- JSR Nametable_Clear;命名表清空! g2 v1 g& f) Q8 B5 c# j0 Z( ]
- JSR Palette_Init;初始化调色板缓冲1 e7 }% S. K- O9 O0 J% h6 a, b
- JSR Static_Text_Init;初始化静态文本
$ Q9 ^/ N2 K* U# U% S a4 V. o - " c o4 W3 [' c
- LDA #MUSIC_ITEM_TOTAL - 14 k" M2 x( K9 n6 _) I1 ?# u b+ P; r
- STA FC_Music_Max_Index) c+ z p7 _% A, B1 ^5 ?* c1 l
- + i! p. W! h( t
- LDA #$1F q0 n' |5 g5 }4 z4 k1 H
- STA APU_STATUS# f+ `7 a, a$ g6 |( O, E
- LDA #MUSIC_BGM - 16 s) A4 L" t! r6 B0 a) p! G
- STA FC_Music_Index! P( Q$ ], P+ c
- JSR Music_Init_Process;音乐播放
4 Q2 Q: n9 Q: j+ t - ( F1 O: C0 u, W! D/ E
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
. K+ d( r4 a& [2 C) f& [4 `9 A - LDA #$1E3 v) D% C* I: |4 q5 q
- STA FC_PPU_Mask_Buf
2 F9 c. [! \/ _: F% Q -
4 o g3 Q* }/ u4 D( ~9 U" Q# Z' r - ;启用NMI处理0 z; H. p- g0 i% N3 u w' R* j
- LDA #$80
7 y+ s+ e/ ^4 w5 f - STA PPU_CTRL
2 ?: a5 q" h+ C# D - 1 q0 y* s2 V# {0 j- R# k; e. |$ Q
- ;程序循环, 剩余工作交给 NMI 中断处理
2 d& K4 d: `, W0 ?% w+ ~ - .Loop* y6 u, _0 _2 W" _, O7 d7 ]
- JMP .Loop! R; J+ Y6 P- p! J# {
- % Q: ?2 K5 T7 o4 D0 w
- ;======================================================================2 P, d+ x' w1 a8 H. }& m! j
- ;不可屏蔽中断处理6 b3 e1 f* r8 j# `3 w
- Nmi_Program' n+ x+ M5 l- h) d( r+ ?
- PHA
# I7 ~" |7 i; N- U! ~, V - TXA; s) e4 a+ ]6 T' m ^$ e
- PHA
! }! l1 q. ~7 P/ W - TYA
6 P, E3 U1 n. s" u - PHA6 F* ` w4 W1 x+ f5 }, z& s
- : D# _ i; b" J5 }" N
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位* s' U% C+ R% N& m7 `6 C; q
- " t" q; _9 {6 y6 f: u' w& }) k
- JSR FC_PPU_Procrss;PPU处理
1 v/ e( t* g, \" P2 h - ' p( k( ~7 w6 B7 p
- ;精灵内存更新
& y$ V& V# ?* }) Q! R2 @& m2 Q1 G. B - LDA #$00/ Q# l: }3 [7 {1 J6 s0 F+ y- s, D
- STA PPU_OAM_ADDR
8 O. a5 q; ^$ C" H% E( v. n8 z - LDA #OAM_DMA_Buffer / $0100
1 S0 J( h& p8 t% G7 T% t - STA OAM_DMA1 Z3 e6 q6 Y" k5 P
- ) T! m7 }8 ` G$ J
- JSR FC_Gamepad_Process;手柄输入处理$ M$ K/ C" }! K' Z4 K) }* C1 N
- JSR Music_Select_Process;音乐选曲处理
0 G, h4 E. h: b1 U( c4 L$ P/ t - JSR Music_Play_Process;音乐播放处理
% @" u; P0 _& g+ Y - + T$ K7 h( f5 Q+ C& O
- PLA2 ?* W! D, L4 y2 H
- TAY
: H. I+ m. q; F- _; F5 } - PLA0 ^$ O/ S/ |# n/ M. s# |( k
- TAX6 b$ S! i5 S' I
- PLA) D E1 k1 m( V. J/ j2 ^+ j' {
* I/ e3 }. `/ k, M3 z' i$ Q/ h- RTI
# R6 U. y' P" }6 C5 S# l* _* ^ - $ w1 i/ I- i3 O; l4 _: w
- ;======================================================================3 \$ f$ }, S2 N
- ;请求中断处理$ w, |. L- e; c# P
- Irq_Program
; F% I- V- Z+ F; }: O - RTI
7 h7 w" P4 G, b, z; i4 M I - / k1 s' v" {6 ]
- ;======================================================================- n. I* _ N: W: w, s
- ;中断向量表+ I# f, @% X0 I+ l
- .ORG $FFFA1 o% R8 ]" m8 w% T) b3 w
- .DW Nmi_Program ;NMI触发时执行( l/ h7 F) l; G- {1 X6 v! D, ?
- .DW Reset_Program ;载入ROM时最先执行
1 p( t2 b0 X8 T4 H - .DW Irq_Program ;IRQ触发时执行/ O# z8 b) d: \ f' `' i. G. O+ @
复制代码
$ a5 \# @% j/ _( d
1 E2 ?( w$ Z& t0 t
1 X8 A1 c8 W/ i( F5 r4 w! Ihttps://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|