|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
1 [! U/ Z, L2 C7 ]( i$ w. j
% m$ R5 \9 h3 `( P以下是主框架代码:4 y1 [% L; i, K, B
- ;======================================================================
3 b$ a8 b; H7 w8 \. X+ S - ;文件头
" L- {! e3 ~8 ~& ^# a: V0 g - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量" k. {/ \2 Z4 Q+ ~+ c2 I
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量3 [) W) L3 {+ O1 A: ~
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
7 n3 _. T. G8 }+ t! Z - ;======================================================================+ u6 [- ?3 s# T& `/ d% ^
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2, e4 ?. e- j4 N0 V1 f; S! \4 k
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 17 y* T3 p+ G+ X0 B6 @9 ?/ L: w
- ;======================================================================9 N& L+ E0 `! K) w5 D
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 12 u3 T: h5 g+ G
- RESET_ADDR = $E000 ;主程序起始地址
0 O# y; c% d* ^" x6 [' r# r - ;======================================================================. J6 ^, B& ?/ O. ?. `0 u; j: m
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
: i2 K6 `' P M - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
3 K9 R- b( s8 M! x- a" y - .INESMAP 4 ;Mapper号 (0-4095)+ t* {0 N% @ ~# W* @- w7 |% ^$ ]7 Y
- .INESSUBMAP 0 ;子Mapper号 (0-15)
. z% D/ A0 N' |+ h7 Y' K6 G/ { - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)' {' v) V {) h* K
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)( a, Q1 ]! z$ [4 h
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): z% Y+ ?( L( M' t) T, d# }" h8 C! G( f
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( @! T: {" J. D6 o
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
# a$ z, D2 m+ j% m' A+ l! j - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)0 {% [1 w$ `# ^9 e2 O
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)) G9 E/ V' {4 j* w$ A
- ;======================================================================) U& x l; V6 ?$ v7 G+ ~
- .INCLUDE "fc_demo_config.asm" ;全局配置
. w( r) X) U! C1 R( h - .INCLUDE "fc_demo_constant.asm" ;NES常量+ V7 c* W0 x9 `# u! ~6 n0 A
- ;======================================================================
3 e' S& P- t: \1 n* U+ W1 i' Q5 J3 y% W - ;音乐配置3 f( M" K6 }0 ~5 T
- .IF 0 = MUSIC_THEME " q7 J7 s- w2 p1 { e
- .INCLUDE "data/music/Gremlin 2/config.asm"
) M. g6 H8 u/ c w) a' r - .ENDIF, P3 W9 [- ~3 j2 W- p9 x
- 9 ^( E$ S, e$ L9 m2 Z
- .IF 1 = MUSIC_THEME
0 i0 T9 r: p# q8 V - .INCLUDE "data/music/Raf World/config.asm"% r0 j/ ?. K! p7 r. F2 {1 M
- .ENDIF
- J4 M5 |6 M# Y2 P7 ~ - ( j& F |& V) H5 g) A' R7 ~
- .IF 2 = MUSIC_THEME
0 j1 K* ^/ A" F' L - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
# W H2 c7 c2 ^5 ^( E) Y% ?; X - .ENDIF
* Y. ]- g) d6 N
) F8 {6 H$ Z" P7 s5 I1 _" Q- ;======================================================================; k Q* N/ ?/ q: N5 }! J6 g4 G6 s
- ;引用CHR图像数据
( h2 @. I0 E8 ?3 {* Y$ X - .BANK NES_16KB_PRG_SIZE * 2
$ S- ]8 D. ~+ y9 G2 j- `7 R, A - .ORG $0000
( M. G2 D1 B+ D- g - .INCBIN "data/bkg.chr"
7 R& g! o* k) Q1 @2 W$ A - .INCBIN "data/sp.chr"
+ d. _8 `/ ~& O. u: @ -
* G5 F( y+ Q! J0 E( E& q/ R - ;======================================================================
' q+ i5 @# v( h" x - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank7 L1 h e: l, v
- .ORG RESET_ADDR
/ b% J o9 b$ T. ] - ;======================================================================2 X n( n( |7 F2 @. C4 K: Q, O
- ;引用其他源文件* E5 w" t/ f% p8 X6 ^9 y
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理+ j( N; s; Q2 f- i# m
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理; F& D N, p3 p3 d# I( D
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理$ G( n# _$ [/ k9 p* h$ L3 ?4 @
- ;======================================================================* `0 i3 C4 r7 ~9 o; b
- - J0 \ c1 O9 @
- ;======================================================================
7 U9 M: A) t5 a. [ - ;等待VBlank到来
) W! Y( T) ^ c' ]! B - Wait_For_VBlank
, _. ~6 V& f$ S l - LDA PPU_STATUS
! f& }4 a3 N' w* q - BPL Wait_For_VBlank7 O' B" I5 b8 d$ {6 x& q
- RTS+ h: P/ F) M' G T3 q
- 9 I% V8 |# d+ O$ P6 x0 @& D
- ;======================================================================
+ U+ B, D7 E: f - ;调色板初始化5 ^1 @& X4 ] m+ j1 X* ?
- Palette_Init
1 y+ d8 `8 R# d9 O - LDA #$3F
6 X" X1 X S9 _+ ? - STA PPU_ADDRESS+ i3 H {! W+ |2 r- S0 Y$ Y
- LDA #$00% _' x8 l. t9 U, G2 ~ U
- STA PPU_ADDRESS
; g) M: F4 h) v; w5 P. k - LDX #$009 A3 E1 j1 k9 L) ?7 L! X3 O1 K
- LDY #$202 [/ \" I/ j9 C
- .Write_Data, }: Q* E9 v, O3 l! B
- LDA Palette_Data,X- g. I) W: v h
- STA FC_PPU_Pal_Addr,X
; N1 I, `; Z( F: U7 z - INX
! W* ]/ @5 L+ q, E) M" f - DEY* i- ?$ e7 ^9 g. T Y
- BNE .Write_Data/ }6 i. [+ C# W0 Q2 `+ {0 l
- .End2 H2 x. B: o$ L8 `0 z
- RTS
7 y4 }2 E% [* N7 {+ C5 z( g+ }' { - * T+ D, ` J1 |3 f; q2 V0 d
- ;----------------------------------------( J" h. f" M' W
- ;调色板数据
6 R. x4 H0 s8 {& `2 N" Z2 g - Palette_Data
6 M, {& i6 m% z. v - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
/ N+ [3 B+ c. q/ l - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 227 m% @+ w$ V7 k$ A. T0 T' }' _9 S2 L
-
' _6 ^1 s# h; V, A" L - ;======================================================================7 f: G3 t8 Q, a T N9 w8 Y- r! F
- ;命名表清空/ q$ Y( c% x! z6 r4 v
- Nametable_Clear
$ ]* q+ d) o2 O4 ^$ b# b% @4 c - LDA #$20. c' I2 Y1 b, b% ?" p
- STA PPU_ADDRESS
9 M& K- m1 J# Z Z - LDA #$00" r0 s: ^9 ]2 F% M- m
- STA PPU_ADDRESS
$ s) {2 h8 @$ m7 A+ S U# V - LDA #$00
7 Q6 v) m) u" u7 l( f - LDX #$00
/ Y9 F% K& ]4 q - LDY #$08
/ W5 z% I9 t" y" a0 i - .Write_Data# R7 W9 t' T1 E3 |3 G6 ]! V
- STA PPU_DATA
. P3 O/ h& ` { - INX
u/ @! |% Y A - BNE .Write_Data6 `; ^8 Y4 O% `1 _) {$ o
- DEY
" A/ o: S, V# m. P6 [ \ - BNE .Write_Data
3 X3 Y; D$ g) S* u( d. B - .End
! n5 h$ U# J2 f) a7 N - RTS5 h4 H7 @8 i. G, j- z# d1 _/ S
- # U" J3 N" F8 `. y& W
- ;======================================================================6 r* B, x( ]0 N! ?8 \( D7 s5 {9 P% ?( X5 E
- ;音乐曲目切换
8 p+ P8 W4 t$ }5 ]) E9 K - Music_Select_Process
c7 N$ G2 ]. A/ k - ( p; e5 M& Y1 m) {& p6 P8 s9 F
- .Pre_Music;上一曲
: w2 ~0 h: L6 e1 b5 N% O - LDA FC_Gamepad_Once
2 b- { [" _9 c, s- w4 \+ _4 J - CMP #JOY_KEY_LEFT% H# G' V% B# w! s
- BNE .Next_Music, M" k9 e! Q. Z+ J6 _; r7 L
- JSR Music_Play_Pre
% Q9 i! i) A! W+ m - .Next_Music;下一曲. i/ Y: Q, y# M* @8 Q
- LDA FC_Gamepad_Once W, x% m$ @ ?1 n Z& B. T4 v) n, j
- CMP #JOY_KEY_RIGHT& b& |6 A2 w- T9 l m: y
- BNE .Next_10_Music9 g3 I, g* v! ]4 R ~
- JSR Music_Play_Next; m. p$ @3 K) {4 m5 `
- .Next_10_Music;上10曲: Q7 I3 G7 o- l+ {! F" B4 J1 S
- LDA FC_Gamepad_Once7 x! S6 L/ S" ]
- CMP #JOY_KEY_UP
( j. ^+ @* G( G! g# [' {. E& s, a - BNE .Pre_10_Music
/ d6 j T, O: j9 Z( s - JSR Music_Play_Next_10" ]& `1 s; @) Q0 n& N
- .Pre_10_Music;下10曲
- w3 h" G; G+ o k: [" O - LDA FC_Gamepad_Once
; R# h* Q) g' } - CMP #JOY_KEY_DOWN- X& ?; K8 P! a8 N4 ~$ R
- BNE .Reset: Q: q. J, E1 {( R/ L9 \9 b6 O7 E
- JSR Music_Play_Pre_10
8 q# e! M+ B0 b* ?1 {, ]8 r- U3 y - .Reset;重播当前曲目
+ h7 O1 c, n. K+ T8 O - LDA FC_Gamepad_Once
, Y; ?! `) r# `4 M5 c! a4 K+ X# E - CMP #JOY_KEY_START: k" j7 ^4 M. P7 G1 N" f
- BNE .End) v4 @, i6 Z b0 R; g4 @( W
- LDA FC_Music_Index/ U) D" G' |, h' L& m
- JSR Music_Init_Process( S% M3 p; \& _* U: C$ Q
- .End' [& T: S8 }/ E0 a n
- RTS
) h; ?$ `$ x0 m, \3 g
" h: @' z! k! D- O6 w- ;----------------------------------------------------------------------
. K! e* p) K) U2 v0 y$ a k4 e" L - ;播放上一曲
0 i8 K* _+ _0 Z* u - Music_Play_Pre
: v+ T9 O* p! e! i0 a6 r - LDA FC_Music_Index4 R% D1 `$ r. Q% T7 H6 w3 i
- BEQ .End
& b, Q9 r2 m* D2 q- J; ?3 F9 y - DEC FC_Music_Index
) l+ w Q& x' g( C4 T4 B - LDA FC_Music_Index
3 R9 z2 X- @5 n# F7 y - JSR Music_Init_Process
1 z3 i! @1 n# ]0 t2 a. A+ R$ t3 X - .End' b# _; h+ g6 C
- RTS
% q6 {( [8 }% {* F+ k7 P" h - ;----------------------------------------------------------------------
0 {# @7 B8 n; b, @4 |+ n* M2 j$ N! V - ;播放下一曲
8 b4 b, V/ y/ b) Y - Music_Play_Next4 z O$ \7 Q$ o* ]2 {4 a% c
- LDA FC_Music_Index
- @) ?' R, s* q8 x - CMP FC_Music_Max_Index
$ @. X! `0 i/ R! y2 _ - BCS .End: ~: [! @7 k/ w* K2 C2 S
- INC FC_Music_Index7 V7 O6 b2 R* A/ g
- LDA FC_Music_Index9 A$ f: n9 F# H* ?% o$ Z
- JSR Music_Init_Process2 p2 P% x* X9 \$ |# y/ Z9 l
- .End1 F f% \0 u: J! Q* C, l8 ?
- RTS/ L4 [) Q x* Z& K- {1 z) }1 `
- : Z: ]' W7 s# ]3 ~% C
- ;----------------------------------------------------------------------
# z1 z& F) ^. p6 H, X( E - ;播放上10曲, C3 t- Q. i9 ~% j, l' m
- Music_Play_Pre_107 l1 S4 B: ~! }9 x- d
- LDA FC_Music_Index
$ h# n- T9 t( p9 d* Q( |" R - BEQ .End( s0 g# b- L& R; a5 h; P
- SEC- t6 G/ C. h6 p, F
- SBC #10
3 h) n$ J; t6 u1 n& C2 W - BCS .Pre_10
5 [4 d- O, D1 _7 x' h3 ` - LDA #$00
G. C; {1 s. K# `9 d$ R. G2 \$ B - .Pre_10) a1 v2 E/ S& V( l; z
- STA FC_Music_Index5 F5 s' F5 [) b- |4 X3 u5 [1 J
- JSR Music_Init_Process
# A9 u* Z: C, H5 U6 Q$ p - .End/ c0 A# P2 d" A7 m! b8 o& l
- RTS
5 v- ?, t8 p6 v: t - ;----------------------------------------------------------------------
/ x* t. K z) ^6 h, b8 ]( T - ;播放下10曲
C5 o3 ^( d: P" W; Y, |5 \ - Music_Play_Next_10* {3 G7 K, ^2 J# n1 L! V6 ^
- LDA FC_Music_Index
+ `2 I8 h/ O/ V2 |2 l$ h- y5 s - CMP FC_Music_Max_Index+ G) f2 c- L! L# V# X/ P. |; c. s
- BCS .End F6 X/ q5 H5 x$ u+ |
- CLC1 Y8 |- s# M8 y+ ]$ m+ ?
- ADC #10
4 c/ U* r8 E( y C - CMP FC_Music_Max_Index4 ]. q, L- G& `5 n! E# `
- BCC .Next_10
0 g/ Z) i" I K. J. y9 a9 w - LDA FC_Music_Max_Index" ~2 v" }0 a$ Q9 q
- .Next_10; K# [7 r! [; F- i0 M* Z8 R$ t% N9 g) _
- STA FC_Music_Index
- G& C$ H2 P; J, c - JSR Music_Init_Process
6 T/ p1 _# z% n+ w8 N - .End) N/ Y9 E q+ g5 S [
- RTS4 u9 p0 n' Z; e$ |/ {/ O+ T" Y
7 Y+ |: Y' d2 N9 U# S5 Y- ;----------------------------------------------------------------------
4 Q5 R" n; A( E) @! y - ;8位十六进制转3位十进制制
" b$ l: f, J# F2 G1 ^! ] - Hex8ToDec$ b8 P( u1 z& z+ P w( w
- STA FC_Dec_Data_1 K6 n$ L, W y
- LDA #$00' n7 Z, a0 u& K) A2 A5 Y
- STA FC_Dec_Data_100
7 B6 L2 K; Q3 K4 Q" m7 r- @; q: g' d - STA FC_Dec_Data_106 I8 E* O: E1 P9 a9 w
- LDA FC_Dec_Data_1- q1 e, p( Y4 h/ \: r# s
- .Convert_100. a' u; r* b3 ?$ [; G7 X
- CMP #100 P% ~; p6 b- _' \
- BCC .Convert_10- |. D$ d* X# P4 x/ U6 {; z) ?
- SEC
+ i1 T- v( S5 t - SBC #100( S; Y& i d# h- L4 k8 J) m l
- INC FC_Dec_Data_100
- I1 A0 d* {& w( g# z - BNE .Convert_100
9 W2 L6 q+ `: r5 k6 C4 Q- h - .Convert_10
! f! @* i: V+ S x - CMP #10
2 ?+ O) u; R( F - BCC .End
+ H# [6 {$ B& Z* o& {, k - SEC
4 O( q: F X$ ~! r- } - SBC #10' a* S6 x- e7 u8 h0 j, V
- INC FC_Dec_Data_10. S2 Q2 k- E7 Z7 r& v% A
- BNE .Convert_10
1 ~& {* ?- I& [' Z - .End0 j4 t. z' z! }* M( y# v1 ^, t
- STA FC_Dec_Data_1) r9 F# W: U, }: @/ W1 Q+ R
- RTS+ Y' W$ i" C: A( X) N/ Q
- 6 X, d) J; W' e- W0 k
- ;----------------------------------------------------------------------
5 l/ b. f0 E+ X1 g" u& J - ;显示曲目信息
1 w' C, V) R/ u, k - Music_Info_Display
: L7 q6 g$ m( z. X# x; h - LDX FC_PPU_Buf_Count
% G1 Q, P# O2 D% x& x r3 J; ? - LDA #PPU_WRITE_MODE_CNT_LINE9 c4 y) d4 X0 M+ p5 U: K0 U/ L
- STA Use_PPU_Buffer,X: }0 K7 l. N' Q
- INX# [: F' I$ @, D! y; q
- # U& @2 I) b/ U$ K
- LDA #>MUSIC_INFO_POS* w5 ^* B! y+ e! e
- STA Use_PPU_Buffer,X
! B* v3 b& ~" b, y) ^ - INX
6 W" O0 _8 ^: r! ? -
% Q* ?0 }' @2 d5 ?( E$ b n0 X - ;居中
" x. x# S, i* G; S0 D6 M - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2( m7 E. [& }% s: O) w# k* j
- STA Use_PPU_Buffer,X) r4 Z7 @( B* l1 c* n* ~+ x' w5 e
- INX
- U$ C$ K5 e% m -
/ {: T% C t( d0 i0 t7 V+ ?+ j - LDA #$05
% y9 R$ ^3 r' L! e - STA Use_PPU_Buffer,X$ j+ N1 L* J1 T2 e7 _
- INX
+ T8 d4 {- |) K7 j2 o9 l6 I+ q -
( l i0 f) z5 R3 @8 X" F( D - LDA FC_Music_Index0 C* c4 E) Z' m: w: l
- CLC# B: b7 F1 x. W% t0 ^# x
- ADC #$01
a2 V0 Q$ `! |; q: K r - JSR Hex8ToDec" |6 F2 r" X$ ~9 w
-
; K7 U' N% E! j8 E - LDA FC_Dec_Data_10' R. Z% z' I1 S& {# d. x4 Q1 x4 p
- CLC
3 `& ~; _' u; _7 U, G9 f# k( w - ADC #'0'- U* [5 F/ ?0 f% Z5 _5 G1 B
- STA Use_PPU_Buffer,X- I9 |. ^9 n+ ?( i! [& Q* M
- INX5 M3 ?, T, }# ~7 @* f6 Z( m
-
) [* n4 M- }8 U- j# J - LDA FC_Dec_Data_1: h- E O. z. k5 [+ _
- CLC
4 h/ q. O# s: H - ADC #'0'& n( a) k4 n L8 s- R3 P. T
- STA Use_PPU_Buffer,X/ z2 i1 @) ?' q
- INX9 A8 X/ U" d4 [+ g9 t4 K8 G
-
# P# `7 Z4 t( J, O) h% {7 o - LDA #'/'
# u$ H9 B4 a5 H8 v( N6 Z) A( Y; F1 N k - STA Use_PPU_Buffer,X9 ^& f! O# s4 n& C2 }0 V3 ~! I; ]
- INX
6 O7 d# V* ]6 L5 W -
% ~6 I% S4 X4 u, w/ W$ f7 S - LDA FC_Music_Max_Index
3 a5 W7 r( H9 \. v - CLC6 D" g% A6 A. S4 K
- ADC #$019 B% |! ?( L- |: ]- {; M3 M- v
- JSR Hex8ToDec! {' m% r9 X$ i6 h& q
-
% Z9 Z) q; E5 D5 |; s, l5 Z - LDA FC_Dec_Data_10
- G1 g7 }# W+ b! L - CLC: `8 }+ |6 Y$ d) I9 Q% E; B' ]
- ADC #'0'
: k* P: k/ O/ N* X3 F - STA Use_PPU_Buffer,X" Z) w+ M& N Z
- INX3 D; D+ ]2 L4 K9 v' ^7 s0 ?5 {4 ^
- 9 c! f. I: }7 N( b/ C. ]! d; }
- LDA FC_Dec_Data_1
7 {/ q) r" r6 E) A0 c - CLC [, f7 {$ b; U0 f
- ADC #'0'0 B: @' a( K: R' \; p, p
- STA Use_PPU_Buffer,X
8 ?$ f: k, U' ?% } - INX
9 D5 ^. j# N ^ - 3 X' e" {& ~; D+ K
- .End8 U' {1 F. ^# J0 F: Y* k" j
- STX FC_PPU_Buf_Count! s' Y& V N# }5 f1 M
- RTS- d9 p" L. r+ O; c
- ( G2 U" S: Y/ Q6 v( O* v
- ;----------------------------------------------------------------------9 g7 `: \) N4 J
- ;音乐曲目初始化处理: v# C* O: j9 |, v4 M# k
- Music_Init_Process
3 K/ C. E+ S8 q" L* I' p* g - PHA1 ~9 V. K# `6 Q
- JSR Music_Clear_Process
0 y; ?8 {6 m2 h - LDA #$1F
% G6 N3 k) W& f$ T0 T: x2 A - STA $4015( K& V& m! A& ~# I
- PLA0 ~! p* i# b- u. h% e2 q; a
- JSR Music_Init_Addr
! d' }' S7 |! D& _ - JSR Music_Info_Display1 w8 Y1 B) r6 J3 r* _1 ?
- RTS& q% g7 ]! S' W0 F3 R1 [
) Z/ P( E, |' t& `: X9 v- ;----------------------------------------------------------------------- b+ `% I% `* S. \: H8 O/ ]
- ;音乐播放处理
+ S5 h+ w7 n$ j; M - Music_Play_Process
% s# O) l- ?/ K' F3 q2 ~ - JSR Music_Play_Addr
; W& j$ P. S) ~ - RTS8 V7 g3 j, ]3 s9 |; T( h+ G# C: W
- , X/ Q5 s( E' \2 k# u
- ;----------------------------------------------------------------------7 j4 N+ `: f; o
- ;音乐播放处理
5 v+ C2 {0 ^, d+ u' L2 f - Music_Clear_Process5 [; D1 D5 Z2 i4 y
- .IF Music_Clear_Addr
0 J& |. p2 Q9 y$ }' W - JSR Music_Clear_Addr$ n6 M7 C* y% w5 P
- RTS5 c3 F* ?3 I1 m9 `
- .ELSE$ [, ]% X# g7 }. L1 C2 x
- LDA #$1F
1 ?' k1 o! a1 z c% h - STA $4015) `( u2 X3 {6 U, ?7 I) [! w& N
- LDA #$00
. r. R s* x' @ - STA $4010/ z) M- e; i" L9 c4 ^7 @$ {7 Y
- LDX #$00
: n1 Z. T' ^, b+ G6 i - LDA #$005 i) `5 R# y' A% ^* l
-
^$ Q5 m5 a: q - .Music_Clear_Zreo_Page_0
. ?. Q# j' z% f7 x a6 m( q - STA $00,X9 \( {6 e2 I2 k6 \2 s4 [
- INX) g4 y9 H" A; w3 e! S2 X8 Q
- CPX #Use_Zero_Page_Begin d. ~& L$ r! u" u
- BCC .Music_Clear_Zreo_Page_01 W9 R [; V4 a- M9 K& I. ^
- " W2 b) h! ~9 h; m! ^
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
% j7 a9 H S; F( ^# E w4 i3 s - .Music_Clear_Zreo_Page_1% D P' n# H5 _6 J& K( i5 u
- STA $00,X
( q: V! t2 n. a' r. I$ O) _2 s1 W - INX
. u' I- T' J' n3 z7 B* I1 ?- k - BNE .Music_Clear_Zreo_Page_1
* h0 g$ v* M1 S# a% | - 4 k6 o& y% S- ?7 V, L4 M6 S( ~
- Music_Clear_Process_14 ^' ~% f2 m! E, F% G3 x \
- STA $0600,X
: g1 t8 J! J2 m% E5 a! F - STA $0700,X' h' L# q$ i. C- @3 K, g- X" S" `( @
- INX( I& L( \- \3 f# [2 m* ^5 K; Q* Q
- BNE Music_Clear_Process_1. a8 V; k' l5 q, s' M0 D8 \
- LDA #$10
5 z Y0 S4 a, W; _- V, V7 T - STA $4000
& T8 `7 v: m6 S E; p ` - STA $4004
5 S0 \5 D% U' E5 K5 t6 ^ - STA $400C) N2 p; n# {2 b* ?& \' V2 o T
- LDA #$00
* E9 G7 L4 I4 G1 K. ~/ S - STA $40086 P* E0 s8 {) F' r; f* E! D
- LDA #$0F4 Q# I1 o8 ^, Y/ ]# L/ b. z
- STA $40155 y. f% y, T1 H2 d
- .ENDIF
2 }$ u$ c. Z. M4 O/ M - $ d2 {1 z2 C: N9 E
- RTS# Y) I3 y! B' Y/ N" r
5 R" l& m0 G& S/ u$ g/ j- ;======================================================================
" n/ `8 L/ t! s& ~6 T1 Y - ;重启处理4 _9 Z% c' {- l0 ?% Q0 |! a
- Reset_Program
7 M `6 ?) C4 [6 q" v2 g8 c - SEI% ~5 x) [" c5 e S( V% a' I
- CLD% ?% t/ ]$ D9 Z9 b
- LDA #$00
- r9 l6 j8 n" i& }& z# a0 Z - STA PPU_CTRL1 B' R' V" [* b/ ^ k& J5 O+ [2 h
- STA PPU_MASK! B8 R# y( H: s( y7 V2 M2 Z; E# L
- STA JOY2_FRAME0 B$ B) t8 s3 b& {, O5 R& _3 O
- STA APU_STATUS
! W* ^1 z6 s% K( g% N - 2 Q( H" A- k- Y0 i
- ;等待屏幕准备完毕
6 }, y% y/ H" s+ M3 l* M5 A - LDX #$029 { Z5 O l) j- ]7 j& i
- .Wait_For_Screen_Ready: b) C6 s0 j/ R/ `
- LDA PPU_STATUS
( U3 j3 [( e& f2 f# A: d+ ^ - BPL .Wait_For_Screen_Ready
$ W6 Q6 I, v% O - DEX$ U. p5 f9 Y- n4 @6 w
- BNE .Wait_For_Screen_Ready) M) p6 J4 M9 c* m& {2 j4 F
- ( n' f, \- Y# o4 ]
- ;清空调色板2 `. N0 @: m3 c% \" E2 \
- Palette_Clear
4 I( {$ w+ S$ L2 t2 _6 E4 C( W - LDA #$3F
/ x0 v- F n' U, H1 r - STA PPU_ADDRESS
1 ]# `/ r. C, n8 H& ^; n - LDA #$00
" X9 A& `2 n+ a3 S6 |. P7 H i8 G - STA PPU_ADDRESS
" l n: v& [+ o - LDX #$20
8 [# Z* g3 _4 s1 L' Z - LDA #$0F6 M$ G& b7 U- t2 y
- .Write_Data5 ]1 V4 ]1 s: R
- STA PPU_DATA3 q% Z5 |' s$ R& c+ E
- DEX
9 e9 R- M3 \6 o @ - BNE .Write_Data
- M4 H8 \. Y% _# y' Y h: K9 }5 M$ H
0 M2 K/ G3 p6 n- ;清除声音 $4000-4013
" i% c- [( I1 W - LDY #$14
" Y# a2 L2 V3 u6 ]( h! u5 B - LDX #$00% u$ E: f3 |* m4 [
- .Sound_Clear
: q; c& Q/ D2 t; ?. `) I( K4 } - STA $4000,X, X" P) J( v) J/ Q' A! M
- INX# V7 ~( b+ {( m
- DEY
. o5 G" F( b7 \- T" s9 k. i3 b - BNE .Sound_Clear4 G7 y! r- V2 j# y. m
-
7 K, x7 F# w' @& z* E, S7 D4 c - ;清除 RAM $0000-07FF- N9 ?: B7 N4 y! o
- LDA #$00
8 a% ~% y: P, A* `; X* Z* p9 K+ r - STA $00; J5 T$ }& c T2 q/ x7 }
- STA $018 e* Y* {- \$ k4 [7 i# N3 M1 A
- TAY
; M! T8 E$ e! ^ - LDX #$084 s9 q' M% Q% e
- .Memory_Clear* Q3 I% }- h" u X& W
- STA [$00],Y/ C& [/ S: Z: P0 _! m" g
- INY; |6 x, }9 o8 u, x
- BNE .Memory_Clear# e( _. u+ v* |7 T
- INC $01
9 g& G: c. u. R* F F - DEX
* P5 P/ d0 O2 s- ^0 ~! o - BNE .Memory_Clear
7 H* f, e% n8 ?( M: o -
, @) l3 Q$ [# q$ h6 `. b7 L - ;精灵缓冲初始化
4 F1 K; [- Y, Z+ Q9 j - LDX #$00, D2 T* p" _; t' @) ]2 t
- LDA #$F8
4 q$ [4 ^) l/ x) |# z; y - .OAM_Clear3 D$ M! T$ {! h; h$ ?/ u
- STA OAM_DMA_Buffer,X; r: Y' E. r: P. b$ B# }7 z
- INX
0 w+ r$ l6 \) p+ O7 s- s' j - BNE .OAM_Clear: F- a, _. Y6 ]
-
: c9 B- |% ]; ^7 R O, D - ;栈指针初始化
$ c, G% D9 Z. [2 J - LDX #$FF _* ?+ O- K* l9 X
- TXS, Z; J; K: Z$ x) S; n; s' M
-
- V3 d: C9 ]& Q: r9 o - JSR Nametable_Clear;命名表清空8 j) t# l* m& Z+ e0 R
- JSR Palette_Init;初始化调色板缓冲( X$ R* c/ x* }7 ^! x" a1 b2 a
- JSR Static_Text_Init;初始化静态文本
8 q0 S4 r8 u( S: L5 C -
: L ] u7 Y2 X" ~2 C! o4 c% D - LDA #MUSIC_ITEM_TOTAL - 1. e( A& U# U; ~9 Q0 w$ i. k
- STA FC_Music_Max_Index
" o' f7 b9 z. C# z* O i -
1 a& s4 I+ f% O1 L - LDA #$1F( N% P# D, ?+ D) T( \: O' [% Z
- STA APU_STATUS
# [% L8 m- @! }$ c' h) y3 o - LDA #MUSIC_BGM - 1& s8 l1 n* Z- u: Z# ~
- STA FC_Music_Index
+ l; t6 n! Z) d% q' O9 e& } - JSR Music_Init_Process;音乐播放. U; S2 ]9 E6 V: d# b8 x5 N: h9 u$ k
- ! b& R" c* _7 p7 W3 |$ E- W
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
9 L8 B9 c+ ]0 r0 [$ M4 Q3 { - LDA #$1E
4 N9 o) V9 \0 U7 U+ F8 K - STA FC_PPU_Mask_Buf
5 X8 E$ r( a/ w -
# O+ Q2 N8 e" [; }0 u# e - ;启用NMI处理
- \9 _2 l; j+ l+ l! T1 z" [% G% j - LDA #$80. P d) |5 X% y9 w
- STA PPU_CTRL( p* U! \( R: l2 `, C
- : P2 y e7 G" w8 A
- ;程序循环, 剩余工作交给 NMI 中断处理
0 q: G( k& g5 I/ [+ f; _ - .Loop. R. _) g$ {$ J. N6 V
- JMP .Loop
) ]8 f C/ }4 p7 f: \$ m9 `( `
4 K; L! {. L* Y: l- ;======================================================================
" f: p. i4 ?, `+ A6 J6 m - ;不可屏蔽中断处理4 b0 @7 ~/ S$ t
- Nmi_Program
$ y7 V# W H8 }& a- y+ d - PHA/ J! t9 E* u. o1 r0 K% D% {
- TXA0 c# W3 g* G3 J( T4 Z I
- PHA
# h* \4 \! ~: f( O$ F; f - TYA
4 p. Z& R# G/ C) K5 q. }! _ - PHA
$ q# p4 C9 j0 ~* s( ~6 u. @ -
0 Q1 k; q) q& o) R& t# d - LDA PPU_STATUS;读取使得 PPU状态寄存器复位- G, \4 g1 D" R% t8 X: I
-
9 V) O9 y1 `5 x" x9 h - JSR FC_PPU_Procrss;PPU处理
/ F3 G/ r0 ]8 e6 B -
1 V0 ^4 [$ \& D- q - ;精灵内存更新( |" h r, { s! l7 e/ }
- LDA #$00
7 }& f k- s" n& L - STA PPU_OAM_ADDR; e+ n) V+ {$ x
- LDA #OAM_DMA_Buffer / $0100
. N7 J1 H2 A \ e! h- F" a - STA OAM_DMA
/ Y+ V% ~, D+ M) U -
. h3 [5 Q$ \- \4 J3 B$ f6 z$ k* D - JSR FC_Gamepad_Process;手柄输入处理
8 G6 r% v$ R- d. h+ J - JSR Music_Select_Process;音乐选曲处理* A6 ?4 K/ H4 ], h) [2 a: \8 D! J
- JSR Music_Play_Process;音乐播放处理) s' S+ ~% X' V* z/ c4 h
- $ i5 f, v Z# d4 @& o5 u2 f' U
- PLA0 c0 ~/ ]' p8 E2 ^5 s7 L( V4 d
- TAY7 O( I5 b6 F, L w8 a7 H
- PLA( ?& w! T& z' i
- TAX
4 s1 g; }7 I% j0 A* U - PLA9 e e7 n F( e- @' s( G
) j/ _4 r; w% u- RTI
6 a, r) O0 P4 I3 |0 E1 q
$ U! b, Q5 y9 e! y- ;======================================================================# d3 p+ T! Q8 S- Y3 A( F
- ;请求中断处理8 w: i7 _3 M8 W1 ^5 }
- Irq_Program9 x( G! Z9 r2 D" f/ [
- RTI
6 u. s; O! O0 @2 T5 k+ R' |( j" I: N - % z9 o0 _, [3 v! ]& s( g
- ;======================================================================
" I. G! Z; J. @7 G: C - ;中断向量表
$ @9 T; E5 E; M* r - .ORG $FFFA( r$ f) ]) p: L+ a& u( e
- .DW Nmi_Program ;NMI触发时执行8 w6 N3 d3 h% N- ^+ ^
- .DW Reset_Program ;载入ROM时最先执行3 f! h& t, B2 j6 N( Q6 [, \
- .DW Irq_Program ;IRQ触发时执行0 R' O. d. B; `1 g8 l( `9 i, Y
复制代码
9 z9 R1 H. C3 k- w& s) @" Z; B3 T% S* f
- q- h1 F. v5 X* H; b5 M# {2 ohttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|