|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
% m$ d" e! _6 X/ N1 Z 8 ^! V, d5 g' m9 s
以下是主框架代码:
% N: a( y4 b, S) F- ;======================================================================
1 i$ J0 m% e" V. T; [ - ;文件头- T9 j& B) L* c- W/ u
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量1 I! ?' S3 i9 d$ \% L
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! ?5 K+ w2 ^5 W7 S8 H$ l
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码1 l1 W* w, Z# [6 r4 W& o
- ;======================================================================- |% ^, I5 j/ S) s/ G B; U
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2+ X- d$ B& N6 g/ e9 L" E
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
* r1 `% v2 D% X5 O, H( l$ w4 i2 y - ;======================================================================/ a2 r4 |, C: x- n! G1 ~
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 11 r2 [: s" C# [
- RESET_ADDR = $E000 ;主程序起始地址
$ Q" V! X. D9 { - ;======================================================================
$ X6 H: c! H! F0 R! X! X, Q) I6 i6 Q - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
) F. p& {$ T2 ~% B, v - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB' B* @9 U5 u$ X. f' y. ?; u7 I
- .INESMAP 4 ;Mapper号 (0-4095)
2 f* |; X \% J* G1 G3 ^1 [ - .INESSUBMAP 0 ;子Mapper号 (0-15)1 {! q/ |3 Z0 }/ r
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
4 z. F; D! Q: G3 U - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)/ _8 Y7 `' }! P% g7 L
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)# H" J( L8 Z* C1 I! c5 i5 Z
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)1 U- ]7 j0 B9 ?; v( z5 [5 {0 o- P) [6 {
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
% V7 }. g% L. b% T# ^0 x2 R - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
1 G$ ?: V. T- e9 w, { - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
# `# i2 o e) ~ - ;======================================================================
9 D$ l+ ^! `2 R2 n/ i/ w8 O; T. e - .INCLUDE "fc_demo_config.asm" ;全局配置
& G8 F8 c, R( K/ V - .INCLUDE "fc_demo_constant.asm" ;NES常量
4 M. D3 J+ J: r" z, S - ;======================================================================; V6 A# k7 A" g |
- ;音乐配置
( f8 d1 R4 |, [0 R - .IF 0 = MUSIC_THEME 6 ^, D. Z$ D! X& ]6 S# U* P
- .INCLUDE "data/music/Gremlin 2/config.asm"0 ^2 e, Q0 l' F/ T
- .ENDIF7 v+ p2 [5 p0 p
- + F8 q$ k4 Y& y- g* L. Q
- .IF 1 = MUSIC_THEME! }4 R7 t$ v! g6 Y2 } O7 x$ ~( w$ n
- .INCLUDE "data/music/Raf World/config.asm"
* W3 z3 D3 w) \$ ^. `) C - .ENDIF/ {6 b1 `, X% O$ A8 E+ S; u
- " T0 b3 `8 F' {, J* u
- .IF 2 = MUSIC_THEME
N1 x5 s! Z f; o+ o% G - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"9 t' Y+ W% {) U6 V5 s s
- .ENDIF9 e# P$ s) {7 m j6 ?; K
- $ M1 F$ R$ s3 G# Q" v
- ;======================================================================, a2 u* F. E. t
- ;引用CHR图像数据
9 W. v( D0 _$ h! V - .BANK NES_16KB_PRG_SIZE * 28 ^3 o+ G6 l6 G5 {: w
- .ORG $0000. ]( _+ Z; e7 u, U- f
- .INCBIN "data/bkg.chr"( i. N! i* ~2 p, }' F, y
- .INCBIN "data/sp.chr"* e; T* \1 W( w4 k. s" x3 f2 ^
-
0 e9 }2 o0 Q, [' r - ;======================================================================8 [: q! V4 \9 J1 z6 f. N
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
! H1 O* @/ d' \ - .ORG RESET_ADDR9 s: M9 K2 e1 y: w7 y/ L
- ;======================================================================) B5 J. Q8 Y `! T' S/ I
- ;引用其他源文件0 |9 i+ n8 E; s, ^2 O) _5 A
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ m4 a Y; P6 C3 A6 ~
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理3 g- e y" j* l2 i% W: s: M% n
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
; S/ L9 \; k0 [$ x8 O3 C - ;======================================================================
+ h7 {% a: W" y, K* | - - X/ ^, a, j2 g: i5 {( m G
- ;======================================================================
/ K, J; r7 l" f: A! D, x6 T - ;等待VBlank到来
+ P: p, B; E; d9 c- p5 }* m- y/ J+ I - Wait_For_VBlank1 t, f$ K8 M2 Q
- LDA PPU_STATUS* i2 s* \( X! I# t) f7 p
- BPL Wait_For_VBlank
0 a% j% d0 j+ P' b" H - RTS" X4 a) q+ c" B8 @9 c/ W+ U
- ( L8 H6 S7 X- t. f% }
- ;======================================================================4 K5 ?$ P( Y$ [* q) B0 v
- ;调色板初始化
; i& K) u W4 m6 i2 B - Palette_Init
, d8 b4 r; f. c. ]8 ] - LDA #$3F
0 |% G# ` `* K* e - STA PPU_ADDRESS6 P7 w) l( l' P
- LDA #$00
c5 |# z3 [4 u' S% @2 H" B - STA PPU_ADDRESS
/ {$ m ~0 c: \3 c6 i6 g - LDX #$00# F. a. x+ }3 s* ^' T) a, \
- LDY #$20
! ^1 z9 C9 ~8 _6 |8 {. u - .Write_Data
$ S$ z" G# Z: @& ~* Q8 F' R7 g - LDA Palette_Data,X, s/ R6 Q2 m' @7 Z7 P: i* D
- STA FC_PPU_Pal_Addr,X
- z9 R) `# L: T3 L% C - INX
4 r) L# F6 ]3 S& E% K - DEY. h0 s+ G' j0 [. ^3 A, t
- BNE .Write_Data' c7 @$ I, m9 B" Y
- .End f) h9 O* b; ^0 f
- RTS6 E$ S0 f4 {4 J: U/ E) e: i& j9 P
- 9 o: X7 ?& `4 S1 @2 ~
- ;----------------------------------------8 n/ a) ~! J4 F; o A7 ]& Z
- ;调色板数据8 \8 A L; I* k0 C
- Palette_Data' G1 p; a( T X5 A/ L# X
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B# N& s. r9 ~5 K8 w4 a9 V
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
1 ~( v# F" V/ y0 O4 r! @ -
5 b& `2 M) R' l& E4 G" W3 A2 O; R - ;======================================================================
4 v; i, Z5 E/ v - ;命名表清空
9 ?" J. S6 E9 ? - Nametable_Clear
9 o" z2 W- X- J, b" ~( b2 k3 D - LDA #$201 s& U# t# q4 v# P0 \
- STA PPU_ADDRESS
% y, W- F+ B& B7 N - LDA #$00
) Q+ y5 J" ` ~; A1 \4 n - STA PPU_ADDRESS
3 G) M# U/ b2 @7 J% Z8 ]# u' @; t - LDA #$005 o- P% S* E, R9 i) `9 m0 z6 g
- LDX #$00( V" N$ S1 U' e4 M6 f
- LDY #$088 G; ]7 m' Z) @
- .Write_Data: L$ k. f$ m2 A1 X/ L- k2 }
- STA PPU_DATA
/ A4 q% b. M, }% h - INX/ s3 T7 F7 h# T8 M
- BNE .Write_Data
, y& R9 z% J! Z2 O% [ - DEY8 T( I) R$ E& a! V$ v q
- BNE .Write_Data- R$ c- X! ?# p3 x
- .End
; D: G- S7 V' t& @ - RTS4 k& B& ^- d7 _! r
% q2 N9 L' @ Z$ a4 \# h- ;======================================================================$ q6 h% d# [1 O. G$ t2 w
- ;音乐曲目切换2 `* T& |2 H% U3 Y! _+ w" I+ k
- Music_Select_Process
$ r# ?: `' @3 k+ _ p
, d) K0 U0 i2 q8 _" k$ f( P- .Pre_Music;上一曲6 v* M$ b+ M% [, H# h6 a
- LDA FC_Gamepad_Once+ u9 H. Y S$ l# s r5 W& E
- CMP #JOY_KEY_LEFT1 u4 e8 P) D! N* O! I& u
- BNE .Next_Music- u' D2 I0 t- L( }2 Y2 n. W/ |
- JSR Music_Play_Pre
# e6 }" Y# p3 f( Z3 ?8 ?& y - .Next_Music;下一曲5 h) o3 f- Y8 q* G
- LDA FC_Gamepad_Once. w& V7 I8 d6 p& d. R' c
- CMP #JOY_KEY_RIGHT: p, u, I# G* }! e7 a9 @
- BNE .Next_10_Music% g! F5 W) e2 O+ u' H8 }
- JSR Music_Play_Next
, i& e& i) K, q+ e, D* W - .Next_10_Music;上10曲7 W/ D. W2 X7 i
- LDA FC_Gamepad_Once
; ?# U/ [/ |3 i3 ~ T9 y; r - CMP #JOY_KEY_UP
/ t1 S3 R* ^# e7 c" @* }. Z - BNE .Pre_10_Music
5 E- d# ]+ r1 L2 G; ?0 i - JSR Music_Play_Next_10
# [9 r* X. f1 u - .Pre_10_Music;下10曲$ Q4 z, R) Q' P3 j" l
- LDA FC_Gamepad_Once7 x9 v+ O$ M( H2 G! p
- CMP #JOY_KEY_DOWN4 ~% d" n! g- d/ x
- BNE .Reset
, j$ `8 w5 S* T' J8 P- T- V - JSR Music_Play_Pre_10
) A* b) B2 I: n; L) |( u9 r! c - .Reset;重播当前曲目8 j' _3 k' C `# A: U' Y$ r
- LDA FC_Gamepad_Once/ y0 ^* C3 U( h7 N. L+ S$ B
- CMP #JOY_KEY_START
, u( x; U% E- b/ t) x: X' [' F - BNE .End7 S/ p S" W [* L i# r) O
- LDA FC_Music_Index& U0 `8 t4 n' D0 V4 \
- JSR Music_Init_Process7 l4 h0 H3 p% N' I! z5 v+ {& Z) F
- .End
9 Q" o9 V* t) @* v( `0 b a - RTS
1 h' M; P2 ], i% R
$ @% G( r$ G! O+ Y- ;----------------------------------------------------------------------
, P& {% r4 g4 R& u% d/ Z - ;播放上一曲- @+ c4 i" a6 ]
- Music_Play_Pre- t6 t5 A2 l* h0 r- J# h& D" p
- LDA FC_Music_Index# d8 n( o2 `+ H% K" ?
- BEQ .End
' I9 B* ~+ l4 F3 @ - DEC FC_Music_Index& s5 u9 D6 U: J& ^6 ~# T
- LDA FC_Music_Index% L0 p2 \# @+ Q1 t. G; ] q- f
- JSR Music_Init_Process
+ e7 n0 s$ N, {6 l9 o% S - .End
0 E+ s" |6 Z9 l7 f. B - RTS
8 @( l5 k r2 S - ;----------------------------------------------------------------------
0 }8 ], }5 q- ]! }1 G8 [1 x! Q - ;播放下一曲* m5 a7 S8 X4 O$ }( ]. v
- Music_Play_Next
9 I# i) z. e4 N$ G - LDA FC_Music_Index! { R* K- i y c( _6 r6 R
- CMP FC_Music_Max_Index7 s8 S$ a2 i9 q8 ]
- BCS .End
: H' X2 b9 p0 R - INC FC_Music_Index$ t8 M$ U5 W. [! E7 ^5 Y- R
- LDA FC_Music_Index
- @, p5 F, N/ i; Z H5 ?; l - JSR Music_Init_Process, j! v# ^* M* t7 v
- .End
' q4 N5 J6 e( Z3 b/ v9 W8 b5 H0 b# ?; T; J - RTS
, u3 h6 a9 `# |! h" U Z: v; Y - * E9 H1 t3 w/ W7 j$ a
- ;----------------------------------------------------------------------
. T, A2 b7 S% f5 H" V- O8 N/ p - ;播放上10曲. M) p! [# v5 T- V, V
- Music_Play_Pre_10
8 d; K2 w6 K3 T( N7 R0 b - LDA FC_Music_Index
$ b0 ?: i$ N! I - BEQ .End
9 O; f" p8 F$ g* L8 F4 _4 [ - SEC
2 O( Y- c( h% k# A1 I. k/ W; \6 q - SBC #10
& O9 i8 O; a+ l - BCS .Pre_10
3 ^5 ^" ~+ x) l j - LDA #$00/ R5 T( n- V, v+ q i
- .Pre_10
2 r. T8 ?" b _ {6 g - STA FC_Music_Index0 v- H! g {& A) Q: i' Q1 u
- JSR Music_Init_Process
2 G" e$ l; u; j6 I" y - .End0 z7 U% D$ F- S$ x1 u" N8 c
- RTS0 v6 |# k. Z5 @) \: y
- ;----------------------------------------------------------------------
; k9 l. g2 o4 |; f' u6 I - ;播放下10曲+ t/ ?( N7 m& Y" A; r4 r
- Music_Play_Next_10
; o" ^6 s* I9 u6 I& c - LDA FC_Music_Index6 o1 O0 T: K% I# c9 ]
- CMP FC_Music_Max_Index
/ ?& D8 e9 B5 t6 I - BCS .End
: g2 c, D# m! Y4 | - CLC$ g' i" v4 w" c3 Q+ l, C# U# A0 l
- ADC #10
5 z. T2 M: {! P - CMP FC_Music_Max_Index
8 \4 O' K b+ W" t. } - BCC .Next_10) ^8 y, n2 u& R. Y/ w1 q& X- E4 V6 }8 x3 h
- LDA FC_Music_Max_Index
6 @2 O: e7 x+ H* ]/ q - .Next_10% m5 W( a+ x3 X& y- d
- STA FC_Music_Index; @) D0 r9 m6 \
- JSR Music_Init_Process4 R$ h8 y1 a0 e1 O) b
- .End
7 S$ |/ p; X, `( y) A: m6 W - RTS
: N* ^9 G* X2 _
3 G2 F4 p; ?. j2 P+ b# b* W- ;----------------------------------------------------------------------0 f: c# U1 ?1 a
- ;8位十六进制转3位十进制制' ^$ s+ M( k$ z; d; u
- Hex8ToDec8 v/ e; R+ z, J) q. n/ y
- STA FC_Dec_Data_1
3 b1 H+ {& B* z& G# u - LDA #$00' t4 ~1 x" ?# E! [0 T5 a. y! k
- STA FC_Dec_Data_100
) i0 Y* i! h8 H& y8 R - STA FC_Dec_Data_100 r- d. f+ e* C+ Q2 _+ z
- LDA FC_Dec_Data_1
: `1 A% N: f6 _) j4 r - .Convert_100
6 O% R' H+ c; I4 ? - CMP #100
2 N/ F6 [, q% P3 Y- _( \ - BCC .Convert_10
3 v6 ?3 p: e, `9 x - SEC* K# O3 t7 ~8 a0 y
- SBC #100. t5 S4 }5 R- b0 F( O7 F7 @& }3 Y
- INC FC_Dec_Data_100 l: B- a& L+ R, V3 ?! W
- BNE .Convert_1005 j/ w; h! b8 P& d9 E' m$ B
- .Convert_10
8 E O0 ?4 _9 @6 \7 |. E6 b - CMP #10. A2 \2 L- H, _; F3 i0 o
- BCC .End) q& P5 S6 N, k8 Y4 e
- SEC
3 V* T9 \& h6 ]8 ?+ m# } - SBC #10 r4 e$ | A$ n# t- [
- INC FC_Dec_Data_10! x+ f+ Q6 M b. z' J& e2 |
- BNE .Convert_101 Z% ]/ C/ J0 L0 F0 ]
- .End0 v2 u: n6 t$ G, Y4 F
- STA FC_Dec_Data_1
% r2 Q* n8 S& ]2 R - RTS4 ^5 D3 Q3 Y0 P# ?
- % b( n; ]/ v" \2 |4 ]" s+ N7 u4 A0 B7 l
- ;----------------------------------------------------------------------! L/ ~1 V* e; F' d2 ]( z
- ;显示曲目信息
& ?. ~/ v% S2 C$ z: Z+ P6 I* ?0 |" \ - Music_Info_Display% z e4 }) z1 e& P( U' q
- LDX FC_PPU_Buf_Count
4 o y6 o4 D: ]$ j; b+ \( L5 X - LDA #PPU_WRITE_MODE_CNT_LINE2 J% J/ L5 U5 I. Q
- STA Use_PPU_Buffer,X
" n7 t# w! R( l( f z1 ]4 ~9 r - INX
% }0 |. r1 m4 M; W3 I! W -
9 o8 `$ _8 W3 x% H- q2 C9 U# B - LDA #>MUSIC_INFO_POS( V+ g0 S+ ^% h: g& A2 m/ N6 Q7 [6 k5 Z
- STA Use_PPU_Buffer,X
6 i1 U1 ^1 X+ Q# ?7 Z - INX
3 j& _* b3 r# p; T - % L5 I* N5 s% G* L
- ;居中
! s S& B8 |) R7 t) w1 m# f+ V - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
0 ?6 W# V* \, T" ` - STA Use_PPU_Buffer,X
: e! V" j+ D! d0 A* G* I/ s - INX
, b. F6 e( O4 o - ; N+ {9 r3 O7 r4 S* Q
- LDA #$05
' c5 D) o! i. y - STA Use_PPU_Buffer,X. a j3 I# }' `8 A
- INX
- ]" g" _- v9 N5 N/ W+ z5 A - : b3 D' x, }! v) _# b9 {
- LDA FC_Music_Index
. {+ W' Y2 e% ~* |; @8 _9 E0 t - CLC, c( n+ f) A* K7 u* ]' @6 u) O0 z
- ADC #$01
/ c. N4 D- K5 i. i* k6 T - JSR Hex8ToDec
+ Y' l4 a* `4 h1 _7 T9 c) q8 C4 h -
! f6 e$ N/ |1 a - LDA FC_Dec_Data_10. K- D0 v/ Q. d8 J/ C! t2 C
- CLC& h: Y* v, \6 B
- ADC #'0'" S G; k4 c) ]$ }1 I
- STA Use_PPU_Buffer,X
! N; ?! Y6 b Q - INX
; q# p/ t" d+ A' B - * I" e) I9 N8 i. m1 T
- LDA FC_Dec_Data_1# H; o' I5 L3 b: J5 I! w
- CLC
8 {# k. O1 z& c( L, r O, p - ADC #'0'
$ d1 Z5 u4 a8 R - STA Use_PPU_Buffer,X
5 t5 x3 a) `3 W: F4 a5 D - INX: X% R4 {1 }4 R! w. L
-
8 q Z( O4 N+ | - LDA #'/'
4 @* C3 v2 X ?# o. g. k; I6 T - STA Use_PPU_Buffer,X
9 Y6 k+ ?/ ~! Q - INX
; F( k- o, G! Z- x# F - * f3 N. T" z- d }' `
- LDA FC_Music_Max_Index
' N- H" @- u1 B. k - CLC w+ v% \* K# ^1 y1 ?0 B7 x
- ADC #$01& {4 H, L+ \; b/ ~! }/ n& I
- JSR Hex8ToDec' R% U# l' X! \7 i+ z7 T
-
6 Q* l( b- ?( X8 n - LDA FC_Dec_Data_10* D( ^$ X0 R1 j4 b0 L
- CLC" j p# ^& @, }6 t5 I2 l
- ADC #'0'
$ V. W- l J% p - STA Use_PPU_Buffer,X
; c( O# }' a V - INX
, T) r4 r& P) y! g/ G -
* z% D$ K9 W, u9 c5 b3 c+ O - LDA FC_Dec_Data_1) `, p, l3 ] j. O3 q, {
- CLC8 P6 z1 _& f+ T b/ s& m% v
- ADC #'0'
a5 C' H( X7 U) N0 b - STA Use_PPU_Buffer,X
; D' c1 c+ I) j s! ^) m$ g - INX
% `+ l1 K( m/ W% W6 x# c -
+ f( c; F+ F2 x4 W, ` - .End
7 `8 q' ~$ n; x* N. R8 \ - STX FC_PPU_Buf_Count$ u9 ?' d2 D" D1 H5 N O1 m
- RTS
8 E+ ] H) X) {: P2 {8 J l - ( r/ O5 @! ~2 C$ i% X
- ;----------------------------------------------------------------------7 P: u% z1 a3 R1 I7 ?8 [! P4 s
- ;音乐曲目初始化处理& I# | o6 J3 V! {# F
- Music_Init_Process9 l+ Y: u i* w1 U
- PHA8 L2 L9 y( G0 C6 f- [5 T! i
- JSR Music_Clear_Process
# w1 ?: K8 a" x - LDA #$1F
4 @" Q* n: f- b( t6 n - STA $4015* A A) A/ i5 {2 L0 @/ l; V4 j! X" n/ x
- PLA
( r/ A c5 L; ^, D" P; o8 u - JSR Music_Init_Addr
; s* x% C0 U. Q) P/ C5 B - JSR Music_Info_Display
& N0 @* J) x" N - RTS2 N% {0 k C5 a
) ]4 J6 l) f" S; J& m' T B- ;----------------------------------------------------------------------
% m# x2 W/ ?% U* b$ r% G4 I9 ^ - ;音乐播放处理" e6 c0 h; _6 X5 E* ^
- Music_Play_Process
( Y9 N" Q+ v/ s' s4 @# Y - JSR Music_Play_Addr; V2 I# y4 l s5 o9 k
- RTS
$ t7 G* \" B* r8 q - ! g$ H1 A* {7 f# B+ h
- ;----------------------------------------------------------------------! k! [% X5 K( J" k8 x" t6 i
- ;音乐播放处理# Y5 Z; |2 y& F4 m4 O
- Music_Clear_Process
8 J! c7 O) n @1 }, Q6 C - .IF Music_Clear_Addr0 d8 H% I8 l( s1 R
- JSR Music_Clear_Addr: }9 i% v. D" |, f9 u) B/ ]
- RTS; Y+ m8 e8 Y7 Q
- .ELSE! ]0 {3 V& u0 _9 c
- LDA #$1F# [0 p/ C7 Z9 _0 g0 m
- STA $4015
' n( l4 _9 _' ~* R/ r% X9 |2 d% y2 n - LDA #$00# H& q# B. T5 T4 F6 g" S# @2 W
- STA $40101 G: q9 o! K# n# @
- LDX #$00! w; A9 ~' s; T
- LDA #$00' `$ B2 y/ F( h+ W* A& V4 a
- . f2 X. R" x9 o; a' w
- .Music_Clear_Zreo_Page_0) i! n2 I7 p* w7 x# v& v
- STA $00,X
6 v) F4 Q$ \5 |. n2 ]2 s! p - INX# ` s" Y' N, k& w9 i \
- CPX #Use_Zero_Page_Begin
& b6 p0 p6 b, l: E7 t% M - BCC .Music_Clear_Zreo_Page_0' P5 x# H$ ~- p+ V
-
+ `) C6 [9 h! \. Y( s T# o - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
' v$ v2 G, r3 V8 z8 ` - .Music_Clear_Zreo_Page_1* I, X* b% U+ W( g" n" X; h
- STA $00,X
. `3 T. J' `) J - INX( {1 c( F. r1 @+ S# ~! F
- BNE .Music_Clear_Zreo_Page_1* ?5 F" k3 u5 x5 H C) N j# s% y
-
0 o0 s' [- |+ {% l- m; k! X - Music_Clear_Process_11 {: T C; e# t- x- x$ P
- STA $0600,X
/ Q6 B7 w" b: L! S - STA $0700,X
2 i1 X0 K0 s* J6 ~ `9 ~ - INX
' y# a# a6 z: z7 g1 |- l8 F - BNE Music_Clear_Process_1
: P$ R d/ O2 r - LDA #$101 R- g+ c/ J) [' g$ M5 }2 j) Q
- STA $4000
P) d/ s; X' f6 n+ B" y p. i" \ - STA $40046 u5 R9 z3 d0 m
- STA $400C
0 v% K, z2 `2 E6 K& y% {. Y# q! q1 { - LDA #$00
) O( W7 d; d! e: h2 r, V7 L7 ?3 j - STA $4008, n) X# e9 M/ c
- LDA #$0F
4 ?' y( e+ i' R( ~3 E( a$ Q - STA $4015: C: L- |5 S5 Y3 x. r% m) Z
- .ENDIF) o" H9 j4 p" j0 A$ u
-
8 N% B" |5 w. y* l+ W6 i - RTS
- I4 F) j& w$ S: v5 {# v
4 {& h5 G0 z8 l3 M- ;======================================================================; S" U* Q/ f1 J7 u
- ;重启处理
2 }: p W/ i5 } - Reset_Program7 E' v9 G0 Y) D
- SEI
, i: Y1 m; o. r' f3 B - CLD
% ~) D3 h1 j% W% z% q - LDA #$005 t1 [3 p1 c/ C
- STA PPU_CTRL A5 _: V( R- |2 B$ |
- STA PPU_MASK
; H/ H3 @$ w5 W | - STA JOY2_FRAME
/ I D c( N ~( o1 w* E% n4 Z8 W - STA APU_STATUS1 j( c q. Z1 f
- 4 c% P6 ^: @" m* `( U+ N* u
- ;等待屏幕准备完毕: O* M" ?( C0 l& Y/ v. [% L& l6 F6 c
- LDX #$02
1 v8 O* m; I+ B8 f: `8 \8 N3 r( o; r/ ? - .Wait_For_Screen_Ready
; }, R* D/ W( d3 b k. G - LDA PPU_STATUS
f) [+ w+ c% p; q4 _( ^- t - BPL .Wait_For_Screen_Ready- X6 j, g3 `6 B& O
- DEX
" g2 j% Z) G1 m$ T7 t# W - BNE .Wait_For_Screen_Ready0 w6 |3 X- Z% n& Q' N) }# j9 H
-
2 g5 t& i% @$ V4 v6 B3 e7 ^5 l - ;清空调色板, v- ~: k" |. y" K1 S
- Palette_Clear
) L, i' z+ f) s6 F# q - LDA #$3F7 M" C: h- W7 k9 c
- STA PPU_ADDRESS: N# @& v% R" r; V$ _
- LDA #$00
, a. O! h! {0 z% [ - STA PPU_ADDRESS
; _5 C) O0 u. ]# V - LDX #$20
4 X3 h5 q: L# f9 @% h* }/ X' i3 M - LDA #$0F- V: {% A- O. V: w: x. U5 S; U
- .Write_Data! @5 c! ~& H7 q* T( }% V
- STA PPU_DATA
0 p: t9 `2 k6 Y - DEX& |5 ]1 V& R+ Z" k4 C# Y0 M8 B2 _
- BNE .Write_Data7 f( [& @/ F7 Z0 R8 A+ a @- V
2 d3 p5 L$ W& `7 k$ N* s- ;清除声音 $4000-4013# e8 y. r2 b! ]
- LDY #$14
# ]+ o( o0 E3 ~& k( p: X - LDX #$001 L+ _2 S+ v* {" a& h
- .Sound_Clear
: t0 x- a- H, f, ~/ ~( d2 P# y - STA $4000,X
2 j j/ w+ d0 c9 \ - INX- o- o( l, V" o1 P6 x) [5 o" T1 k
- DEY+ j* @8 x5 F( i3 {" X x" k
- BNE .Sound_Clear
! `) D1 X0 ~9 m - 0 J p- X% w! A. i
- ;清除 RAM $0000-07FF
8 v9 x. Z$ x& }( M - LDA #$00 |3 l4 F$ N' h5 e
- STA $001 r6 C, e( B; {+ r f
- STA $01
8 ?1 _/ g1 k2 k+ m4 K2 D+ t - TAY
( R; b2 [' n- Y - LDX #$08
% J" i! }# M% U, r - .Memory_Clear
4 _3 r7 \4 }# U2 A- r& \ - STA [$00],Y
# E( `0 |, ~; d1 ? d) u - INY
0 D! [6 }% r- D8 x8 v# r - BNE .Memory_Clear4 v4 u2 |5 x; T, A, X
- INC $01
8 F) R D) z( I: j. m - DEX
m x1 O5 G9 H" D1 m - BNE .Memory_Clear
0 f* r, A& C. N+ ^1 n -
4 [6 ]: U) Q8 I% s! U- d - ;精灵缓冲初始化0 V# |+ g0 }5 N0 \& H; [ s- x
- LDX #$00
0 B7 t; J* g( S6 Y) o3 \, B - LDA #$F8/ Q8 \1 Z9 O- X8 ~; I
- .OAM_Clear
: Q, H$ Z8 O/ k" h# a7 i: }/ S - STA OAM_DMA_Buffer,X
! M8 G* A( E- { - INX
6 u. F7 r6 D! e, I0 e6 E* c - BNE .OAM_Clear: e" l! E0 e2 o# H
-
( @' j2 x! m! T C - ;栈指针初始化
. s: X% g0 m, v' X2 S - LDX #$FF
+ @( W. r% _: s* s - TXS
! e: a4 V- d, E2 [ - - D) N& e/ _8 S/ O$ }& N7 F! m
- JSR Nametable_Clear;命名表清空
; n9 t E3 F' ~ N+ m - JSR Palette_Init;初始化调色板缓冲2 V8 }' U! q# O" i/ [9 p
- JSR Static_Text_Init;初始化静态文本
4 ]3 K! \3 E v- J - 0 }3 _2 b _! [$ V! T
- LDA #MUSIC_ITEM_TOTAL - 1
: r/ ^% o- j6 C' N! T - STA FC_Music_Max_Index
+ f- N/ L# h- ` - 6 `. E6 z1 ]8 m
- LDA #$1F
, w( x6 a1 [5 r+ c4 c' M: Z& A - STA APU_STATUS
* b8 I+ F; |" G) b2 l @ - LDA #MUSIC_BGM - 1
" L5 Q* {2 M: v6 ] - STA FC_Music_Index, q+ o; Y6 i* C' A* n2 m
- JSR Music_Init_Process;音乐播放
) u) x! a7 H: I. P -
2 H' Z. |: I e `: u - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' B$ [/ [; o! A" }0 @# D
- LDA #$1E
! F o. f9 Q( D {8 x. H6 H - STA FC_PPU_Mask_Buf
0 E" ^, @, A% W+ X7 b( V -
( @! _' n% G0 s% x - ;启用NMI处理
6 `3 X7 v! F) Y X - LDA #$80. b1 u7 O$ E( P8 p, z- X
- STA PPU_CTRL
) k( P0 W+ h8 O6 B8 j4 I, w# x - ) I7 `( z) N. Q) H
- ;程序循环, 剩余工作交给 NMI 中断处理
$ S/ M3 @' O7 } d0 S2 k; G8 p7 B - .Loop9 W& M- g8 W R. A7 C: X& h
- JMP .Loop5 |$ r, L+ c4 {1 R% [3 |2 i
- . F M6 B) {! I$ B" V! X! h4 t) X1 r
- ;======================================================================
! m% ?9 j' d3 E - ;不可屏蔽中断处理# o8 R6 \) _) b# ]. o- r
- Nmi_Program
: @' M: L1 l9 y% Q8 Z - PHA
1 p9 X* G0 B) b4 h - TXA# _0 \, c6 c4 I j& Q, Y( W
- PHA
" X! X. Z3 j; T" \ - TYA
* s+ `! g7 ^1 }6 r5 }2 y# O; P! W - PHA# \% z7 K* N! f+ ~4 b
-
$ ^ G/ `. Y/ G' ^6 h8 w2 ` - LDA PPU_STATUS;读取使得 PPU状态寄存器复位* b# Y# U# g( [/ [; y: z
-
# Z# X- }2 ^6 B% f+ w( d: j5 s l+ i - JSR FC_PPU_Procrss;PPU处理, j$ W: g m' `' m
-
9 [# M) \/ [. H( n7 `* { - ;精灵内存更新
) |' A' H, r8 B; R7 c6 m - LDA #$004 i/ w, y! T1 i9 S0 |# Q. O5 W; V
- STA PPU_OAM_ADDR
2 V9 O; `9 `0 S/ z2 X( P; W: d' Q - LDA #OAM_DMA_Buffer / $0100
" m O6 o% `2 z$ T, X8 Q - STA OAM_DMA
. y; M/ {7 }, p) c: b: i$ b, U -
; [ n# }% c; @3 ?0 x* V - JSR FC_Gamepad_Process;手柄输入处理* Y m; _) h+ Y) L- d. \; c/ B
- JSR Music_Select_Process;音乐选曲处理
: C( U' T+ @$ o* v0 _- a- x+ r) } - JSR Music_Play_Process;音乐播放处理
0 W1 K% l" h& k$ | - 6 {$ I; d% _. `* b6 D3 \. W5 d
- PLA, l7 Y7 o: d3 Y5 R( @ N: @
- TAY+ }" T. ]( b7 Z V5 d; u1 @2 q3 M9 t
- PLA6 B6 |3 T! ]& Z1 @( F
- TAX
3 P) W' o/ H @4 @* ?* j5 ~* u8 Y - PLA
' h* c! t, S% c" f {7 Y
3 U1 s: y9 Z" [( x: ?3 v1 [8 Z6 ?- RTI" x+ d' p! ]/ r q( X
( r' M9 z6 t) R6 J% X- ;======================================================================
8 {7 v8 j4 |7 S4 T6 H3 M" w - ;请求中断处理) o8 `, v1 W! G. a* g) X
- Irq_Program4 J$ F4 {+ v% @
- RTI
: a5 U7 a; Z' q - - ~2 u8 {+ ]) I6 s$ l6 [' }
- ;======================================================================
6 O" a' c" Z% P4 A6 O - ;中断向量表' x7 n3 a+ ?6 Y: z6 J
- .ORG $FFFA* c! y. |, ^+ L& M' T/ S) E
- .DW Nmi_Program ;NMI触发时执行9 {5 ?% `* B% ~. |. F+ E8 _
- .DW Reset_Program ;载入ROM时最先执行* |2 x. q* M9 L
- .DW Irq_Program ;IRQ触发时执行; I1 R( |$ H& X
复制代码 B' O J3 ~8 s1 s/ t- M
) t" ]7 D4 A$ o( g) M5 z+ U3 T4 F7 e
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|