|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下( X; @ s5 _& Y6 b; X* p

: G1 s8 N: Z0 U% m: }) K) B以下是主框架代码:4 d* N: o3 F' L; C! U- d! [+ z" \7 c
- ;======================================================================
/ I& T: {" P7 w" L - ;文件头% d# m/ A4 _% N: m5 R2 K$ F
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
# X; B( g: l- U+ V6 R - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
5 _, j0 M) i5 E8 K* T% j% G0 j - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码7 Q: A/ t+ c) P5 J) S- W
- ;======================================================================
# u* K2 b, m# \6 z: T! U - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
$ u5 ?. [6 g+ |2 k: D5 `1 z - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 19 |1 m* H) |, p4 ]: a0 _' @/ w% |0 D
- ;======================================================================
. f. }6 d9 d0 R; ^: V - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
7 r* j- K5 R3 d- G - RESET_ADDR = $E000 ;主程序起始地址
& `. a' n7 M: y( S' w, A! B - ;======================================================================$ T& f% Z* e0 F5 A' T) h" w9 q
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
8 z* x9 G& G) W3 `- ?* r* }6 g2 u' E/ e - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB& b4 x9 X9 T, t, F/ z5 ~
- .INESMAP 4 ;Mapper号 (0-4095)' R g4 j% k' f% z
- .INESSUBMAP 0 ;子Mapper号 (0-15)
* R+ \+ h! ?9 ^2 e# A- F - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- _. O5 m) Y6 x2 \" `
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)+ X3 y# J' g3 a; d
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)% C9 o7 |) s; T! h0 T( O
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
& O- Y; B, D6 s. O& P7 I& Y - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)/ ~ x9 c: i: a W( E
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
, T: [' P" ?; [# Q! l: [ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
( \, w7 ^* ]! F - ;======================================================================0 \: o- r6 X2 Q! }% q z+ `! p
- .INCLUDE "fc_demo_config.asm" ;全局配置
9 b+ R6 l3 f8 P; _ - .INCLUDE "fc_demo_constant.asm" ;NES常量
& b4 T" _1 d: k' M - ;======================================================================* v& Y) k& p9 J- r$ `) d9 o
- ;音乐配置2 d* W2 b+ z2 W2 Z3 T
- .IF 0 = MUSIC_THEME 1 w- P( B) ?* r5 R
- .INCLUDE "data/music/Gremlin 2/config.asm"
5 o# Z. ^! h! ]" z - .ENDIF+ i: M+ [: B( S! Y' Z* N
- % ? {& k6 _- R7 t
- .IF 1 = MUSIC_THEME5 d- P- N( i2 \3 w3 g, x
- .INCLUDE "data/music/Raf World/config.asm"
M4 x5 F+ p/ v1 t - .ENDIF" L8 E9 I7 L1 u8 ?$ U# B( \4 z- ?. b
-
+ R9 [$ L+ p8 N3 L$ M - .IF 2 = MUSIC_THEME
: E5 V4 ]' h7 k+ y) w( m - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"% b: j: N, S: z; s) @# t( O
- .ENDIF
& f! _7 ]3 I$ l9 A
- @ p8 H! i, q* {( G- ;======================================================================
7 _& Z5 B; d; f( J - ;引用CHR图像数据- M) s" e" J z, a) C# n( _
- .BANK NES_16KB_PRG_SIZE * 27 r' t1 Y* [6 D4 Q& i3 _+ h% ]
- .ORG $0000) I6 u+ s* A, {, {
- .INCBIN "data/bkg.chr"0 U) F8 Q3 W; L( O5 m. g
- .INCBIN "data/sp.chr"
# s" o% V3 m# ^ - , b D! a9 Y4 o1 s, Q) U% Y# w- L3 S
- ;======================================================================: n( I4 l" G9 h1 Y0 s
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank7 W! @4 \+ a; M$ j
- .ORG RESET_ADDR1 ?* T, I V7 U" C7 V( Y
- ;======================================================================
8 G4 ?- n8 S- ~3 s& M7 g' ]* s - ;引用其他源文件7 S1 u9 H0 J: x% N& M* S! J
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理4 z5 o7 L- ?( y1 v$ W5 ]( k
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理6 u- E0 {2 b& E7 _
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理" h9 @; K5 Y) b4 g9 J2 b" S: D, S
- ;======================================================================# V4 M/ c# L$ f8 U H
- I) e3 L0 P$ Z7 Y* L7 U+ ^% A* g
- ;======================================================================0 T' Z# m# t+ ?: V1 @( K
- ;等待VBlank到来* ~& ], a6 F' |( ^
- Wait_For_VBlank ]" a, t, b# h' P/ o0 `3 s
- LDA PPU_STATUS: z# }5 q& @; I j
- BPL Wait_For_VBlank% |3 N; g! K0 _2 N/ ?0 S, M
- RTS6 |+ ^$ \9 J; X9 z+ \! s
- ( w; Z9 Q. Z; l% V8 n, A
- ;======================================================================. U: s* W4 w9 f }5 k* s0 a- a
- ;调色板初始化
: w+ y4 d; W/ l5 t+ M( | - Palette_Init4 s& V" n7 Z) w! ?
- LDA #$3F1 ?- C& o5 a% Z# v0 D; S
- STA PPU_ADDRESS
A2 f) e' P6 P7 t) E6 z - LDA #$00
$ d+ S) M: L. K8 e, H - STA PPU_ADDRESS% v2 L! d. H5 m3 z" c! n! @! o2 H
- LDX #$00
* o3 Y+ l' ~! @7 |) G - LDY #$20
% ^! k/ }2 n9 U( R, y" } - .Write_Data
, C- [9 t% H; k! q- I H( N; p; p - LDA Palette_Data,X* M! k7 t+ R, f
- STA FC_PPU_Pal_Addr,X
( [& f- a& f9 d, M% t9 T; ] - INX
5 W9 K% p7 Q7 r3 [5 X/ u6 T2 { - DEY
6 n/ k! {' c- L2 P: ?, S1 \ - BNE .Write_Data
) Q" d. n* \: _- k0 M9 G" J - .End
' ?6 k! D# V! |# \" `6 n% J& Y - RTS
/ G3 [, g4 X* v# \& X6 z5 q6 V
/ i) L# }, ~2 D* U- i z3 x" B- ;----------------------------------------
3 x& U. R6 p: N% E' b/ }# {" [ - ;调色板数据: j9 }+ u5 V8 ?) X- g$ o
- Palette_Data1 m& W$ q* ]9 T) P9 f4 X! ]
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B8 V0 K) e5 ^/ p8 a
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 223 [! t+ W1 ]; F; l0 X- D5 Q+ m; N" i3 J
- . d. |0 X% V2 o/ W$ H
- ;======================================================================, r0 O1 n5 r. Z
- ;命名表清空
! r1 r: w, o' Q2 p! l: o+ k - Nametable_Clear
h1 I2 a$ i M( T2 ` - LDA #$20
7 L, `, j8 b) Y+ y8 r7 z, T - STA PPU_ADDRESS
5 L4 C% d8 O) w! l/ a - LDA #$00; V8 j6 H8 I4 D! o& W
- STA PPU_ADDRESS$ |* ~3 c. {* |2 X3 {% l; R5 A, ^2 t4 q# L
- LDA #$00
6 M* f* b; E0 h - LDX #$00# O& X% |4 ^1 ^3 [8 X) E
- LDY #$08
& m! p, n: @; L9 h* l$ ]! _ - .Write_Data
$ |. k0 |6 c' U8 _1 M' C6 K - STA PPU_DATA
' e3 R& R5 z7 B& ]. G! H - INX
7 b0 w2 x% Z ^ - BNE .Write_Data
9 ?0 a% k7 |# Q - DEY
$ x- P% { g0 I" Q8 x9 T - BNE .Write_Data8 n/ Q0 _3 {* H& `
- .End1 ~, O/ z, J" I* Q/ k# m( M
- RTS! I9 ?: c0 @* g9 J" K
3 }' s% \! t9 ~% z. i7 `' V' s; w- ;======================================================================3 q$ X1 O( `+ a: {! A, l
- ;音乐曲目切换
* G; X" G6 z: e - Music_Select_Process
7 W0 o5 l- {: X( C - ) G7 S, M: G( {
- .Pre_Music;上一曲% M. i* ^4 [2 y' B% H) D! _
- LDA FC_Gamepad_Once
. [# l) A- ?& a, S b: N0 H - CMP #JOY_KEY_LEFT7 Z" D7 I5 s4 G' K
- BNE .Next_Music
# B N8 p4 c0 M- r, v - JSR Music_Play_Pre5 |& E8 [# A6 d8 _7 Q% G) D
- .Next_Music;下一曲) k2 Q$ `+ L7 z8 X3 |
- LDA FC_Gamepad_Once4 {0 d; y9 x, d8 \5 C
- CMP #JOY_KEY_RIGHT" [! Q c$ H v& I% L" z+ k
- BNE .Next_10_Music0 Z4 f9 e @5 ?5 C
- JSR Music_Play_Next. a& e2 m( h8 E, X1 ?1 f
- .Next_10_Music;上10曲
4 e0 M2 v' N5 N! ? R4 \ - LDA FC_Gamepad_Once
+ V- ]9 E4 I4 G& p) z/ K - CMP #JOY_KEY_UP
; J- W Y9 [0 b1 ^3 D - BNE .Pre_10_Music* s# `6 m3 j8 t2 s
- JSR Music_Play_Next_105 _/ V7 M5 r9 C0 I2 q( Y4 R8 \
- .Pre_10_Music;下10曲& I+ j4 q( o( H: u( Y. U7 K, p4 @
- LDA FC_Gamepad_Once L! C% ^0 a3 O
- CMP #JOY_KEY_DOWN* Z3 L0 ^+ d7 I& t- u
- BNE .Reset: E+ R7 R5 e) m$ ?. T6 s
- JSR Music_Play_Pre_10
1 y2 o+ d# K4 j) C - .Reset;重播当前曲目" P+ l5 @! K, Z- H9 _) F3 \
- LDA FC_Gamepad_Once7 D9 a8 y) X8 Z0 {% v
- CMP #JOY_KEY_START
5 H. C: l, D! l! ~$ u9 _ - BNE .End
2 S7 d, J) [' p* N Q - LDA FC_Music_Index L- _' w8 x" z; U$ Y
- JSR Music_Init_Process8 T3 k5 R& j" n
- .End& N# @# ?" n/ x3 ~% h# A$ H/ M
- RTS
& c; w* y* w, e# u% \1 @
0 Q" B- T1 }$ \* l# V- ;----------------------------------------------------------------------3 [, s2 ~- u6 z0 U& |
- ;播放上一曲
8 C) S, y k( e6 A i - Music_Play_Pre
( v. M8 T" J( i' A. t; r$ n/ C1 k - LDA FC_Music_Index7 h. f6 s+ }$ V" |
- BEQ .End
3 i, X1 c( b; p$ D8 b6 W - DEC FC_Music_Index' h# d- i% q0 }4 p
- LDA FC_Music_Index- u# o/ |2 y) O, i) j7 B- s" t
- JSR Music_Init_Process
% L4 G! Q$ A( ~8 H$ u8 n - .End
V! w. ^: J0 Z; _ m6 ?% T5 L - RTS
4 F4 O- z0 f2 f" s) L9 B; _( u - ;----------------------------------------------------------------------$ |. U+ z1 x% V
- ;播放下一曲
4 [. l6 H! I. n6 S6 e% {6 Z+ }! ^ - Music_Play_Next, ~9 f" \6 S( a: `3 X
- LDA FC_Music_Index) m5 }( z9 I( N7 c4 b7 `
- CMP FC_Music_Max_Index
9 t- F$ S6 S& F+ l: U) e - BCS .End
2 ?7 B% U# P4 ^4 { - INC FC_Music_Index
5 O0 ?* R" @2 ~" f) l - LDA FC_Music_Index5 G& |$ e. {' F' ^& A* e" T8 k
- JSR Music_Init_Process
9 C4 @) ~6 |7 B: x - .End! p. Q# K: I+ B' K0 T
- RTS, _; {. C! `4 M
8 L) v, G5 w6 C. W7 k0 F/ y7 x- ;----------------------------------------------------------------------( o9 e. ^, W( ]/ _, i! \
- ;播放上10曲
4 w% v6 j% Y, k9 z6 s - Music_Play_Pre_10
3 P* d( A" W i( c+ w - LDA FC_Music_Index
4 \6 C% w& r! G5 E - BEQ .End; m$ K. E) ?# D& }/ k
- SEC
3 f1 `! _7 S* @' C - SBC #10
) m1 }1 N% j) {; L - BCS .Pre_101 c0 Y7 G7 u1 b2 ~" [: q
- LDA #$00
! L" }$ ?2 Y& g8 D& _ - .Pre_10
) E S$ _/ l1 a5 x) k+ s9 ` - STA FC_Music_Index
3 O; g. }1 ~. t A0 A3 H - JSR Music_Init_Process' S: p5 H% `! p2 z
- .End( @/ N; V* t% v: Y* N6 f" e4 Z& t
- RTS H8 j8 e7 f# S& f6 J
- ;----------------------------------------------------------------------# m) Z' R$ J* m4 m+ ~
- ;播放下10曲* g/ j+ v2 C9 g) b/ F- _9 k
- Music_Play_Next_102 j5 K+ K9 [2 i9 Z- w, T8 d
- LDA FC_Music_Index9 q5 D; Z* j: r3 x3 ^
- CMP FC_Music_Max_Index2 d# q+ l( x- i8 v% B
- BCS .End. X& j$ N- U3 ^2 t0 @
- CLC
$ ^5 N3 z( k9 b, K - ADC #105 m, Z" x/ J% [- Y4 [, V
- CMP FC_Music_Max_Index8 j; L9 h( ?# x8 X0 } V8 P
- BCC .Next_10: S" _$ m6 d8 L( e3 L, J1 L O/ B
- LDA FC_Music_Max_Index7 |" ^ D0 @9 w) Q/ N3 H) L, p
- .Next_10
8 u4 m/ s. ^( _: m - STA FC_Music_Index1 A6 s0 n, c$ y+ p4 ^! T
- JSR Music_Init_Process
/ R, j$ h4 V9 B0 Z B3 C$ v9 Y - .End
0 P/ ?" a2 ^2 [" j - RTS
; g! Y0 J, B0 X" I - : |2 l/ I( h A: h$ d L) n# `
- ;----------------------------------------------------------------------
. l- u* n( I/ c7 P8 d1 I9 f8 F- \) A - ;8位十六进制转3位十进制制# ~( m" P1 F' u' ^
- Hex8ToDec
' w9 c9 { }) Y! V- g) F. ^; \ - STA FC_Dec_Data_1
! c; o5 p& f3 y- f' r - LDA #$00
* S; s8 D2 |, X. {$ U7 f - STA FC_Dec_Data_100
( B8 K/ h+ n* R6 B( M* Z - STA FC_Dec_Data_104 u( Q" o" x7 J( d N9 t" q
- LDA FC_Dec_Data_1
. [- Y& {. q+ E( g - .Convert_100
; t# H. o' u6 |% n - CMP #100
" l- ~: G6 I- a0 H& a/ P" l - BCC .Convert_10
) U7 A+ V5 u, h - SEC$ b* z) G* `' B
- SBC #1000 A- V' x" ^0 S' P; ]: q- x. g, X7 W. i2 g
- INC FC_Dec_Data_100
6 j ^3 b5 [) [7 f+ ] - BNE .Convert_100/ _7 T- D) R; x" z f! U' e
- .Convert_10; p4 ]9 `5 }4 [$ k7 f$ o* j8 W! x
- CMP #10, Y8 C$ n' H; j. k {1 [9 |
- BCC .End
5 V& Y) }7 Q4 Q& Y - SEC" y, ^5 @1 m( q( ]5 C1 I9 }8 t1 s" `
- SBC #10; p- Q" W- v) z5 q4 o& ]
- INC FC_Dec_Data_10
( z) }/ ^& f( z0 ]& K& G - BNE .Convert_10: Y5 c6 }2 E5 X' s8 m
- .End* j3 H( @1 \8 b, I# H- `2 ^
- STA FC_Dec_Data_1) T, ^, V2 P- H
- RTS: M; T9 G1 T+ J3 i6 O" {& D
- - G. x9 t: F3 n
- ;----------------------------------------------------------------------" q# \# t- e7 D% F( u: I# K
- ;显示曲目信息
. g( f; `0 m! T. k7 M9 l$ d - Music_Info_Display8 L+ F& `0 _9 {& _; }3 o6 L% h
- LDX FC_PPU_Buf_Count
9 z3 g3 t; R2 m6 @ - LDA #PPU_WRITE_MODE_CNT_LINE
1 z. a( u* z- W# t - STA Use_PPU_Buffer,X" t, @' _4 v' p$ c& g: j7 e
- INX
6 y' W; l: D0 W/ W& w5 n/ i - 2 t' E' X# \& R) G% D5 T
- LDA #>MUSIC_INFO_POS
( w8 G3 T8 W8 [. D8 h5 Q - STA Use_PPU_Buffer,X5 U! e8 z- \9 G1 U# V
- INX2 U8 u( n3 I* j$ g# f- ~- J) p
-
' W) t6 T5 E4 G7 K: _0 k# A8 K - ;居中/ z3 A7 m6 D1 N4 Z
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
, H" l0 \5 G: f2 m- k - STA Use_PPU_Buffer,X
6 h4 _3 t) s7 {# Z, J* T: p - INX
, a7 G x5 z( b% P9 a6 v2 v6 r - " S7 V/ H. ~7 g% z5 N9 X
- LDA #$05
" Q: I0 N' |/ F' X8 G - STA Use_PPU_Buffer,X: e8 d) t* C J; `8 B
- INX
& a5 W6 B% k1 m+ v3 b - 6 _) P v! b0 ?5 c% ^) ]0 u
- LDA FC_Music_Index6 ?4 A# z2 E F5 O" d4 y
- CLC: ` H5 m# }" y% Z. f& e% ?
- ADC #$01
$ ?9 V* Q. K7 Y( k% L. ^3 G - JSR Hex8ToDec) `7 o! P3 K, D1 K
- 7 g d) L; l- Z2 S3 G
- LDA FC_Dec_Data_10
9 }1 U0 c' T! d - CLC. _( l, N7 l: {* W; {$ D' T
- ADC #'0'
2 o9 Q; u+ f( w) r5 h ?1 @ - STA Use_PPU_Buffer,X e0 Q1 O- a- @* r0 P
- INX, g0 _2 ~% S8 K7 J$ y
-
# j* y7 L: y% A/ ? - LDA FC_Dec_Data_19 S0 ]' p# ?+ d! f. V) {% |; L2 i
- CLC: i1 ?/ o3 C* c6 G4 [
- ADC #'0'$ U) y( F$ [- t0 T: }5 q' f; z
- STA Use_PPU_Buffer,X
# f6 V* _, s) l! k - INX2 O3 ~7 f+ e* l; I/ `: o8 |, F& D
-
3 H7 {' `9 J0 x/ M4 u! Z Q! ?5 L - LDA #'/'6 q3 t8 W) `& r
- STA Use_PPU_Buffer,X! I. ~& H( t1 z( V) P. w( x
- INX
v- C* @6 U. |8 K) K1 v9 g -
O' {: M( P3 x - LDA FC_Music_Max_Index
! N$ S9 H( M/ R- B4 q8 R$ J - CLC
7 z8 m% S& z% s( B( m% n7 j: J - ADC #$01: t, @& o6 W% I8 `: ]3 r, l
- JSR Hex8ToDec
2 O2 t0 J: n5 H" s6 l, V( M! v - 9 v7 e/ j' i3 A+ q B. f
- LDA FC_Dec_Data_10' |* s6 X/ X6 f% R: A' }
- CLC
( b$ |- ^ Q0 ? - ADC #'0'8 _( E8 y. T" I$ c
- STA Use_PPU_Buffer,X$ [0 o5 Z! Q7 D5 x3 r; q S, X
- INX2 n3 e" C! [; v$ e* V5 Z- b2 h' V
-
' j; e: M$ v$ a9 g. W, G - LDA FC_Dec_Data_1
, K& r# n# | D F% U - CLC k/ D+ x- Y5 C- R6 I9 {; w! \
- ADC #'0'
, {8 I& C% Y9 p - STA Use_PPU_Buffer,X6 o3 |4 f, ^, U% J
- INX5 S% W6 q" a D9 ]4 ]3 G
- # b+ H; `$ b4 B
- .End
' R0 [ ]; p* {% w1 G - STX FC_PPU_Buf_Count4 i5 T% r8 j" f
- RTS2 e; S! H9 Y7 s- v! j0 Z2 e- \* j. G
- 1 Y$ |" i# C$ l6 o% r; H
- ;----------------------------------------------------------------------. o4 @: D( y: U4 e! C
- ;音乐曲目初始化处理0 k9 i7 \, m5 |0 C
- Music_Init_Process/ L& [5 v( A) `1 b7 G/ v! e' L) X! d
- PHA
" P1 Q4 Q3 p+ C! V& A5 z' g - JSR Music_Clear_Process5 a" l; o' c; A) ?$ G, ~
- LDA #$1F; }* f/ A9 |/ g
- STA $40152 K s" ~+ h+ b+ g C9 h+ y; b {
- PLA7 q9 j k, Q$ y6 n+ ]( w9 X
- JSR Music_Init_Addr5 O% x( O8 R" E" {
- JSR Music_Info_Display
6 P6 ~' f1 ~2 q) {1 n9 V" p% _ - RTS
7 k- p) A/ @, p5 M: I5 J( _* q1 q - ( j/ ?+ h8 k% Z( e
- ;----------------------------------------------------------------------9 G" v' ~! `0 a' N( `, ~
- ;音乐播放处理
- d: i) [) t G# z3 G0 x7 N - Music_Play_Process+ B" q8 k+ E' D- x3 {4 Z4 C" V# U4 \
- JSR Music_Play_Addr
3 H1 s- f. _2 }# w- p - RTS0 A9 N$ d- O+ H8 q
! g/ b5 x: ~) O5 J J8 B. X7 |- ;----------------------------------------------------------------------
. T! e, G0 G, B9 x9 A - ;音乐播放处理
' J4 q) {0 o* s) F1 l6 a - Music_Clear_Process
2 n _% r* T$ z; l - .IF Music_Clear_Addr& ]2 B4 p2 r& S9 l Z' o# i
- JSR Music_Clear_Addr
. d/ c" e2 E/ E6 D8 J+ L - RTS% S( Q% e. z/ k& n, Y
- .ELSE9 U: [" d$ v" k0 h' o
- LDA #$1F
& m% |& P( }# C) d - STA $4015
0 q& z/ N% D9 w! t+ d1 l. _ - LDA #$00
% c( b9 P1 H$ A, {: H( v; ~ - STA $4010) g r: z+ r8 N- v' ~( v5 Q
- LDX #$00: h5 a0 G( w' _4 J' I
- LDA #$00
6 Q4 J9 ^! Z2 h5 Q i -
2 r `# D1 _1 \, W - .Music_Clear_Zreo_Page_0: i8 t/ r0 R, s9 o, j9 T/ ^
- STA $00,X
* t/ D) M, v' M# |5 y - INX! s9 D; F' N# C
- CPX #Use_Zero_Page_Begin" U3 S- A$ c" N5 W+ F) J
- BCC .Music_Clear_Zreo_Page_00 |. R H/ J* j& C L
- , T7 i! F7 [5 c% v+ Z/ L
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size$ j6 G# R/ e+ c$ H6 o
- .Music_Clear_Zreo_Page_1
( Y8 D; ]) ~$ I' _! L3 }! E - STA $00,X
{5 N2 l3 Q9 l( d0 g Y2 J - INX* d3 N( I8 h! O: F% |' \
- BNE .Music_Clear_Zreo_Page_1
- `" j& Q, [9 Q2 Z4 s6 X - / e2 J+ S% V0 [+ T; |# g6 v
- Music_Clear_Process_1
1 L( ]: ]+ `$ l3 l5 B8 ? - STA $0600,X8 _# r# A. N ~+ I/ @7 r
- STA $0700,X& u; {$ U+ Y& p$ \; ?
- INX' z5 `& n1 K$ r4 b; G2 c( W2 n
- BNE Music_Clear_Process_1
7 y+ O, Q3 V9 ?$ l - LDA #$10
4 C% c: F: k3 `) d - STA $4000( Z6 i M6 L1 q3 \; S: F- t
- STA $40046 D* l. R( p) n% c' q6 W/ H
- STA $400C4 P9 t/ z/ L; H& U: M" u
- LDA #$007 ?8 r& J2 V* ]0 O, t8 q
- STA $4008" V- p7 M+ x3 H
- LDA #$0F
F7 ^ W+ K' A% M* Y* |4 y - STA $4015
0 J1 Y/ G, C- c" Z! U% M1 n- Y - .ENDIF
! _! y8 @! u9 k6 C( Y - 5 Z! P1 A. h5 \ ?. G* V2 \
- RTS
! R, k! C& [3 N- l8 F - . P8 ^' \7 c8 r) \
- ;======================================================================: H+ s9 N. K" n2 A: r/ |. ^
- ;重启处理7 p! p- q. o5 t% o
- Reset_Program
1 B8 j' D1 T. W - SEI
/ f5 N* P" T* q' _ - CLD( S: I/ Y* A5 h! y+ }
- LDA #$00
3 R* C# e, n8 D4 K1 d4 K$ W - STA PPU_CTRL
( I; G4 n8 n8 F5 H - STA PPU_MASK+ E1 h. v6 b+ b8 t9 h% C* U, _
- STA JOY2_FRAME
' j* G! w* }# }- @6 w0 J3 I - STA APU_STATUS2 Y0 d4 T* B C' r- N5 _* [# z
- , P# F4 ]5 F6 s
- ;等待屏幕准备完毕- n# i7 s; K5 c
- LDX #$02# |0 }3 L1 X) g5 Y% @/ o
- .Wait_For_Screen_Ready
u4 H3 {8 T3 H2 @ - LDA PPU_STATUS
+ L' H3 K/ x/ p - BPL .Wait_For_Screen_Ready; p7 v+ [6 d2 Z: @! A% c; S7 @5 l* s5 \
- DEX
: B) M& ?: j% y8 _ - BNE .Wait_For_Screen_Ready0 b5 B) m% L- S$ G/ J
-
3 M/ a* H _# O3 T0 o - ;清空调色板% U6 p3 D( R A* v3 d* i; w
- Palette_Clear
$ x: \ [, y B& G6 f. y - LDA #$3F
7 J7 m6 N6 N4 {* T - STA PPU_ADDRESS/ d% Z% J9 o8 A- a: j) m. g" h
- LDA #$00
" y9 I+ L& Z+ W X6 g! g - STA PPU_ADDRESS
2 {2 i, S3 M* r2 A4 Q; R& @ - LDX #$20
, ]0 i! L" R2 u+ @( W - LDA #$0F( ?2 e8 u. V, E9 u6 D( u
- .Write_Data1 Z9 `8 I1 I3 r- n
- STA PPU_DATA, G0 z1 \/ O. s, p; i5 W. Z
- DEX
# }7 y: j3 r5 _% g9 y" o - BNE .Write_Data
7 d5 \. J- z0 C% C - ' \/ l7 [% |, @# }9 [; q
- ;清除声音 $4000-40137 m' Q6 b" C9 h1 H! q- c$ [5 H
- LDY #$14: h E Z/ r7 i- u1 V% E R
- LDX #$006 w; R/ F! j; W: k5 @
- .Sound_Clear
; y2 Z7 k% G+ d4 j; Y* B( Q! w - STA $4000,X% j( ^+ k# r1 ]+ c2 A* W# _
- INX' N% q" s2 u" g& H+ x% f- W6 a# a
- DEY) d* a' t" r8 B U! G$ x7 j( n
- BNE .Sound_Clear. G6 K( G9 V! _* n! p
-
- I$ C8 d7 z$ V1 O1 ^1 A - ;清除 RAM $0000-07FF8 B9 n J7 q# v( `# u8 Q, n. F
- LDA #$00) `9 f" w( k- y0 o) f0 \
- STA $00
5 s7 M1 E; A) D h7 E% @7 M. ~ - STA $01" v" d& u' f' U x5 a! m" A; F
- TAY
% a9 x0 o2 C+ y7 Q4 W# S# | - LDX #$08- Z E, a6 j8 D# s! H
- .Memory_Clear
h1 m' T+ O6 S, y0 Q. k - STA [$00],Y
0 A* m+ J! V- u - INY
. `- c8 h9 x- s+ k; ]5 `2 o- v, | - BNE .Memory_Clear
0 J# M# p+ L8 |# e - INC $01! Y; t3 c$ k- f; {6 L: E' W
- DEX- ], t# Q. Y0 b( o+ ~* o
- BNE .Memory_Clear
+ |) f. T3 @ L d9 W0 o7 h$ j7 J - ; ^* U# _9 p; `5 U% d1 l9 ^+ J) o
- ;精灵缓冲初始化
. J4 B2 H z( j( L1 E. {. Q8 E - LDX #$00; E/ e3 V6 v& [3 i
- LDA #$F8
8 }' E/ B# u* a0 b - .OAM_Clear
: ^; t( W8 a: P! N$ S - STA OAM_DMA_Buffer,X
H1 P) D' l* D3 ~& x - INX, R5 i P2 }- a% `2 g$ B5 o3 H
- BNE .OAM_Clear g& p6 a3 H; J# u$ S0 v
- ; g( W& r/ _ T* b) H: q
- ;栈指针初始化
p! v# `5 ~+ ] - LDX #$FF2 Q2 J' n/ f# R0 M6 T" ~
- TXS( H' O" ~5 K, r0 p
-
4 V3 P9 n4 _) i! T - JSR Nametable_Clear;命名表清空+ J1 V$ |) q# G5 U4 \5 m7 `
- JSR Palette_Init;初始化调色板缓冲
$ `! ~/ q" ~8 ~; P8 t7 M0 r - JSR Static_Text_Init;初始化静态文本
2 I D8 {- Y2 T8 S9 }% N -
' j% z2 O4 _' W' i- v5 D+ m2 m( j - LDA #MUSIC_ITEM_TOTAL - 1
# b$ H/ j" T/ \ - STA FC_Music_Max_Index
/ r2 n6 X+ q& f% F5 ?/ k - ) F8 J' B9 E8 ]
- LDA #$1F/ i4 g; F5 j2 ^ K
- STA APU_STATUS+ C) h& W0 Q+ F7 z" [
- LDA #MUSIC_BGM - 1
7 W! [! `1 E. l - STA FC_Music_Index6 N8 I- }! K ]0 h+ T( V1 i
- JSR Music_Init_Process;音乐播放
3 I/ q. B9 \& A7 z1 h - : M1 z; j. Q$ f- |0 ]
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)# B# w& Z5 s( l2 e4 S
- LDA #$1E$ W; o5 H( @, I
- STA FC_PPU_Mask_Buf
8 w/ R# B, N% [8 p - & a9 l6 P( o6 J: c, G/ z3 a
- ;启用NMI处理7 w: I% C0 O# J8 Y) [: `; P; S7 c" l
- LDA #$805 k& ~" X* ?3 k# n( D
- STA PPU_CTRL/ Z, {8 o' l1 @2 ^; o
-
! ]0 c f" L3 ?! U- z: H - ;程序循环, 剩余工作交给 NMI 中断处理8 @- N! \1 p1 Y j4 r3 H5 q
- .Loop1 H' |4 k0 p6 P% l+ ]" a L! b8 b: j; O
- JMP .Loop. S. ~/ f. \+ r$ ]7 m
" G! o. n! J& {, i- ;======================================================================4 Q* P7 k5 e6 }7 U2 s; D
- ;不可屏蔽中断处理7 H" `( H# Q' ?7 `! Z/ P! I# p$ s
- Nmi_Program# v, T1 d& I9 M5 W' q; V
- PHA) `" l+ e/ C" m0 R' c& K0 c ?6 c
- TXA
9 [( {- q( q3 j/ v/ O - PHA
+ a: K' k' \& H, A" E% \% b* l* u - TYA
0 V& G; i6 X6 P9 s1 L6 u( H+ f. c - PHA
- Y8 e: W. q0 O9 \# h -
: b0 [7 |" A" D - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
3 ~ q" S U5 i2 c8 [: o2 T& _ - . q* v4 B! D% o) `
- JSR FC_PPU_Procrss;PPU处理
# n7 ?4 w: I# z7 M4 J0 @7 j" U8 m+ c -
5 _/ U! r, e+ n! E% D3 u - ;精灵内存更新 w& J5 |2 @5 W4 W) I# n
- LDA #$00
. r2 G" ?) V( c7 ?" T2 z' m - STA PPU_OAM_ADDR& g: e2 \. r2 n7 Z
- LDA #OAM_DMA_Buffer / $01008 W9 K/ {/ ^& \
- STA OAM_DMA, `$ @0 n/ b- X/ k% ]! Y
- / z& }' d8 ~& c$ A
- JSR FC_Gamepad_Process;手柄输入处理" u( Q+ R( J6 h- K: k4 c% w! q2 ]
- JSR Music_Select_Process;音乐选曲处理( F4 K3 ^$ E: a
- JSR Music_Play_Process;音乐播放处理
/ Q6 b4 n1 ^3 U5 b -
3 w L. }4 O- Y: r* @: K - PLA
+ h! S2 Q. b* d4 T. n - TAY
$ ~; l$ R7 V( q2 F - PLA
d* e4 T9 {3 S$ N; n' Q - TAX" b" A9 I" _ ?4 [
- PLA5 f* a* |! G0 r
& r. U2 }; O L- RTI
! _1 S# z" J1 K- A$ i: I - / J. A2 L K0 D8 {$ f, x) [
- ;======================================================================& g% w6 X7 t. f X0 j, |
- ;请求中断处理* V3 k7 x, _3 K0 v0 f; r/ \% V
- Irq_Program
% h4 r% M- Z. }7 g8 B* N - RTI) n! c7 h/ Z# d
- ! ^& V4 x6 t/ S$ n1 ?/ I
- ;======================================================================$ }9 w% } {+ ^& K+ N- G
- ;中断向量表
& u$ ], [: @) s! B/ l' W1 N - .ORG $FFFA. k; V2 [1 T' G
- .DW Nmi_Program ;NMI触发时执行
0 `2 x3 z1 m0 ]4 H0 {$ ~3 t - .DW Reset_Program ;载入ROM时最先执行 t. e% L+ o! r2 G& v# L3 x
- .DW Irq_Program ;IRQ触发时执行
5 K) X4 D2 \9 n% E$ Y
复制代码
+ c6 \, v2 c1 @+ k9 s% {) D5 b H
0 I# j: r9 f0 M5 B o0 z. `
! p. [( E* b- Z- x8 p+ O( r8 H+ @https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|