|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
# `( l8 ^! l! }/ P: [
- i3 G& V. A: K) A+ l6 C8 L/ X+ E以下是主框架代码:
, M6 p) \* u6 M3 Z: ~0 s. a$ ^- ;======================================================================
3 M( G8 a u& ?" c1 C n5 | - ;文件头/ D$ L+ X7 s! y( Y3 y H
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
/ l& p' Y* I% z. y& @ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量9 X5 h6 W) F* J4 }" b' F
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
2 j) o" L, v! D- T7 ^% e1 F+ P$ v - ;======================================================================! I3 U' c! l. M+ [$ e: L/ {* y
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 22 C* f! R0 c1 ?& J9 u9 s B
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ U( t% p5 N/ h+ R - ;======================================================================( r# a. J+ K/ m
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
h H0 M8 j# P1 `6 B* S/ h - RESET_ADDR = $E000 ;主程序起始地址
* ^% o5 R6 i; v8 t2 u2 U - ;======================================================================( i1 h6 X! R d o: p1 M. M/ e, I
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 Q: f% t; r: I; _
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
2 Y% K3 `$ _9 L4 ~& ` - .INESMAP 4 ;Mapper号 (0-4095)
* r! A9 O( F" [7 f. v5 x6 j+ G - .INESSUBMAP 0 ;子Mapper号 (0-15) b; d: M% d2 S! U7 j& N
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)/ B) T4 g0 G9 T# d
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)8 m; V$ {4 h( R& w
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' @5 h( s5 G9 f* Y3 F; V& V
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
7 G: g; p2 L% G( d f# G/ H, L - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); _& u) j* k- F0 l) T4 n# S
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
2 }( e8 z0 F) ^% _& {5 j" p - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)! L. B6 `# g3 Y# x' u: B/ E
- ;======================================================================. m) W* Y4 d: v8 n3 O
- .INCLUDE "fc_demo_config.asm" ;全局配置
8 |1 ~1 T/ L9 |7 n8 Q# @8 k) p/ Y - .INCLUDE "fc_demo_constant.asm" ;NES常量
; r& B5 n8 U0 ^3 ? - ;======================================================================
; W1 p- S; Q3 I# W& F3 Z4 `7 {% N - ;音乐配置' e% F6 n7 x$ ]$ C9 D
- .IF 0 = MUSIC_THEME
9 U4 z0 W( ]) _+ s* L - .INCLUDE "data/music/Gremlin 2/config.asm"
2 X4 `: C+ m* F9 G! f. \ - .ENDIF
- i/ r7 f2 w0 V -
& s1 O4 I; h! N6 g. i4 a - .IF 1 = MUSIC_THEME* x3 i" {: V9 t; }6 d
- .INCLUDE "data/music/Raf World/config.asm"
. P+ K- [8 Z; K - .ENDIF+ @! W* k' O7 w3 D; }
- 6 ?. B% l+ h8 L. j
- .IF 2 = MUSIC_THEME $ i; G$ N- b; C* x
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
- P, |! b: E" b. D% f* n% @ - .ENDIF
6 G. ^. I7 X+ y8 X3 ~9 y( E6 }. {5 N - ' F( Y2 h4 x3 i' @/ {
- ;======================================================================7 z+ }- ^6 C( n! L" h+ N
- ;引用CHR图像数据0 {( h* O+ b& ?1 F+ |8 B
- .BANK NES_16KB_PRG_SIZE * 2$ H% i; p$ `) V: I
- .ORG $0000
M6 o1 p2 D8 w - .INCBIN "data/bkg.chr"
, w+ p6 ?4 {" N# I$ Y. } - .INCBIN "data/sp.chr"
0 _% {( F1 B2 E6 P, v$ j -
+ N# A6 h& W: E8 G - ;======================================================================
1 e, Z9 k! o% }3 Y' E: R - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
& ~2 P$ F% j9 ^ Q c9 q% ]7 S - .ORG RESET_ADDR
Q+ T) C! f7 I6 l9 p% h/ n0 X( y - ;======================================================================' I2 b% P9 G8 U" E/ y6 I
- ;引用其他源文件
3 W8 f' H. E, ]. O/ B% K( {. ` - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 W# r# j$ [# Z) Z - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理* ^0 l, J) Q1 V; q# b
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
* Z8 g: f, D& n* @- V - ;======================================================================/ [& C6 w/ s" B- A
8 @$ h9 l& B5 k- C- ;======================================================================
$ h' F, m4 a/ s& U& m3 H2 s - ;等待VBlank到来1 o; c/ p8 ~7 v. X9 i) V* e/ B
- Wait_For_VBlank
( |* p! M, w7 c' B& G% n4 E - LDA PPU_STATUS2 Z2 B6 y, W) p9 J9 E
- BPL Wait_For_VBlank
2 M) Q$ Y0 W8 E( O1 e - RTS
& }* S1 v, a- H |! m2 G# T - 7 a: k- O) T' S8 U( i. I
- ;======================================================================% I/ B3 A3 ~+ V# f4 W( O5 e
- ;调色板初始化+ w1 P( Q5 s& K
- Palette_Init
* r/ n$ e. f6 X - LDA #$3F8 u0 }6 x8 E" I4 s0 S
- STA PPU_ADDRESS9 R* `) c& u$ [5 ^) B
- LDA #$00
/ [, d0 D y5 P6 s4 N8 i" T3 u - STA PPU_ADDRESS
( s+ }) j9 j$ ~* w - LDX #$005 v9 F' _* k5 r& ^4 @
- LDY #$20
8 L) p# U. h7 U1 M! ~ - .Write_Data7 T7 _- n! f: D3 @
- LDA Palette_Data,X
2 A2 B4 l5 }" j7 o S - STA FC_PPU_Pal_Addr,X
4 _% D$ j* X. E - INX1 A! ?8 `3 @& k9 @' I5 r
- DEY1 S! k8 K: o, u+ d
- BNE .Write_Data
2 s! v8 I2 L2 `- O - .End
- Y' Q- R: |' m+ Z! U - RTS4 K" H! W: _! D+ G
' `( C: k9 |; M& s- l/ G# {: {) v$ m- ;----------------------------------------
: G4 ^4 P+ a" e4 [/ y - ;调色板数据1 t/ p. P: R& O6 M' z1 o, |' k
- Palette_Data
G* c0 O1 i' R3 U; I% X' r! n7 { - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B9 w4 E9 t- |/ D5 d8 E
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' U. ?4 T( s S8 S3 Y3 t -
6 t n( i& G: y* H0 V8 S+ Y7 ~ - ;======================================================================8 r! ^7 C4 ^2 |" `8 d2 W3 y9 e6 {
- ;命名表清空: }7 y) q' Q' w- O
- Nametable_Clear h) J7 f! V# t8 p0 W ^
- LDA #$208 C0 N N! H/ G2 z2 G) o
- STA PPU_ADDRESS. z% U' P7 ~6 C' C8 |$ D& c
- LDA #$00+ V5 x; i* K1 ?) k. g+ x- D" I
- STA PPU_ADDRESS! W* ~( |1 s* @( q6 `& l8 I& I6 {5 P
- LDA #$00
$ N) ?, |0 G" Y) L - LDX #$00
2 u5 J; C& Z* t2 ^. w" s- } - LDY #$08* s7 |7 p2 p9 W0 F
- .Write_Data
# }$ j4 f0 F2 b, }7 l$ Q - STA PPU_DATA
+ _2 D( A$ |$ X, c0 o2 M - INX
, v2 ^( p& Z- f- p0 H" w - BNE .Write_Data1 B- u5 a* H' E* u' ~$ K+ |* |4 J
- DEY
- z) u) W0 x4 ]) d% g+ T - BNE .Write_Data
9 P& R2 \, t8 T# U% d; O - .End
a" A5 E& S/ \" P% y - RTS) Y$ h: ]; W& f- J, w/ K' G/ U
! C4 M- \6 b# f$ X3 s6 p- ;======================================================================
% E( u# `- W: z P2 N4 q" v2 k - ;音乐曲目切换
, b* V6 f+ _! Z4 W7 V - Music_Select_Process; g4 M# D+ R! d ^6 _) E2 I
- ! S. G% E6 l% l: r# E3 K$ Y
- .Pre_Music;上一曲
( Z# [9 A. A8 p& B; L" r% M0 T - LDA FC_Gamepad_Once" T8 R; K4 _! B5 C
- CMP #JOY_KEY_LEFT" K# A* d N, k9 ^9 s& g0 f
- BNE .Next_Music; K% n0 O" X: U4 z/ R8 d
- JSR Music_Play_Pre
8 _+ G0 N1 _( D - .Next_Music;下一曲
w7 U7 R! E! z4 ?2 i - LDA FC_Gamepad_Once
( P. c* o7 m' f' r; N! s# A - CMP #JOY_KEY_RIGHT0 R, p$ V$ _9 G/ _3 l
- BNE .Next_10_Music
) `0 o6 n# q2 o; U4 T$ i" v5 P - JSR Music_Play_Next8 p1 J, ?) } P" T0 f Z, m
- .Next_10_Music;上10曲
" j- Q1 t9 W1 y - LDA FC_Gamepad_Once
# s, W$ {* Y+ |3 W' q5 \ - CMP #JOY_KEY_UP
' D0 ], I6 ], B- c: u - BNE .Pre_10_Music
# m7 C; E7 s/ r9 L+ W) y) {: z2 D - JSR Music_Play_Next_10
. Q1 u% W- ` b+ i/ K5 o; {6 `, } - .Pre_10_Music;下10曲
% f9 H; x; Z# ?6 t& V M - LDA FC_Gamepad_Once6 Z% O! @, _7 l
- CMP #JOY_KEY_DOWN
9 B- ?/ f& l8 p \# r* k - BNE .Reset1 W' _0 T/ t; Z
- JSR Music_Play_Pre_10: R" Y3 A' J4 j ~6 A7 C
- .Reset;重播当前曲目& P2 c7 I$ ?( f% U
- LDA FC_Gamepad_Once
2 r2 `9 R; Z- ?/ j3 R' P( X5 A - CMP #JOY_KEY_START* R: ]1 S- E( j6 Z. F) N0 v/ _& A
- BNE .End# I, L/ e( f; G. L: p
- LDA FC_Music_Index4 }. L% F$ ?1 z0 e, o* a# O' a
- JSR Music_Init_Process
3 ]* i1 j( K2 [; q# n - .End
& y: N$ T7 e0 p' ?; u. n i' a - RTS
0 [3 O7 }& ]4 a4 C - 6 u6 a# w1 d" S0 K
- ;----------------------------------------------------------------------) v2 {# ?/ _; d* y; O, S+ W/ y
- ;播放上一曲2 k. e& @& S" Y5 ]& ~; u$ H& n2 J
- Music_Play_Pre
+ W3 m' ]: O( O - LDA FC_Music_Index
7 B0 t5 b& s4 n' ~7 [4 F6 B - BEQ .End7 Q7 v' N; F! E* _* M& T" z! X
- DEC FC_Music_Index
3 P' j% f( ]( W6 n) {- i* Q3 v - LDA FC_Music_Index# s7 V0 a$ w2 v" J& h
- JSR Music_Init_Process) ~- T# p- o3 g6 p% ]' T& H
- .End" `2 z: C5 G4 B N
- RTS
8 c1 K4 k6 [8 q" g' U+ Z - ;----------------------------------------------------------------------
2 ?) T* D8 N. O$ X+ | - ;播放下一曲
$ `+ u9 ~1 l, v" A - Music_Play_Next" ^& [4 c1 e3 N/ V2 ~' M, ]$ m
- LDA FC_Music_Index
9 Q4 Q, m% H6 `, m+ g - CMP FC_Music_Max_Index
9 o; w6 O& d) k4 {2 {+ { - BCS .End c( B" {4 u# u4 n- H
- INC FC_Music_Index5 O v9 g3 Q4 V* s) T$ U: a
- LDA FC_Music_Index
; y- J; F* R& G' V& Z' `+ ~ - JSR Music_Init_Process
0 _ l2 T L' E - .End9 V! {2 t, ^5 a2 w( r# P
- RTS
( d+ N: X" p) I9 T8 F; Z" W - $ y3 j; A2 \3 f7 c/ v& I. g8 D/ B
- ;----------------------------------------------------------------------
+ G9 v& f/ Y' j - ;播放上10曲1 o, u3 }0 j& \6 ]! s. y) D
- Music_Play_Pre_10
: m' q# E$ }5 L& d - LDA FC_Music_Index
0 Q8 f7 S3 N) u M - BEQ .End3 X4 N2 {" }% @# |
- SEC* r! F5 `: f( X5 F! E1 K
- SBC #105 C8 v# G5 D1 r* X% t; x
- BCS .Pre_10
A2 q+ V- C% t B- w; p - LDA #$004 l; J5 u: w7 p8 |3 v
- .Pre_10/ D; H1 P- E5 J# ^. o
- STA FC_Music_Index
/ E7 ^* c9 T5 @9 W3 i+ ]; m l& L - JSR Music_Init_Process# w4 r& A: o* E. S2 M* R0 ^/ D
- .End7 T, @. t4 Z1 W. K1 x- \( r. V2 I
- RTS
( g- T! O/ j- T! X7 g0 H; t& S+ I - ;----------------------------------------------------------------------2 R! t/ t @$ c; X. b' L
- ;播放下10曲
6 \5 H' s7 ^$ j ?7 o# f0 y - Music_Play_Next_10
5 V4 I7 _ Q- v - LDA FC_Music_Index
0 [+ L( J! N/ T6 x/ b. v8 s - CMP FC_Music_Max_Index
4 n) N; U( ?& ~ - BCS .End
; B: I T% x7 a5 w2 K - CLC
" Z h' `! m% `4 U7 c - ADC #10
' I9 \0 K- p0 \, U" m; s - CMP FC_Music_Max_Index# h& [9 c- o( Q& q
- BCC .Next_103 j1 c5 r( V1 P8 |
- LDA FC_Music_Max_Index6 O% @: G$ i% K% U- Q2 b' ]- c
- .Next_10! M5 K/ V" N4 D, n+ ? ? S
- STA FC_Music_Index0 \2 s/ M5 D# Z& ~. A$ h
- JSR Music_Init_Process* ^, D3 z- m' J" F2 G! p' g# y6 x
- .End) J2 t& W/ ]) W" @
- RTS
& t, A* {2 T) o+ `1 F0 D" O
/ z' S& }" |9 O/ n- ;----------------------------------------------------------------------
4 q8 F+ E" L$ F m) ]. ] - ;8位十六进制转3位十进制制, P# r2 z2 M" t% p; R
- Hex8ToDec* l) e2 W) }% @2 x, y
- STA FC_Dec_Data_1
7 i# @" A# r7 d. N8 @) k) F - LDA #$00
- L0 A6 t0 ]4 y) I - STA FC_Dec_Data_100
% i$ |5 Y! \: B& i - STA FC_Dec_Data_10
4 T. l6 M% e. E. L c. ^ - LDA FC_Dec_Data_1
1 `' }# O% ~- N2 } - .Convert_100$ D( A1 B9 }6 b: f' k0 ~ p
- CMP #1005 z: j: I* j/ V' K8 [) Q6 a0 T
- BCC .Convert_10
4 c& ]! H/ x6 o+ D' W - SEC: N% c! ~' @- w8 g! i7 n
- SBC #100
9 t: I3 e$ I) I* p/ s - INC FC_Dec_Data_100) \& ?, U& G w
- BNE .Convert_100
4 Q% u( Z8 y& y% O* S; }) ^ - .Convert_108 } t& h. p+ |3 I; t
- CMP #10. V8 r, t) L% B. d2 {# l
- BCC .End2 i' S. u+ m- U% |5 L D
- SEC
# {+ Y# Y) v! R' ~: M* }$ O# y - SBC #108 C' D0 T' C( z3 l4 p
- INC FC_Dec_Data_102 G% j5 d' ?4 Z. C: t3 c
- BNE .Convert_109 ^2 ?; I' Z9 o1 f* ]- C, Y
- .End
) t* A1 r9 q% N* P - STA FC_Dec_Data_1
0 V. Y" w% C0 c/ [" A. B - RTS' G% v0 Y5 O1 W' Y( }" h
1 Q, z$ E7 u: R& U: r- O- ;----------------------------------------------------------------------: J2 X% J2 ?1 k& u6 f
- ;显示曲目信息
$ @& B' q# e2 |7 I - Music_Info_Display
# U t& N2 H# i: q2 ?& r5 J - LDX FC_PPU_Buf_Count
) F5 X' a' J/ Y+ V+ {* J4 Y - LDA #PPU_WRITE_MODE_CNT_LINE
* f3 u6 L& l9 p' Q - STA Use_PPU_Buffer,X) k" G* i/ P1 w1 [% l! r
- INX8 w& {2 t' T, F8 D
-
: I9 ~9 w( ?2 Q+ v& S3 {, z! g - LDA #>MUSIC_INFO_POS6 q' ^* b2 J H
- STA Use_PPU_Buffer,X9 h( F" @, V7 e) [2 S
- INX
2 x% z0 [) j9 c) ] - 8 Q( G( M V9 F3 _* h; U( E
- ;居中$ h& l5 \5 T& R& K
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2# L; d+ g3 Z0 ~
- STA Use_PPU_Buffer,X
% X$ a# T5 p4 R& R# Y' {2 X - INX
7 K! H3 F9 d5 f3 Q8 e; d/ k -
& F; R/ t& T0 k% [( C - LDA #$05
6 M: H4 {! o2 S9 K7 ~* D+ [" } - STA Use_PPU_Buffer,X
7 p3 D7 Q6 w4 I5 E1 q2 P, y - INX. P. w8 F2 R, {
-
5 H7 I1 B7 ?! Y. J7 P. D) I K - LDA FC_Music_Index
2 O1 X. {/ ]8 ^% v8 @- G - CLC9 \( ]/ y/ J6 E; ?$ e
- ADC #$01
' z6 c* g; J0 B; G - JSR Hex8ToDec P2 H) d/ ?; `6 N0 N3 V0 Z
- 9 M# ^ `& d0 u$ G Z& k2 T
- LDA FC_Dec_Data_104 Q9 k W" s. ?! q
- CLC; k: Q9 u% i; w' @
- ADC #'0'- P0 M5 q% v$ B( G
- STA Use_PPU_Buffer,X
& n0 z! t% C, H# f/ c4 g; Y0 h* W - INX
6 E& r, J1 R+ n. a1 i9 o - . ~' l0 `+ C) w: B; g
- LDA FC_Dec_Data_1, p; }; z( Z0 J9 h* h- F
- CLC
" G* E! `0 B" |6 v3 z - ADC #'0'
: @3 h! N( o* A& j3 U9 z - STA Use_PPU_Buffer,X& ^% ^" j: G2 I4 S& h& V S8 ^
- INX" f8 J8 [" N8 l
-
8 A4 b1 J+ O X: I+ R. t: q - LDA #'/'
, n; b. x% D7 g7 { - STA Use_PPU_Buffer,X: z3 X% ?& r* g: h; Z2 Y
- INX) P, X# g2 Q" d# J1 c
- - S/ T$ Y# A) u$ O, S; }) \
- LDA FC_Music_Max_Index
' a# }( J* h- p - CLC: [: H2 j' E( m$ w
- ADC #$01: z( B, a% D+ y1 ^
- JSR Hex8ToDec8 t( a9 o7 ~; y+ t# M; q
-
# @* N3 A g, B" U$ m% u u' k8 m, g - LDA FC_Dec_Data_10! Z2 V6 q& O- B$ K9 ? e2 b
- CLC
% E0 b6 o3 e- ]0 | - ADC #'0'# @4 f: D2 |2 ~3 |- b
- STA Use_PPU_Buffer,X
0 S$ M" i* i' b. M - INX9 W9 e4 I d$ \& a# L8 {4 _
-
- W5 ^- ^- u2 ]- U9 R/ e - LDA FC_Dec_Data_1
i8 p4 A \! y5 N$ p9 I - CLC+ ]! l# E( S0 R4 q# l& g3 ]! O) e
- ADC #'0'
0 j. f9 B/ a- }" U0 j" J! | - STA Use_PPU_Buffer,X2 @# r/ z9 q9 m6 V" O. H. v0 D
- INX0 s. y2 a6 L+ l3 \ S; m
-
; a2 H+ b8 i: q8 ]$ ~ - .End
( R# S x/ G5 T - STX FC_PPU_Buf_Count
' H' C2 g6 G# j0 ^& @6 ~1 L, C/ s - RTS8 X- d1 v w. C r; k) T, \3 _
% n5 T7 q; n: {; B; \9 }. U/ w- ;----------------------------------------------------------------------( Q- |' H$ ?5 u, r9 t9 Z
- ;音乐曲目初始化处理
0 i8 [, A; y" v - Music_Init_Process* k9 N+ m* v- r! q3 P
- PHA' z! O- U& G; {2 i
- JSR Music_Clear_Process
& L5 m& S6 ^& O& k5 \( D0 a% F; m - LDA #$1F
" T7 t! A! K$ _- U$ y- O$ Z2 h - STA $4015/ `) O# f2 V8 e( q3 j0 m
- PLA' j' j, y* E5 k" b% T
- JSR Music_Init_Addr
+ ?2 c; N/ T8 A0 }+ x, d$ x - JSR Music_Info_Display
! ]. a1 Z; ^& L$ k7 O1 h - RTS6 c: P7 c) @. s8 y0 {
. X6 L9 }; S5 |$ E) A- ;----------------------------------------------------------------------
, {7 p0 w3 f( e, C/ ^ - ;音乐播放处理/ O* J' N% Q! e6 c/ O- b
- Music_Play_Process
3 _) e( C% V6 B - JSR Music_Play_Addr
$ W( Z3 x3 F: @4 [ C `( D8 i - RTS9 t b8 d- V* `, {
2 w: a+ d/ C( d, f8 z i- ;----------------------------------------------------------------------
* V( Z% w4 e) c/ `3 l - ;音乐播放处理
3 ^- B) g, c6 [/ J - Music_Clear_Process9 S! Y: w; f- g. m, [; Z- f
- .IF Music_Clear_Addr' T! f) C2 x0 x7 f3 r, ?( p9 p
- JSR Music_Clear_Addr
6 M7 F5 L( D8 \: P - RTS' w( D- o m7 y$ {( I9 t" i
- .ELSE
2 e" H% x- X( X# p4 { k+ q( D - LDA #$1F0 p. ]& f9 C' |
- STA $4015
. ]; Y* ]( ]- X: M7 v4 W4 r8 O - LDA #$00
' N3 f0 Y: ?' z) ]7 B' P- q - STA $40105 f' @" N& ?( Q! [
- LDX #$00
0 s: c. `: F. Z" P! I, O - LDA #$00
- u0 F! x% K X, Z0 @8 Z& Q1 K - * W5 B+ r! D6 N4 V% b1 O
- .Music_Clear_Zreo_Page_0
4 p0 ]& ?9 G% U# W - STA $00,X
3 x$ F2 L: G/ _8 |2 V0 l - INX2 q' x. S5 S5 h( Z: P( R" E
- CPX #Use_Zero_Page_Begin x/ \, P; I/ G+ w
- BCC .Music_Clear_Zreo_Page_0
& Q! w6 j) t( t9 c% x! }7 W -
6 C# ^' x3 S; C p; ^1 ^ - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size! z7 W2 N! V; F9 q9 r6 n0 S
- .Music_Clear_Zreo_Page_1) Y) N3 k6 z! @
- STA $00,X [2 k5 t6 E1 H! U W1 P# U
- INX4 ^. M: X0 p8 E+ x
- BNE .Music_Clear_Zreo_Page_1
. z3 C+ I: M r& B8 d) b t - 9 G0 o W' R5 n2 T$ ]1 I5 A
- Music_Clear_Process_1/ \7 C% ]. [2 i1 Y( |
- STA $0600,X& B9 U( W9 |6 t1 c/ f/ r5 e2 \4 v
- STA $0700,X1 R; S/ z5 k3 s# o* [! y
- INX/ T& s$ A' Q1 T4 G
- BNE Music_Clear_Process_1
; J* V' ~" G! l5 w' n - LDA #$10
( W" y7 v+ O. w7 c# [- { - STA $4000
, K0 j y) ]7 z& \/ V" q7 u, A - STA $4004
# O- n( ?1 {- W - STA $400C% w" H, Z4 q7 B; @9 x" b; q
- LDA #$00
$ _) n! R( k. E! I* Q$ I - STA $40081 M3 g( m# D" o% [8 V
- LDA #$0F( g; Z& l+ {" }* |
- STA $4015* Q! m5 p& |# Z7 k4 f8 E9 M9 d
- .ENDIF) ^ p( C3 t! f) g6 o1 g6 ~* t0 o
-
7 J5 J& K9 }$ f+ Q$ j/ g- s - RTS
! T8 o/ s! \1 u5 _$ O0 R% l* X$ @
8 g* }1 @. O" o& q! U- ;======================================================================6 f' W* T( I) {1 }
- ;重启处理
) G1 j3 \' E4 R' `! s - Reset_Program; F L8 O0 U$ U9 h* n) P
- SEI
4 c2 r/ f6 ]4 N3 k - CLD1 j$ B2 V* l9 P5 `0 k# P4 V$ P5 Z9 E
- LDA #$00
- Y% T% _$ P! Q( l - STA PPU_CTRL
: z, I# _! @3 }6 j& ~3 a1 d - STA PPU_MASK [. @' x0 H. v7 }' X" c: K! C
- STA JOY2_FRAME+ {+ W8 A" u; r7 J* X9 {
- STA APU_STATUS Q/ a% h' {; q! }" j7 z
-
6 F7 O6 t# T- b, w, O- R5 x, j - ;等待屏幕准备完毕, S6 D: A4 ]! r4 T; O
- LDX #$02
}0 T) ^: X6 s% U6 A0 q, R - .Wait_For_Screen_Ready
9 F9 e P8 r7 L- E5 E - LDA PPU_STATUS5 `4 v0 t4 T0 a+ @" o+ `, {
- BPL .Wait_For_Screen_Ready* w" m+ k; U0 L8 Y
- DEX
' a, G }, h4 r- s - BNE .Wait_For_Screen_Ready0 [' g" D& F6 u# c6 i
- G6 ~8 l& q9 _7 r& ~
- ;清空调色板
/ i" x& p7 z- O9 B+ ~ - Palette_Clear' |) p5 c/ B* t l. r- A
- LDA #$3F
6 _* N, m7 E% J q( p: ?% N: V: G4 S - STA PPU_ADDRESS
( T9 E# c. r9 |; y {; Y: A - LDA #$00% x0 R; Y; V4 D4 C( n
- STA PPU_ADDRESS1 C+ \- o+ x, r: z
- LDX #$20
( V& }8 k. ^/ v( \ - LDA #$0F( p" f+ o) ~; }& S% Z% G
- .Write_Data8 U2 ^3 ^7 t$ ^
- STA PPU_DATA* i2 W$ ` G3 p
- DEX
V4 _$ `: v# ~" ^1 z: }% X3 F - BNE .Write_Data2 \6 S$ t' ?* h
# o- d6 a" Y* i( F0 k! M- ;清除声音 $4000-4013
: v" f. I& `! K, Z - LDY #$14
' R9 A4 v5 E5 J* R - LDX #$00
: f ~' x+ u6 c# h: S2 H - .Sound_Clear
$ E) z- i4 |& g, M - STA $4000,X
Y# t5 T( T4 |1 T0 } - INX
! E: Q; {+ _5 K3 A3 `4 v) i7 N - DEY
- ]/ s" A6 s- f5 k - BNE .Sound_Clear3 S' M8 a) @! U& F' h1 p( P
-
* A: L3 |3 I( E4 c, l$ I4 u* u( w - ;清除 RAM $0000-07FF
/ H# D; E) D" g6 c! G - LDA #$00
/ u- W/ x2 |: w- `5 r8 b - STA $00. [6 A: h; U) e' w1 ]
- STA $01
1 H" ^3 t: d# i' {. u- L2 [& \, J - TAY
6 P% T% j3 H" \& x - LDX #$08
. T. l* a( z+ A: E8 T8 c$ L - .Memory_Clear+ f" P& M0 C3 r: i% B; L
- STA [$00],Y3 S% @- M% H7 J& K& \
- INY6 Y; E7 }' p# ], c7 d
- BNE .Memory_Clear
; f& Z4 w( O& S( `$ P# F - INC $014 P2 s% a, n, \5 B; @ O" x0 u
- DEX' o6 L! N. e9 ]' m
- BNE .Memory_Clear: ~. t; m9 S# [$ Y6 H! E
-
8 @: G; i4 b) j7 s6 |1 I1 V# f, |# E - ;精灵缓冲初始化- g0 J9 d M3 L1 W' I9 C" O
- LDX #$00
0 Q! B/ X! J6 U+ I$ M8 U7 u - LDA #$F85 d% O5 `( f" I3 N. D9 q! }
- .OAM_Clear
1 G- x+ h; A: ~. G# D; d* F - STA OAM_DMA_Buffer,X
* e! B2 G( w8 e7 ]0 k3 V - INX2 u( R3 I# H7 l& R
- BNE .OAM_Clear$ ]3 I+ g- S6 c
- 2 R5 v4 G- U" b) a$ D" @
- ;栈指针初始化6 Z# y& y7 d3 O6 y! r
- LDX #$FF1 M; ]4 t) H s# H9 y: i, h2 V' U$ ^
- TXS( X3 e/ O& [( m- w3 y' U
- , [2 x# D' ]- ]2 O5 @. Z4 _2 L5 _
- JSR Nametable_Clear;命名表清空
' g9 U# P0 O: s4 ?( E- H" x1 F - JSR Palette_Init;初始化调色板缓冲
4 Q& A, Y4 w) A ~# S1 | b - JSR Static_Text_Init;初始化静态文本
) D0 F+ Q) @+ f/ t8 W - % a1 \* V9 |( U6 q3 y# m$ d: B
- LDA #MUSIC_ITEM_TOTAL - 17 i; O8 r$ z( b4 [
- STA FC_Music_Max_Index% W2 t! X5 b9 I# C' l
- / R/ ^- d0 x# }. w: c
- LDA #$1F o' l- C! B4 ?2 B# |; W. C( L
- STA APU_STATUS0 ?; G9 B; V1 f: p
- LDA #MUSIC_BGM - 1$ B P( m0 D' n z, o
- STA FC_Music_Index
' U, Y5 U( n1 m% q# c! Q - JSR Music_Init_Process;音乐播放4 C- g% H) W* k$ [1 G! B$ x) C
- 8 i8 u4 o* K) v* M4 f9 {( e
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
3 C) _7 \. N) P. i: f* b" ~ - LDA #$1E
! x* J" M: v6 @& A8 m) g% U% I - STA FC_PPU_Mask_Buf
$ Y1 H& w# |! Q: ~8 ~8 I8 ] -
1 i# a- e* `5 f! x1 `- O b* W3 n9 F - ;启用NMI处理
) G3 A9 J7 R+ Q, W% e: B9 ] - LDA #$80. ]( s$ p- {) u% p, i
- STA PPU_CTRL4 y! I; x7 L/ k- X, o
- 2 N! |' z; S, A: ]+ s5 {: p1 S
- ;程序循环, 剩余工作交给 NMI 中断处理/ R; [; z. J+ y! c2 C
- .Loop* ^% s- q8 A3 ~ t( k
- JMP .Loop8 A) S, p- S1 {* H6 [7 r& J9 l
- ( n' y+ k" ]( Z& Y1 J; q
- ;======================================================================
% \6 E2 y$ C4 d7 A: K* \ - ;不可屏蔽中断处理* I( h' G1 ^. l1 l$ x
- Nmi_Program
' e1 V( q# g) c( X - PHA
+ S+ e- g0 t$ M - TXA k2 g% Q( U/ T. b9 a" D8 n
- PHA
3 u! p8 l4 h' |' B8 W - TYA; Q- B! ^& h2 i' _* d
- PHA! l+ O7 s. W: u. r% [% t
- ( U" ~% Q# L5 y/ h- G+ C
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
6 B/ ?$ Q7 l% u- D# Z% v3 j - 1 N1 q& o8 p* l
- JSR FC_PPU_Procrss;PPU处理
K9 J+ U# @( L* s; M5 t9 c -
& ]+ ]0 W: H3 r% N$ O! a, S9 N1 t - ;精灵内存更新 K- m6 n, i4 ]; ]2 a* o) `
- LDA #$00
6 w4 S. p4 k" m- U# e' q) k% a+ O3 k - STA PPU_OAM_ADDR
. k* c* O' { l+ X9 w - LDA #OAM_DMA_Buffer / $01006 V) _; r* _2 ~3 [
- STA OAM_DMA2 z& u: \$ k7 s+ X
- $ Y$ f) E) `0 @+ T' u
- JSR FC_Gamepad_Process;手柄输入处理& b! H4 Q/ @1 u' b5 r
- JSR Music_Select_Process;音乐选曲处理
! b6 ]* z! I9 } i - JSR Music_Play_Process;音乐播放处理; \% k5 u4 \ s/ L: G
- ( e* s% P/ \' c( W J7 k
- PLA
! T% ^* N2 x) M% r: J5 f; X! L - TAY, {" g4 m6 t8 V& d+ j- ^ s. x
- PLA
" S3 ]6 J3 ?! \$ i7 z! ` - TAX( o5 q4 [2 _* j% W0 ]4 r# r
- PLA; l. d, `: X- M {) [" z" `4 T
- ! J8 o+ x2 P P% R
- RTI
* a5 Q) a% R4 S+ |* o - * p0 x5 _. h8 W
- ;======================================================================
) G/ ?, O. C/ I4 ] - ;请求中断处理
5 n* d' Z g3 v/ r! n - Irq_Program' B0 r" |7 G# H+ g; {9 `! Q
- RTI
( C# B8 i/ X A3 B/ k5 E7 o
7 T# m, d8 d. c0 }- ;======================================================================
& y/ c0 s$ m0 e. u6 W. B7 | - ;中断向量表
, v+ L, x7 A* O& i$ ]7 C% [ - .ORG $FFFA7 p% l, k: G3 d7 R' m
- .DW Nmi_Program ;NMI触发时执行. I* b* \5 ~9 v6 h' O; C' N5 B* K
- .DW Reset_Program ;载入ROM时最先执行
" e( R4 K' Y0 V4 b - .DW Irq_Program ;IRQ触发时执行) n) o& ^8 U4 B6 G1 x4 f
复制代码
4 @. ~9 N' T- u# z
3 Q1 C h F& `
}8 H2 D4 W9 o7 k% j6 Q' r% _. |5 phttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|