|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( {9 p7 J$ `, X: } \: _+ `
: M- E9 S5 r$ ?2 _5 b8 E. w. z以下是主框架代码:. i r8 Y2 Y- @# o$ ^; ^ c1 i
- ;======================================================================
9 `! j2 ^# t4 ~4 I! A% |) e9 | - ;文件头; b1 ~7 z3 M B) d/ `, s+ l$ w
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量+ W6 k. T+ v& T' q
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
E- f6 z1 G# o4 h - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码! _. \/ Z3 z( G- Z( _8 {1 h; ^2 I
- ;======================================================================
4 O% [! P) H- x - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2! q0 j T" |; h% E- M! g
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 10 ?$ [% u8 C- p, }( |5 _% v5 n a
- ;======================================================================
) Z0 }7 T& F! }. u1 D: Z# q - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1' W, j3 N4 d/ U' K9 t" P' G
- RESET_ADDR = $E000 ;主程序起始地址
a; x4 p) I# z9 c+ \$ T - ;======================================================================* u9 `6 R4 h9 I
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB8 r7 w! l5 l4 {. {* N) y
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
/ ]$ ?4 ^( y0 h& l. a! z% p1 P+ F - .INESMAP 4 ;Mapper号 (0-4095)
( N+ L+ C3 _1 ^0 h5 l* y9 n6 j - .INESSUBMAP 0 ;子Mapper号 (0-15)6 N+ v- v8 [! y: M) g1 r. ]- T- X
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! r4 {7 V" L/ }, } - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. \, n7 i( {7 ~2 I1 ]; Z0 s - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)+ q7 _- W2 s j' G
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
) q3 J; f& k0 F$ t$ A; t7 `. c - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
4 S O# A2 ^) d8 L - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
0 g6 f/ f0 s7 K2 a& x1 c" |1 n - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), D' o& j& k; c3 v* Q" X
- ;======================================================================
1 p# N; ?0 Z: O+ o% l - .INCLUDE "fc_demo_config.asm" ;全局配置
) e$ F* J4 K9 \ - .INCLUDE "fc_demo_constant.asm" ;NES常量
4 y. B6 [/ f' | - ;======================================================================: X7 v u+ w; |' a1 y% \
- ;音乐配置
, O/ n# p4 M9 W - .IF 0 = MUSIC_THEME
8 m5 B$ R4 v/ a3 F/ }+ g5 d - .INCLUDE "data/music/Gremlin 2/config.asm"2 u8 i4 u2 y5 O* e
- .ENDIF
3 @! ^7 _ o; r7 B -
) E. b1 m7 m" t( T - .IF 1 = MUSIC_THEME: A( c' \, o' x
- .INCLUDE "data/music/Raf World/config.asm"
! A! m0 S( C0 W8 P- ]9 p3 B - .ENDIF2 @- l2 v, P# i' h4 Q6 j
-
l" f( y! ~. D- T - .IF 2 = MUSIC_THEME
( K1 Q. U( ~4 q9 ?; K - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"* U# P& q0 U% y' ?8 O& l: |
- .ENDIF+ q1 h4 S" Q n' `- v$ A) l7 ]
9 t4 Y( X5 b; i9 {- ;======================================================================) Z6 j- T2 d& F. B: d3 i
- ;引用CHR图像数据/ q# ^3 i+ k9 C# y9 a
- .BANK NES_16KB_PRG_SIZE * 26 \! \ D% i+ v2 f- o* C* y" q
- .ORG $0000+ S' t) t1 b B3 ^- `9 n
- .INCBIN "data/bkg.chr"' ~1 A& i- K, c: V; a d' V
- .INCBIN "data/sp.chr"! R% e l- i6 }0 |+ _3 G, X
- : z* c' D5 R' y/ e0 a8 E: c2 e
- ;======================================================================
z5 k- l; E' N4 N0 Q [ - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
1 y8 n6 x3 Z' k) T/ w - .ORG RESET_ADDR
) }* v" H: J, G% t! A; _# f - ;======================================================================
- L& U8 e9 @- H8 v/ O/ d - ;引用其他源文件
* s4 Q+ i I, M' P! O - .INCLUDE "fc_demo_ppu.asm" ;PPU处理 t8 j9 B% N4 b8 u" d
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ g) I+ k7 E. l3 A
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
. s9 J" i6 y7 F5 _7 [ - ;======================================================================
! K7 h4 [7 w: Q. Y0 g - ! p* i F q( g
- ;======================================================================
2 I/ U# O* n! X& a5 U8 J x2 T - ;等待VBlank到来
9 B" U" u9 }0 [5 L/ t' j1 Z3 C - Wait_For_VBlank* r! s J" L' j: y. t8 g% C
- LDA PPU_STATUS: R) d T9 H( h9 J. S
- BPL Wait_For_VBlank, x0 N) E; E) T) a
- RTS
* L$ o* _: o I! e& s+ G2 _; p8 e
* `$ ?+ x4 W2 b7 A- ;======================================================================
$ b9 T% q8 [" R( ~6 Y - ;调色板初始化1 }- o1 x% a J, K% E' I
- Palette_Init: M( ~2 }: N5 [/ b
- LDA #$3F8 A& n3 y4 R \7 L" h+ C9 `, E* w; R
- STA PPU_ADDRESS
- \0 h: A$ V/ F4 w" V4 I9 ] - LDA #$002 O, ^5 V4 Q& Y+ s1 O0 s! ~
- STA PPU_ADDRESS ~: c- k0 S7 U6 u
- LDX #$00" @' u* k) \) ]2 m/ H9 ?/ g
- LDY #$20
# g! ~3 f/ s: ]# C2 u& x7 Q - .Write_Data
( L$ R+ f8 v- v+ I - LDA Palette_Data,X
) n1 h1 y% o* h4 y - STA FC_PPU_Pal_Addr,X1 y& y5 c4 N1 v) Y( [- a6 E
- INX7 N$ `3 f# s" Z7 s$ u
- DEY
4 Z e: D5 J0 e7 M4 y/ x- w - BNE .Write_Data& c* |, E7 y" [9 ^4 N+ p7 _! K, b
- .End
* E! L& G2 C6 B - RTS: h+ {' ~2 Y9 D& G
0 n+ U- _; U. I! r+ H: [# y- ;----------------------------------------9 x& ?# x# u% \! b
- ;调色板数据
- T* g) M4 f9 M0 Q K8 Y - Palette_Data7 o% v! W1 Z: e K; r1 x
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B6 @9 M. a {" p, J
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 ~0 V# f+ H- a0 R8 i9 O+ v
- / t1 I3 N& d3 I% b' Z0 m U! w6 D0 W
- ;======================================================================8 I8 v/ u5 C2 V+ q% E- P) L
- ;命名表清空
: O% J0 d8 J) P/ G6 ^) c - Nametable_Clear9 X a0 D$ ]& J6 u; Q; ^5 i; C
- LDA #$20/ C I$ c6 v1 _6 j# @1 v! x
- STA PPU_ADDRESS
) S. y6 S0 x+ e: S3 } - LDA #$00; V! d$ r2 I( @" x2 c5 |3 ?
- STA PPU_ADDRESS
! y$ I4 r( N2 i# X - LDA #$00- h0 E: p5 T, @
- LDX #$00, s- }2 g4 ^) [. M; b. p' N
- LDY #$08
$ c+ X$ |8 i/ D5 k - .Write_Data
% ? [% ?" W2 D9 b5 U- T - STA PPU_DATA2 X {$ |( l9 e! t4 h
- INX( V* z$ Y; N/ O. i W
- BNE .Write_Data$ P" W$ j- W9 U
- DEY. H+ u, U# t# e
- BNE .Write_Data+ t \. U$ S0 P8 p
- .End Q/ T Z! v8 y% @7 [" j3 m. A" {) h
- RTS' R% F( l; K& r) t* A' m
- & N% d. z& c0 M: m
- ;======================================================================
n/ d. h4 }7 A* ?% a2 B" Y - ;音乐曲目切换. X0 ~ y D) s+ F, G. ?
- Music_Select_Process
0 {9 G9 g0 x x8 K+ O$ R
; G8 f$ n H9 A- .Pre_Music;上一曲
) U; @) x }0 H; X+ c/ n* Q - LDA FC_Gamepad_Once, s) S; R. @) M5 U ]
- CMP #JOY_KEY_LEFT
" ? {5 y' w! h( p7 V: l - BNE .Next_Music
* N6 Q% x, N% c1 ]& q' C - JSR Music_Play_Pre; O7 h* v2 k* b! F' U7 ]8 l
- .Next_Music;下一曲0 j" O3 B9 h+ ~; c/ m
- LDA FC_Gamepad_Once$ b5 d# l- c2 l/ H/ G
- CMP #JOY_KEY_RIGHT6 r! P, C9 `. V) e2 x
- BNE .Next_10_Music
2 O" \! U5 W9 {9 ~0 n' r" m - JSR Music_Play_Next
/ U& i1 g6 q! b. _$ h% U - .Next_10_Music;上10曲
5 z2 c0 W: k' `- |# i+ L - LDA FC_Gamepad_Once# z* s/ v3 g& v: f& l
- CMP #JOY_KEY_UP
; A0 ]( O+ \* N2 X - BNE .Pre_10_Music1 r0 Y* n- |6 g. ~
- JSR Music_Play_Next_106 C9 q1 }7 {) {2 p$ k% x% ^ `* V
- .Pre_10_Music;下10曲4 U' g( l0 B4 z9 t
- LDA FC_Gamepad_Once
- Q: U& |" c% o- m5 D8 _; H - CMP #JOY_KEY_DOWN
6 H! r8 v z) L" @! q - BNE .Reset
. ]: u/ h9 P9 B0 E" b4 v# D - JSR Music_Play_Pre_10/ p t( R: e5 f. ~4 r) a7 x
- .Reset;重播当前曲目
/ Z D5 T$ z( I2 Y2 N: u8 v$ C - LDA FC_Gamepad_Once
% K9 n9 E# s! F. J3 m5 x$ ?+ a E' G* f - CMP #JOY_KEY_START5 J7 x0 G- m+ S) c g3 k
- BNE .End S3 L# M3 o- Y. |9 H; R8 w
- LDA FC_Music_Index
. |* {$ H2 m, P7 g; [ - JSR Music_Init_Process
5 \* Y1 X' T4 z! U* A( o - .End
2 g/ l: m7 v% `/ w) D, ~ - RTS7 P! z6 |, ], L
- " g& y- g: B/ W: `) P
- ;----------------------------------------------------------------------1 E8 e( L; t! n! ^7 R
- ;播放上一曲8 n. f. B- x. n& @6 x2 d
- Music_Play_Pre
& M( O$ V- b/ @% H& [( y* T - LDA FC_Music_Index% S& @1 Q& x% J- F0 R4 c' @' G
- BEQ .End: }1 H9 h* Y8 ~% k
- DEC FC_Music_Index
) d% l! Q( C' y, P- C8 F! S, Y - LDA FC_Music_Index
- X4 k$ ]2 L' ]/ } - JSR Music_Init_Process
% ~& j. X7 J, v: J* O - .End
+ ], |6 `6 [5 ^# D/ O - RTS
" Q8 O9 L! ?; ]0 |) R* u" B6 M9 l - ;----------------------------------------------------------------------
L8 @1 ]) p. s" P( K. @- T" F - ;播放下一曲
1 I% H2 O3 y* W( ?( z - Music_Play_Next8 J# I- c4 j, J0 L0 k, s; P
- LDA FC_Music_Index Y" S; L3 F I
- CMP FC_Music_Max_Index
7 _. E) W2 r% b& E R0 \5 H - BCS .End
( s9 K$ a% Q0 d1 }5 L$ z - INC FC_Music_Index
# ?4 d- S& \6 w- l; t - LDA FC_Music_Index
. K0 V% w' r4 D! H - JSR Music_Init_Process" d5 i/ T, A- _# |" @9 v8 x
- .End# Y* i# o1 _6 u8 v n) k6 v
- RTS
9 K1 A! R$ Y( w8 V) U - % `# J7 K# O" O7 M. b3 W
- ;----------------------------------------------------------------------0 a2 n! L* L2 Q$ W" h) T
- ;播放上10曲2 I- h7 P8 [+ C4 U9 t
- Music_Play_Pre_103 ]7 \+ g) V1 O5 F; U% ]5 D
- LDA FC_Music_Index
6 O s7 r# Y# {! d! S - BEQ .End3 z! H6 N/ J7 q' E8 W( U/ |
- SEC/ `* l7 I g( l* M9 I! ]6 t
- SBC #10
% t6 m7 n% ]& S ~) ~9 Y; ? - BCS .Pre_10! ?- }: L9 J% A. e2 E! `% f
- LDA #$00. p9 Y! r& T8 P2 f0 u
- .Pre_10
/ a8 ]# G3 Z3 X - STA FC_Music_Index
+ v7 {' V9 H7 Q+ y - JSR Music_Init_Process
7 ?/ @( g' d: p1 d6 T0 T# {' Q - .End; Y/ R5 n0 ^8 q( }" N
- RTS+ G$ y, Y) y' T; b- x& P8 ?1 Z! T. F
- ;----------------------------------------------------------------------* J0 u' ?) H/ L$ m% v
- ;播放下10曲
5 z9 H; w) c7 c - Music_Play_Next_10
7 t4 ]( K' Y7 ?% u4 n - LDA FC_Music_Index
( J. c" g# V" h6 K* y- W2 l - CMP FC_Music_Max_Index# E8 y# Z$ Q/ p: r/ _; j- |# c# T! ?
- BCS .End
) B- F. w% k! s - CLC
! ^0 D5 X- z. _! E5 h% ?' j% B- T - ADC #10
: `' `9 A2 c! c( h0 Y5 d* }2 \9 { - CMP FC_Music_Max_Index1 X p; t$ h" J) y+ N% L
- BCC .Next_10
. `2 l" V/ G, [4 Y! I$ I, g L - LDA FC_Music_Max_Index( V' H; u$ ?! H+ S: H$ T$ T
- .Next_10$ t6 s# ~6 `0 |& R& S- ]5 d
- STA FC_Music_Index V3 j$ q$ J, c' E8 f! R# o! u* ]
- JSR Music_Init_Process& _5 i0 @3 S( }1 {' }4 `
- .End
/ _/ [! S5 E/ ]" f - RTS
0 U" s' V( C x4 i- B ] - ' d- C& t0 K5 r2 a
- ;----------------------------------------------------------------------6 w2 H6 ]8 w: J
- ;8位十六进制转3位十进制制) ~4 g& T* i" W1 t
- Hex8ToDec
! q# d0 S( O$ G' l* A5 N7 X - STA FC_Dec_Data_1) L5 V, t# F" U4 B, ~, M$ c
- LDA #$00/ |6 g3 l' S" `& `
- STA FC_Dec_Data_100
9 n0 H% S7 P3 e2 g- q6 C - STA FC_Dec_Data_106 C+ e* u- k8 P" Q* T6 [
- LDA FC_Dec_Data_1
2 L9 m# A1 d, ~) g0 I% a - .Convert_100* F# i; S! r. |0 W- Y( m/ r5 i: S
- CMP #100
. V$ G# E: S1 g+ o# |9 f* K - BCC .Convert_10
4 D" ~% p; v! |1 |( [0 A - SEC
$ f1 W, A6 ?; t) B$ A - SBC #1006 m: l @# J: E; J$ c5 k; h
- INC FC_Dec_Data_100# N6 U& D! I, h6 E
- BNE .Convert_100# z7 u8 P1 {; C/ h6 \) `
- .Convert_10) B, C @- `7 k/ q6 p: u+ Q
- CMP #10
9 u3 I9 v! \3 e4 M c8 [ ?8 D - BCC .End
# c( p3 b% Y \* Z# Q" W - SEC! |0 e: i: d) O& d4 |2 }3 p( {
- SBC #10; t& T0 g! M; V( {7 p5 m$ _
- INC FC_Dec_Data_10
! s6 b: T0 _ e7 r* w* t: P' D$ x - BNE .Convert_10
q/ Y. p) X% U* I8 n. e& B - .End0 g" m, V) [- Q$ F( b" w- Z2 J
- STA FC_Dec_Data_1
. }2 u/ `0 M- S" x# J# o0 g - RTS
: k& g( k! ^8 s" w% K
, F2 |, T0 R0 o$ `- ;----------------------------------------------------------------------
: B3 g6 ~) ]4 |( C; O1 ?2 Y - ;显示曲目信息
+ Q; d4 w" K. s9 B! w4 d }, } - Music_Info_Display
& u. _, \) a' {- \ - LDX FC_PPU_Buf_Count
+ Y4 ^$ g4 K+ ~" q2 P% w - LDA #PPU_WRITE_MODE_CNT_LINE I3 \# \4 z) o r9 R
- STA Use_PPU_Buffer,X) @ z; t- v. L" U0 h* C. P2 q# t$ d
- INX: I% e) @* ^; a7 ^$ i) q, Q
- 8 [( r# z+ Y3 G$ S' G
- LDA #>MUSIC_INFO_POS
! B# x+ U: v+ q! Q - STA Use_PPU_Buffer,X1 A' u8 o4 r& S
- INX( @+ V& y! O4 G& j
- " {. T( R O( C6 x* |
- ;居中
5 Q- K3 P! T. H0 ^ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
6 g1 t |# k: T - STA Use_PPU_Buffer,X
/ r0 C& `, @9 B, V5 e9 a - INX+ O: u4 i" `- S* O" |
-
" ]2 k8 h" L c4 h - LDA #$05
3 s3 l1 v; T, Z0 y; Z9 ? - STA Use_PPU_Buffer,X2 i9 d4 d5 q, ^9 _' F
- INX
# f. e% T/ q: t* q -
! e" G# w4 ^/ v) s2 q7 A" F - LDA FC_Music_Index! v6 y1 l8 T7 q/ Y1 M( z8 }& X! g
- CLC) D: u. o0 B0 ]. @( e9 B
- ADC #$01
$ t$ p9 }: d' o' r - JSR Hex8ToDec
/ k' u" q* R! h# W; i - a# y" d5 ~* E8 B/ l9 Y. ^6 Z
- LDA FC_Dec_Data_10
( y$ z4 O9 C8 L& u - CLC5 G# D \. }( g2 F' ^
- ADC #'0', w% U7 }, P0 w( l# n+ f, T
- STA Use_PPU_Buffer,X
( @7 G* w) h* C& W* f; L4 D - INX
. v, U/ D/ t# D, @; v v - N7 [* ^9 G }* B0 \
- LDA FC_Dec_Data_1
& R+ p, t. @% l' A. w - CLC9 @/ w3 ~' k+ V5 u
- ADC #'0'& w8 K1 w( [- { M
- STA Use_PPU_Buffer,X; N2 s9 z3 V8 a+ C( y7 w; [* N/ l
- INX
$ K! j5 z: Y! q; _) { -
3 V7 \0 l2 ~6 T- H5 o- \ - LDA #'/'
" H& w# W& C* y+ a1 V: d - STA Use_PPU_Buffer,X* ~9 s& h& j4 ?) m& B
- INX( d Y' U; O9 h% J6 p W# f
- 8 d9 V% ?. S, E2 ^
- LDA FC_Music_Max_Index1 g8 Z9 Q4 K) W% {! I8 R
- CLC
4 Q; x. R9 v1 H# J- H* x: c; W* ~" o - ADC #$015 \/ P' C" U) N- Y$ Q
- JSR Hex8ToDec
- ?% m- S& _) \ - 6 r6 h& C }: ?6 R
- LDA FC_Dec_Data_10# y8 a/ F8 j& H& e0 s7 d; e
- CLC* I& I% R$ I1 X3 G5 o0 ^
- ADC #'0'0 |+ @: i% s3 P9 H! o
- STA Use_PPU_Buffer,X
2 R0 k) T- [: B/ Y* l - INX
5 S8 V, b# |; n2 y3 k! h3 F% g0 T -
) g, P6 R( H6 s* W; F - LDA FC_Dec_Data_1$ N7 q& ^6 |$ Q, v7 p
- CLC$ O; d( T. Z7 H, l
- ADC #'0'
' E" G8 z6 u1 g6 x* o% _) `/ s. E - STA Use_PPU_Buffer,X) o, ]7 N. J$ F3 S$ o3 y a. Q, k9 u
- INX
+ w E0 d1 Q" A& U! s - % D% x6 {& G# Q3 ]; b4 X7 e4 B5 {
- .End& o# }- S7 Z3 I$ y4 R' q& a% U
- STX FC_PPU_Buf_Count$ j6 k& R7 s* t+ }) C3 _4 B
- RTS3 F6 m# j) `% Y) d
- ' _4 p/ y4 w( }6 s6 D6 i
- ;----------------------------------------------------------------------
* \ v/ i1 V( d, { - ;音乐曲目初始化处理
( ?6 t6 `8 I- R- Q4 a* T+ P - Music_Init_Process: x. @: b; |# o2 i, c. l
- PHA* h' i1 O# e- X
- JSR Music_Clear_Process
8 l$ b, n: a5 R. E7 C9 s - LDA #$1F
2 x; r4 H d! Q - STA $4015
. o9 Q" O! b9 ]& G4 P7 c1 }# b* i - PLA. Y& _, p' w: Q7 n
- JSR Music_Init_Addr
6 L0 |$ D( P0 V7 \! |3 h: ^ - JSR Music_Info_Display$ S+ T% \! n( r
- RTS q X9 `8 [9 U6 \% H8 r. J
, r0 P! {5 W! K8 r- ;----------------------------------------------------------------------5 a% B% Y+ ^# L) n2 F$ q& f
- ;音乐播放处理7 o' l# o$ U v
- Music_Play_Process
1 ]5 y; B0 R% s - JSR Music_Play_Addr
7 }5 h- i+ [. h: Y c - RTS9 B& \! o: F7 ^3 F& F o
- ( R7 @' Z& p R+ u
- ;----------------------------------------------------------------------' }2 [5 n* L$ d! }
- ;音乐播放处理6 B0 [' t% |. O1 p& L1 B! K$ v
- Music_Clear_Process0 Q5 C2 q2 ^+ g/ h5 F$ K
- .IF Music_Clear_Addr/ M- Z+ Q D" y7 `
- JSR Music_Clear_Addr3 x6 m, `* N" O! n$ q
- RTS4 V T6 K& J& X/ }$ u2 \
- .ELSE, v% \4 q/ @2 u9 N1 T* l
- LDA #$1F$ ]5 B) C: R6 W" E3 H, j6 B4 `
- STA $4015
% V7 j5 _- S/ k4 K - LDA #$00
. e6 |" p6 n1 F2 t5 _ - STA $40102 I% ?7 g/ Q% `$ T" u
- LDX #$00
6 p8 v8 n* E& x - LDA #$009 v9 t8 I" b5 p0 R
- 7 m: t( M1 q. F, D/ g9 P1 B- g
- .Music_Clear_Zreo_Page_0
9 y8 w4 ^: L6 p: ] - STA $00,X# h' q% |9 O! r: J
- INX
) _8 {6 h% B Q9 R# \ - CPX #Use_Zero_Page_Begin- c8 ~/ T- ? d& y- P
- BCC .Music_Clear_Zreo_Page_01 |6 @/ C, g0 R# Q1 z! q) s
-
7 d9 f3 ~! O' F - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size* {5 G, g; b, g( D7 l" S, H
- .Music_Clear_Zreo_Page_1& `* K2 `5 b; n
- STA $00,X; n G. p. D. ?1 \7 s& I
- INX
5 c& v6 j% `9 w' X6 e' S9 W - BNE .Music_Clear_Zreo_Page_15 B0 q& ^ j4 c: y$ z$ a6 }
- 4 N4 R l8 T p6 J5 x4 a" P
- Music_Clear_Process_1* b" I' H$ I: A* C& f3 P
- STA $0600,X
% {% b" l. \" ?) u) q - STA $0700,X
6 {! b4 B) t, K% ]( `5 `7 c ]2 m - INX
1 E' r0 Y8 s- ~6 L+ X% E$ _ - BNE Music_Clear_Process_1
& Q/ A5 O" ?/ M6 ~ - LDA #$10
5 }0 {3 d' v4 D/ T) O - STA $4000! [$ Y6 ~- W$ Q+ n# h
- STA $4004: F% {0 X1 t9 O" s; {
- STA $400C
. Q, }0 z1 m" T. B/ h - LDA #$00
/ d7 b1 A; v- d0 Z u - STA $40085 Z0 L- o/ H+ r* {
- LDA #$0F# o3 T2 h* P+ q
- STA $4015
1 S) B6 \! j: I+ \+ N$ _6 R( D) M - .ENDIF8 q A: {9 E6 ^: Q" w' l4 O" b
-
: d! ~$ p1 l- L0 [# O$ _! }% b - RTS
9 E: d$ N$ r' T# X/ n$ t1 H' @3 q - 2 j% K/ w6 Z; D1 \) M8 _
- ;======================================================================
" V1 d* G* C( \ V3 X) ~ - ;重启处理
5 \0 R0 W0 i; L+ Y; B. q7 G - Reset_Program
3 k, J% l' p9 p$ i6 l, E2 `4 Q- ~ - SEI$ |5 F/ i' R5 |& C5 F0 U5 y
- CLD+ `2 c2 p1 d0 y) v% J0 L
- LDA #$00
! s( q9 t: [- U' ?2 \ - STA PPU_CTRL
$ c4 w/ ^& T: \: b6 w; F% }5 }3 e+ u" f - STA PPU_MASK
+ n; \6 ^; d: d. B - STA JOY2_FRAME
8 j% e7 |+ z' P Q( t, f, v - STA APU_STATUS# h* v1 F" j" N+ c5 ]: v
-
( h* f2 v" B! |2 S g: M" f8 H - ;等待屏幕准备完毕
$ D7 I0 ~4 H& \) x - LDX #$02 t% B7 o: \: d$ H5 x
- .Wait_For_Screen_Ready
: V5 w* m+ U& N1 t - LDA PPU_STATUS
: e! w) Y8 A; T - BPL .Wait_For_Screen_Ready& S# w h7 Z# o) e( E" A6 `0 N% z
- DEX
6 ^0 h) j4 l2 M- t7 b' ^/ Y - BNE .Wait_For_Screen_Ready8 X9 X) o8 M( ]* g& ^3 C7 v: a. z
-
0 R2 u! m( I$ l - ;清空调色板
' ~% p+ ~+ C# k - Palette_Clear
) Q! {! i" E! @2 k O - LDA #$3F( N3 q# Z8 [ M, e, t
- STA PPU_ADDRESS* X: p4 g8 ]- t( y
- LDA #$00
9 y0 t/ v: H& L. P - STA PPU_ADDRESS- `6 l, |9 h& r+ V3 o: j5 A
- LDX #$20; k4 |* W6 s. [6 F
- LDA #$0F
# G ~; M* \3 o' b5 i% T8 |4 D - .Write_Data$ {* u3 u8 o" T8 t: w
- STA PPU_DATA" Y( {6 `' h7 c/ Z1 M
- DEX- F# u+ {0 [$ f; U" v% f
- BNE .Write_Data
6 r- \8 E, K# S: d% ~
/ O& h0 y$ R2 K' Q) `* F- ;清除声音 $4000-4013
5 ~/ b+ A) V) S: n9 q% r6 V$ x - LDY #$14
! y" E( i" \* X& I/ m6 x0 ~9 S - LDX #$00
2 y: I2 l3 _" \6 l+ h3 O" P; f - .Sound_Clear
: K% N! Q/ P+ C. X - STA $4000,X
2 z0 E8 K: f/ d4 `0 ~ - INX! V' C) J1 ^5 {4 E
- DEY5 o5 P' v- x( G
- BNE .Sound_Clear L, R; Z0 ? \; h
-
, U0 R2 r7 O* ?; D- u, W - ;清除 RAM $0000-07FF, t# i& T1 E0 {
- LDA #$00
1 w! D7 K' T- M4 G& q4 I - STA $00
- i# Y7 h7 W: U3 R" y) g: |2 r9 C* s3 b' _ - STA $01* q$ W, Q4 r: P4 x6 H) [1 d
- TAY; k, \8 q, H" U, \9 |5 H' @
- LDX #$089 V6 A+ C# @% u3 d! m! i& G2 H
- .Memory_Clear2 r# v6 c* M$ |8 \( Y
- STA [$00],Y" ~$ [) \8 P4 h& C b
- INY
6 U* o2 x$ S6 K$ \ X8 t( J# W - BNE .Memory_Clear8 l s; p1 c" h( }4 {% y
- INC $010 i* _8 e! S9 Y+ n
- DEX
4 e* Q, L; w% H$ j; u2 s" c - BNE .Memory_Clear
# i# |. A' j$ Q* d0 j - / h; ?) O9 R: M9 J
- ;精灵缓冲初始化1 u4 T' I3 [/ o1 h7 |, o' @3 s8 z
- LDX #$00$ P7 c- k/ A) N, C7 e
- LDA #$F8
6 }( S: q6 V5 Y1 V - .OAM_Clear+ J' t/ g& [6 R0 D. D3 S
- STA OAM_DMA_Buffer,X
/ A- ~( ~6 U: } k: J5 ?3 y1 U - INX
" {* O) K/ B0 {5 e' v0 [7 T0 [0 c* d. b - BNE .OAM_Clear
6 b! r5 |8 K( H -
) x4 L8 K% ~2 I% [6 G2 e4 v: N5 A - ;栈指针初始化% P6 V7 j" c) o! b/ I
- LDX #$FF
5 B! |3 Y9 E2 [ c) T8 O6 w - TXS
9 ^9 b% R: F/ I7 m: S' |9 U -
4 f* h" E+ C# a# r* }6 Q$ {- Z: d - JSR Nametable_Clear;命名表清空# C0 G, O- R9 E+ B: C1 ?- j
- JSR Palette_Init;初始化调色板缓冲
- m4 C4 ]3 c' ^9 G - JSR Static_Text_Init;初始化静态文本5 ]; X% a& i" ?" Q% I
- ! M. R' p) ~* b, x. W1 p
- LDA #MUSIC_ITEM_TOTAL - 1
- o0 x) G9 n3 a - STA FC_Music_Max_Index4 ~. x) z% G3 \# p1 D
- 2 l" J# Q7 h4 r h3 F+ ~& Y2 }
- LDA #$1F
1 Y& _( N( B" \5 Q% L - STA APU_STATUS
) A- G( p2 j6 @- } - LDA #MUSIC_BGM - 1
& _3 @4 a6 c( r T3 @9 @ - STA FC_Music_Index, L/ [9 p( [$ K7 p) t
- JSR Music_Init_Process;音乐播放
, ?* _1 I# Z* ?" o! J - 3 P \- z$ f' g8 {1 t$ q% [$ y
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)8 {1 ^# g! }# f; Z! B) M$ Y
- LDA #$1E
, n4 u) c! D* J( | - STA FC_PPU_Mask_Buf2 E2 Q# e6 m, p3 @/ l% f8 D
- % K9 a" c8 O+ _/ E# E) T: G) j
- ;启用NMI处理
" x6 r; @7 j5 f7 V" |3 C* \/ | - LDA #$80) s3 q0 }6 I, B+ ^, T% z. E, Y
- STA PPU_CTRL
! b& ?9 i' z3 Z" z" F& k0 P - ! Q; I* t9 a* {
- ;程序循环, 剩余工作交给 NMI 中断处理6 [! g( K$ z6 v' x; t- X1 w
- .Loop; R& Z5 S" @4 a9 ^5 f4 u0 x$ V
- JMP .Loop# i! X0 r/ h" J, o! Y7 B% N+ z0 t3 D
4 Y' ?1 `7 e5 j+ } d- ;======================================================================
+ {' _) f% b; _# U, N% U6 D' X - ;不可屏蔽中断处理. k5 |- N F' y) m) |' `
- Nmi_Program3 @0 r C1 C( Z; }& z
- PHA
8 v3 q5 O0 C: P! i- Y( ~ - TXA
& _- I$ E! E L- U! e! S( { Z - PHA
6 C1 P( N6 q! W9 T4 N - TYA
' N( F; z* x8 M4 Y - PHA* J! ^6 m R' T& X+ n ]
-
* ?" W _2 R* Y$ v) B! g& w - LDA PPU_STATUS;读取使得 PPU状态寄存器复位1 Q3 [2 Z- K Q8 P' @" w& v, K
-
8 @) T5 z- Y) B - JSR FC_PPU_Procrss;PPU处理
) x3 `( {5 k( H - 7 c8 ?% h% ~. l* p. p ^
- ;精灵内存更新' f8 E% H# ?* W" e5 l( `: S0 l
- LDA #$00
: A& }$ f3 T8 j H3 I, a6 g - STA PPU_OAM_ADDR
/ w0 L* j; R, e3 Y - LDA #OAM_DMA_Buffer / $0100
% W+ B. A, p: b - STA OAM_DMA
! k; _* c' x7 s& N8 \; C6 ~ `; o -
# @1 S1 f" a" G: }( p - JSR FC_Gamepad_Process;手柄输入处理; {" u3 m- B' ~/ i- K+ t
- JSR Music_Select_Process;音乐选曲处理0 J' _# s% i& ^* s& F
- JSR Music_Play_Process;音乐播放处理; A# w3 y8 j0 l y7 ~' |
- . s6 X' X# p: H$ G. c
- PLA
5 j% G$ b n0 ~& e8 r: e* s - TAY
; G" A) ]6 l, y5 A - PLA
: f9 _+ r$ t9 {. Q - TAX
) B0 ^$ X3 G: O& b - PLA
0 R; y2 L* Z+ \7 h9 T2 ?
# R+ F1 m7 l8 C6 t; U- RTI
* w# x. ~" @+ D5 V! ], ?6 L
1 j: V% F& s+ {6 {$ R4 b- ;======================================================================
3 q: p. b* a- t! C- z4 V( B' g - ;请求中断处理
& J5 B4 F) {: j, A - Irq_Program! V% |4 Q# i( h* c
- RTI) M. j, j$ d, V. \9 p8 D
1 f5 o( R; k; z1 x& o. V- ;======================================================================
0 k* M2 l9 A. P8 g% R9 d, { - ;中断向量表
4 r; q7 F; M- F, c - .ORG $FFFA
) F9 B( R9 x$ l- J. }; } - .DW Nmi_Program ;NMI触发时执行. Y3 n6 ]0 m$ t$ K+ X2 U& J
- .DW Reset_Program ;载入ROM时最先执行
$ ~9 _- }7 I2 p7 v; |' @) g# d - .DW Irq_Program ;IRQ触发时执行6 l9 h* w# }( n u0 P
复制代码
4 l3 r) C7 B" O' r& \
& D# t4 t3 t7 H# \: j
/ p$ \" T& L w" O9 G) Phttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|