|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
5 e. x( n0 `4 n4 z8 Q( |8 f
0 w, l+ w" O' K9 `/ O' C以下是主框架代码:
, K+ P0 ?3 W$ A4 z$ r- ;======================================================================5 d# x( H, _/ z* m9 p2 A
- ;文件头
+ y( G- e% U: d5 P0 }/ T - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 X4 p% ]1 H9 M- E3 D
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量: T( h5 e" e; f! k- V( X% }
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码1 @% a. i8 F( k4 r( n( @3 Z
- ;======================================================================
1 m* n9 i* w. ?8 J5 @ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 26 V2 P) y4 d+ L4 ]- I. A! X1 j
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& m3 d: I/ X5 ^8 N - ;======================================================================. ~5 b% M$ Q& _/ N
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, }) H& h& n7 N' c- y8 B0 S6 ^
- RESET_ADDR = $E000 ;主程序起始地址
. ~4 U; _+ J! b - ;======================================================================% x4 X) x# T" Z6 [* c
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
7 Q' s0 j+ {& P1 }- H: M2 n - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
1 D0 q2 Q! R/ O( S/ k% o - .INESMAP 4 ;Mapper号 (0-4095)* X; O. Q% _- U
- .INESSUBMAP 0 ;子Mapper号 (0-15). `. G4 G4 Y& f1 I- x( w
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
0 g! A; P* Q, O# r6 i# Z - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在); ?% T2 s$ a5 \2 Y6 q1 d
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
) T1 R* Q9 k8 p3 L ` - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)3 Y1 ]0 `* |; H; [1 h3 K. H9 O! j
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' P* U* D) ^/ I% `7 c! ?
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
: q/ J( k8 ]3 e4 Y4 ]% m, P7 G - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
- [$ I& K, i' n - ;======================================================================
X! V' L: {5 z" q H4 [. r - .INCLUDE "fc_demo_config.asm" ;全局配置
+ Q8 d! s' G3 z% t; I w - .INCLUDE "fc_demo_constant.asm" ;NES常量
, z9 q) p$ p$ p; d4 Y: S - ;======================================================================( ]# t4 `4 k. v3 J4 n% O- u8 P
- ;音乐配置
H+ h2 Y1 Z7 A s3 n3 c- w - .IF 0 = MUSIC_THEME
) |/ w9 @8 B" \7 X9 ^ - .INCLUDE "data/music/Gremlin 2/config.asm"
, F) Y. q9 A. F0 Q8 a( u% Y - .ENDIF4 Z$ z# K% t3 b' \
- : ]% [9 p* \2 a# t5 p% A/ v
- .IF 1 = MUSIC_THEME
2 |& a; w( p, C, q0 r2 A% t - .INCLUDE "data/music/Raf World/config.asm"0 i8 M3 m$ C; `' Y1 W. G& i5 i
- .ENDIF' F+ \/ y" U9 \7 M
- {+ H' ], j8 K* g( f' \; ^( B
- .IF 2 = MUSIC_THEME 2 H+ k- ?% e( @5 t
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"6 T( j9 T9 ]1 F3 q0 p( r
- .ENDIF
l) w3 d% B4 A/ U6 `, s - ; J) o0 [; I! x8 P: O
- ;======================================================================
5 E* G S" @* t" {5 M. ?: \ - ;引用CHR图像数据- K3 E0 ^$ _# J" W5 K. q( q4 ]
- .BANK NES_16KB_PRG_SIZE * 2
) b7 ]0 t* y, u1 L* D - .ORG $0000! ]/ o6 X' s: g2 `& n
- .INCBIN "data/bkg.chr"/ E' o$ y, N4 t4 N {
- .INCBIN "data/sp.chr"2 Z- H0 R s' O! K
- - S) o0 M7 {' |( `/ [. [# H+ Y
- ;======================================================================
- q% f7 Q: i+ @+ N# o - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
- x# a- d/ R5 g+ z/ M - .ORG RESET_ADDR
* L, x3 H: b L! p - ;======================================================================0 c c6 s* x7 X+ c
- ;引用其他源文件
- h; [( \7 q' G% r7 M& D - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
" Z4 o5 n6 f9 X) n2 | - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
; o4 e' k( c( A' S. l1 g7 B - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
2 \. a( {4 U% i& r - ;======================================================================
8 X5 u4 g/ [" I$ k2 d5 _6 i - J& y* Y1 @5 u
- ;======================================================================
7 a; d# G R' J. F4 Y9 L - ;等待VBlank到来$ m1 l2 N8 G: |+ e# S2 B9 r
- Wait_For_VBlank
% u' D! H* I9 E3 o. z# c7 C+ [ - LDA PPU_STATUS4 p a/ F' N6 X6 D, p2 B
- BPL Wait_For_VBlank
4 ^5 K# C V( ]; e# S4 ~ - RTS
% z1 I6 O* y8 T$ |$ ` - ; t: Y5 s' o9 |/ l. B) Y$ }0 \
- ;======================================================================- s7 l, `" [, o( E5 L7 Z
- ;调色板初始化4 x }4 [* `' o+ b" j
- Palette_Init
" h3 ]' b( i7 l. h3 K - LDA #$3F
?6 E4 i; r, {$ u2 N( l - STA PPU_ADDRESS [) ]# |# Y# _. ?& @8 q
- LDA #$00 a( ~4 b' S) q" L$ l1 Q
- STA PPU_ADDRESS) {7 `; `8 n7 E) H" A
- LDX #$009 w+ B! U4 w6 X8 d2 K z
- LDY #$20
c: n4 }3 m) }' ?5 Z. ?$ e$ ? - .Write_Data
! F' u' T. k& H: r* m5 d; Q* Y$ J - LDA Palette_Data,X6 T9 M( U; f& ^' B8 K
- STA FC_PPU_Pal_Addr,X" s6 G* x6 W+ c. q1 E
- INX
- n- X' n8 p0 R) D7 q5 p! c* U$ g* s8 v - DEY0 V; C9 G2 K2 k9 }# S
- BNE .Write_Data: t4 m9 s4 R0 `6 P4 b
- .End0 @" A- C/ i) I& g! C3 B+ U9 X
- RTS
" c2 b' P( a- W8 G; Q% j6 X& K
* h8 I' ?2 j& I/ u- ;----------------------------------------
+ g) H# G; q) ]% H- I* h - ;调色板数据+ l" c" X) P5 t- }0 I% u1 _# e
- Palette_Data7 t" `4 g0 ^% x- \) A% H# C1 k
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B2 y3 ^' F# ]; B( |. l4 i+ \
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
# ?9 ^% ?8 B- Q. c4 p/ P - ! T2 R% T( h7 `7 I9 r
- ;======================================================================
" k( b0 T" h6 U0 }2 e - ;命名表清空/ ^* a3 H9 L$ W/ p6 I
- Nametable_Clear. J8 J% G1 j7 L
- LDA #$20
8 ?6 R3 g" U p' i Q. Q) H - STA PPU_ADDRESS
) l9 M& w7 T7 C1 D - LDA #$006 [) A8 m( r0 O4 V4 g* R+ B
- STA PPU_ADDRESS
' G2 _1 D6 e- x7 v - LDA #$00
/ |# ?) Z* C. l6 d( | - LDX #$00
6 Y9 d# p4 ~8 Y; H! E: j2 r; w - LDY #$084 U- e; J9 @1 b8 p& {" c
- .Write_Data8 U0 l9 `- A! l6 `6 `/ _
- STA PPU_DATA
" \; s: v6 X( D; [# H) w9 o - INX% o$ x& [6 W" c$ P& h
- BNE .Write_Data. z6 ?8 Z* k+ Y
- DEY& ?) V! h: a- D' I5 w l
- BNE .Write_Data' E0 E# U; E+ o% f
- .End. q9 e7 e3 G0 i2 N0 F! o
- RTS5 M$ ]1 k; x8 b8 J& ]6 X
4 [4 G7 Z8 E+ }( k9 v- ;======================================================================6 }; I3 T; b# F ~7 M. o
- ;音乐曲目切换
+ j3 x0 r' o; G2 \2 d. I - Music_Select_Process0 q: f) N8 l( z
" g* V5 a+ @0 [0 |0 {4 _' }% O- .Pre_Music;上一曲
! l' k4 B2 S6 \* w) i- z0 `+ Y5 u - LDA FC_Gamepad_Once1 H/ ?, l* u, U* [
- CMP #JOY_KEY_LEFT( H9 ?) R9 Q n8 f
- BNE .Next_Music v7 {* i( ^7 R& F: q
- JSR Music_Play_Pre
# c1 ^3 ~1 [! ` - .Next_Music;下一曲1 ]* @# c* w9 A$ i! J: h9 `) h
- LDA FC_Gamepad_Once
2 z& S; n6 \6 ^; W8 d - CMP #JOY_KEY_RIGHT. @ c/ S! O5 W4 Z5 S, g) }
- BNE .Next_10_Music
1 G7 v# w! \$ p - JSR Music_Play_Next- W0 \7 m2 j, ^- F& M
- .Next_10_Music;上10曲 ?4 l4 t" A e& `
- LDA FC_Gamepad_Once
. c. V) k9 A: d( u4 y - CMP #JOY_KEY_UP
5 n$ A* ?) c: N+ [& @ - BNE .Pre_10_Music
1 V/ ?" w8 p) d# I; [ - JSR Music_Play_Next_102 ?$ H6 W* }" c: N! j
- .Pre_10_Music;下10曲
# b* s% D6 y1 y - LDA FC_Gamepad_Once- D8 {5 @ z, q1 y. m3 {& H
- CMP #JOY_KEY_DOWN
, H# D. M/ e& P: G& |" F: e - BNE .Reset& J2 N1 a# D; W) d1 I, y
- JSR Music_Play_Pre_10, N$ w3 B, I- K
- .Reset;重播当前曲目
1 L. A' E9 C0 _" P3 T - LDA FC_Gamepad_Once
$ f1 v% u g, H9 J0 |# O% Q - CMP #JOY_KEY_START* ^) n- t4 U9 I
- BNE .End6 U, S7 P/ I3 s6 e' E
- LDA FC_Music_Index
6 g4 @! V1 t1 x# u9 g0 A$ i2 |5 X - JSR Music_Init_Process
4 f- s, z1 B7 P - .End
3 @8 z; T) G! D4 A+ y - RTS2 N$ n% `. h* D
- ; G1 q. [6 w2 A7 t8 b
- ;----------------------------------------------------------------------
* a: s6 h" r9 G - ;播放上一曲; b }" N) a$ E" n3 u4 C0 S
- Music_Play_Pre6 Z6 h% E0 W" s* h
- LDA FC_Music_Index
$ Q, _4 X. p: ^2 ^ - BEQ .End
) K7 }* Q9 L6 X2 F - DEC FC_Music_Index' y: \- q1 y* H; N0 `% y! c
- LDA FC_Music_Index; l1 w- O9 W* A/ S8 p p
- JSR Music_Init_Process
; A }! g' Q4 h+ m, l - .End0 r* r5 d% D! K/ b' m/ n E. Q4 N
- RTS7 T( N7 _% S% D, A; @' m
- ;----------------------------------------------------------------------
& L- U! \. n/ u/ s/ H6 |" C/ c - ;播放下一曲
5 h) t( Q3 a: [* W9 K - Music_Play_Next
, `1 j" Q* h! z - LDA FC_Music_Index
, x v/ [# q( X% h" @ - CMP FC_Music_Max_Index
# L" F$ q* M/ z - BCS .End
i* E% Z+ M( Q/ o - INC FC_Music_Index! y1 B \& W3 {% Y. ?$ J
- LDA FC_Music_Index5 c" P1 s* K0 N7 }: U1 d
- JSR Music_Init_Process; c. T, o7 k: i
- .End
; y. Z3 p% e5 P$ \5 f- E - RTS
s$ w5 g1 R% i; P) a
' f7 z0 a% r s) E4 a; d- ;----------------------------------------------------------------------) b0 V7 U+ C) f
- ;播放上10曲
4 b! `7 [$ A" a! H1 x - Music_Play_Pre_10* R% l) C& x0 Z& t, [5 J( M# E" }
- LDA FC_Music_Index/ X7 c1 \/ F; N9 w
- BEQ .End
. i& i5 |$ h/ ~$ w6 W1 @' y: v: X - SEC
3 i: c; d. A; O- k# Y; }' } - SBC #104 B8 u. j% ]" d
- BCS .Pre_10
8 j6 Y/ V! p( [$ Z5 g6 p - LDA #$004 n" @& u+ E6 |' [
- .Pre_10
% g. S% ?2 E$ t! m, _1 C) h% u2 V - STA FC_Music_Index
' w U. I6 J' ~ \5 ? - JSR Music_Init_Process* u8 s" |4 i& x/ N+ k
- .End+ E2 }) D) X; a. q: C% J b
- RTS
8 ]% \3 N! J4 f/ W& s - ;----------------------------------------------------------------------
( B& i" P) q! k( ^( E - ;播放下10曲
/ T3 B1 L) i8 x5 B+ C# t, V# G - Music_Play_Next_10
|3 @; [$ F7 {6 f# @) l - LDA FC_Music_Index0 o1 t0 T [; |9 D$ @
- CMP FC_Music_Max_Index$ g# a9 H" w- Y8 i
- BCS .End
0 W& u4 \* l- W; R$ |$ d - CLC
1 ~) I. K! I$ M; D; r( p& v - ADC #10" b) ]! k. a5 }3 H
- CMP FC_Music_Max_Index
+ |8 I y6 e) n - BCC .Next_10
/ h0 W* P* {' ~" T% T - LDA FC_Music_Max_Index
, p k2 Y1 B' n% d) u1 v - .Next_109 g: y; p. F8 a2 @) Y
- STA FC_Music_Index
% M# O4 @) z) w1 f% p - JSR Music_Init_Process
! y; ]/ G4 |0 c! t- r8 } - .End
/ V- O1 G9 l0 M _6 l - RTS6 y3 j, _$ T7 Y" U# ?& I# N
- 5 q4 w8 b& G+ `- T: Y# j
- ;----------------------------------------------------------------------* Z7 b; K7 C- p! {: C
- ;8位十六进制转3位十进制制
3 @! B" f% T( `! J" r6 L! z( J - Hex8ToDec z" ~6 s7 x. \! e
- STA FC_Dec_Data_1
4 M& X# \5 G! K+ s - LDA #$00+ }/ F% a: x }& N
- STA FC_Dec_Data_100" {, y2 L/ i W9 w+ |; W1 |
- STA FC_Dec_Data_10- l+ F. ^9 h$ t5 l
- LDA FC_Dec_Data_1
* b% z% Z2 G! w; z - .Convert_1004 h+ F# ` n7 a w, r: {
- CMP #100( J. @& H4 k' g4 B' ~8 K2 q# \5 ]2 Q' }
- BCC .Convert_10: D! v8 y2 T, G9 c; ]4 z
- SEC
5 b3 \$ G) h T* X7 ?1 f - SBC #100
/ G; w: P! V( R" n0 k9 l - INC FC_Dec_Data_100) x6 c) j0 X h
- BNE .Convert_100& j& C% Z- ^) p! [$ u6 x
- .Convert_10
d# A7 }) H3 B0 U" u) ?$ F - CMP #10( U& O/ X7 E0 b. _7 t) C
- BCC .End5 O0 ^, {% d8 U- E& {1 x
- SEC
+ r. K! @, ?# A - SBC #10
' d2 u: ?7 K0 v9 F& C - INC FC_Dec_Data_10, g$ c- J6 ?5 n' a
- BNE .Convert_10
6 d8 s/ |6 j- z: R( k6 u, \7 }' l - .End( E7 d* ^3 K/ D0 H4 a
- STA FC_Dec_Data_1+ [: O7 b5 `8 T* V$ N/ ^
- RTS
) w8 s2 M8 ~4 d3 k+ n/ g- I, V - & R& q# c6 t7 ^: D
- ;----------------------------------------------------------------------
& |2 Q6 d& [ N" j - ;显示曲目信息. M. ?7 E/ {3 x$ d8 a6 F8 @
- Music_Info_Display
- q8 l) u9 [2 p, R. Q - LDX FC_PPU_Buf_Count& m! J6 k: g0 J: O) I
- LDA #PPU_WRITE_MODE_CNT_LINE
3 e/ R; x. Q! ~; O% Q4 x: h - STA Use_PPU_Buffer,X
3 j" r$ |7 C9 R& E# Q0 g - INX
4 N/ w2 r- e* A -
/ F3 M1 w+ B& g" K* ^+ E* f - LDA #>MUSIC_INFO_POS
/ ]; y( q$ Q, @! H - STA Use_PPU_Buffer,X/ A& \1 @+ k* v8 c& o4 E- q
- INX/ o+ ^ r5 K5 F6 {
- ' D/ Q, d; i! t o$ E- Y6 Z$ |
- ;居中
3 T% q2 \8 M8 o3 s r - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
' m: \$ }+ y1 Y. w0 v1 } - STA Use_PPU_Buffer,X& b% K @# s) H3 L; `* z4 s' @
- INX
% G8 ?1 B9 J5 B) e( y1 y2 G: U# u -
$ s/ y9 X* m2 u0 ?+ G' Y' h - LDA #$05
! p5 c/ @" F$ l8 T6 x1 v8 O - STA Use_PPU_Buffer,X
0 t7 G6 d F; o& L5 \ - INX
# v- u7 a2 ?( e+ n7 E' [. W2 l -
; \. K% b% \3 G ^- u - LDA FC_Music_Index
/ p5 p: V! i0 O6 [8 { - CLC
6 S" }! ^% b0 h# L3 |6 v- ? - ADC #$01, H: j" b* K' Y% f. r/ P& P
- JSR Hex8ToDec4 U! \, I5 W, Z# s% `% v6 D& u
- & d) z v- J N# D
- LDA FC_Dec_Data_10$ M) W4 s% X6 k- e3 z+ V+ J
- CLC
- [4 K6 q2 M [0 ^/ Y g - ADC #'0'$ W: P# J& d1 S9 V6 C2 H7 y
- STA Use_PPU_Buffer,X
8 {7 z6 u) v* c# O - INX o% a2 W# G- ~- i* A0 J
-
+ s$ M: E: e# y$ k. g1 m - LDA FC_Dec_Data_1
; {' l3 D& G {+ f - CLC0 N/ J6 S* ]9 Z. [4 J) I
- ADC #'0'8 q# q: `8 t9 \1 F6 S# s7 c
- STA Use_PPU_Buffer,X
3 s. u! j0 @. B1 d - INX) c4 M: R+ i) j) k( [( g( @/ D* \6 D! y
- , z3 f. T* ?/ B- ^
- LDA #'/'" b# ?: I; D a" X; y
- STA Use_PPU_Buffer,X
- E) d7 e) U' P$ V& V - INX
5 p$ k. G" x$ ^8 E s0 m - 8 \. K9 W, a2 z0 z: j+ l& L9 E
- LDA FC_Music_Max_Index
; M' Z& _ b" j - CLC
/ C. b) `* p9 }2 f8 g - ADC #$01
) o. \: z ~: `6 V- y5 {" b2 p - JSR Hex8ToDec* I& t! j5 Q% e8 U9 H. O
- : u7 w1 _+ p3 v0 _# G7 { W* ?; A! G
- LDA FC_Dec_Data_10
0 r0 G* O! r: ]3 j( ~) { - CLC
3 H! p* ]$ ^$ p - ADC #'0'
! _- x: A5 V) o0 m - STA Use_PPU_Buffer,X4 c; _; b5 V, Z( T
- INX
; d% J4 ]# X( H! Y6 W5 F -
" q n3 X. h; E0 Z3 c1 d - LDA FC_Dec_Data_12 V1 P! s! e7 I) V/ W! ]9 F
- CLC
) X: e/ U* x7 j1 t7 Q - ADC #'0'
N, c2 o" k0 \. \ - STA Use_PPU_Buffer,X
& |7 ^/ S" l7 f - INX* v/ z! j7 e+ i3 T
- ' k* f3 ~( U1 F( F8 ^6 j
- .End
& v% b+ k* U' c3 w2 _5 B - STX FC_PPU_Buf_Count& y3 d8 s6 }- ~' x/ W$ Q
- RTS
( V8 t0 X3 L8 j. u8 E - : a3 u5 [$ }2 `( Q, p x0 {4 t
- ;----------------------------------------------------------------------4 |$ l) `3 V( E8 X
- ;音乐曲目初始化处理! k) `( j" K7 q' r( J% x" I
- Music_Init_Process
3 w. j; Q; O! z% P - PHA. J9 E5 R$ J. ^" ~* u8 X0 D( C: _
- JSR Music_Clear_Process1 [1 B5 Z. ]9 R& E" x
- LDA #$1F- \/ K# v* K4 A# m$ U
- STA $4015
" n b! d1 I& a# `; G - PLA: Y9 t; D- U2 K3 R
- JSR Music_Init_Addr
( p$ i4 u' a& C. O& j - JSR Music_Info_Display
$ ^2 k' [# f+ x: ~# T" H: L9 P# e b - RTS. U( g+ p* _5 p7 q1 A
- / j) E: k+ s; M! S
- ;----------------------------------------------------------------------5 T& w/ Q* H D9 q X* X% N
- ;音乐播放处理
; y+ p% E' w+ }4 } w3 X - Music_Play_Process
# {; y( [! u' T( Z - JSR Music_Play_Addr9 p) T( e' A8 L6 y
- RTS4 }5 |! c8 Y) J' B6 g3 R1 R' _7 X
- 5 i% F, i# K4 Y5 t" j
- ;----------------------------------------------------------------------& k0 ]" S. s$ F% b# Q6 Z" i
- ;音乐播放处理
! } r" ^# _: |6 J - Music_Clear_Process( m U1 { g; F/ T8 H
- .IF Music_Clear_Addr* R- m! E' u! \7 S. m! {6 m
- JSR Music_Clear_Addr
" G1 e+ l0 j) {; p& O* n - RTS
, j& j: e* _8 F9 a1 D- c/ y$ W9 z - .ELSE
# I2 v6 a6 c' A# | } - LDA #$1F
) ]- p( v4 A. [8 O4 W5 n& n - STA $4015: l. v" {3 \+ i7 t1 Z7 q
- LDA #$00+ I6 a: M% W1 X
- STA $4010
+ e; r' k. J8 P% M6 j) P. G - LDX #$00
) g/ u& P0 F* w1 j, j2 N' O9 H - LDA #$00
$ K7 P: c! K- C1 Z* [ -
) J1 y- D( |6 O! N) H - .Music_Clear_Zreo_Page_0
' t( H6 p0 e5 N, D- P6 f - STA $00,X
5 K* K0 W7 K: t% p - INX+ d$ ]4 C1 p+ P
- CPX #Use_Zero_Page_Begin. o, |% F6 K9 K C" d) h& |
- BCC .Music_Clear_Zreo_Page_02 h. c3 @6 G' X1 O0 s! n; R$ N
-
2 C4 U! [, q; p - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size9 Y- E& m! \8 n# \) L* Z
- .Music_Clear_Zreo_Page_1& d; @& Q5 _ p/ ? ^& }% b
- STA $00,X' v; h0 J$ r3 M( ^
- INX( _& ^7 f- p- c5 e& L! n6 z G
- BNE .Music_Clear_Zreo_Page_11 h3 O' A% o3 y/ A: g
- ) n' x1 z$ Q7 M% o c
- Music_Clear_Process_1
' [9 y) P3 b( ~# g - STA $0600,X
. j' i" n) D. Z E# g - STA $0700,X* ]+ {5 R! p) w
- INX
. U8 p' k# |8 g5 n5 e$ I/ V - BNE Music_Clear_Process_16 e+ J I" ?/ s* Y( b$ N1 F8 u0 T
- LDA #$10
# B2 K( x) h. A- H5 l - STA $4000( d* W/ x, r& k: D, s' Y
- STA $4004/ E1 |) T" a0 ^# U: ]+ y/ O: ^
- STA $400C2 m# t; N; I. L& U- L% a+ N
- LDA #$00# I0 @6 e: y* u% g
- STA $4008
% u5 T1 Y5 d6 e2 U9 ^/ L; Z - LDA #$0F
4 [. C$ s, S, \- K7 q - STA $40155 E8 W5 v- S- f& L3 b
- .ENDIF% Q4 Y: D% D5 U
-
& @! {; v- j2 l5 a8 c0 v1 e+ G9 X% N - RTS
( T, e) k6 |4 N9 d7 z4 L, }. x
. [0 p6 }, h: ~+ C" \- ;======================================================================
: F; L; r$ `- R, \ - ;重启处理
( Q. S' G' c; F) ^& q - Reset_Program9 B8 W; {8 z0 b$ [ V
- SEI
1 u9 A# M6 n% x5 n# ~" C - CLD! L, G1 l# L6 I, x9 w
- LDA #$00
/ @$ }) G4 B* S9 o2 q - STA PPU_CTRL
: A) \/ T$ M& B- Q* h, q) l - STA PPU_MASK# J* ?6 I6 X- l1 L3 u8 Z
- STA JOY2_FRAME
2 O! u: r' ]& b/ A" Y2 Y; X - STA APU_STATUS) U( r& {! B, _' j
- * e x- t' P m6 k
- ;等待屏幕准备完毕
3 O! K8 V/ V0 Y8 `; x/ T - LDX #$024 R' I" c7 A5 o, k1 B% S
- .Wait_For_Screen_Ready
+ ~* K4 b6 P h$ T0 w - LDA PPU_STATUS
* N6 y8 ]' Y \, u7 w - BPL .Wait_For_Screen_Ready$ y: D3 t# ^, A/ y3 E
- DEX
+ ?6 _3 q9 S, w$ d - BNE .Wait_For_Screen_Ready
) L9 W" [/ ^ \5 y+ @1 F" ? -
8 Z: @1 Z3 V9 z4 w0 s - ;清空调色板
) r& C Y( y0 D+ a6 F - Palette_Clear
; Q: G9 U* C, D7 d: a! I - LDA #$3F
, r: |% |! j+ N! J5 d - STA PPU_ADDRESS
* G3 V2 G/ b8 X( n% k* Q - LDA #$00
+ I; f) a/ e K* t! D - STA PPU_ADDRESS
9 q% y5 T. C) k+ W - LDX #$20# Z. X, F: ^0 v; A
- LDA #$0F$ ~9 H6 A# D8 ^
- .Write_Data! Z1 V! a5 H+ a8 d# Q6 z2 h
- STA PPU_DATA
. s6 m: [3 H! A! D - DEX3 ]0 t( Q8 z3 Q' x! x; |. Q
- BNE .Write_Data
# z! Z, Q4 e9 y' D2 S
1 W4 j+ J$ f7 L, X, o' K1 {- ;清除声音 $4000-40130 m `/ R' {& f
- LDY #$14
/ J: {- K4 s: P; e8 t i - LDX #$00
0 i' w7 e7 t6 T5 w - .Sound_Clear* O3 b) ^* L5 c6 T5 ]
- STA $4000,X5 ~7 C/ m2 \" w6 t3 T# U
- INX
9 B% _4 @: r( s8 C4 C" U& X - DEY
& \$ H5 a' |+ E1 h. n* P& o - BNE .Sound_Clear
2 M" Y/ j, f# p -
) f* f8 w* [# w0 y3 I: D C5 |% x' T - ;清除 RAM $0000-07FF
& U5 t0 |" [% Y3 z - LDA #$00# v; B4 j& x) _' H( _
- STA $00
; L4 b1 S& C2 x! w$ S& Y# n - STA $01/ D8 \( y) G' {: ?! l
- TAY
' J# ]' W, F$ \$ R1 U- B) {$ E - LDX #$08
3 m1 p0 @6 g& {- ~ - .Memory_Clear) F4 i+ d+ N& @" d3 o5 q; r
- STA [$00],Y
; k: T3 u! Z# n; s( u/ A - INY
: {& ^% a" C0 t/ V2 G( y - BNE .Memory_Clear
) T' F1 @" Q4 B2 X" j. n: i - INC $01
" r( q$ D! B/ ]0 P - DEX
s* a4 H: O& T( q5 t' N, y7 O - BNE .Memory_Clear* `' D0 K1 _# J8 s
- 3 y* m$ l3 O, D2 r
- ;精灵缓冲初始化
2 [$ Q8 m) W4 p - LDX #$00
5 j4 J+ c" j/ s+ G, U& m - LDA #$F8" C5 l: x$ z, L$ h& }2 G
- .OAM_Clear1 O* x1 u: z) P( _5 l" U0 c0 j
- STA OAM_DMA_Buffer,X
: K: {7 [4 N J% e# E - INX3 v- u6 Z+ Q& m) q9 s9 M7 D7 S- S
- BNE .OAM_Clear6 S* n7 o. ^2 z$ n* [$ A
- 4 R3 S$ C* Y0 _
- ;栈指针初始化/ h! F# c a$ H1 }
- LDX #$FF
# X% {: o6 S8 r - TXS' a3 A. C( U- A) |% H4 M r
- : x: P+ Z! M5 j" C) q; j* g" o6 m
- JSR Nametable_Clear;命名表清空1 ~- i: c p* O+ `4 ^
- JSR Palette_Init;初始化调色板缓冲6 W( w. H/ R: N
- JSR Static_Text_Init;初始化静态文本' W: A- n* J% k- k" {* ^) t
- 8 [. u' S0 C' ~4 l+ ?2 T4 n
- LDA #MUSIC_ITEM_TOTAL - 1; ]5 i* J$ P% m: R* f# }! ]. E
- STA FC_Music_Max_Index9 p# f4 | K6 d/ G. U
-
; J4 d/ u6 t% W7 k1 k1 X5 k5 Q - LDA #$1F' V+ R3 |7 _3 x* \
- STA APU_STATUS- w- [6 U' U7 b4 d, O* t5 H3 f$ Q
- LDA #MUSIC_BGM - 1
+ ? ?8 q' I% I( T# T! \4 d - STA FC_Music_Index+ \9 O$ x& N L. \- [4 c
- JSR Music_Init_Process;音乐播放
D Z# K1 |, c& z: a) i0 ] -
2 p( b* ]3 o( \ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 B: R2 v$ S) O$ P8 h - LDA #$1E
4 q( A3 Q; T9 A. T" P - STA FC_PPU_Mask_Buf! x& |/ h4 Z5 p! T, i' q2 I! S. u
- 6 T( ^& U: q) }3 K# I
- ;启用NMI处理( | A5 e. K% m# u
- LDA #$80; r- w2 A& Y, q6 N/ u1 y% Q
- STA PPU_CTRL6 R# ]& \( F0 e! r z( g/ k
-
* m$ S4 Q4 C. x" _4 H8 o" Z: v+ j( C - ;程序循环, 剩余工作交给 NMI 中断处理4 y2 }2 K$ ?/ p$ t
- .Loop c/ b; Z* O* m; s" J3 L
- JMP .Loop
& d E3 o0 B/ {7 ]
* r2 c& U6 m2 @- ;======================================================================
, ]. v. E& \7 I) m& w7 G - ;不可屏蔽中断处理
) z/ n6 ]8 f4 w; ]7 [ - Nmi_Program- V1 i$ n! p" K9 h
- PHA
5 \+ D% X, s0 e: @/ y/ J: I) R - TXA, l) ?" D, v2 z( e$ m
- PHA8 U( i% [* ?5 M# t. S
- TYA* [0 Y. |# \9 M& b, ]3 D
- PHA
{4 q4 J2 @' C0 X -
$ D$ _: |/ l; ~9 q- n: @% u - LDA PPU_STATUS;读取使得 PPU状态寄存器复位: |4 p& H5 O( J/ d( D: P
-
% P2 w7 e- X5 V, U: {. [! H) F - JSR FC_PPU_Procrss;PPU处理
# g3 H( x& c+ S+ B7 ~ -
% _" I" q( D3 h5 ]' E3 @4 m: \ - ;精灵内存更新
$ q/ U1 T: W9 H2 W4 F - LDA #$00& s) f) N1 l, P
- STA PPU_OAM_ADDR
2 ?; E; ^7 V) f1 T - LDA #OAM_DMA_Buffer / $01006 }4 Q/ h* D4 N- x9 \; i
- STA OAM_DMA7 [+ r% m5 y. j' z2 j" \. C
- & k* z+ `6 V8 c( m3 l! `+ o! C
- JSR FC_Gamepad_Process;手柄输入处理
8 l. \9 J: }6 ]6 U - JSR Music_Select_Process;音乐选曲处理
5 C2 f, \4 x7 Z7 w# I - JSR Music_Play_Process;音乐播放处理
+ n% O. L7 @+ O, P# P -
! Q. P% f+ ^; f C - PLA
; i b2 u( E# {% X( A# m# [ - TAY
3 Q' k' |( b3 |" _/ ] - PLA
" ]( m8 @. A7 U7 E) a - TAX5 `2 V) v, H; {$ k
- PLA& x5 @0 Y" ]: n% f8 C; F
- ; [: \7 z' H l# I) n2 u
- RTI, ?* A* c- w6 y
5 T: r$ t& q7 ~, X+ v- ;======================================================================
) ~- ?. f) h( b5 ^% Y% O! G - ;请求中断处理* }4 N: l8 i! Z0 _
- Irq_Program/ {& |$ x1 \' K. q8 B$ }
- RTI ?9 _( s0 n8 @, J# ^8 s+ Y$ ]
- ! c/ C: S- l1 Q) p5 {8 x
- ;======================================================================
% c! r. ?9 @/ F - ;中断向量表
( \& z: H2 j. j* u. p9 z - .ORG $FFFA [% [; J, u( q; b: `8 N1 x& y
- .DW Nmi_Program ;NMI触发时执行" \2 |( [0 Y* s4 D: K; m- t
- .DW Reset_Program ;载入ROM时最先执行
/ M% U% \* [5 X' A, g - .DW Irq_Program ;IRQ触发时执行
$ n {# P+ Q' H. x8 P' d
复制代码
, l6 L8 E y- L5 h/ ?- `7 `6 A: m+ R7 V2 E' I( m
% L! u! ?& P6 p6 y: K& O m
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|