|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下2 n* t( ~3 S: T( E( d

6 h3 p2 _1 E6 q/ F" F以下是主框架代码:
/ d; |1 v1 {& Q2 ?+ O' {- ;======================================================================
6 \' D4 l- p$ X, x - ;文件头- \) r6 A+ x V: V6 Q" l8 X) s
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
+ D6 F7 r0 O& `; n) S" T" T - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量4 q+ \/ p( U( |7 }; `# o( X
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
s% e5 _5 r* }# z! d8 K- I) I - ;======================================================================. b3 u I5 v/ |
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
Q" u* K+ H* w" c i; l - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 15 f5 f0 Y5 R( k4 [, f. ~* q" C6 h0 Q+ ?
- ;======================================================================& q2 M! E( G g( [% W+ s
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
" |& f) d4 A- U, V2 F" n9 _ - RESET_ADDR = $E000 ;主程序起始地址
$ B0 h! j, l) q7 o3 X% a8 g - ;======================================================================& y" Q. S2 [" B4 R
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 m8 `' P8 I& [" B
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
; }" I( m! j8 k* b; q; {; z0 w - .INESMAP 4 ;Mapper号 (0-4095)
% X0 A2 F& P! Y* X, o) q - .INESSUBMAP 0 ;子Mapper号 (0-15) O: t+ i# o E: g/ d' H
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
: ]8 |6 Z( [* m. Q) u. M" q& U# L - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, U: N# q6 y7 T1 {- Z - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数) m! B+ L" ]- B1 T
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)1 D8 [& z9 v6 M2 Z/ i8 d+ w
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
! {4 c) q8 X+ w8 _- t; Q0 U e - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数), \' Z) }, x. s6 {
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy): E2 }; j; t/ }; v; E c7 s
- ;======================================================================
0 k! }7 ?9 d3 [1 ^) R% Y - .INCLUDE "fc_demo_config.asm" ;全局配置
2 _6 P, J1 E P% F/ m) J" h! @ - .INCLUDE "fc_demo_constant.asm" ;NES常量
P) S8 ?. @4 K! c5 g - ;======================================================================
4 t. Q J" G3 v; t - ;音乐配置 s! X7 T: A0 Q E9 w
- .IF 0 = MUSIC_THEME
8 q) S; @% p1 p: z; v# o# B; x - .INCLUDE "data/music/Gremlin 2/config.asm"+ F: m& }' N( U# s/ g
- .ENDIF; g t H# m2 l
-
0 b1 g/ P2 s* E1 |4 J, U7 [4 ] - .IF 1 = MUSIC_THEME
: V! _" Y; W1 U - .INCLUDE "data/music/Raf World/config.asm"
/ \; Y' I7 d9 F - .ENDIF
9 B! o" H2 a' s. A3 b -
P2 p; ^& @. S! L+ C% ?9 b - .IF 2 = MUSIC_THEME + ~; p& a C- v2 q0 w5 Y# \# ?
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ T, V2 e' z& x% I3 u - .ENDIF! q3 V% d! x5 C" b( p- l
/ L- N9 J: ^- V% E( c( K- ;======================================================================
3 k5 K! h `7 `$ e - ;引用CHR图像数据- {- ~+ n5 i5 o8 m' n3 \
- .BANK NES_16KB_PRG_SIZE * 2! K2 M( w5 V* i6 z4 i
- .ORG $0000+ F- F4 m) S5 h/ c, z+ W7 `& o1 _
- .INCBIN "data/bkg.chr"$ K4 T5 Z+ M: {8 k+ w
- .INCBIN "data/sp.chr"+ f( h' s; C4 E# W4 @
-
% c; b n. H/ R+ z* B; O4 | - ;======================================================================
4 K, l( {2 d/ J- p- R - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 C+ b1 P/ c3 F$ |( \ - .ORG RESET_ADDR- u( {7 G, I$ u/ z1 @
- ;======================================================================
" j" f) t3 R9 F' o0 { - ;引用其他源文件. c! R" A+ |; i9 v
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
" W) o+ ^! E, _* u6 S$ T' H - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理* \: R: x9 W3 g9 y* Y! a9 _
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理 h9 [' \ w' M
- ;======================================================================; y% z% i( Y: z n' H
- " K5 H0 C6 o: V7 U1 J& S8 Y/ ~7 c
- ;======================================================================
2 [7 Z$ e/ X6 |1 T1 n& n3 G - ;等待VBlank到来
- m6 y2 w( _& m @ - Wait_For_VBlank
2 E) b& w; j8 j2 ]! ^ - LDA PPU_STATUS. y1 x0 C: ^5 l
- BPL Wait_For_VBlank" y0 b% |* d8 I& a( h0 Z
- RTS
% V: Z: d( d" l+ @$ u5 s - ( x* L% v8 K! ]
- ;======================================================================
Y' ?' Y) U8 p8 D% Y - ;调色板初始化
7 L/ l6 [1 @2 t+ R7 m* t - Palette_Init
g E" g0 O4 j8 x3 D - LDA #$3F
4 l3 ?' l% T9 n! D - STA PPU_ADDRESS: @$ X: g; V5 _
- LDA #$001 B- [2 B0 f( X) c; ~% q
- STA PPU_ADDRESS8 a: R% x( H. c- { L5 H
- LDX #$00' F6 s$ }: D9 X- [# |. }6 i
- LDY #$20; w+ [' N+ B! l! f' J9 o
- .Write_Data( s4 e* l& Q6 n/ e
- LDA Palette_Data,X
2 `5 Z W5 N1 N- ]# q - STA FC_PPU_Pal_Addr,X- G" G% ^/ w; z& W1 j1 L% r* l
- INX/ C8 D) W+ d5 Y9 I: y: }" M
- DEY( t& A7 B4 `, u1 y4 D$ o/ n
- BNE .Write_Data! U* B+ y D% R3 M
- .End
% I3 ?% ^1 C5 [% E' M - RTS2 n! W5 `4 S/ L$ e% l; O
- 8 @4 @# ?1 H- F) e- ^
- ;----------------------------------------; @2 p" O9 g5 p/ e9 [$ P
- ;调色板数据; `# R* ~% R z# i
- Palette_Data S w3 Z. P7 I5 m3 u+ g$ D0 N
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
* b* t t& E; X0 I% [+ Z% g; q7 C - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22, [4 p- Z0 V* I' j* n5 B1 t
- * p% G* M- |) X, J0 D1 {
- ;======================================================================, k3 v0 @! f, v1 }; E2 C+ a
- ;命名表清空
5 C0 A" t9 E) b - Nametable_Clear% j2 p! e; }! }8 r8 Q
- LDA #$20 t5 \% {; X7 @
- STA PPU_ADDRESS/ ^" U# u3 X/ v; x, U
- LDA #$006 ~1 W) o% t0 ~( M8 q
- STA PPU_ADDRESS. A" Y- @& h, i+ O+ K
- LDA #$00
. m8 h h) @& ~4 l/ P, F* \ - LDX #$000 y# @+ _/ B8 r
- LDY #$088 S M6 f1 K8 j% b) c
- .Write_Data! T3 W) B$ j7 Y3 ^( y; J: H$ n
- STA PPU_DATA
" _: s, l1 X1 r, l+ c/ f9 w% l K - INX2 m+ t$ t1 f/ N
- BNE .Write_Data; Z' e3 h+ b: ~: M
- DEY7 \; x. Y" _0 g- \. y6 Z
- BNE .Write_Data
3 C$ ~1 ~- R! ]" ]6 f - .End1 y, m6 }- I7 g0 @
- RTS9 _# `0 D/ f2 R3 r9 i- O
! P) P# k6 x4 S" D/ B% n3 i ?8 h- ;======================================================================
* t* M2 R, U/ o: l3 A - ;音乐曲目切换
/ L2 i1 A/ V" |/ Y3 V( { - Music_Select_Process
" T8 G' P( ^3 P7 v' \ - 8 j F9 l7 ?0 n- V
- .Pre_Music;上一曲
9 `9 h, K1 f" r0 u3 H8 ^0 c - LDA FC_Gamepad_Once4 {+ u9 E8 A1 v/ T# S3 t ]
- CMP #JOY_KEY_LEFT
8 K8 [( t2 I2 ?* o - BNE .Next_Music
) r3 `" c% G/ A+ Z' x: C# R - JSR Music_Play_Pre( ~ s8 X/ { h$ r# A" h
- .Next_Music;下一曲/ h& }! a5 ~$ e) ?$ w
- LDA FC_Gamepad_Once
& l! [& x4 B9 B! [5 w - CMP #JOY_KEY_RIGHT$ {$ z; J& O# |8 h% p: Z( }9 h1 U
- BNE .Next_10_Music0 o$ p5 D0 f+ W7 }( J
- JSR Music_Play_Next
% m: {4 N {6 N* _ - .Next_10_Music;上10曲
* q! I. R$ k" J - LDA FC_Gamepad_Once5 p2 `& \ X/ z: f8 _
- CMP #JOY_KEY_UP
. T( H! Q0 g$ }" o' t: R - BNE .Pre_10_Music
& Q1 h5 }5 ~! ]* o2 t- p& Z - JSR Music_Play_Next_10
& D3 a* ?4 |* g: H - .Pre_10_Music;下10曲5 m1 R; g0 s. X0 I5 u f5 z9 z
- LDA FC_Gamepad_Once* [& g! {! F9 Y8 N: e4 |, _
- CMP #JOY_KEY_DOWN
& n8 v) ?/ K! \6 x1 X$ w' B - BNE .Reset
3 y* s3 w$ B# F. o: B - JSR Music_Play_Pre_100 S# ?/ s% c0 N$ U8 o* G- Q
- .Reset;重播当前曲目
4 X' ~$ Y0 B2 c - LDA FC_Gamepad_Once
6 t" c5 H* d% a& w5 c - CMP #JOY_KEY_START
* v0 h/ h' K- _ - BNE .End
& H- V- I0 J4 i' E, m$ o& \4 c - LDA FC_Music_Index
6 }4 F8 t5 k% ^& I% u4 R - JSR Music_Init_Process
8 j$ i. Y# h( A4 w0 w4 z - .End8 {% i! O8 j* Z Z
- RTS
# s9 \8 @. S6 X1 V( s0 @
3 C E$ k1 V( ^: {, y" h! L+ E- ;----------------------------------------------------------------------
! V! s; j8 ~! N) _0 u" j - ;播放上一曲
, n m- B* O0 b4 n, j) v - Music_Play_Pre: U1 y9 r3 B5 Q
- LDA FC_Music_Index
/ Y$ T- A. |) M+ c' G' M% K - BEQ .End" E' I1 F" V |: ^, [+ ~
- DEC FC_Music_Index
# ^) J) Q" P- G( s2 J7 E - LDA FC_Music_Index
6 `2 _5 o; x( R - JSR Music_Init_Process& ]: n; {1 t2 m% t. l7 C9 X
- .End
3 C0 I6 p8 }4 h3 p& k# c8 }6 B - RTS5 O Z; Y2 x; h% J
- ;----------------------------------------------------------------------3 H& i% R! @' `3 {
- ;播放下一曲
# v6 J1 U# _: ?" C) v, X& r7 o9 _ - Music_Play_Next
7 @* N8 k& v0 J) C/ t3 J4 P ^ - LDA FC_Music_Index W# ]9 G3 u9 U4 U+ Y9 X/ N
- CMP FC_Music_Max_Index
7 R1 p/ ]9 {, Q8 [. Z# x1 m - BCS .End- N' h+ ]( I) C0 W; a7 |( _
- INC FC_Music_Index& i# o+ y; s3 H* I- C
- LDA FC_Music_Index3 L, v% n: S& @: t3 ?
- JSR Music_Init_Process6 j( K. t2 w0 z/ V3 Q5 E( O4 V; |- w
- .End* E, \. [6 N, o/ J/ \' p* G; F
- RTS
1 z9 y8 C; M' J, W' ]6 R0 a
S! h$ w+ u* K0 L! a- ;----------------------------------------------------------------------% t9 R, ?2 n9 m+ G Y1 K% U3 h
- ;播放上10曲1 a% y# p+ U! @4 v4 j
- Music_Play_Pre_10 T6 c. p+ _+ P& s
- LDA FC_Music_Index( p' b3 a9 x& L. U7 B; l
- BEQ .End
0 k/ p5 D5 D( I' {0 E5 C+ S3 _ - SEC$ }0 ~4 q* a, V: N4 K
- SBC #10
, u9 G: |3 @( o/ p - BCS .Pre_10
9 M* C, H4 C4 a. g2 y$ } - LDA #$00
8 M3 ^; z& w7 M% V - .Pre_10
6 P! q( x; u& E: ~) s5 } - STA FC_Music_Index1 T+ }. n1 X" C1 ?: q
- JSR Music_Init_Process
; _2 _) \! i3 n) ^; J: G0 t1 `% r1 I - .End
# z5 x. x% ]9 G" D; j - RTS0 L, O7 S2 a: `( v4 }' K v5 G* o `
- ;----------------------------------------------------------------------1 d" q0 p" p; F
- ;播放下10曲
( Q( n3 q4 |$ n3 U. n& l - Music_Play_Next_10
+ r1 b+ r, V7 }1 a2 u u - LDA FC_Music_Index
, c; N; z; {5 O; Q- z - CMP FC_Music_Max_Index
! }! t6 Y6 t" S& c) r* L - BCS .End
7 B5 z. i6 E! R( Q7 ^ a - CLC
7 J, j4 l9 i! q( Z - ADC #10. _) T- X: F% G- W5 ]* U) W
- CMP FC_Music_Max_Index
2 O0 _* D9 Q2 A# S6 }- A - BCC .Next_100 s3 p3 A r/ m& Q( }
- LDA FC_Music_Max_Index
* }) o% |1 W! O$ U/ l8 T - .Next_105 T j0 y2 W/ v( h; j- A& [
- STA FC_Music_Index
. D {6 \- j" x6 X& T0 J - JSR Music_Init_Process! |) M1 h+ I0 }0 o+ ^
- .End
; D) ^0 A& _+ i& K u4 |4 [7 ] - RTS
! [9 j) q5 z3 k; {5 Z
' v+ x Y- {) Z4 `' ~- ;----------------------------------------------------------------------8 P' o2 S' R( A9 Z7 w
- ;8位十六进制转3位十进制制
" f% l" N3 F. y' R5 h. ? - Hex8ToDec7 L: R! f# H3 M% V# p$ s- d4 Z9 r( G
- STA FC_Dec_Data_1
& }- ]' K) G( T3 J3 A/ [6 l, d8 Z- B - LDA #$00% N% p, L% V4 q7 N- Z
- STA FC_Dec_Data_100& I6 G9 w; x: b0 q/ f/ i. y' B
- STA FC_Dec_Data_10. v3 `& U! e4 k, H6 H0 {- E
- LDA FC_Dec_Data_1- Y3 a B- `( C. F* H$ p
- .Convert_100
: r! a2 Q) {1 O0 O' q) Y - CMP #100
$ H$ j, s$ s' q6 o( j4 M4 z - BCC .Convert_10$ \6 s" _2 y& e$ W7 I% X' l7 U/ _
- SEC0 G3 @2 d4 c$ ^2 y% k2 r
- SBC #100
, ~# \; F: k7 T+ H3 b! k' o - INC FC_Dec_Data_100% g* v# Q. }* s+ u ]
- BNE .Convert_100" C8 B, E. I' {! O; Z* A
- .Convert_108 a {7 Z9 n2 T. m" {! p/ j
- CMP #10
' A! r" U4 ?: R" j" I6 [+ k% } - BCC .End6 F0 q; E( A- G
- SEC* K8 k% L( l- ? M4 r3 e# X" {
- SBC #10, H2 m; H; O. c# Y f! v* I
- INC FC_Dec_Data_10
& p) L5 \% t, T. U' r1 R1 b - BNE .Convert_10- [. F4 ^! ?: Y, S: s; u
- .End
! ^! g0 J! S4 {% B - STA FC_Dec_Data_1
) k' J; @8 |3 N, S4 r. ?& N - RTS M( P1 u& G O$ M6 S& t# l5 m$ T
- Y/ t, `1 C+ J$ n, l: }
- ;----------------------------------------------------------------------
" B# K% N* U# G q3 w - ;显示曲目信息$ s# R* Y0 M# p. r
- Music_Info_Display
! j% A. L% ]% K6 M2 {- V# S - LDX FC_PPU_Buf_Count8 A! h- f9 ^! [- o
- LDA #PPU_WRITE_MODE_CNT_LINE
$ w, ^7 n( p- [ - STA Use_PPU_Buffer,X
; `" x/ A4 C8 c+ V2 S9 N; S1 h - INX) n+ B4 T( f3 A! C; M
- * c& R: }) Q" p; t; t
- LDA #>MUSIC_INFO_POS
9 O$ I {! M) V/ A - STA Use_PPU_Buffer,X6 j; R& }6 h4 ^7 Y2 Z
- INX7 l8 X5 ]( x" j& _, W; x8 C) P: D" `
- 6 ^$ m2 B" g. j k e( i9 q
- ;居中
# i$ I* M( ?- t) s$ P2 f - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
I7 [: y0 C7 d v4 D& x7 A8 @ - STA Use_PPU_Buffer,X
6 Q7 x; @$ X4 ~ - INX# n0 l3 g( ~; S6 F# ?2 t, Y( l, j
-
8 ~: ~+ x; W( q& @& Z9 J3 a - LDA #$058 g# | L) i5 l Q
- STA Use_PPU_Buffer,X8 w! Q0 l# \, P0 i/ v* W
- INX
, M% N' u3 x1 c - 1 _1 s, }0 Y( g+ K
- LDA FC_Music_Index
/ y( a# Y( `0 K; \: R - CLC
+ F4 T9 s) Z; u8 c5 I. Y+ v - ADC #$01 T6 Y4 m9 ~- j
- JSR Hex8ToDec' `+ |" w0 V6 @- d, J
-
# j" A9 M6 N' b1 r) T - LDA FC_Dec_Data_106 o# I! q" k) g% x% Q
- CLC+ ]( i$ t4 l" @* a9 B, o6 z
- ADC #'0'
& W" W% x* K( r( | - STA Use_PPU_Buffer,X
0 y. V( O# \1 R% x$ d - INX
1 W8 V3 h. l( `9 I - ! p& a' s* d8 P( X$ ~7 n; K
- LDA FC_Dec_Data_1
; {0 V/ r2 \( F" l - CLC
9 X! E( g- \" d - ADC #'0'2 Z9 y, H; o3 O8 t+ J1 c- s
- STA Use_PPU_Buffer,X3 r6 D, h4 G) H6 Q
- INX
, _# {% i# h2 j+ \1 Q- e; Q -
8 u5 d4 ?: r0 W2 C# f1 u - LDA #'/'
! q4 T1 T$ A6 d - STA Use_PPU_Buffer,X
) `# F; v* Y6 D - INX; W9 K( J% f5 I0 l/ D ^
-
& j; k/ R H9 U& F9 Y - LDA FC_Music_Max_Index
$ D4 z" a8 q8 n7 \! L - CLC
- B, c, D% l" P4 q- N! H - ADC #$01
& i! `1 h9 q5 F- Z4 c - JSR Hex8ToDec' g @# M6 B3 O# T0 x, Q5 R( d
-
" r( R: m6 T! N$ j. K/ Q - LDA FC_Dec_Data_10
. o" N9 ?! R2 P! | - CLC
9 p1 e) Y8 b" S w: Z6 c( J - ADC #'0'7 @! g1 F7 s1 w; w0 y! c0 ?
- STA Use_PPU_Buffer,X
5 J" E2 G* W& M/ m - INX
+ V* }/ `, ~! }" { -
8 c$ t1 `' Z# e3 I9 o* @ - LDA FC_Dec_Data_1- A5 ~7 N( G Y: y
- CLC% l; A0 h2 ^, j0 X, T+ `+ d9 Q
- ADC #'0'
- {! t% O5 f5 [/ D- S x - STA Use_PPU_Buffer,X3 h2 d! s- q% N% Z4 b7 ]
- INX! O8 [; ~; ^$ G5 t S
-
& \3 ]+ l1 ^6 Q/ u$ g4 |4 S - .End
' T. h; T! D3 B# Z$ i8 n - STX FC_PPU_Buf_Count
. d2 i7 a$ D0 y, _2 z - RTS2 e7 s: U3 r: q# }; {6 C0 V
- ) p3 W2 C$ o) g. w2 M
- ;----------------------------------------------------------------------/ j" j- l3 H* h% d
- ;音乐曲目初始化处理
) b! G7 Y* }, v2 } - Music_Init_Process) I) G, h$ C& I" M2 k5 f
- PHA
, b: L& O/ ^2 G- T - JSR Music_Clear_Process3 }0 z- \9 s; y0 [( ?/ z4 W
- LDA #$1F
- S! q' P# O5 d4 b5 ~% y# f - STA $4015; E! l$ r- I1 t
- PLA
) M/ ~& b5 A" n( r - JSR Music_Init_Addr
- z, ]) K' `+ h/ A0 ?5 J$ t5 `2 c) v - JSR Music_Info_Display
( _: E" Z; j" S7 G - RTS
$ ?. w' i4 t H& ?
! B* J1 A+ M; L( Y- ;----------------------------------------------------------------------3 D' G f0 l1 _) L) [* @2 D7 \# B6 C
- ;音乐播放处理# ?* q+ h( Z2 t2 i6 }
- Music_Play_Process* S4 L6 u9 r- D8 }) w- I/ Q
- JSR Music_Play_Addr3 N: U1 [5 A1 }4 ]1 Z$ u
- RTS2 t, q; B: U! s. j
# f0 E ]' z5 _: S" J. \* V- ;----------------------------------------------------------------------
8 i' m+ z# w/ a) s - ;音乐播放处理; L6 b8 ? O: ~7 U
- Music_Clear_Process
4 t$ d h6 |9 i3 u3 v: z: x$ { - .IF Music_Clear_Addr+ t6 T2 m9 `* D# H0 t9 ]' \* U
- JSR Music_Clear_Addr
8 W9 s7 {& T; w2 F% p$ U, s6 f) g - RTS
% P2 T4 M, ?; z. s. m8 x2 r) T - .ELSE. V( H. u# t# C) T
- LDA #$1F
9 Z' P) ~4 B, I+ {; { - STA $4015
+ H+ G* H& Y0 K, I - LDA #$00* m- b+ y* P/ I- G2 I4 X* j
- STA $4010
; L/ |$ A1 @* ^' }0 V: G - LDX #$00, A/ y% d' }/ f
- LDA #$00; R* l0 z: J. a' L% P: } i# I
- ; j/ X* h- o, q7 C. I
- .Music_Clear_Zreo_Page_08 ^/ u/ }6 K1 }
- STA $00,X; J; Y p: ^+ @
- INX
% g6 E" M) P; k: E4 z - CPX #Use_Zero_Page_Begin
/ R; z, a% J3 l" E) m5 n - BCC .Music_Clear_Zreo_Page_04 S1 a; f* I9 V
-
7 c& j" _$ P- Y0 W( @: M/ a - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size( T/ N% p5 S3 e& Q3 t" T) z
- .Music_Clear_Zreo_Page_1( i2 V! k8 d3 Y% ` [+ o& u2 i/ y
- STA $00,X1 f9 p& X d: C% v) y
- INX
0 f" J B8 g* P8 V - BNE .Music_Clear_Zreo_Page_1- e3 \2 d% n! z O7 \
- $ d# b @& O7 f
- Music_Clear_Process_1" L& T0 R- M( S, R) ^. ~% e
- STA $0600,X, Y, k# R2 ^4 K
- STA $0700,X
% h& h$ @( Y! ] - INX
1 Q0 y: e* E# c* P - BNE Music_Clear_Process_1: a; b7 j2 `# O7 Z/ Y' O& O" C! g
- LDA #$10
- n3 \4 ~1 s/ G5 y; ] - STA $4000
& A5 ^5 |3 K' B% D& N - STA $4004
" ?( b3 X2 |7 z8 n- E" F - STA $400C
: w5 D* Q; u0 m! Q - LDA #$00
8 a& {* `4 E2 f/ U0 ~1 N0 @8 R% \ - STA $40085 f1 U _; c$ ~; e
- LDA #$0F: Q0 r$ t$ U$ L
- STA $4015( u( i- d' L6 v$ i$ c
- .ENDIF
4 ~6 L4 C. {, _1 Z" s2 V -
( o7 s- C9 p& h - RTS
; g3 j7 l3 n! J" v! w4 @
) Z4 B& o7 H4 ~" z* q0 {# f- ;======================================================================
' ]( i! E8 u' R; }! t/ G - ;重启处理$ l6 l# v- c8 t/ f
- Reset_Program
( z$ Z( ]3 m# o4 M: R2 b/ o# D. M5 r# R$ Q - SEI
! k9 l) P8 L( ]( G" D& W1 e. q - CLD: H4 C' }7 O1 k
- LDA #$00
# N5 V. M, x4 N - STA PPU_CTRL/ r5 G1 P% J: T
- STA PPU_MASK
! ]" a5 @2 G9 i" r7 t9 e9 r9 c - STA JOY2_FRAME% b! [5 X D; d# M* z3 {& H
- STA APU_STATUS
, C2 ~# [0 v/ ]+ D - % s6 `4 ?3 H! [% G! X. r* _
- ;等待屏幕准备完毕& \ Q0 d; n p" \. D( z
- LDX #$02
6 v) ?0 w. B) T3 S" d. I3 ^ - .Wait_For_Screen_Ready
9 E& E6 `# W7 U5 t7 z/ \: E - LDA PPU_STATUS
& j. h" u7 c- Q2 B# O: c - BPL .Wait_For_Screen_Ready
* C: u4 N o$ J) ?# z - DEX
- O: Z" G) K( s6 p2 B3 G - BNE .Wait_For_Screen_Ready
( q0 y: R5 ^# E6 z% U* A - G" C, f" U8 ^7 ~5 b
- ;清空调色板
3 t3 `) ^+ i9 C - Palette_Clear9 W6 T' {3 e3 L5 `+ j
- LDA #$3F. t) ~6 h2 f' m, ?$ f3 {. Z0 M6 H
- STA PPU_ADDRESS
Y: Z& s: L$ p - LDA #$00
# J3 c' Q. s6 k0 \2 ]; G - STA PPU_ADDRESS
* J) `4 B6 H( b/ a n - LDX #$20
2 }; [+ [3 y- X, f6 C$ ]5 v - LDA #$0F
/ ~; K# Q) I! S' A/ Y/ v - .Write_Data
/ b# {( K, U% u1 o - STA PPU_DATA
4 K) f" Q9 Z1 d1 y: b( O - DEX
4 S# i+ ^& k+ x* f. R - BNE .Write_Data
5 D8 u5 `' T6 r& {6 m# J* h
! v9 L+ l$ \. w- o1 y3 J% \- ;清除声音 $4000-4013
9 b+ ~ S! g0 u+ A2 L - LDY #$147 E' ~, Y* T0 j4 \6 p8 t4 j- G
- LDX #$00' J7 k8 s( y) S% b0 b6 }
- .Sound_Clear
" E4 R! q: b3 f - STA $4000,X6 ]* u$ U* F# [; w1 z3 \, D
- INX% F+ {1 u% J/ b- a( F; S
- DEY: x2 d1 p* v/ x3 Q- ?# z) H$ h5 s
- BNE .Sound_Clear
- w3 m) A" i) T; c -
- t8 p2 V2 A" H7 H N - ;清除 RAM $0000-07FF9 |. c1 Q- j9 r! O& ?+ Y
- LDA #$00
0 s; D8 z5 _0 Y( S, g& [2 t+ X - STA $00
8 `/ k7 f, ?% x) p9 I - STA $014 N+ s# ^% ^, ^0 J
- TAY/ o) \* |5 t, l5 C) K
- LDX #$08
3 Y& Y, n" x( P& e! r6 C - .Memory_Clear5 ~; F: x% v Z, m
- STA [$00],Y0 ]3 K# Y9 n8 i4 [
- INY7 E0 @# Q% {* @3 v7 l# h8 D
- BNE .Memory_Clear/ h& ~4 X7 u$ L2 l+ v" K1 _% G# k. x
- INC $01
/ w' q) ]0 O2 ~% \3 W - DEX
3 v4 B! f$ H o. q; M - BNE .Memory_Clear7 K" i8 G) q! i5 c7 v4 V
- " F/ o# l# m) N3 y7 J6 F( N
- ;精灵缓冲初始化
! p, H0 t* F; i9 I, l6 f - LDX #$00/ I+ t# e' g$ s' f: V& @
- LDA #$F8
+ M" J( V8 R, E0 l! V - .OAM_Clear
+ s" H+ m) T9 @4 E- c" Z0 ~ - STA OAM_DMA_Buffer,X
0 _( O' ~+ _ o: }0 z - INX+ M4 p. y3 e' F9 V% c1 a+ O8 ~
- BNE .OAM_Clear- l9 G* x6 P8 j" b
- : j) u) B; a' M! d# `; ~
- ;栈指针初始化
( d- x+ \3 ?9 E& r( K) m( ]0 A- a' I - LDX #$FF" P/ u6 }* u0 r# h: j" M6 S2 p
- TXS U8 t6 s: M ]- J8 G9 m: Q
-
4 M1 s# v% X9 a% y - JSR Nametable_Clear;命名表清空: D i+ c% r4 W: Z/ C6 D
- JSR Palette_Init;初始化调色板缓冲: r; v y9 J6 l1 @/ |- f$ [
- JSR Static_Text_Init;初始化静态文本! U1 G; p4 _% F- L6 w
-
* Y9 l% E, U; |' [1 {& t - LDA #MUSIC_ITEM_TOTAL - 1
4 U0 F6 ^+ u. W! { - STA FC_Music_Max_Index' G+ F4 q+ [* U% N4 f) r; X
- " L, W* t0 z) {, K/ L5 ?( {6 A; b
- LDA #$1F
6 }7 i6 }1 l8 R - STA APU_STATUS
7 ` O6 {- J+ \' o - LDA #MUSIC_BGM - 1
& Z; M N& h, L" u" _: b - STA FC_Music_Index
2 o2 p* c4 Y6 r" N( ?: ^1 g4 y& x8 I - JSR Music_Init_Process;音乐播放
3 r0 ]8 O* J, e5 x9 Z5 g# `/ P -
% P" Q+ S; c, @& a! a$ m) K - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)* J- i3 l0 E6 U" ~! Y, M8 x
- LDA #$1E- a/ U* D: x, V4 b5 |& ~
- STA FC_PPU_Mask_Buf
7 {4 b# _9 g9 r5 z& Q -
: w9 Q( ~* n* w - ;启用NMI处理
3 j: U1 M9 Q1 d- c2 b, | - LDA #$80
; }1 [) I, f, | W+ N8 T+ R - STA PPU_CTRL
* L8 f! }! a! u! b: q7 r8 x) L -
# ]6 d) q/ l1 ~3 k - ;程序循环, 剩余工作交给 NMI 中断处理. [3 d' V+ j$ _/ Q& P! P
- .Loop8 A5 X2 f6 N* [& U2 [- S
- JMP .Loop. g4 W' t' J9 ~9 H
- ; W- Q- x$ v" U
- ;======================================================================
8 ?8 B, E( f8 M6 @4 t- N - ;不可屏蔽中断处理
. H, p) k" _) X6 o" s - Nmi_Program1 N% a S o: ]" X) ^" m) W! x' B
- PHA( H2 p, F3 @* c* A$ `
- TXA) a" _$ F+ x- R* }" G, c0 \
- PHA: R2 t, }2 g4 v9 ~' R! `- v
- TYA. Z3 W' h% d7 d9 }: _
- PHA
: M/ b7 g; g$ g - ) U6 k: m# W/ F. G( E1 c# I
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
' ^ p0 Z# p; y. r7 x - : f+ v5 C) a+ X: N/ l
- JSR FC_PPU_Procrss;PPU处理
8 E- _) a- L3 k8 K. }; c - % W3 V) D, `8 |; D1 Z- X
- ;精灵内存更新5 J+ x9 V$ b2 p8 l8 m m4 G
- LDA #$00& H' h/ j X# c2 u" f. }
- STA PPU_OAM_ADDR/ \8 C- S4 q1 u0 A8 x3 y! Y2 W3 ~8 f; u
- LDA #OAM_DMA_Buffer / $01006 {9 b+ f$ ? \/ k4 P
- STA OAM_DMA
' a5 Z8 J M$ J6 s+ Z -
9 ?$ o8 K% ~5 i1 o* Q, s - JSR FC_Gamepad_Process;手柄输入处理
# y; h% u& v. |: U - JSR Music_Select_Process;音乐选曲处理
0 L7 ^; A7 m* \( a, c$ { - JSR Music_Play_Process;音乐播放处理
_7 P+ Z9 B! Y: N -
* N( w6 V; X: `1 s+ b$ B - PLA
4 K: E: n! [1 L9 k' |& w3 _/ p5 I - TAY
1 O6 T( A- z. z4 r. y - PLA! x, q! U: J) Q1 d; `6 I
- TAX0 i+ z! g# m- _2 U8 I* a
- PLA
3 J5 F+ u" M4 [( K5 j - / U+ t8 c7 z( s
- RTI' r# A- z% v2 G/ N
* o8 X2 W+ B9 i: I5 A% u3 i- ;======================================================================! v( H8 _- w* ?7 _2 }' j+ D. k
- ;请求中断处理
4 S; a" O! V5 z - Irq_Program
5 c0 n0 \( U0 `, a [9 n( O/ G - RTI2 J! W2 P8 N7 {- i6 ], r% C( p& ]
- ? `+ c) P9 i8 Y/ U5 {4 [- ;======================================================================
- ]1 I! z# V$ S+ G# |3 | - ;中断向量表, K+ d) [8 A- b! S; l
- .ORG $FFFA
4 |3 w% [, d: @ - .DW Nmi_Program ;NMI触发时执行1 e; C$ t/ Y; T% Q5 @" a/ q" t
- .DW Reset_Program ;载入ROM时最先执行5 m d) `9 G- m- K/ P( `( h
- .DW Irq_Program ;IRQ触发时执行( O9 z1 G/ J( O. L) l
复制代码
, `, ?$ ]& {) _ j1 h0 T3 O" I4 a! _7 \ j1 o1 M
5 V/ L1 { D) X3 x; u
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|