|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下4 \1 I' Y; Q% y' O7 s% q
# B" \( Y- k; h$ i+ a# R
以下是主框架代码:5 K0 O. I1 u) q
- ;======================================================================
t* j; K* x7 T, m4 W - ;文件头% O) ]$ k2 j' g6 M7 Z0 Q3 |
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
, y0 r9 _" |0 J; Y3 r K4 \ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量. Y8 ?9 w8 J9 W( E7 p+ d1 u$ t; F& U
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
1 i3 `" G8 u6 R% @ - ;====================================================================== e$ v% g9 D9 T) |% I
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
9 t' w6 c* m/ ?$ M6 K: p - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1# p' q" p- s, ~
- ;======================================================================
# [6 ^/ a& ~6 @2 v! ~2 _ - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
2 N) k$ T0 k" C" X- n# Q/ r - RESET_ADDR = $E000 ;主程序起始地址
: O. R. B8 G, C! G) m - ;======================================================================
( y7 h* x0 W! \8 ? - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
) l( ^. h3 P/ g( f3 B- c - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
- h# ?( a) J0 I, _* \- {. e - .INESMAP 4 ;Mapper号 (0-4095)% L; U+ R ]. b( I/ \0 f# ^; [
- .INESSUBMAP 0 ;子Mapper号 (0-15)9 q) g6 G. [8 P- t2 y# d
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
% u- Y. j9 s$ Y( |& v2 [, `% ] - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ a, j' m7 r- P# F, O1 B8 I; k5 p
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' w$ r+ M9 S4 ]% U+ Q5 J! L+ L# |
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
& A% g2 D2 p; j6 D. D4 ^, s - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
# Z" Z8 n6 G }% ?% S, ~ - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
% \% @. w3 h U2 V% D - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
- W8 t4 K+ }/ s4 V - ;======================================================================
+ r% J/ k! ]. X. q$ K# g, b: X' f - .INCLUDE "fc_demo_config.asm" ;全局配置1 e! A+ P0 p( k# N3 |
- .INCLUDE "fc_demo_constant.asm" ;NES常量
6 `3 A5 F2 p$ u5 D0 o6 R, L - ;======================================================================! c' s' V' M0 A: x) z$ c) Q
- ;音乐配置. H, o& I w6 ?" j' R
- .IF 0 = MUSIC_THEME 1 ]) `7 J' `5 v2 {2 Y1 l. H6 Y
- .INCLUDE "data/music/Gremlin 2/config.asm"
/ Y/ D+ ]. D6 J) |( q* J - .ENDIF C) K+ l @# S7 ?9 k5 d0 Z$ }% _
-
8 G Q, F/ z* ^8 g - .IF 1 = MUSIC_THEME- C- S- V. Q3 k0 y# B8 M
- .INCLUDE "data/music/Raf World/config.asm"
0 i# U+ z4 l* ?1 F) S: o& {, A# } - .ENDIF
; N/ q4 ` S7 J- `" `( j -
* p) U( u& @! L% K - .IF 2 = MUSIC_THEME ) e, E: v1 M. r, S# A7 ]1 X
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm" V+ z r+ L* l8 r* p( M( U5 {
- .ENDIF
. D: a. G( k9 l) t
" S; E9 w: Y6 \. w- ;======================================================================- ?0 F- w9 N0 X" f
- ;引用CHR图像数据
: I8 G6 H. w# ] - .BANK NES_16KB_PRG_SIZE * 2
7 K9 k( N1 x% l2 M1 ~ - .ORG $0000
& V" L0 V0 ?6 S% M& m. s. V - .INCBIN "data/bkg.chr"& t9 Q. _: d8 G+ s* B
- .INCBIN "data/sp.chr". Z* J8 k, N" x
- + @8 M/ w: j) B4 E9 \. Q- ~6 D$ A6 a" G
- ;======================================================================4 }) F1 t, m& z* }
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" r5 `8 y; \5 ^7 U% k" F6 n
- .ORG RESET_ADDR
7 Q- e% \) G" E; q3 a - ;======================================================================
' {; u/ e6 _7 R& c - ;引用其他源文件/ a n; A# k$ `8 S5 s
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
& w! v% M0 d& J. |+ V% v. h - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
; k8 z! H4 g4 d l/ D3 l; G - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
5 F" M& s8 Q f& O7 \0 H$ g$ T. W - ;======================================================================, E* A+ r. x7 G( P- w
, @7 s/ d8 k0 p& u4 j- U2 t: G( U- ;======================================================================, p( H5 J7 a* t
- ;等待VBlank到来% `3 |2 y% n' ~9 z% y8 ^, X! Y
- Wait_For_VBlank
& u& r6 {- |/ g! F/ u3 Y - LDA PPU_STATUS
D: ~" U6 \* i; A1 i& ]/ P% D6 z - BPL Wait_For_VBlank
) |5 R* ^4 x9 P# y# m; H/ \ - RTS" A7 ?0 q' \/ m
* h( X. j0 b0 P- ;======================================================================6 C/ u; }0 P) r" N* b% N
- ;调色板初始化1 j: C; h: F/ q
- Palette_Init7 r" x7 B/ \) [
- LDA #$3F
^+ U' o$ ~ i% M4 Q w! w - STA PPU_ADDRESS y7 G$ E+ w h, R
- LDA #$00/ f" t) Q3 Q+ F9 L% K, P
- STA PPU_ADDRESS
! h& {& k8 q5 h - LDX #$00
1 M& t" S1 {4 Q8 P0 z - LDY #$209 ?8 [/ S" ?# h. n$ r' A. a7 y# s
- .Write_Data
3 R' k" j3 }4 B3 o# F# D - LDA Palette_Data,X
3 q/ z6 p) ~; |: j5 N& G2 Z2 A - STA FC_PPU_Pal_Addr,X, B5 p! z/ O$ Z/ o7 M8 h8 }/ T$ p
- INX
$ D; A2 ]5 @, w$ T! E - DEY
/ t8 S& R/ W& i) J! M! j9 \ - BNE .Write_Data
0 [! D g3 k2 u1 }5 @ - .End$ w# F0 u% s) ?1 q) d: J+ X
- RTS
8 r% Z% p0 p% t. ` - 8 y/ O/ o4 @/ l9 i, h! g' Q* \9 m
- ;----------------------------------------
2 d4 ^ H7 a5 m) s1 Q, S& H8 i, H - ;调色板数据
- M7 q7 M ~+ t" U) k - Palette_Data8 F: u0 h9 m" V5 _6 i) F( w
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
' V: Z5 u7 L$ @3 [) _2 w7 I - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22. @) ?$ h3 O! |- |2 g7 ?
-
6 D/ w! y$ Q' d( S - ;======================================================================
' o/ ]+ Q; k0 I/ [5 `' s P' | - ;命名表清空2 S2 m0 ?( w( n. @6 e4 W
- Nametable_Clear
/ y/ z* P Z, L - LDA #$204 l( q; l/ R0 |
- STA PPU_ADDRESS# @, }; W0 s4 {" r
- LDA #$002 ?* b/ K; ?* M& C
- STA PPU_ADDRESS9 d+ Z0 y( j# [3 J- M% T0 m( v
- LDA #$00
5 ?' F! a; W! X Y c - LDX #$00) R0 X, x! y ]- Q9 ~ R5 Y" H
- LDY #$08$ C; y5 X9 O& J, t$ D
- .Write_Data1 x5 y2 C \0 {3 j2 n7 y
- STA PPU_DATA
) S! A+ ]$ b+ `, i% i6 l0 u0 y - INX) s. f9 t+ q8 H, X: O
- BNE .Write_Data
& V% r7 H+ I; r; T0 m - DEY1 J, b! G2 B- Y% g4 g9 a
- BNE .Write_Data4 B0 A" X3 x! B7 e
- .End: R/ e. j+ ^/ E% o* B9 `
- RTS
- y0 u/ k% z/ u; ] d9 n - , b) S( @/ n. A
- ;======================================================================
/ l( n! ^1 N3 K* e$ Q. c- { - ;音乐曲目切换
+ T3 j5 v" [3 y( u6 O2 f# X - Music_Select_Process3 k' T( b, z! o8 w) K
- & Q) \3 Z0 F% i2 a3 v# o4 i& w
- .Pre_Music;上一曲" K$ M# s% A* h8 D1 w o$ X
- LDA FC_Gamepad_Once
; k0 |* H; v# {) F8 Q3 r - CMP #JOY_KEY_LEFT& Z: R8 J- N4 P5 Z, `4 N
- BNE .Next_Music4 y' Y& u2 i4 Y0 C
- JSR Music_Play_Pre
9 ]" n: T5 h6 ]0 R - .Next_Music;下一曲$ y" R2 d8 ^3 u& Z
- LDA FC_Gamepad_Once
" _6 w' b/ P, B4 i) o! t) s/ ^ - CMP #JOY_KEY_RIGHT! k9 x' R2 C( N3 O: v2 q, }. M
- BNE .Next_10_Music
1 K1 |( _* K. Y+ M" ^ - JSR Music_Play_Next- V% Y7 L, K! P8 y- A: b, ?; K
- .Next_10_Music;上10曲
% i$ S( L5 P m2 m: S; W% F - LDA FC_Gamepad_Once
& ~* m8 G% _5 Q5 x" M+ h - CMP #JOY_KEY_UP$ R2 c2 n2 P9 w0 r' v9 O
- BNE .Pre_10_Music
Z$ z4 X4 y0 O* L, Y - JSR Music_Play_Next_105 I9 y1 ^# c" F5 z2 v& }) ~& d: F
- .Pre_10_Music;下10曲9 f1 ^2 M( m/ D6 S4 p2 c
- LDA FC_Gamepad_Once6 D+ z/ o$ Z* M0 T" A# V
- CMP #JOY_KEY_DOWN
" u$ I) p3 d4 I: k( b X% Q% ^: u/ p9 S - BNE .Reset
$ r; ?: |' v% E - JSR Music_Play_Pre_10
( W3 W" W! p5 g; M9 O - .Reset;重播当前曲目
% U! z) [: Z% j - LDA FC_Gamepad_Once3 ~! z8 H; g3 c$ I; |* R' N
- CMP #JOY_KEY_START1 E t( I3 N+ L- s+ g# {# O
- BNE .End
7 g! W" D, J) ~# K- P* S - LDA FC_Music_Index- i" A& B% R$ E
- JSR Music_Init_Process6 p6 c3 w' f; n6 G4 A7 D. _
- .End
& z* V6 |+ ^! d- N* i' x - RTS6 {" k6 x2 _) N n
; R) s6 `: w0 N |" l- ;----------------------------------------------------------------------
|! y0 s3 v1 }" [3 W& f9 ? - ;播放上一曲
1 B+ s) h2 [9 R, K& [. ^: J - Music_Play_Pre% y3 B6 @1 j! [
- LDA FC_Music_Index
2 C1 ?/ C: o$ G A: L. V& e9 [- h6 R - BEQ .End
' q3 \+ Q1 P4 x G - DEC FC_Music_Index
. [/ t: q0 Q" I0 Y! l" W+ s! Z+ \5 A - LDA FC_Music_Index9 m V3 [- W) ~; C
- JSR Music_Init_Process
! r: l$ `- z" \" O p+ v4 f - .End
. f" i8 [) A: b - RTS
4 ?# a/ m. ?! d# \( G9 r" c6 P6 x - ;----------------------------------------------------------------------
) l7 r1 N! B5 v( ]3 ~" z - ;播放下一曲
& f6 U1 _- d+ O) ^* t - Music_Play_Next0 v- O% t1 }6 w( q5 M- j; o$ \
- LDA FC_Music_Index0 I9 K3 N9 F# t4 B/ U* F r, M/ K
- CMP FC_Music_Max_Index5 K2 p" {* ], B) m) I, @
- BCS .End: \9 K3 o2 N5 A! G7 ~% _
- INC FC_Music_Index4 \# E. J3 s/ f
- LDA FC_Music_Index
: O2 L- P; O9 M8 B8 O4 C - JSR Music_Init_Process
7 u8 M6 V( F, b+ {( }( R5 G - .End3 F9 J O" s2 e, D0 y
- RTS
7 w3 U" U: T6 G7 j. T! U6 v% d1 Y
& a0 v2 {$ o3 Y* N9 v- ;----------------------------------------------------------------------, J) ]1 S3 D# W4 a( P
- ;播放上10曲; X3 u5 r2 {. R3 S$ q5 w
- Music_Play_Pre_10
3 `# @% r( w0 F- \ - LDA FC_Music_Index( \% u! M1 x; a+ c
- BEQ .End
; k/ Z* N3 y' R7 ~ - SEC
& c# j# S# S! P! w& S) R. t0 f - SBC #10
) I7 w# R1 H+ F3 m! s - BCS .Pre_10
% N0 `& ?% O! ?; e2 S - LDA #$00
, z% B, M7 D6 x% D; w" k# g - .Pre_10
$ g q G. C1 T - STA FC_Music_Index# d4 f/ t* S1 H' `; d7 I2 ?
- JSR Music_Init_Process& w7 S% G# F3 P6 n
- .End
( Z/ \/ t# B' z - RTS
% b& [* u: k/ ] - ;----------------------------------------------------------------------9 [9 V7 l4 h7 h# z& n* v
- ;播放下10曲8 Y3 K# F: q4 J. p% g
- Music_Play_Next_10, g6 S9 H% M$ U( C5 O% w) ^
- LDA FC_Music_Index# ?( U& _( l5 {* i% y) u, D
- CMP FC_Music_Max_Index
, e$ C( m- {& V4 L3 P h - BCS .End! k, d. k* J O3 m% {
- CLC$ e$ ~% ~0 g$ [( R
- ADC #10, s4 ?7 }* a5 S( s
- CMP FC_Music_Max_Index7 g" T" O! a- z2 S, o+ U
- BCC .Next_107 p! T/ s6 K- _, ~" c& P; e. u0 t! z
- LDA FC_Music_Max_Index
; \" _, Z5 j" S+ L# Q0 m% g- |# [ - .Next_10
- e( o# [' ?% ^! r/ i, D - STA FC_Music_Index
4 q5 y1 G! i: Z( ]& G$ z - JSR Music_Init_Process
& Z* `8 ^5 {7 b q - .End
+ r& [% z6 d/ G' r9 {% ~% v, L - RTS( A. ` `" \; L. E3 b! ?
- ) Y$ P" a/ ~* q# F. \, _ z: J( Q
- ;----------------------------------------------------------------------
]7 @, \- n% S1 i+ O - ;8位十六进制转3位十进制制
0 j' m% i7 t$ i6 U, S1 c) n - Hex8ToDec$ I. b. l. E+ F" t5 H! e
- STA FC_Dec_Data_1" G% {. ^8 v% H- M8 T6 h- o! o" o
- LDA #$00
5 U9 g3 S. [# z7 s - STA FC_Dec_Data_1009 w8 J) j! ?% d, I2 A* V
- STA FC_Dec_Data_106 Q6 w8 F/ x( x) p3 @
- LDA FC_Dec_Data_1
8 K% [' m2 q. x2 I# W - .Convert_100( B; B) c/ |; _, g5 S( ?2 J1 a
- CMP #100* f' R1 K7 R! b" Y! }0 [
- BCC .Convert_10! W9 }% h7 _* S. n/ B2 Q, Y
- SEC! X# D5 ~* `5 v6 M
- SBC #100# `9 S2 t; A8 q z7 W T
- INC FC_Dec_Data_100
* P1 A b8 F& h' ^ - BNE .Convert_100
) {- A3 Y! G5 s: l/ o' z - .Convert_10' S' ~" C. t$ g8 J5 r0 C
- CMP #10$ Z: L5 H7 ~. [( L: _+ q7 z
- BCC .End4 T( p; Y2 s% X0 a$ `* M
- SEC
. Z$ @% G% f. q3 S6 g - SBC #10
. x+ h' E3 G4 Y& F+ N - INC FC_Dec_Data_10
* \9 W3 h7 d5 M, {* l% r/ N- P - BNE .Convert_100 O6 Z8 v: W& m$ P, E
- .End
& o) e0 \3 E4 i2 M7 o0 i, K) v - STA FC_Dec_Data_1% f# S! }8 O( ^
- RTS
! q7 t( Q! ]- `6 K k. r' d% y - 0 D5 F( [! W2 @8 n' Q
- ;----------------------------------------------------------------------
. e" Q- L/ ] N v - ;显示曲目信息
" @& [1 S& c+ S" r) M, x. d - Music_Info_Display
6 Y% H/ n5 q) }$ O - LDX FC_PPU_Buf_Count
^+ Y% y' t$ G$ h; I% c2 `" f' e - LDA #PPU_WRITE_MODE_CNT_LINE
+ ]* b/ z0 b" Z0 p: M - STA Use_PPU_Buffer,X
4 o+ ?, w& M, k: v7 J - INX
* T% w2 b5 t, G8 w% h8 U - 1 Z/ ^* Y) ^2 m1 t/ R6 H
- LDA #>MUSIC_INFO_POS
+ Q. d- b' M, B d! R - STA Use_PPU_Buffer,X
# C+ I O7 U" |" l8 K* N - INX2 x6 e W( Z7 w: L2 [/ C7 g7 T6 W
- 6 ?9 w0 M" Z/ D. ~
- ;居中
3 ]# \" V9 b6 y N( d - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
' ^% D K' [; u% @ - STA Use_PPU_Buffer,X* s2 {7 P' k' A3 i9 p; ?
- INX
0 y* y. l* P* ^4 C# J# c -
4 [# d9 ?/ P% T - LDA #$05
+ A- R# p1 C# d/ D6 d9 T, w - STA Use_PPU_Buffer,X
; H3 b, N0 L* O8 l9 w& T# @# I - INX! y: ?# f0 e' J' N N& \
- 9 h: y8 i- t5 H
- LDA FC_Music_Index2 K/ n7 e6 U# B! o% ?/ R: l
- CLC
. x0 w, T8 n6 G3 m. @% v - ADC #$01
7 {' ]+ y8 V, G. ^- C' S - JSR Hex8ToDec
; V3 T4 k/ }* q7 J M P" A -
: F; A! p+ l5 |8 S7 y' \ - LDA FC_Dec_Data_10
6 d3 X7 R: u# k: Z- v+ c - CLC/ v9 J6 H' l( j* Y4 Q
- ADC #'0'/ d* d9 H9 q) V2 z. f5 a0 N! A# r
- STA Use_PPU_Buffer,X
$ Y* |% z; D' m" F/ \6 G& v F - INX2 C" j O5 D. {
- 5 E( w5 A6 \/ G1 u* ^+ R( x( ?3 P
- LDA FC_Dec_Data_1' T2 V( l1 ?% C7 C
- CLC" S: t" j2 ]1 Z1 v* u
- ADC #'0'; T) n. c6 E& D5 \ I" i
- STA Use_PPU_Buffer,X/ a% J3 e9 |& r( Q6 T) |' v* _
- INX% \: A1 b3 h. D3 A$ c5 |8 S& @% t
- ! J8 U# x' ^) a z' x6 }" h
- LDA #'/'/ c3 D9 f% C: ]* K$ _2 }
- STA Use_PPU_Buffer,X
3 b% ^; ?* f$ r: T - INX7 ?' E/ ~+ e' N4 q. o# ^7 p
-
4 E; j" I2 Z3 Y7 E0 x( d: n5 S0 m2 p - LDA FC_Music_Max_Index8 M' o/ y. q& \$ u
- CLC& J6 ]& h% x( B! \0 i l3 E
- ADC #$01
+ E ]5 i' l8 y$ s7 S8 x - JSR Hex8ToDec% Z' Y# `& k. ]2 g/ G. ^
-
$ h' N7 K, S9 B% b' D3 P3 q- C - LDA FC_Dec_Data_10
3 Y1 }( a! [$ s4 R - CLC
) k8 X8 J" E+ h! A# w - ADC #'0'
7 e7 m1 a- n7 f4 D" { - STA Use_PPU_Buffer,X
, P0 X, a @5 S" _# k1 c, m( s - INX
! n7 m# x3 z/ [% U" t% s -
* y( |9 X4 ?; W; E - LDA FC_Dec_Data_15 Z4 b9 e' |0 }# S, m2 N, ]* j# P
- CLC2 l; e2 P' A3 |. h& J, h/ @1 e
- ADC #'0'
% z7 ^! a4 ~2 k0 W% j! ` - STA Use_PPU_Buffer,X# y: O P+ Z" g. j
- INX
1 {7 A. f1 b; L2 M# q& ~& W - & }4 m# W& h6 e% u9 y+ G; H1 w: |
- .End. m v' d- B0 T/ v) f. B2 X
- STX FC_PPU_Buf_Count- C3 p! i( e5 |3 y: G2 n# @5 t
- RTS
y" ~# }9 Q/ t3 D - 7 x/ A5 K: s0 {9 v- |. d. W
- ;----------------------------------------------------------------------
8 S! ?& r7 |2 Z) S- h! { - ;音乐曲目初始化处理
& H$ _4 c" R+ d, z; C+ | - Music_Init_Process
4 ]+ ]4 G, F* g, { - PHA6 X/ C5 M: C0 r& I; y9 }' x
- JSR Music_Clear_Process
) J$ r. R0 b4 N- d7 x- ? - LDA #$1F
$ u3 Z8 V, R! j, M - STA $4015" G* P2 F8 k$ t7 P* h
- PLA
8 s- I& z& S# |2 R) J - JSR Music_Init_Addr
/ S+ q5 P& N, ]: x$ J, ^ - JSR Music_Info_Display
; I' R, R/ o( _ - RTS
6 D) a$ a/ x @6 { - 6 w# [& N" o( w1 q8 }! K
- ;----------------------------------------------------------------------3 w6 C& ~. q5 g4 z! _
- ;音乐播放处理6 ]$ T# k0 R3 Q( [
- Music_Play_Process6 h# l; s* B3 U' p+ R" A& k5 Y- \
- JSR Music_Play_Addr
" s$ g* \" u- D' Z, J7 ^% P - RTS
0 b. k* }% |! q& c5 N; c: P3 E: d - 7 D. k) K* ^4 R
- ;----------------------------------------------------------------------9 G. I8 ?+ Y) z4 z
- ;音乐播放处理$ M5 G$ H# ~: @3 _; w- \" h) u
- Music_Clear_Process
) F' p. A% |9 C+ ?' N7 Z% Q4 \/ N - .IF Music_Clear_Addr; k7 u; U% f0 {8 l, \
- JSR Music_Clear_Addr
8 ^' a# H: W6 u( U. c) d& o+ v. c% _ - RTS
5 n2 L, L; U, p; b- B" H$ b - .ELSE
/ A, `' n% I6 L4 [# w - LDA #$1F
9 }3 e1 N5 \9 q4 b - STA $4015; _& B' \8 E+ }, ?1 H+ Y2 e. J
- LDA #$00
0 m4 @0 n- I: R - STA $4010/ ^9 \: _2 _( u; `5 K* X2 l
- LDX #$00
' Z9 c6 y1 w* q0 `1 \# @/ U" I+ @ - LDA #$00; g# ?' g4 k% k L
- # D1 a L5 \: }' t3 v
- .Music_Clear_Zreo_Page_0
! M- \# G* N8 [+ G6 Q. j - STA $00,X8 W. {3 Z/ S' z: B' j
- INX
; S9 N' H9 m, `0 F, ?. N7 _ - CPX #Use_Zero_Page_Begin
3 P5 |' f1 v! V) A, | - BCC .Music_Clear_Zreo_Page_01 J& V$ k! g6 `
-
+ h% s$ F H' G8 D9 d. j - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size" W+ Q4 x; d/ n& L; M* D! u P! \
- .Music_Clear_Zreo_Page_1
% D6 h: s6 r8 M w0 v - STA $00,X w- b: N+ a7 t8 ], R3 n
- INX5 T" E# U- Z& F1 @3 j3 c, l0 x+ ]5 ?
- BNE .Music_Clear_Zreo_Page_1
- c4 v$ e4 G! J- R2 v6 d1 { -
- A$ o9 L* }6 r1 i: c' y/ N - Music_Clear_Process_1% H# P0 W1 {- W& U
- STA $0600,X2 U' a4 A* n" \! g- z
- STA $0700,X
: \! C$ E6 h6 E; N, M- p: `: M- p - INX, F0 p- u/ c( U% Q3 Z
- BNE Music_Clear_Process_1
" Z) ~6 o8 F$ W. t9 U - LDA #$10
' B3 f% ~& Y7 w' H3 | - STA $4000
d; `( l, b* S2 H' n* |/ i - STA $4004) }6 o3 y" T5 s5 H O! k# g
- STA $400C
) M. E3 J" Z8 k - LDA #$00
8 S4 Z% U( S' m, g* V( I" T; _ - STA $4008 A* d9 X7 z) Q% u
- LDA #$0F; e# Q9 ?' }5 O8 v2 Y' q
- STA $4015
" r* D. b& A+ k8 W( F8 l5 F& O F - .ENDIF
$ v: U! y; R4 Y% c - 9 q6 ]) N/ a* b
- RTS
7 g6 q% F5 N* ~ - ' u( w; x/ G( i; h$ U3 b5 `8 B
- ;======================================================================3 o5 V( c5 n7 j( [0 x- ]2 {
- ;重启处理
/ s! B* @6 s7 [. m9 P* [0 @ - Reset_Program
' V H& p0 ~0 z: [* x - SEI7 S1 Q: p9 _5 o" N5 L0 u5 Y& u
- CLD, o+ F* y& \) g' X k/ R9 L( [
- LDA #$00
+ c( z5 E8 a# c - STA PPU_CTRL
* B {4 v+ Y% |2 |: { - STA PPU_MASK' W% d9 j$ S2 a* F! a4 j2 x
- STA JOY2_FRAME$ J9 |& N+ i! h5 Z: m0 L& _
- STA APU_STATUS
: S, A2 c& S) ] -
. |3 E" t4 R, h4 k - ;等待屏幕准备完毕
+ X" [0 L& Q: o, C - LDX #$02
c1 S: ]$ `) M" R: z' H# i - .Wait_For_Screen_Ready4 U) w8 L/ Q5 w' z
- LDA PPU_STATUS
$ `4 H7 f4 N# F, w6 ?; _9 _ - BPL .Wait_For_Screen_Ready
& u$ k+ t8 g/ p" ~: v; ` - DEX
& E* q/ w2 f% j: T$ U' H& F1 a3 t - BNE .Wait_For_Screen_Ready
9 K- l6 B3 Z& o5 D1 K -
* ~5 e: {7 L2 I% V% s - ;清空调色板: K0 y6 a. l2 V$ C: E8 \' T
- Palette_Clear: v- b- q H% u" f" |$ L
- LDA #$3F
: M. _5 G0 L. a8 x$ ^2 d - STA PPU_ADDRESS7 I4 Z/ R Q9 Q4 I, Z" P- F
- LDA #$00
; {. l( S- c! Q2 K - STA PPU_ADDRESS8 v: _, d& F3 W9 o: U
- LDX #$20) w! ?! y6 [: J
- LDA #$0F; [6 D8 l6 H% \
- .Write_Data4 B3 S) p ~ q8 X: p
- STA PPU_DATA0 ?# G! }. R' J8 g8 s& O9 a
- DEX% Z- m! ?4 x7 J( k a: C
- BNE .Write_Data
6 C( ^4 D' D$ A% b r+ J6 Q
- s" |4 ], j" u, O( C, [) B. J- ;清除声音 $4000-4013/ I, k* ~8 n7 a$ p+ _2 L
- LDY #$14
+ n8 l6 \- G: K6 _) V R - LDX #$005 C7 j- z7 q" ~& M- D. C& U
- .Sound_Clear2 X/ T3 L+ d" G. j; m
- STA $4000,X, x" }4 }8 V+ {! @7 e( g
- INX* ~9 K \2 {0 o% N+ V
- DEY8 t: d6 L6 Q' r
- BNE .Sound_Clear
* N, I. A9 H$ g3 f/ C2 ]3 e. s- R& j -
0 Y/ y9 I/ @0 @ L - ;清除 RAM $0000-07FF, h7 [: K% c1 ]( i" d3 H
- LDA #$00! C4 Y# K, y0 O0 \
- STA $00" D/ V2 G* h' _) p2 K
- STA $01
! q( \+ I$ d6 Q u - TAY
8 y/ R+ l* u! C& q! L7 h9 J3 { - LDX #$08
' Y2 [9 @# _+ _' B4 r: q/ I! z - .Memory_Clear
0 Q+ s& f/ P1 K. R$ H! D - STA [$00],Y
8 |1 r7 ~% k% ~$ F( E7 w) \( L - INY
' c0 Q$ R+ z' q9 w0 k* [& y7 X - BNE .Memory_Clear/ x- _4 f" e- i' V
- INC $01; ?5 y; z9 S/ p7 \( G
- DEX
8 R% U# S, l4 M- y - BNE .Memory_Clear
4 Q+ J& B1 o# }! N: \( U! f - - b, {1 F$ W6 r
- ;精灵缓冲初始化# p/ S5 t8 D5 s
- LDX #$004 ^1 H, L# X/ f7 ^ n, g$ M5 f
- LDA #$F8
- D7 q% T Q$ i4 @% J, } - .OAM_Clear! a8 r( B9 u- `, i
- STA OAM_DMA_Buffer,X
5 s' y0 s: g; U& K/ {" x9 W - INX
* ~ A. i# Y$ g9 x% ] - BNE .OAM_Clear7 w S$ I3 ^1 a- P" V% V
- ! N$ E: D( o+ N1 y+ ^
- ;栈指针初始化
! S4 D" O& o- _6 w" C - LDX #$FF0 h0 w2 S8 y% ^" Z% d7 j9 E+ x9 L
- TXS
% {5 W+ A. h$ z' l - 9 Y* E+ M9 F$ G% V( Y5 N
- JSR Nametable_Clear;命名表清空
' o- Q C9 D$ t: o$ W& W6 K% o - JSR Palette_Init;初始化调色板缓冲1 j" D0 r& W4 V* F8 H
- JSR Static_Text_Init;初始化静态文本. B; H! x% @! W, ^- m
-
! B1 d$ i! C# V: w4 b% I5 j2 ] - LDA #MUSIC_ITEM_TOTAL - 1. u/ ]/ T- x) [8 J
- STA FC_Music_Max_Index
6 w% |& h9 N4 I& ?, k8 I - $ z% ~) W5 w8 w: m& O9 Z0 u
- LDA #$1F
: [' c! B4 N" c8 y/ v0 K - STA APU_STATUS' S; D: ]3 K" t L& D' \
- LDA #MUSIC_BGM - 1" Z t, E& x! Z& k
- STA FC_Music_Index* E- w" m# [! F- i* B. Z4 U4 I
- JSR Music_Init_Process;音乐播放" l1 X# _; J2 M1 W0 p5 j8 V) N" e1 d' F4 ^
- 6 e ?: V* }8 l5 h
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' V# [/ r' k9 j5 r2 s0 L' B
- LDA #$1E
7 g9 [" L, A% c+ f S9 e - STA FC_PPU_Mask_Buf# d+ `. S( _' c3 B. Q* I1 {
- & Q* E3 ^( h6 \, |
- ;启用NMI处理, D5 e) o# L8 {
- LDA #$80
! |6 V1 G5 i" p& j N" s- e: e - STA PPU_CTRL0 x% P& P9 ]6 M1 O, s
-
) s! M* A4 y: D - ;程序循环, 剩余工作交给 NMI 中断处理
6 [4 e4 m d/ G - .Loop& J4 `- z# P6 V/ a% @
- JMP .Loop
9 ?9 |) j/ y) Q- K5 U* h
4 a. J2 |. F$ G# G) L; \& |- ;======================================================================- F! s, R! K) I. D a
- ;不可屏蔽中断处理" i2 h, P7 ?& Z) L4 ^$ l1 o
- Nmi_Program
( r0 l: r( W: v2 B# J+ \ - PHA$ U! u7 M& V k4 t4 a% u. M
- TXA. N7 [3 K q: o! B* ^9 h. a
- PHA
; l; \3 L5 I# q# R; a+ ~ - TYA6 e8 Z) X* U3 \3 _. t
- PHA
4 n ~( S! A- {2 O8 S8 S -
1 n+ {; q, ^/ |$ }. N( w+ | - LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 R% x/ N7 E" E9 s; \
-
* x; L! a$ }+ j8 q - JSR FC_PPU_Procrss;PPU处理3 M7 s8 E' D* K
- " I* W# W ^: T0 q
- ;精灵内存更新6 B {, d& ?/ M- v8 S
- LDA #$00
/ d8 j( a' d. \# Q9 c! v. A) f - STA PPU_OAM_ADDR
' Z2 q4 i1 y9 \ - LDA #OAM_DMA_Buffer / $0100- }7 B1 T+ u( D7 \ T, P B) [
- STA OAM_DMA0 d+ I: u: ~) Q/ ]" e* Y, L
- - B1 O% y$ \7 r& S" s1 |. Y
- JSR FC_Gamepad_Process;手柄输入处理3 I. n8 ?3 B% ], g9 I) \
- JSR Music_Select_Process;音乐选曲处理: `& L) G% C1 J; u5 h7 r3 q, m! w
- JSR Music_Play_Process;音乐播放处理
6 ^/ M& X0 n' z0 B8 W -
# v7 z% L( t3 ~( N - PLA
4 h! X2 M/ n) _% m5 f$ ^ ~ - TAY( H# x# L0 c8 I: c) w) s& ]% S6 c
- PLA% E4 c+ X" v& ?( d
- TAX% M1 T2 G8 Y3 e( x) O8 k
- PLA1 ^4 M! S' y1 F# Z
" n J" {) f4 |( v1 i- RTI
+ o* ^' [0 \% l! ~& k a - % D8 s7 s/ B4 [! m6 c" a
- ;======================================================================7 R7 i% y8 G! U6 F t( P
- ;请求中断处理
( g1 c$ x/ k" e/ J - Irq_Program4 @) {. `( D. F* Y
- RTI
$ c# n# @4 N1 J
9 q) _. Y) P2 x. `+ k: k- ;======================================================================/ h% N2 F0 Y0 f( W2 b: _, |
- ;中断向量表
) C# [/ E, z7 V - .ORG $FFFA
5 [8 }& R6 |5 O! c - .DW Nmi_Program ;NMI触发时执行
2 Y8 v3 k1 ~$ q+ Q - .DW Reset_Program ;载入ROM时最先执行
1 p; u$ X; U$ B - .DW Irq_Program ;IRQ触发时执行 R' ?9 w" h+ A& [" N
复制代码 0 \1 A7 F+ Y( i: n
8 Q7 {* y0 A& c) _; z- I! L
2 L( w& q" a+ Ohttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|