|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
8 K9 l# k0 |' ~9 u 9 d9 x9 }, ]7 }
以下是主框架代码:
3 H! H! t/ q8 I: h6 t- ;======================================================================8 ]( w8 X$ ]8 a& ]( Y+ Q# {# t" r7 A
- ;文件头& @1 J# H# t. G$ {3 o" y$ M1 x0 }6 A' |6 Z
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量( F7 E3 b" X, ^9 R/ L
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量$ I$ y" B" H8 c/ j
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码9 Q D1 G! w$ s2 Q8 k
- ;======================================================================- g/ P' k9 t* b3 W, H9 h- H9 {. `. N. X
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* F3 o0 A0 c9 _; _
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
* [1 r3 S) X7 N6 y8 ^3 N - ;======================================================================
& s; H6 E; k" W* u& V9 ?- ] - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 13 ]. ~% _; p9 o8 } g
- RESET_ADDR = $E000 ;主程序起始地址2 ^+ Y. Q2 s6 u' v! U& `
- ;======================================================================1 U+ ^8 X" C7 ~. t' t
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
& r6 i0 o7 |4 [4 ^" ?2 q - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
r) E. l5 e' W- ^& C7 ?# [+ I* {- H, u - .INESMAP 4 ;Mapper号 (0-4095)
0 b7 t9 t" \( f; \+ f4 k0 [! Z2 H - .INESSUBMAP 0 ;子Mapper号 (0-15)
2 V% z; M: Q4 l& g9 J0 ` - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
( M5 N T. Q3 \9 j& [# B9 E - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)4 G$ b: E3 e" Q5 m M3 k, N
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数). Z$ ?+ S$ l6 k( M6 c; c
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
$ p; N$ z# U& x* B9 c% y2 Z! I - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
+ _* I3 g7 P8 E+ d* P c - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
* d7 R% }$ O7 n) s/ Z4 v - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)3 r1 ^) o6 R- z. Z; U" C6 u
- ;======================================================================
) U; s7 w" l; \. \8 e9 u - .INCLUDE "fc_demo_config.asm" ;全局配置3 o' [# c9 ]2 ?- ?+ i7 {. M" u% b
- .INCLUDE "fc_demo_constant.asm" ;NES常量7 [# P, M: D) q; z5 ]* V2 ^( J8 k, |, M' Y
- ;======================================================================* P! s* H0 T" j* Z1 a' Q
- ;音乐配置7 ? |( V* v: s
- .IF 0 = MUSIC_THEME
( p( ?# S2 q: n P" b/ K - .INCLUDE "data/music/Gremlin 2/config.asm"
( B; Q; N$ P' ~# J2 |+ x/ y: g% U - .ENDIF
, n' x( ]$ x& K -
7 B; D9 u$ t; k4 n& w3 O5 { - .IF 1 = MUSIC_THEME1 k0 `/ j& K/ A5 \& S/ j7 |* T
- .INCLUDE "data/music/Raf World/config.asm"
) M3 y ]9 O. {5 i( E3 x6 k6 I - .ENDIF
& t z7 ~( G8 @) Y - - a3 ^4 \, _3 i3 m7 g5 D) Y
- .IF 2 = MUSIC_THEME 3 k+ D/ A2 }3 M/ K5 n8 q
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"9 \ I+ D; L0 w) e9 q
- .ENDIF
7 B$ A8 @4 [# {( R - 2 u: S( _! y% m9 H8 h- m
- ;======================================================================6 {3 E& ^2 M, B6 ^9 ~; V' c
- ;引用CHR图像数据* m& \: m3 H! Y. V% A9 M3 M
- .BANK NES_16KB_PRG_SIZE * 2
0 v/ K! w, f" [% K - .ORG $0000
: m" E8 i$ q. O7 ?7 o C - .INCBIN "data/bkg.chr"
5 e- O6 H% G$ Y( Q0 `; s7 H - .INCBIN "data/sp.chr"
0 b, V% _$ |# P - . }: }! V5 u# v. n: t6 X; b
- ;======================================================================; x* L; Q! w6 f7 F0 E
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank0 d8 ?# K* x: F) e" R# h% |
- .ORG RESET_ADDR
* P1 E" x! e* B3 o' y" a1 u& r - ;======================================================================
6 A+ T0 @' M% |7 F6 E# [( J/ g/ R - ;引用其他源文件- S" N( Y) a0 v* X0 r, X
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ h5 U' @5 l- b& I* n$ \: ?: t
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理2 r% a9 R0 |2 v1 t$ ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
+ Z3 [ m, K! Y2 j3 K1 m - ;======================================================================
5 Z& w6 C7 A8 v+ o# p2 R8 K
% B( @" a) u3 l G/ L% ^. n: O7 `0 `- ;======================================================================6 |; d# p1 }" T' ~
- ;等待VBlank到来( B* S5 g/ k5 [" [4 M R5 B
- Wait_For_VBlank1 n' W6 |! S% f9 L+ J8 ~
- LDA PPU_STATUS
; I7 ~9 ~' W1 i! d4 q - BPL Wait_For_VBlank4 @. A" b% ]! v) I( j
- RTS
5 i. Y! t$ V) @; C' E( Y* h2 F" G - - A, Q- g. V5 y8 |! W9 [3 Z
- ;======================================================================
* P5 [# O# I: T" ]; p6 ] - ;调色板初始化# U2 E& |# e f$ `6 h8 o2 h, ~
- Palette_Init
2 Q) Y2 c8 ?0 T8 ] - LDA #$3F
' W/ ?) w" ^% ^ J4 y6 t' i - STA PPU_ADDRESS* l& e1 g7 y, q. J; z- [0 }
- LDA #$009 h2 r/ @: F0 Z8 c
- STA PPU_ADDRESS6 x+ G y; _" t2 @( c% W. t& n2 r. g
- LDX #$00
. v$ C* a( R% N6 d0 X - LDY #$20
* M& ]- C! `4 F1 Q; T - .Write_Data
- H, U2 }8 |5 p5 a9 K0 Z - LDA Palette_Data,X# j; q& g8 ^& H) D9 h, g
- STA FC_PPU_Pal_Addr,X; W- \* j' j! ^% X
- INX; Z8 M( t/ A+ N6 E6 y
- DEY0 L }1 J2 J- }0 |9 R& `
- BNE .Write_Data
8 a! U j, e V$ G4 N1 H - .End
1 S5 F' m; j9 I8 J0 {( v+ y( h - RTS) W% Y) O+ t8 k _; N% E
' y8 L: O! O. ?; J, |- ;----------------------------------------% p5 n' g$ }3 D5 ]& l/ ~6 j$ R% \
- ;调色板数据 P: w2 D7 N) s0 i7 U; W( X
- Palette_Data. K& t0 T6 @& o' _
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 j/ p* p* s' a - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 223 {" `$ r3 L% u/ r; a
-
. H: S3 m3 D0 k- E4 [4 X) [% L2 V - ;======================================================================0 X4 e l" K; e* S, S* [
- ;命名表清空
8 w$ s2 G3 ]! b1 Y2 n* _4 D k7 A - Nametable_Clear
1 g- {7 @" G% y$ _# \ - LDA #$20
8 E. k/ j4 V8 B) v. d - STA PPU_ADDRESS
) z% M9 i5 J ]6 K2 j. ~, C - LDA #$00
3 J; A' M. h: |* `6 G& u6 H& E% g/ p - STA PPU_ADDRESS& T3 p6 r- S4 T
- LDA #$00
9 `# ?8 X/ o) Z& W - LDX #$00
8 l" R/ U/ Q* K, p& }* D7 r# a" w" | - LDY #$08" K5 ~# c% O' l; U
- .Write_Data
; y \+ E* b+ Y7 p4 z+ X) n - STA PPU_DATA$ s% w9 h4 e8 `( S; s% R
- INX) T# K5 m5 J1 Q3 A. H: {
- BNE .Write_Data
6 `' R$ d( Z' g! B# j# H( R - DEY6 I; S" d! _! m, B% O2 q
- BNE .Write_Data
6 ^ _1 L J7 A: W - .End' |- c3 l7 U' N# `& W. R4 i
- RTS
3 C, |: N- J# t. p - + F, }( s; h. R
- ;======================================================================5 W0 L' l4 l1 M; Z5 S9 b7 D }
- ;音乐曲目切换
- ? ^7 x# E+ `1 h! ^( Z( h - Music_Select_Process; G$ ^ E; }- {, f" n, e
- 1 l# m0 o; k6 i0 n( p- {4 C
- .Pre_Music;上一曲
4 T, q E( c" P) ^, @$ f" u7 k - LDA FC_Gamepad_Once$ a) }4 a# D `
- CMP #JOY_KEY_LEFT
5 i/ V% ^1 j, w3 w& ^ - BNE .Next_Music
: R9 B; e: Q E: \9 E, a% z - JSR Music_Play_Pre
& I2 e( @: I, s9 P: a# z; G/ y/ I - .Next_Music;下一曲0 ^0 p: P3 W+ `% F: @! [5 V, K
- LDA FC_Gamepad_Once0 c; B4 n2 o' E5 ]6 G0 b
- CMP #JOY_KEY_RIGHT
$ `6 Y! x) s: H1 u1 c - BNE .Next_10_Music% H8 l/ g w" L2 O
- JSR Music_Play_Next
2 g, p& P' w" y4 H - .Next_10_Music;上10曲5 `/ `# p/ D, L' a+ ~% u* d1 S2 V
- LDA FC_Gamepad_Once
b2 b! H3 F6 l" ~3 r- \- }8 y - CMP #JOY_KEY_UP
0 E1 ]8 F7 d4 }0 m W. _" k - BNE .Pre_10_Music% c7 S+ [/ @/ v r
- JSR Music_Play_Next_10
2 k& Q6 z5 G$ E m - .Pre_10_Music;下10曲
# g0 e! b6 B% ?. b9 N* j - LDA FC_Gamepad_Once0 }, E% Z5 C" N) ^& F
- CMP #JOY_KEY_DOWN. j' W# o7 h2 ]8 b
- BNE .Reset
! B7 Q7 F) Y* q- L3 l0 F - JSR Music_Play_Pre_10
0 u* v- _2 r/ H) r- Z) G+ l$ a - .Reset;重播当前曲目
( Z4 b9 K) B, h2 b1 { - LDA FC_Gamepad_Once
# V; ]6 ]8 X" w. q - CMP #JOY_KEY_START' z, d* _* X o4 W/ F# F
- BNE .End
7 C( C( N; f5 \+ Z - LDA FC_Music_Index
2 A) _! D' s6 Z0 v7 C# ?* k - JSR Music_Init_Process$ k; G7 X+ @- }) |' ?3 o% k
- .End
8 n" p* \& h- v6 T6 b - RTS3 m) C7 d! }# a( s5 |$ ~
- ) k* H5 s8 h; D' X" m* n' k3 ]) e* Q
- ;----------------------------------------------------------------------
& f. l3 J' z5 b - ;播放上一曲
2 ?6 G! B E6 h8 Q t R - Music_Play_Pre
" t) H: ]: p/ V; f3 s0 I( ^! T - LDA FC_Music_Index2 @& n& f6 f% X6 e) {6 b$ S. B
- BEQ .End6 {3 q6 X4 d+ F: {
- DEC FC_Music_Index
; u! ` e* v& s1 W - LDA FC_Music_Index$ G" r3 o4 s: L5 q
- JSR Music_Init_Process5 s& m# X0 L7 {% O$ M2 R9 W; k
- .End# ^; w# k2 t7 ~' G7 G
- RTS6 \: t4 V) F# H9 `
- ;----------------------------------------------------------------------2 R3 W# q& j2 W9 P* m7 Y9 [6 k+ Q
- ;播放下一曲2 U' U1 \0 e* G# W# u
- Music_Play_Next
, C1 G) x" Y- { \- F - LDA FC_Music_Index g5 l a5 ^/ |5 z/ n9 h
- CMP FC_Music_Max_Index A+ j y. V- T+ m; J9 ]
- BCS .End+ F. u8 g4 D4 e' n
- INC FC_Music_Index/ E$ v i* G( U) k* o* u3 U
- LDA FC_Music_Index
7 X! v# O4 A6 X! Z - JSR Music_Init_Process: R7 j" _5 W9 R' @4 O2 W
- .End
: P! n, a% T0 _- j - RTS6 X" X0 s+ i2 j
- 3 x5 {3 X: o" f) F& c
- ;----------------------------------------------------------------------
4 D8 R# {9 `$ m* R" z! n - ;播放上10曲- a6 ?; y# \/ W4 I, S/ m
- Music_Play_Pre_105 t0 P1 H1 j3 ^# s' s
- LDA FC_Music_Index
! T( ]# y7 V; O7 h5 ?6 w* `) X0 N* o - BEQ .End& i% O* K5 ?! i5 B0 {7 _5 P
- SEC( o% a9 t2 K* o
- SBC #10
& f) f! K, e" t, d4 C1 ~+ s - BCS .Pre_106 Q( y. r3 i7 o: n
- LDA #$00+ A! s& [: H" M7 q% h( g: k/ p+ F
- .Pre_10" z, \4 c) r0 {: q) \1 i2 J
- STA FC_Music_Index& X B/ n* B( o% I) A9 Z& |+ E
- JSR Music_Init_Process" @" W" q# z2 b
- .End8 M- m. ]0 }7 C& W+ } j. d% W( j
- RTS/ ?/ z" Z* W; w/ ^ d2 U
- ;----------------------------------------------------------------------
* K3 V) g/ p7 P1 t - ;播放下10曲- x" k9 P$ E# y9 B* e
- Music_Play_Next_10( e1 i, K3 _9 t9 |: b
- LDA FC_Music_Index
$ V o. ^- `. O* K9 b" E - CMP FC_Music_Max_Index
3 S* h3 o- B- _6 h" t - BCS .End0 i) V }6 h4 r2 m, S1 m
- CLC m% `/ f1 F% n1 }0 _( U
- ADC #10
: j+ a, T3 p3 C - CMP FC_Music_Max_Index4 c5 G4 u3 n) G0 ^
- BCC .Next_10
! w& F, |; N! A6 y - LDA FC_Music_Max_Index
- p+ u; i/ ?5 H, X6 s* U - .Next_10# M: C& O% `; O/ N; S1 k7 M
- STA FC_Music_Index
: w" T- o8 S3 c$ r - JSR Music_Init_Process
+ U4 R) }; ~% Q) n6 D7 y - .End7 O9 v: _- s9 {9 z2 ~
- RTS
' o( A, j3 ?5 p! q: j f! y
. w J2 l, u: X6 b- ;----------------------------------------------------------------------/ Z# r8 s! p9 G) ? q/ B
- ;8位十六进制转3位十进制制1 a4 I3 `- F Z1 n3 Q& m4 ]
- Hex8ToDec
* T' q* c1 _1 k) Y - STA FC_Dec_Data_17 v5 t% M) b! h0 O8 |0 N4 |! |
- LDA #$00
; m7 f) C' E5 p' D2 B1 i+ l6 ~ - STA FC_Dec_Data_100* f4 Y2 Q/ ^4 ?) q* S% ?3 y# Q
- STA FC_Dec_Data_10, P, n" [- S# ?0 e: Q1 T7 z
- LDA FC_Dec_Data_1
& c: ]& k& n3 G3 N/ x# K8 p - .Convert_100
. L3 M& n) H( B$ ^+ w - CMP #100
2 f L' L" O; q. X1 Q - BCC .Convert_10
- @ a& }6 H2 W+ R( I% M - SEC- i( { z# t; m) B
- SBC #100" u! }" V2 K0 w @. ^8 R( V' k; E
- INC FC_Dec_Data_100. x+ m/ R! t; d. Y( l J2 |
- BNE .Convert_100, S5 N' v( ^. _5 p3 ]+ S
- .Convert_10 C. |) z$ [+ V0 \& ^
- CMP #10
0 ]0 v" e: r% ]& }3 l% @ - BCC .End
8 T0 @( L' q! r- O4 R P- W; b" l+ v - SEC
5 k; x& r, ~2 n) { - SBC #10; ]9 e- _( C( H |3 J2 C$ J% F
- INC FC_Dec_Data_107 x- [0 b0 S7 f1 m+ Q2 t$ [
- BNE .Convert_10' D ^4 f$ m, i5 G$ _1 ~
- .End3 N7 Y4 ^6 C8 n# [' C
- STA FC_Dec_Data_1
4 t" g8 K7 `( H% J8 h9 A4 H - RTS
5 U( p5 [1 t! H# R, }" P - 3 H9 V: G+ E9 D4 |7 v/ l. \
- ;----------------------------------------------------------------------3 Z) V& X% a9 H6 B; `
- ;显示曲目信息
+ L7 ?! W. e" c; U/ q) B - Music_Info_Display0 c8 w# l# Q6 Y1 H3 [! q% p
- LDX FC_PPU_Buf_Count
' t8 A7 @: Q+ h4 W2 l0 }( \' U - LDA #PPU_WRITE_MODE_CNT_LINE$ R- S+ S8 r9 d! P5 s
- STA Use_PPU_Buffer,X$ D) z# B% x' y" S( l$ p
- INX
1 }0 L% Y& Z( W4 R% n -
5 K6 b5 _5 f0 B# q. z/ t - LDA #>MUSIC_INFO_POS. t3 B: m( R( c, ]- Q: O! V
- STA Use_PPU_Buffer,X& V) T4 ^4 R) Q9 [2 Y F& i) F
- INX1 n- E+ v% H) }! P% @3 q) f$ i
-
n9 l5 w- V5 i - ;居中
' F' i& Q: `. s* ] b! x* E. X6 i - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2% X/ [) ]5 g- [ F1 A: D( u
- STA Use_PPU_Buffer,X1 G0 k. Q& Z+ Z/ @" t
- INX. | ^5 ?; K3 F" L6 H- x
- * c3 H: f; ~( M
- LDA #$051 X) t0 ]4 T$ C$ I+ c" q
- STA Use_PPU_Buffer,X
( Y/ O* z5 k" [# C - INX. x" t* e v' |; h* n
-
1 f9 s/ i# {# B- N# Q, [ - LDA FC_Music_Index
& z. i; c9 b$ a% a7 w! G - CLC
# s- S4 k" Q5 Q9 }1 B! U* \: r& V - ADC #$01
, j) j. B4 _; z+ }3 N - JSR Hex8ToDec
& j, h8 n% i* M: @ -
/ ?1 g* C; R# Z, @; ~ - LDA FC_Dec_Data_10
* j M% Y. D3 l( w1 Y - CLC
7 B, R. z# D0 a' ~9 R5 e( T3 { - ADC #'0'
4 v0 a& t8 }. U( @( t( Y* T - STA Use_PPU_Buffer,X/ ~5 O# q- ~. t' y8 \2 B- V9 n; U
- INX
' j4 W$ q0 U2 p% a! z6 F3 w, X - " ?# }! C: d/ a. Y, N) F' D% z2 Z
- LDA FC_Dec_Data_10 }# p2 ~- [4 H9 J/ z# [, N/ p* B
- CLC/ \. }$ @, n$ c& E1 y0 C
- ADC #'0'
) k/ `) [7 Z7 s; p - STA Use_PPU_Buffer,X
0 D9 P+ u6 E4 ?! \( w: V+ d4 A - INX4 D7 W, h0 e. B* T
-
! U6 W8 V) {! | - LDA #'/'- s/ r. c2 T. v# h: j/ |1 {- z0 J
- STA Use_PPU_Buffer,X9 z8 }$ ]8 ]: x6 M
- INX5 p* @6 y7 _( J( T9 Z! q
-
4 V5 O2 }7 p+ v( s& V f. F1 ? - LDA FC_Music_Max_Index
, T9 [7 F; M ~& a/ Q2 ?! \ - CLC+ _' t$ A3 ^9 m. M& t; {) x; a! ?
- ADC #$015 r, J$ Y" h( V- n
- JSR Hex8ToDec
4 u& R, Y1 e3 o+ c. N( W& y - 5 K+ z; D: u! @6 f' f
- LDA FC_Dec_Data_10
1 ~ I5 L0 v' [ - CLC/ o5 b6 V- }# i; y
- ADC #'0'
- D! \! d' D3 M Z/ L% d& { - STA Use_PPU_Buffer,X
& \/ _4 N6 @$ ~ - INX- ?1 f2 m* e, x
-
& X; ]% D& d& d' `. T8 T# Q: Y - LDA FC_Dec_Data_1, U$ \$ _- E( a/ P4 p) o
- CLC
* d D3 |0 W; c0 W4 h - ADC #'0'
2 Z5 f4 }1 x7 |: y# h' m - STA Use_PPU_Buffer,X" O; a5 V3 X& m& _, }) O2 H
- INX# s" Q' P8 l8 q0 `9 ?( l/ c& O
-
! b0 X: D- x# C2 x0 m/ y V - .End
1 G3 F. I, [, W- V( ] - STX FC_PPU_Buf_Count
3 O3 C ?0 d" _ - RTS
- K2 i/ ^8 u) r# ~ ?
/ g h9 }/ X& Y0 @4 n: L- ;----------------------------------------------------------------------! E* S% P9 ^6 d0 E, ]! k7 D1 s ~) i
- ;音乐曲目初始化处理
2 o5 ]& D0 B' ?7 `! e. ~ - Music_Init_Process2 k5 }. V1 L# i2 l A; l; y
- PHA' q2 ?& i: H. D# d
- JSR Music_Clear_Process. O" `6 E- n1 c9 K4 I+ Y
- LDA #$1F5 S. H4 m4 T1 m* r; M
- STA $4015
' ^: s! v9 L$ z - PLA
* k+ X7 R% d. L( b( w( } - JSR Music_Init_Addr3 }& f2 x! B: G4 h& Y. S- z
- JSR Music_Info_Display
; p& O" U0 u# ]+ ^ m3 B - RTS. m) d& z# h2 |6 w2 A* [" a
/ Z& Y; Y. l9 h% n& i* Z- ;----------------------------------------------------------------------
) C$ `% T* j3 R6 ^/ z1 N - ;音乐播放处理
+ E C; K8 Y, E - Music_Play_Process+ Z7 y C" `0 \6 x& h j* ^' F4 u
- JSR Music_Play_Addr6 P, y3 ` j/ K' x$ v% `! d) T
- RTS
# H/ z6 Q* Q8 A' m2 t
( K3 U& y% X, t$ N- ~- ;----------------------------------------------------------------------
6 c0 r) \, A( J' _ - ;音乐播放处理* F! [# {2 \5 V( v6 E
- Music_Clear_Process
. V& H5 t5 q* k5 C3 S8 x9 [ @ - .IF Music_Clear_Addr
# j5 S3 ]% k4 R0 ` - JSR Music_Clear_Addr7 j' L' C4 ?. F
- RTS+ L1 `* @4 ?4 x) a9 P
- .ELSE
8 `: }% s) T% ]+ G" h" F* O i9 C - LDA #$1F
& o( O4 j! A6 x3 `0 f2 }/ A" I - STA $4015
$ ?6 p* m+ m7 m2 U1 H - LDA #$00
7 u' \* t0 D9 J- c7 ]3 m5 C5 W" L - STA $4010- H/ x" a5 c) C- d9 f
- LDX #$00# y) T; I) Q+ t
- LDA #$00
' W3 x: [- y# f& h. h1 X7 _% k - 8 m* I6 ?- L7 M$ \" `
- .Music_Clear_Zreo_Page_07 [, J- r7 h4 @
- STA $00,X( K8 ?8 o) \ t. z, c
- INX
" R/ S ^! c) R3 h" M - CPX #Use_Zero_Page_Begin8 [2 p' p1 I1 z- w2 J( H
- BCC .Music_Clear_Zreo_Page_0: o1 Y2 H( t4 v, q k2 L
-
. o0 d" ], S3 N0 R i/ f - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size* i: x, i! k3 K& g9 b
- .Music_Clear_Zreo_Page_1
; G& h6 H7 O$ B- ^ - STA $00,X
% F @- E- c7 V - INX
# j1 M+ K- a/ r. S, J - BNE .Music_Clear_Zreo_Page_1/ X- P" l# R8 j, @$ h+ _+ }
-
' ^& y9 y8 g9 a7 ~6 q - Music_Clear_Process_1
5 }5 u6 ]$ z+ l6 _3 i0 Y9 P - STA $0600,X
5 r! v8 m$ v, T M0 Z; ^0 J, g - STA $0700,X
' {: {! j! D$ p - INX4 ^2 w1 ]$ }; J; E3 S( V- L
- BNE Music_Clear_Process_1
; P1 Y5 T1 @" c" g/ B" c, c - LDA #$10- t+ t' G* ^. `: P' j: A L' ?) A
- STA $4000) x5 v- B0 }4 t
- STA $4004
# q/ F( z# s7 m3 B - STA $400C( i% v u: F% p- l- M5 [
- LDA #$00
0 J% `7 R3 d2 ]& h7 M - STA $4008- o8 N+ w" s M
- LDA #$0F
, r. ?0 o; _& F) }! P: C* H# H - STA $40154 Y5 K9 V9 ~& v/ E; F7 T
- .ENDIF
# }3 i- U: [" b/ G6 [ - # E9 n/ D+ L0 _6 B" v
- RTS
7 U1 e( s0 R2 \
0 i. u! y. B6 @1 B) e- ;======================================================================4 T1 x5 e$ R+ x0 |: P+ c
- ;重启处理
; o* ^7 \" Y; f - Reset_Program
- n2 W2 d3 G$ t! a, |# i; q4 B - SEI
$ n! g% d; E- a* \ - CLD
7 k% O% ?2 |5 @+ k; ? - LDA #$00
, y: c. ^. }' B! H+ I# @ - STA PPU_CTRL
, R% i( C. Y, k0 e+ |2 \ - STA PPU_MASK6 b% [9 H- m V5 n
- STA JOY2_FRAME7 o" g/ a- l( j( Y) S0 N# U
- STA APU_STATUS
; R) y' K. a3 h2 `) t6 L3 w - . u% n! @! `5 J- R
- ;等待屏幕准备完毕
5 Y7 i$ I# {3 I7 F - LDX #$02
' `. V) i% G" N - .Wait_For_Screen_Ready
5 Q: ~1 W. s* z3 ` - LDA PPU_STATUS
: K2 O8 F# x" m$ D - BPL .Wait_For_Screen_Ready
0 Q) ]5 s0 Z. j/ u" O* o - DEX0 C4 \& C3 J% p' ?
- BNE .Wait_For_Screen_Ready: I( r+ [; q1 C. z6 m2 M
-
$ Q1 A* G# _, o' ]0 i& }# @4 L - ;清空调色板! v( O) H5 y- S5 r- M( U/ t+ {
- Palette_Clear
8 G ? i5 k# \& m; S - LDA #$3F
, k. f2 J0 C6 J& l4 B) L - STA PPU_ADDRESS7 B" E' c6 X" u9 Y- `
- LDA #$006 ~+ ?) u8 N; U, L0 j' }' K4 o
- STA PPU_ADDRESS
4 z' t. ^6 {8 J- M# h- p6 N) y' m - LDX #$20 t4 n+ g$ ^" R' }
- LDA #$0F
" w# t- h) M! {0 Z - .Write_Data% Z6 }; D" p% w0 a% X
- STA PPU_DATA
5 o' \0 H: p" C3 T - DEX
! v6 U# X0 R- {3 z7 ~ - BNE .Write_Data
" |$ s/ }& X" [
! }+ H1 N, x2 p: G- ;清除声音 $4000-40133 c8 c$ a* m+ {3 \ F9 ?. u& w& |2 N
- LDY #$14( F& ]- J$ V$ ~, {2 @0 C A: z
- LDX #$00) I9 c4 {' l# _" r4 [
- .Sound_Clear5 F7 {/ s- T+ S$ X6 u, ~
- STA $4000,X ~2 |$ Y9 s* O$ w( j7 {
- INX+ f6 B( g& g9 B% _8 k+ l4 f
- DEY, s, E0 m: A/ a5 u7 X A! ?: s
- BNE .Sound_Clear
) \ }% S7 @/ k6 c. ^0 | - 5 F' p6 Q- R/ \9 {4 B0 v1 z
- ;清除 RAM $0000-07FF
* A0 m8 s3 ^ u3 m a - LDA #$00
& f0 m( N4 H% m6 V8 E - STA $00
- ?9 p" e4 [% b. v- M - STA $01" k$ I% q" Z6 v, Y. E
- TAY, h, {1 `+ e9 b3 P
- LDX #$08
* G( g5 x& w" p: T) a - .Memory_Clear
, n3 {* l; T7 P9 o" ` - STA [$00],Y
: ^. s- p( e+ {$ E& S, o& H - INY
8 G$ H+ d' V6 \, A1 k r - BNE .Memory_Clear
; I% N' ? r. ?+ e+ u. W3 p - INC $017 Q. x8 B% F+ q2 E' p
- DEX7 Z b! _0 a& t$ }2 i( E( ^8 S/ v
- BNE .Memory_Clear& W J( w2 _* [" P
-
: ?0 P) z) o4 m% f - ;精灵缓冲初始化3 e1 P; C7 C& X4 z9 p8 p. w
- LDX #$00; ?3 M) W: b. x1 u+ L
- LDA #$F88 h/ T$ q' q' e$ r+ p2 a& N
- .OAM_Clear
, Q/ N/ @! k, l/ s - STA OAM_DMA_Buffer,X+ T3 l+ b) f8 ?4 s3 D! R
- INX
: F- @' s0 a) s7 n- d - BNE .OAM_Clear; M% N3 w) O% q! s D- _7 t& t
- # a+ \7 v: y' z1 y7 f$ [1 ^$ Q
- ;栈指针初始化
. l+ l( o7 O* ^9 ] - LDX #$FF
5 B9 L9 B, M1 l$ f - TXS$ W" h1 E( }. |; \
- 0 |' D% p s5 A
- JSR Nametable_Clear;命名表清空% D# L& \+ ^. }: Y8 Y
- JSR Palette_Init;初始化调色板缓冲& `/ b" g) y' q0 ^: y" c+ E
- JSR Static_Text_Init;初始化静态文本
% A. d. I' X4 I' k& m7 p - 2 T8 q1 Y/ X, n. ~- l; }- l# A
- LDA #MUSIC_ITEM_TOTAL - 1
# h1 ?2 O: y7 f1 O - STA FC_Music_Max_Index. c W9 q4 K' H2 \# l$ X: q7 l1 v
- : m* B8 S9 W* N( s
- LDA #$1F
# x, F% U& w% X7 }5 [' D/ w: } - STA APU_STATUS
$ d' ^) s' \/ r( Q, f - LDA #MUSIC_BGM - 1
5 p' A5 t$ C6 U+ C8 h; I3 F - STA FC_Music_Index4 F. E+ w% U$ L Y" b: @
- JSR Music_Init_Process;音乐播放" J. J$ t( H6 d. u& i
- - T/ b, H! b& n' }4 X
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态); p/ ~) d0 Q* Q0 S
- LDA #$1E7 t" \$ v8 Z: D
- STA FC_PPU_Mask_Buf
$ g) |" _6 C/ V, `4 u" p - # a; t; F/ g& ^4 r) ~ s- A7 |+ y
- ;启用NMI处理
' k7 q& O+ Q: k d+ J - LDA #$80' ^5 O2 i7 w/ t; }% h# y
- STA PPU_CTRL% P' t7 Q& I$ g
-
2 m& g- r! G* X. i - ;程序循环, 剩余工作交给 NMI 中断处理! F5 j2 c$ C, j3 |9 n, r/ d% f
- .Loop
& K0 Y2 g( F, U2 G! p4 _ - JMP .Loop+ S5 r9 F$ a; Z7 h
- # o7 e, {! u5 j3 t, A
- ;======================================================================) m( ?6 l& @' @( e" F0 D
- ;不可屏蔽中断处理! I8 h: {: P, @0 B' [
- Nmi_Program
3 [9 c; k: w/ E9 Y( k - PHA
2 f1 A; k1 e: J6 F) t5 O - TXA
/ f$ v) Y' o/ T8 P - PHA* n5 ~( `' V+ n3 J- Y
- TYA
5 h7 A3 H9 P. d - PHA8 C" v+ W! M! [' W
- 6 h# Y9 q3 R8 e6 O; t% X+ ^
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
" U' ^, \- \- B9 o) @' j( \; V - 3 D" n) h/ s8 |$ f
- JSR FC_PPU_Procrss;PPU处理8 r, E* ]0 m) `+ p
- 0 i8 G; F% I$ o/ {0 d) c! a6 X( y! F
- ;精灵内存更新
# Q8 e" M, D( Q1 {; _ - LDA #$00
8 j" n9 j5 x: M: I" U7 K' b8 \4 B9 h8 c7 v - STA PPU_OAM_ADDR
0 n; l) K5 G4 b% |( [ - LDA #OAM_DMA_Buffer / $0100& U) I( a B7 P3 A" ?3 _; i
- STA OAM_DMA
. E! Q4 e% k# k4 }5 Z7 Z7 c -
" j! o4 a; P9 S* S$ r' ]' a - JSR FC_Gamepad_Process;手柄输入处理
6 C6 u4 T/ {2 m) Q7 S - JSR Music_Select_Process;音乐选曲处理+ @* K0 {+ Y9 B3 Z" k! f2 J* |6 E
- JSR Music_Play_Process;音乐播放处理) U9 n5 z' m7 o6 ^4 I: U
-
: W% n# ?; Q! d' E - PLA8 E; a- _: N, N) a+ ]
- TAY
( _' K6 t8 j6 I' K s* i - PLA
) ~. S$ x! A6 Q1 B# B/ m - TAX: `4 E [# m0 w$ o
- PLA7 b" g( z9 `7 [. z% d2 T$ V$ @# f
- 1 l3 o" ~) A2 I' e& G9 D1 g
- RTI
, `9 R1 I; Y& M2 O U& K* c
$ x8 j! F4 K" A2 o, [0 q- ;======================================================================* l6 e6 O4 C, }0 k
- ;请求中断处理
! l0 f( o4 u$ W/ p4 Q: ] - Irq_Program, ~! z( Z. X4 v3 k& b
- RTI; E1 `) s1 \, r
- ) ?8 @) T- s$ n2 F, A- r# g% a
- ;======================================================================
, ?2 q0 L. t) j9 n: Q - ;中断向量表9 K( F/ c) _( Z( V L
- .ORG $FFFA
; U. T2 c- `9 j& |% D - .DW Nmi_Program ;NMI触发时执行
1 ?0 g! y Q8 G - .DW Reset_Program ;载入ROM时最先执行
( k5 B L! B* s* U0 G; S - .DW Irq_Program ;IRQ触发时执行$ M, i0 [: q0 V" v( E
复制代码
" M3 s4 C' _) o$ q
& t+ k, a J. \$ Z5 h
" H& e: p0 [8 w* g2 o zhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|