|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
* K' l7 }6 c( \ 4 A* |+ d: _: A7 m0 D6 T+ W/ A
以下是主框架代码:# ?" M8 H! y6 J) h* A/ w
- ;======================================================================3 m6 P( ]5 B `4 v' |" G: }
- ;文件头0 |) A$ b7 C- U7 @4 V9 x1 x3 J
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
( E1 r/ @' `6 \- h1 R2 m* G - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
" k9 l' s# ?$ H% N6 `& P - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码( S1 b, {% n1 T, ?. \ `1 r
- ;======================================================================
3 \/ V) \ m4 c) s- } ] - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2: B. D: A+ Q4 O3 v1 @; X& [
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
. V D! ]7 b6 }" G, m) f - ;======================================================================
1 y6 n8 `% @. D - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
+ V6 t4 z2 g( H - RESET_ADDR = $E000 ;主程序起始地址
. c" `1 }2 G2 b" r' ]8 S/ [3 I, I3 v - ;======================================================================
6 p# u" Z% s K. n7 o - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB# x8 \* |$ C8 `; r) c" s
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB" x# l. {7 p" a \8 V
- .INESMAP 4 ;Mapper号 (0-4095)1 C* S2 d% q- P6 n$ g4 x! w
- .INESSUBMAP 0 ;子Mapper号 (0-15)1 p2 B' p3 m6 \6 _& ^
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
# {7 s( a* y. v6 w* ~& D ?( @8 P - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)! i. j \ v) m3 N7 [
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& {2 N: f$ ~, v! B* M* G - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
1 O5 v" H/ F7 P, Z/ s. o; t" W- U' X - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)/ @# O2 n8 H4 p! M- h
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数), ]! ~% U" {- f, e
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)$ ]0 d) S; K' W! q3 M
- ;======================================================================6 D+ L" w0 j- u' Z
- .INCLUDE "fc_demo_config.asm" ;全局配置
# \' a0 f) a9 {: I h" b7 }$ n) c - .INCLUDE "fc_demo_constant.asm" ;NES常量$ }4 \1 l( F, W9 S8 H! y# P( B
- ;======================================================================+ s N# q% \7 W* h9 ^+ C' ?* R
- ;音乐配置
; {: n' n( B% D- j/ d - .IF 0 = MUSIC_THEME
9 u. t$ P( j. X- E - .INCLUDE "data/music/Gremlin 2/config.asm"4 l4 D, e5 X' L @8 F
- .ENDIF6 ^' P( a; \+ u* s z
- 4 q; g; @$ Y$ V+ [5 s4 E. Z
- .IF 1 = MUSIC_THEME
1 r# R: X0 ]1 o* Y0 X2 v7 Y - .INCLUDE "data/music/Raf World/config.asm"
" Z" l' w. f2 ?. z7 p6 a - .ENDIF
& P d# W9 V [! o - ( m' Q) e( p9 y, R6 P1 d* w V: V6 E
- .IF 2 = MUSIC_THEME 3 L8 P" K- Q) k0 [
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"; u5 C1 y1 Z5 E! G" {$ p
- .ENDIF
9 @6 M- W4 e A8 w - % c1 L) U9 C# n: Y0 S
- ;======================================================================$ r: M! N0 H8 J u4 A* ]
- ;引用CHR图像数据# X8 U$ F5 x4 x% J8 L `2 z
- .BANK NES_16KB_PRG_SIZE * 2 J& A2 K0 W) |% S
- .ORG $0000
" f4 p& y5 j h - .INCBIN "data/bkg.chr"
2 X+ I% e4 \$ K' B, {2 h% N7 K7 _' _ - .INCBIN "data/sp.chr"
7 g! n J* `$ o% o5 }" k - : u A0 k# ?+ t# k3 _) F
- ;======================================================================
# S3 S @0 I. F - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
7 w/ [3 G) ?3 ?' } - .ORG RESET_ADDR% I) r# e8 d9 Q% a. a
- ;======================================================================
. [3 c: M) w$ X# o c' } - ;引用其他源文件8 |: B* L9 u4 |) C% i
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理6 B0 z2 v: \& u6 P# @
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理: ]: A; |, H" Y% A* |0 H: u
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
! ~3 d8 y2 R- X, f8 [0 ]* \ - ;======================================================================- B6 q" a& C0 `5 c. }3 F
/ C7 J) _/ c+ ~- ;======================================================================
- I. ^. `9 H3 \: r* g* A+ t/ ~ - ;等待VBlank到来& K& I$ U3 i8 p/ S$ u. W' N
- Wait_For_VBlank2 P, x% Q! D( ~' ]& }/ y
- LDA PPU_STATUS
! `# H D5 e0 e( t" e* j7 q - BPL Wait_For_VBlank
2 e E" d+ E( I& I& }4 t" Y - RTS
. U9 E3 D0 d @3 ~& J& \ - % z6 @" ~9 M w+ D- \$ J+ z
- ;======================================================================& c" o# P% r9 o8 b7 [. |
- ;调色板初始化
" a- j; h8 b, S1 g0 `: B( T$ S7 z - Palette_Init
+ ]* l& l2 M( ?- w4 R& l/ \( K _. x2 \ - LDA #$3F5 F( D8 l- K" i' a% U
- STA PPU_ADDRESS
/ U# q+ J1 t6 y) h5 V# C: V - LDA #$002 \( l9 }3 `' p, m/ }
- STA PPU_ADDRESS
2 A Z. T. O) N# x9 Q - LDX #$00. F5 p; T l# O6 i- U' F
- LDY #$20
+ m" o, I5 j: q: ?3 i. H9 k% q# m - .Write_Data: X# T3 h; E, h2 q1 z/ Z8 W" e
- LDA Palette_Data,X
! H8 z6 U4 Q& {- _' A - STA FC_PPU_Pal_Addr,X6 V A# @% o1 I/ G. L6 {$ g/ g$ S+ @; W
- INX) X6 A+ Q" x9 Z! u6 p
- DEY
0 E: ]; Z; S2 s) W, M6 H) E% \ - BNE .Write_Data
. f$ Q6 I6 f# ~% n# S& H - .End2 Q# Z8 J5 K* d; q# K/ R
- RTS
8 i x3 ~& G+ [! t - ) s: [5 L- f8 `, y
- ;----------------------------------------, o: e) [6 v' P& }" E" t n& I
- ;调色板数据" x$ w/ ?2 R9 `
- Palette_Data# H( I! @2 n% f! D; O
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, S, O" i! y% O/ \; ~& I9 C
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
1 T3 Q8 x2 }1 O; r6 K* l/ n. G -
?$ N' {. j1 [3 Z. T7 q - ;======================================================================
8 `+ S4 u8 F, G- X+ T' @/ H' ^ - ;命名表清空
5 `% `; n7 O2 c- V# C8 L - Nametable_Clear+ A/ U( `% ^" x( b* {
- LDA #$20
3 d) Z1 Y) m4 F8 g8 Y. n - STA PPU_ADDRESS3 e7 Y$ y; y" r0 G$ G
- LDA #$00; U! r# n6 S) {: a4 G# i+ R
- STA PPU_ADDRESS H5 ?/ J) u# F [9 v; ~; l6 `
- LDA #$00
+ x6 @' e# q- V7 x9 |2 K. O - LDX #$00
' T# l) U8 c1 H/ N# t5 d' c - LDY #$08
1 a' U! D, y9 D, N - .Write_Data Z! c2 U! X& Q& q9 y. w8 ~
- STA PPU_DATA) o' Y" b* N F& P# }
- INX
/ R) |- J8 j* Z p |- T - BNE .Write_Data3 n n- Y" a% E0 f1 ^* P4 m
- DEY3 A* }: A& A6 v( Z
- BNE .Write_Data
; U) r& \+ b# F# k - .End+ @% s! C$ R! M/ T
- RTS: P% \2 V9 }3 V# @) M
$ T+ y% f. W' t) S, _/ C/ H9 F' k- ;======================================================================
, e$ l6 Y2 T+ K - ;音乐曲目切换9 G5 f; _0 u, C2 X3 V; N& N# \
- Music_Select_Process
. y4 L9 x5 x9 M p! a y
; |6 N% V' i, j. K2 o- .Pre_Music;上一曲& p, d0 S( x4 g I
- LDA FC_Gamepad_Once# k. b) y: }- G; |0 r9 B; Z
- CMP #JOY_KEY_LEFT: @/ i6 z1 R$ d" B. W7 q
- BNE .Next_Music
9 i/ T" f/ m1 u7 V - JSR Music_Play_Pre/ Z3 v# B$ f |7 _. ~9 J% X' O
- .Next_Music;下一曲
6 W; A& Q; u' }8 O2 _( ` - LDA FC_Gamepad_Once6 R7 l/ ^; a3 y7 u
- CMP #JOY_KEY_RIGHT
- e( o: e. K2 i5 `% D+ ^- n - BNE .Next_10_Music3 q; _& Q3 ? K+ J! b
- JSR Music_Play_Next
, ~7 _# g9 N8 A9 D, g9 c - .Next_10_Music;上10曲 j; p$ E0 g- B8 r0 L
- LDA FC_Gamepad_Once
) i. a- B3 ]+ T% g4 r; T, _+ D - CMP #JOY_KEY_UP
% i% ]* {: ~6 p - BNE .Pre_10_Music) v7 K7 y' a2 _# w& {" p
- JSR Music_Play_Next_10
# j) f1 A# W1 k( b - .Pre_10_Music;下10曲
0 z& q( V% Q+ V# w& b+ A- m - LDA FC_Gamepad_Once% l+ j' d( q- e; M4 M! \$ S
- CMP #JOY_KEY_DOWN
! Z6 _1 J* m+ a& g, j, V7 l - BNE .Reset' {2 D. P# @/ r7 e/ w3 ]4 W
- JSR Music_Play_Pre_10
' T* Y, _. j' T# R+ [4 n1 l - .Reset;重播当前曲目
: P$ `, O: k2 v$ ?% L - LDA FC_Gamepad_Once. ^) J" L J$ V& ]: c9 [2 W
- CMP #JOY_KEY_START
8 r* T% ^! y7 L0 l - BNE .End" \6 U; l- n7 r) H
- LDA FC_Music_Index
: x+ _: T* y! ]/ o - JSR Music_Init_Process7 v3 _% c+ R1 b' A4 o7 m
- .End
; K$ y) e. D. |+ B% r; i7 j' U - RTS
2 K6 a( b r+ W3 X" q. ]
" M7 ~ @; V4 C8 k( p" g- ;----------------------------------------------------------------------
* ^0 P- ^9 m: f8 C/ c9 i - ;播放上一曲$ \; ~6 s, U8 [' ?& x( r) `. I+ r
- Music_Play_Pre
9 c) n0 V6 [# y# b, e6 w) i8 p; t' @ - LDA FC_Music_Index. e7 t; V( n; K; v N5 d( m
- BEQ .End2 g+ ^$ u- G% Z3 s- [5 W l# i
- DEC FC_Music_Index
6 H) ~: H1 f( f9 C - LDA FC_Music_Index
$ K7 f( x1 R2 e0 m" M- m - JSR Music_Init_Process; I h5 f1 @2 P7 M9 |. W1 K7 C
- .End
9 }7 J1 J1 J3 F* V0 y1 g - RTS0 s5 ~& i, M5 e) `; V5 S6 ^8 w
- ;----------------------------------------------------------------------7 q$ _/ O1 W9 {) @9 a1 t
- ;播放下一曲1 f/ C1 f+ [- t& Y
- Music_Play_Next8 m) L# t: O( @. B K$ I
- LDA FC_Music_Index0 b2 Q+ s- I% a9 C
- CMP FC_Music_Max_Index
6 ^, c% N% R! G0 v- G - BCS .End$ H+ D6 N- ^% |
- INC FC_Music_Index
9 Q0 t, a$ O5 I& W. x - LDA FC_Music_Index) ?* h2 l, E1 r5 A5 F ], s! y
- JSR Music_Init_Process
S' p X P5 N4 j - .End
; E: Z7 Z" V5 K - RTS4 g6 b6 \- f5 F' K
- 6 E+ A& y) b7 G% E
- ;----------------------------------------------------------------------
( A; Z: \! }. F X5 {' i4 P# z - ;播放上10曲9 D" G5 o+ c- J$ w: L" N6 `3 i: s
- Music_Play_Pre_10
" s/ N( q9 Z' y: m: I% e - LDA FC_Music_Index
1 ]% {* J9 G( S - BEQ .End6 Q: m9 L, D2 C- D6 x6 w4 T
- SEC C1 |( {2 Z) h* `8 @- u* `$ E9 L5 M- t
- SBC #10
/ g/ p7 u: g! m: l - BCS .Pre_10
5 ~1 T, E1 L6 U1 a* j - LDA #$00
, h6 |( O' z$ Q5 F7 P - .Pre_106 ?% L9 x* |4 ]. K( \
- STA FC_Music_Index6 S! [& t# |7 H
- JSR Music_Init_Process
: T, ]' N% F3 E3 t - .End, z) f# z* t; w/ X/ U+ B
- RTS
4 D2 l9 R+ s; {* {8 v - ;----------------------------------------------------------------------
$ N1 |) z" Z; x x' K - ;播放下10曲
* s' k1 X3 N' @ - Music_Play_Next_10 z' R4 h' n; T, l. E" A1 a- b |
- LDA FC_Music_Index+ \2 b. ~3 ]4 x3 Z* B) e6 P
- CMP FC_Music_Max_Index
1 u% [3 j% C+ p# \" ]' G& |# z2 k6 m - BCS .End
& D; q0 }5 a K! p$ |8 k - CLC- O5 x0 l1 @0 `; z
- ADC #10
1 Y2 e' |/ x$ h - CMP FC_Music_Max_Index8 e- L G9 H' ]
- BCC .Next_10
7 H; z8 k* b s" X* Z - LDA FC_Music_Max_Index
2 j1 T6 B. x. [3 B# e# e. w- D - .Next_10
) S, z0 K8 i7 F8 [, W( G - STA FC_Music_Index
: a& Q: x7 R! h; A( _3 ?& H - JSR Music_Init_Process
2 [# a: S$ l2 n8 o# ~9 J- M - .End8 Q; ?4 q$ V1 \# e: Q; M. P
- RTS% p8 ]" N H% e8 W
- $ F6 D" z7 m! i& m B
- ;---------------------------------------------------------------------- t9 P }( r( b+ P, ], m
- ;8位十六进制转3位十进制制
; I- t* q4 [$ a+ I+ L5 X - Hex8ToDec
0 _ g( k' ~* g$ H* j* k - STA FC_Dec_Data_1+ L& L! [. d. L% Z& l
- LDA #$00
9 t( r- ~' k3 d- o# V - STA FC_Dec_Data_1003 \5 B; V, \- X! a1 E
- STA FC_Dec_Data_10( Q6 F% u6 o& D, [0 \0 \
- LDA FC_Dec_Data_1
0 O N# z5 k- V - .Convert_1006 t' r# t! m' }' P
- CMP #1003 e) y6 |7 w$ v% C( M2 W, r3 k p) D
- BCC .Convert_108 ~5 f+ {5 x& c+ z. q5 o
- SEC. p* p0 e5 F- N7 C
- SBC #100' `! C4 _% e1 }# o4 r* b: f
- INC FC_Dec_Data_100% E0 C+ q. E1 Y$ x1 E0 ]7 r( y
- BNE .Convert_100
+ b! A# b, N, o; M1 S4 o8 I - .Convert_10$ ^' {3 x, v7 E3 N
- CMP #10
- o$ R+ ]8 V8 z3 @4 e - BCC .End
' `! g- Z' x, `* g - SEC
0 i7 h9 S2 v" P - SBC #10% y; }$ [% J; ^9 y/ u3 B1 }
- INC FC_Dec_Data_101 w7 p8 B& g- R! }
- BNE .Convert_10* v5 q) f, p+ c
- .End
0 ?- E+ p# h9 e - STA FC_Dec_Data_1& O% v9 l" m0 a* i" _' B
- RTS" z( H+ D% z; z7 A3 B6 b$ F$ _# o; T0 J$ G
6 Q+ _& s0 t6 O/ m* P- ;----------------------------------------------------------------------7 h4 ?2 W1 C n' Q; M; n
- ;显示曲目信息5 S: l* x6 q/ ^ |3 m
- Music_Info_Display
" V6 I" l% ]( n5 \' N! t& ` - LDX FC_PPU_Buf_Count
9 r$ G" @2 f. }8 \2 P# j# n - LDA #PPU_WRITE_MODE_CNT_LINE2 `- ^' m; n4 u, C( A# v0 G5 a
- STA Use_PPU_Buffer,X* I( M. k- H, _ i/ Q$ [0 n
- INX7 X7 E/ u( Z+ D, G/ E
-
: v6 q0 u2 z- r8 }2 \, l$ G1 R - LDA #>MUSIC_INFO_POS3 u; }- t/ A$ y+ k/ }, \7 g
- STA Use_PPU_Buffer,X
! i/ U& z# _% w; o3 P+ U$ A - INX
' E- i) o- U9 O3 J( v -
' J: I" H7 r/ ^) q. _6 x6 T - ;居中
5 N/ t( n& H! g" F9 I+ B - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
# V R) I0 J8 Y3 B9 _0 v - STA Use_PPU_Buffer,X
1 t7 o6 n# b! W0 X* a - INX
4 U; m& ?6 N; h: B -
8 }+ q3 m0 B1 [; u$ R9 | - LDA #$05" x7 I" L( X5 A+ A6 Q& I
- STA Use_PPU_Buffer,X7 {9 K8 l: q: h7 m/ P9 N9 v N4 E$ E9 j
- INX( i* `2 L% }) i4 Y; @ R, P; ^
-
! |# r6 G+ c1 l1 ?: Q - LDA FC_Music_Index: _* ^# A5 U! ^* W5 z! G4 X
- CLC, a6 c% ]1 a) O, W
- ADC #$01: j: V1 D& r2 }3 A3 B4 D3 Z. q
- JSR Hex8ToDec
3 j- o( }# r1 V+ p# }) X - $ ^' A p& ^& f/ }2 Q8 c, ^
- LDA FC_Dec_Data_10% @. d7 Q* c0 z
- CLC$ l" g3 Y, B' d- [
- ADC #'0'
" o( s6 s" _$ K) {8 S( V; Z. `/ z - STA Use_PPU_Buffer,X
& Q, @, ?; [3 [) y+ d - INX3 e5 w; w9 z7 `; a
- ; G1 {/ e4 [. K0 _7 w
- LDA FC_Dec_Data_1% v- t# W. ]9 y9 Y( M5 E' m
- CLC7 @6 Y: j% b- M4 |+ r& u' F
- ADC #'0'
* }7 [# \( q* ]7 K/ I, d* K5 C - STA Use_PPU_Buffer,X
9 b! Z) q8 t+ R6 C - INX
$ \. B8 C% u' d/ O, Q - 7 t- O3 M* k& @' G+ q2 H% ]
- LDA #'/'
8 g$ S' D& ~* I) H! Q) X - STA Use_PPU_Buffer,X3 v, e1 _ ?$ k1 _+ w9 R1 v: Q
- INX# V0 l5 ^% ]0 ?
-
6 r5 ~3 J; c" B/ E1 p! E - LDA FC_Music_Max_Index
+ W* q5 h8 s( z0 E [ - CLC# p) s% Z% ]. l
- ADC #$018 X: V- K+ z& q4 Y; F$ Z1 \6 L
- JSR Hex8ToDec: ]; m! V9 f) B; b# E( ^: d/ G
- - n$ T7 h# B6 w2 b% g, |, E, K
- LDA FC_Dec_Data_10
k# S* a$ S, `1 W5 \ - CLC
* `8 d' C3 r/ Q, x- M8 h4 T - ADC #'0'( A% P* ^/ X5 M! F
- STA Use_PPU_Buffer,X
7 n7 H8 G% F$ P7 U" t - INX- c R/ [" `3 K4 U
-
. V8 m" F( F% Z2 L7 q - LDA FC_Dec_Data_15 j; s. Z* ^. c0 m
- CLC& l* H, ]. j3 Y# C: Z& [0 c
- ADC #'0'
1 T: ^9 G( Y0 e2 h1 F. I1 _5 F - STA Use_PPU_Buffer,X
% @$ H; f W5 x. g# h' l1 f - INX
5 P( c+ V4 l3 _6 q - 8 ^5 O6 F8 t5 }+ E0 R; b
- .End
8 L5 ~2 k. v# _* b$ t: j - STX FC_PPU_Buf_Count
& }" u; ^4 |9 j7 B - RTS
" [2 c7 G, S% b' F0 J6 L2 g - 0 @2 s; m1 a; A ?3 V# i0 K! S2 \9 j
- ;----------------------------------------------------------------------. G. |! ^' E9 b5 c0 S: ^$ C
- ;音乐曲目初始化处理
( F7 Q5 [. W4 }4 s - Music_Init_Process5 b+ s! X4 W5 ]1 ?+ L$ m3 W
- PHA8 _1 t/ p- u" U* g# |$ x/ ~4 M
- JSR Music_Clear_Process+ |. G; e* t- v# K% k0 I
- LDA #$1F
4 [0 i5 P$ |: Z( G) T% E) ^, n - STA $4015
2 k+ c" N s/ U* a; O - PLA6 r, [3 _$ e& q$ s# x8 X. }# g
- JSR Music_Init_Addr5 N# K4 a9 l9 k4 H* ~
- JSR Music_Info_Display3 w& n8 a2 a( l7 C* J7 f. v
- RTS0 f: a0 d4 s6 _" d2 o1 x$ b, S
- ! W/ X$ n+ d7 T0 z
- ;----------------------------------------------------------------------" ]8 k# W L& N6 b2 B
- ;音乐播放处理/ ~$ W5 j, }* B! l' V0 X
- Music_Play_Process
7 t1 i5 a2 N9 O' p* }, \" ~ - JSR Music_Play_Addr
- m9 i" ]9 H% s* J4 g3 i D - RTS0 {, P8 }9 N* f! u& Y8 a2 L/ Y/ s
- & J9 o* D, \1 M6 O4 c
- ;----------------------------------------------------------------------
' t3 L! O- F5 F @' S+ X - ;音乐播放处理3 J5 a, M1 ? u5 l+ B3 I, [4 g
- Music_Clear_Process1 c+ ?+ J( M3 i8 N( \
- .IF Music_Clear_Addr3 k9 r: C4 D4 T0 Z4 Q) y' D c
- JSR Music_Clear_Addr
5 v3 W3 Y+ \1 G; v0 F3 L/ Y - RTS
: O6 C5 B5 d( p( c$ D' ^* F; J - .ELSE7 ^% r0 ]' R T
- LDA #$1F
( P9 j9 D/ o' s+ X# U3 S7 O - STA $4015
" l" P* s# Q4 ]7 _# Y0 H2 \ - LDA #$00
2 `1 L3 G1 g3 T4 K N! W& K - STA $4010* w. t4 n' y' Q, w l, R
- LDX #$00
9 {$ T1 R' O0 O( m7 D3 E# I - LDA #$00) y8 y5 U: j! o8 z7 `0 s4 y
- & _, w# t7 P/ p' l9 T* N
- .Music_Clear_Zreo_Page_0
$ s% G4 s) M u; K# x0 D# f5 {: @ - STA $00,X: A* {2 _& ^" [1 @" ?8 R z: u! e
- INX/ T+ T: G7 u5 ]/ m6 V! N
- CPX #Use_Zero_Page_Begin0 b- F0 o! d4 l; b1 ~
- BCC .Music_Clear_Zreo_Page_0( D5 [& O5 {2 s. s q. g
-
$ G: w( O5 T! e( S- z - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size, y$ I. K. A% n- s- A; y( W
- .Music_Clear_Zreo_Page_1
- K) l" i" [( n( ?; e' O - STA $00,X
: v2 H6 k- W% g7 L - INX P. t0 ]; a: t9 h3 x C
- BNE .Music_Clear_Zreo_Page_1
1 J; s' T! ^3 A# e+ }# C- a4 K7 ] - 2 P, x- ]2 I# T# Z6 @* X
- Music_Clear_Process_1) ~& F4 ^1 p. h: M
- STA $0600,X
3 n5 ?& ]. j- M. `! ` C/ ^ - STA $0700,X
8 y9 X- b* o# L. O - INX
' a! }4 ]% p) I3 D, | - BNE Music_Clear_Process_1 l" H. X2 T" ~( W' {+ o7 h8 }
- LDA #$10 j0 u) S" S: w6 `
- STA $4000$ c1 g' i: M$ E5 ^5 A
- STA $4004
9 h7 U3 @7 q& X7 E5 y - STA $400C
]3 u& F2 K X" _, \ - LDA #$00 m% S$ f0 ~. l5 U; P8 x8 E. y
- STA $40084 r, L# B4 Y' d6 v
- LDA #$0F5 U/ \; Q5 Z5 B# c5 t1 X# Y& S9 h
- STA $4015
& Y. G) e/ t7 J# b - .ENDIF
; x" y6 C& G/ w2 B, \4 _# L - 4 ?5 {- U' j/ A9 O. H0 b
- RTS0 g* j6 T/ G) Q. K* k! b
6 G c% W( m) e# _- ;======================================================================0 Q$ w& p3 I2 Y: i2 K( c
- ;重启处理/ I1 _. z. \3 L7 k
- Reset_Program% T4 _) ^$ |/ G% @' r) r
- SEI
" x$ }- P* d1 @8 F& |& V - CLD) Q- L& ?* l% {/ M8 b5 c
- LDA #$001 `5 i K& K$ u! W2 V
- STA PPU_CTRL, J4 y: {: F( h3 s
- STA PPU_MASK; s4 O5 l$ U0 [- S' m Y
- STA JOY2_FRAME
( h) o" w. c9 @, y; j% H! O$ A - STA APU_STATUS
$ s/ w" }/ N# b4 [: T# [ - 2 \ I0 p% ~3 X; t, n1 L; s. d' ^1 Z
- ;等待屏幕准备完毕
2 }6 u0 N# {4 i3 V - LDX #$02
7 I5 U- g- M7 P3 g. y0 h - .Wait_For_Screen_Ready
1 B0 W9 J# M+ U4 E - LDA PPU_STATUS# R% ^/ q* h4 q
- BPL .Wait_For_Screen_Ready7 s+ b4 L( V2 y, D) y' X
- DEX& b5 N; x6 C% M! Q; w
- BNE .Wait_For_Screen_Ready) W& w, }' z2 H6 L
-
# s2 y: O9 P; K& N O/ J6 W6 o, } - ;清空调色板
, O/ |" @; r3 n0 E( o" H$ [" G - Palette_Clear d4 }- Z `' A% v+ E3 M# {- m# z3 l
- LDA #$3F8 k: ]- G4 {/ @, n0 | Z# \
- STA PPU_ADDRESS
. `4 Y {& g L6 m - LDA #$00
E0 g0 n5 u: \) J - STA PPU_ADDRESS
1 I- X/ n L2 g2 J+ v8 s - LDX #$200 ?' F4 |/ N3 Y! A
- LDA #$0F
/ ^* U, Y, b, ?6 k: V/ n - .Write_Data
$ S; S$ W" I- |; P( v/ L5 a - STA PPU_DATA, v7 r+ ^. n- o- P$ S; w3 E
- DEX8 Z/ I, Q, e0 h7 M1 S
- BNE .Write_Data
7 c& I# R, R4 V/ b3 r - k) j# @. u6 u+ v
- ;清除声音 $4000-4013- Z: A. N3 E/ d# w9 O0 l
- LDY #$14
3 k0 k9 b& i6 }8 c" l - LDX #$00
, ?8 Y8 q8 `( s2 F - .Sound_Clear- ~2 J G6 ]( }+ I3 h
- STA $4000,X
3 }8 K% H- K4 _0 ^ - INX
H* X0 L4 ~6 w - DEY
' Q# P! C# w- w- n - BNE .Sound_Clear( F3 ]: e; w! \- }2 _% J
-
1 F% O' T0 p8 B1 `3 J. G( m - ;清除 RAM $0000-07FF# D/ t0 X& q' |1 [
- LDA #$00
- ?) v! z# `+ g5 @% s - STA $00
8 o5 I# N2 i; e* |% U, Q6 _- G4 q/ I - STA $01
' K+ B/ g+ s7 w - TAY
1 @$ K8 k0 M2 V - LDX #$08- i1 d6 h% g- R6 s" w3 s7 X
- .Memory_Clear
; b4 v3 B) u% \+ U/ X - STA [$00],Y
8 n1 V, U, `/ G - INY
y# f; @& @. { - BNE .Memory_Clear
" C5 x5 Q1 I& p D - INC $01
* ^/ z3 k( i: S- R8 Z% x% u - DEX- b0 K5 n) m3 q/ Z
- BNE .Memory_Clear; q8 I& z6 C5 w' y: J1 e
-
8 V5 F0 ^, {* ?! n - ;精灵缓冲初始化' ] y2 c* g2 I8 @9 ^7 [# D" _+ u7 |
- LDX #$00
* A1 }7 j' Z+ i8 }2 t - LDA #$F8
4 R- m2 [) b: _) E T' _9 H" P& M# T - .OAM_Clear4 c, l# r: Y- B6 a) f# I9 Q
- STA OAM_DMA_Buffer,X& m0 v, y7 g0 N8 o7 Q6 j% I
- INX1 p4 k8 L( {, m9 L) ~
- BNE .OAM_Clear9 I' Q. t& L( d3 @
-
2 p* v0 \& ~; Z" o& u: H - ;栈指针初始化
& `7 q `6 _: ]9 w6 n - LDX #$FF
# ?9 x3 K1 i* k - TXS: Y" e+ D! Y, ~
- 8 T5 A! G. D \1 n3 A
- JSR Nametable_Clear;命名表清空' t" ? `: U4 r5 U/ `
- JSR Palette_Init;初始化调色板缓冲9 D' `6 @8 p, R4 ?8 B
- JSR Static_Text_Init;初始化静态文本
* N6 d( ^8 G+ m5 Z -
" C5 W& a, J' Y8 U - LDA #MUSIC_ITEM_TOTAL - 13 B: Z! @, y+ a- N
- STA FC_Music_Max_Index& K/ S% T& s' U, e( x
- 0 o' m5 G! E- J s7 J/ t
- LDA #$1F
* L M, |* X! U! q3 ~4 i# {- d - STA APU_STATUS
+ E" f, U& S" ?& |% k0 l - LDA #MUSIC_BGM - 19 y. P$ I- `, E* J
- STA FC_Music_Index" i! G+ H- q( S$ k1 b. i
- JSR Music_Init_Process;音乐播放
: K* G* D0 R. e7 X! ?% K - 7 X7 J" z$ _3 |
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
) D4 i9 G7 F) V8 ` - LDA #$1E2 Z/ o# g/ b( b4 E* c' c* o; r
- STA FC_PPU_Mask_Buf' a9 A: x1 w' Z+ I1 |
- : w1 R5 w# V2 b4 U5 S
- ;启用NMI处理
: \0 N' Q- t9 c* b; l, t - LDA #$80
4 b! _8 n1 u' s' Y1 Y+ L: K- t - STA PPU_CTRL
; K/ {9 ?# {: ?1 {( \* ?$ k - - x R; L8 K5 i3 P* \# M! X0 f& v1 z
- ;程序循环, 剩余工作交给 NMI 中断处理% G+ L- G- K. v3 D% Q2 F
- .Loop
/ M! P1 }; Z/ U7 ?6 f - JMP .Loop
2 ~* K0 W+ _$ x
) e- w0 h& t2 _- ;======================================================================9 J" Q* n2 M0 ^& Q
- ;不可屏蔽中断处理
! u8 ~" j: E' D8 F - Nmi_Program G3 K7 d) e/ {' G; r
- PHA" h6 {9 c7 Q: _: f+ s; P
- TXA8 m* q( O/ b$ ]; O* e
- PHA# N7 u4 E- q0 O3 j
- TYA
. S4 o$ ?3 E! {1 E - PHA/ i" r4 v$ Q3 f! N
- # `- m3 a6 O! h1 `
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位* f k( R3 X) u8 y x3 g+ p0 c% I: @
- " e% i3 b4 F9 N+ M' v9 p9 h4 l
- JSR FC_PPU_Procrss;PPU处理
3 f+ H, h) `. R - " h2 s/ I8 \1 ^- @2 ^
- ;精灵内存更新. S; d2 i' M( y) R4 s
- LDA #$002 A2 o4 [% U9 j4 x, k& X
- STA PPU_OAM_ADDR- |: _4 ^7 I' e
- LDA #OAM_DMA_Buffer / $0100
& Z5 n n( q2 p1 D - STA OAM_DMA5 Q, Q! ~% S! b; X3 a% Y: B9 G' W
- 3 D8 o) N7 [4 T2 q
- JSR FC_Gamepad_Process;手柄输入处理
' M# Q- r8 i6 {' U0 w5 Q - JSR Music_Select_Process;音乐选曲处理
) |# r( i% l( |' H - JSR Music_Play_Process;音乐播放处理" b& g% x8 O" Q; D6 ]) R5 w
- * A* S8 b5 O @' e* I3 r; w7 ]+ u
- PLA# M" w: t, K2 z& g" [4 z) Y/ x
- TAY- t! W1 Z1 r% b9 F: C+ K
- PLA
% ~) e: i. ?1 c2 @ b/ Q3 E$ E* h - TAX
6 t5 X6 v+ G f' L) j6 y - PLA+ h- B8 i$ R# Z7 T, x6 K
- 1 c5 h$ j& d- b' O
- RTI
( |+ {8 L9 K7 e2 } - / {+ c. G% R- u( r, m8 B" h
- ;======================================================================
; F( f3 m$ i$ ^' E$ B8 W - ;请求中断处理
7 ~ n' ^# M' p6 ` h - Irq_Program* O0 ~. H5 ~! Y
- RTI- ?' W b0 V9 L" M! P; {1 I" m/ O8 `) q
, j! s' {/ V1 \/ ^3 z& P" t# R- ;======================================================================1 n. d$ J: c/ r. j1 J5 w
- ;中断向量表
4 c' ]" `* @, s: n - .ORG $FFFA
2 L* y$ p1 `1 @; Y - .DW Nmi_Program ;NMI触发时执行
( Q, ^2 F {) E) V - .DW Reset_Program ;载入ROM时最先执行* b. E1 _- t, y+ k6 E4 x0 O
- .DW Irq_Program ;IRQ触发时执行
2 i3 Q! A# n$ _7 |6 j
复制代码 A! q. m0 n% k c" A& ~9 V: Y6 z
; v9 n; W% @- T8 _$ B
( m, ]5 \" V. Z: w
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|