|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
7 T7 H' r. H# [4 o+ p6 l ( K. I8 p' u& d2 V
以下是主框架代码:
1 k2 h/ k; c9 \- c3 b) \- ;======================================================================
/ Q& i+ L/ {/ G1 l9 |. O - ;文件头0 O. S) l- Q6 o. u
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
+ u8 S# D) x- I" S% N: E - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
6 U% h9 ]- e# I$ o - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
+ w9 s; Z7 t* U7 U1 Z; Q: L - ;======================================================================
7 w1 Z* P) n3 h% [1 c - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
1 [- L O- p9 ~0 l: V - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 18 W# |7 p& z# Y1 Y2 `, o: w+ Z+ {
- ;======================================================================
+ m& Z- O# d% ]0 O* P# u - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 12 p" T* \* e& f% F# `
- RESET_ADDR = $E000 ;主程序起始地址6 v. j$ \5 l6 w9 a; ^; j4 k
- ;======================================================================% a. V5 j7 q# C* X
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
$ N% b6 ~& O- L+ y3 F. o+ ^, C, E2 b - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; S+ |: F1 ]' I2 N6 }' `6 A
- .INESMAP 4 ;Mapper号 (0-4095)- A# h% V- b& U1 |" P7 L
- .INESSUBMAP 0 ;子Mapper号 (0-15)
& G- ?" b. Q S9 q- C* T( ^, ^ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)' S) l* o* S; a
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)/ {6 M0 A( Q/ x. ]: T$ e+ ?& y
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
9 e2 H* s( H7 V0 a: h) {7 \( j - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) O; R2 I2 G$ p/ m. M
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
( h- i8 t7 r6 R7 Z0 W& c$ o# w% ]8 o/ S - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" h2 B3 a" t8 \+ A
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
% P; ~" l& }6 P0 \" u - ;======================================================================9 d, k- |) Q( H' _- j6 G9 I
- .INCLUDE "fc_demo_config.asm" ;全局配置* {! C0 L9 e2 w" N
- .INCLUDE "fc_demo_constant.asm" ;NES常量
7 @- J0 q8 k+ f, A9 y6 e. ] - ;======================================================================
7 G" ^9 y# A+ l3 Q9 D; D - ;音乐配置
% {1 ^) M" Z+ v- @% A! S6 M! a! L - .IF 0 = MUSIC_THEME ; R' g! W9 B0 G* O: k
- .INCLUDE "data/music/Gremlin 2/config.asm"
6 ?% }0 U R6 a" Q. b - .ENDIF0 V' |6 K2 }; A1 X% d( }- c
- ; ]) M* j) `1 P3 y# I1 r
- .IF 1 = MUSIC_THEME- C9 A# X# c7 {$ |' m% y( x
- .INCLUDE "data/music/Raf World/config.asm"
+ K" q: o, A9 u - .ENDIF
: {5 w( X2 z! _4 [ -
3 s. m1 C% Q, G9 N9 l# |# P, z0 N - .IF 2 = MUSIC_THEME : Y4 l t) ^/ M9 p- H1 O. G* `9 c0 R
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm". D* |, X# ]7 G/ n- z
- .ENDIF
' G9 i* u5 g a2 ~# v/ V
: @1 m- t# i# ^$ B8 v. v- ;======================================================================
) \: }) T* f# Y; s - ;引用CHR图像数据
/ @6 j: n# H# F# c1 H - .BANK NES_16KB_PRG_SIZE * 2* j* N7 k8 X. ^0 M0 B7 d& C" q
- .ORG $00003 u: r8 f9 R! F/ k0 P% v' s( ~' V. E
- .INCBIN "data/bkg.chr". x8 m( ~% ^; v G) w! c
- .INCBIN "data/sp.chr", T8 v3 p# B* v& ^" Y
-
& a% U- {& S; V F: \ - ;======================================================================* L: k3 r+ P9 W
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank. H" d7 a9 b: W
- .ORG RESET_ADDR5 @! W) S1 @0 t+ |1 k/ |
- ;======================================================================
- R& a. ~0 q/ H4 y. X+ V - ;引用其他源文件7 M9 M& L6 w/ }# y. E0 _2 F% z* S
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ U! X, i: }- _/ W. n
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理/ Y& g8 I! I& h" v9 q. i
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理7 r/ r* `7 j x$ c7 |
- ;======================================================================
& a8 F8 b5 ? E; d2 R5 O+ ?. s+ y& n
& C/ N: z: J3 S! O& V- ;======================================================================
8 o) M: h" Y& w) g- R2 F) Z/ C0 | - ;等待VBlank到来
9 c& I1 }0 z, P" v* }) f - Wait_For_VBlank3 w+ N2 n. t8 B9 s2 e! R1 u
- LDA PPU_STATUS: B! f% E* g$ p( M
- BPL Wait_For_VBlank1 Q* e, b( G6 K2 d0 N4 R
- RTS- }! o9 \- |6 F; a p$ |- D' T8 R7 Q" n
- % g3 a! f! V* {0 _% n# j; o
- ;======================================================================
9 q: h' y, R& n5 j3 `$ v! Q% h - ;调色板初始化
: q! l* _5 A h0 L4 f/ ^ - Palette_Init
* i0 |* W$ c0 V h( i* b' ~9 S - LDA #$3F$ L2 [( e; t6 {- z/ k/ [, U
- STA PPU_ADDRESS( `% F, y3 C% q8 D, E/ ^% U# Z1 R& e
- LDA #$005 g/ r; `% B8 K6 o
- STA PPU_ADDRESS
4 s! f3 V$ J" i) ] K+ E8 [7 O - LDX #$00
1 F( U9 F2 e& @* { - LDY #$207 U- D' B" P# k( K9 L9 i
- .Write_Data
3 @' `) O) S( c6 J - LDA Palette_Data,X4 @ {. d2 Q/ O: s% _0 i
- STA FC_PPU_Pal_Addr,X
: |9 C) _0 w+ t( [. P" v: x5 i - INX
; l. a% Q0 {2 N2 D - DEY
% P9 |2 s# S+ y9 L* t - BNE .Write_Data
9 Q( y; m1 ]5 {6 Z- Y/ `# j/ }0 M - .End/ k& l* X k! n% n: H7 S
- RTS, J- W0 w: h- t; T* K0 C9 Y% R
8 l- Y! ]( I5 r! p- {, G7 i- ;----------------------------------------
+ H. ~8 l3 z7 m/ _; j+ N6 E - ;调色板数据( t, ^" ]" l- X A! U1 Q
- Palette_Data' f a+ U0 R0 D8 |% v& J( i8 ]
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
* H4 O5 e: @5 V - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 222 A4 n& y i8 f2 m7 R, u, n! ]
-
( n: {4 ]% V4 m2 g0 T) V - ;======================================================================
, p$ y+ b" }/ i& D5 [ - ;命名表清空
* R4 ]# x: ?% X& U6 E - Nametable_Clear
; o3 D( B+ ^3 i - LDA #$20- T+ ~# A- L, j
- STA PPU_ADDRESS, H6 R9 v" ]& `0 u* c4 i# {- w" F
- LDA #$00, `7 w s4 K2 w4 ?8 Q& q5 O
- STA PPU_ADDRESS8 k7 ?# y& H. S% N; A# l2 F; z
- LDA #$00 Q4 v9 Y8 _4 Q
- LDX #$00
5 L" R/ f2 L7 q. c - LDY #$08
1 V! ~/ I9 _/ S0 r - .Write_Data* A, d) E" F1 ?) b! ]& G
- STA PPU_DATA$ D- i1 R' h1 k6 C* ~0 R5 S7 Y
- INX6 U/ n7 c* T6 \8 f
- BNE .Write_Data
8 y5 `/ k. q/ V H5 q# @6 R5 @7 t, S - DEY5 P) Z$ [7 O0 ~6 g( r9 }
- BNE .Write_Data" k2 j0 g3 w: c* q/ {
- .End0 R, ^8 T0 u' W. I
- RTS3 @) O6 m7 {0 Q# m2 s) E/ H% B
- ) o6 G" m! f' i3 p s
- ;======================================================================. [7 v8 h! [0 P& {; q
- ;音乐曲目切换
) T. C# P( u# u/ j8 X5 Q2 S* e$ _ - Music_Select_Process- H: K! G; k- w t3 B$ ?# Z
/ K6 v! }$ L K8 l- .Pre_Music;上一曲% p3 b" R9 w0 l/ ^
- LDA FC_Gamepad_Once
\- t. {6 s4 c* h5 I, b; J - CMP #JOY_KEY_LEFT8 l1 |9 G9 N" u+ B) x% q
- BNE .Next_Music
- _) R3 K$ ~: h7 `$ I - JSR Music_Play_Pre
# ]6 g' L% r' Y- ]. C" u - .Next_Music;下一曲7 s# f* [" C5 H6 ~0 w. t& x
- LDA FC_Gamepad_Once
; h& F/ B( X# z. P2 I* { - CMP #JOY_KEY_RIGHT
; D; E6 V+ i; H) P - BNE .Next_10_Music6 p3 L4 ^& V$ c+ Q, l( x
- JSR Music_Play_Next
8 x/ x- @. k6 ~ - .Next_10_Music;上10曲' ]0 m+ Q6 }- ` F6 V: O; E$ O8 r
- LDA FC_Gamepad_Once
2 P7 B0 i- S! v7 q - CMP #JOY_KEY_UP, | n2 q1 L6 N
- BNE .Pre_10_Music3 E% b2 p, V3 ?& v6 r
- JSR Music_Play_Next_10, u- ?, B1 t9 X( H0 s' N
- .Pre_10_Music;下10曲
; T+ K7 S5 H7 v! |* o. u5 A - LDA FC_Gamepad_Once7 I. Y2 }: z* W7 V3 R
- CMP #JOY_KEY_DOWN
7 n; r3 `0 c1 q# ]; H0 J) e - BNE .Reset
Z: Q$ R1 s1 u3 l# B: h - JSR Music_Play_Pre_10/ t- l* r& s$ k2 ~4 D4 g
- .Reset;重播当前曲目5 Y" G9 H% o( m! f) Y3 x
- LDA FC_Gamepad_Once
0 G# g( U, }- }% J# k - CMP #JOY_KEY_START2 Y! i5 e/ z+ `! s: b; x
- BNE .End1 M, S+ ~9 @% l5 s3 @
- LDA FC_Music_Index$ y/ h8 g( A* }. y9 P4 ]
- JSR Music_Init_Process C6 p: U- g; W0 I9 F
- .End/ G" D3 G8 I. A) \5 W# A3 A1 a
- RTS4 U6 f/ {/ c. F3 l+ O4 A H) {1 M( q
- # d* c, r! G6 J6 v2 K: G' X
- ;----------------------------------------------------------------------
* X6 m( w ~, I$ U% x8 \ r% l) f - ;播放上一曲" J* L5 d( O0 v- }3 a1 r4 b
- Music_Play_Pre
, e* F* z3 I% ^* U1 ~: V7 a - LDA FC_Music_Index9 g8 }" _' I: _0 b
- BEQ .End# u' S. O; D, q" C* u
- DEC FC_Music_Index
* P( F9 d# K& X1 g% S4 |' `# J - LDA FC_Music_Index: X( m# L6 L* e2 i$ m' C7 Q) E! O
- JSR Music_Init_Process/ s& }' T8 M l, l
- .End
( e0 c9 _4 V# _) M F5 X) m - RTS( `: s) W* j" _# v3 N: c t
- ;----------------------------------------------------------------------
& M! f2 S% A% ]% Y h5 t0 s. n" l - ;播放下一曲; x4 i8 I/ @; X9 C% ?" o$ C1 p
- Music_Play_Next% _7 X7 B+ B1 W0 g* y1 Y( ^% r
- LDA FC_Music_Index$ ]% f7 w: s ?( y! p* R
- CMP FC_Music_Max_Index
6 J; B7 e0 C3 u6 |! f: n; n - BCS .End% v# ^. h/ w6 A9 x- e
- INC FC_Music_Index& m/ p e2 D. a, t
- LDA FC_Music_Index' V; k* V- M# S9 g, c0 G/ B
- JSR Music_Init_Process
. z1 @4 G' z4 A" x8 y# J* p - .End
, x d) O0 D+ k! }3 L6 h - RTS3 W# k$ ~0 g5 X# `% v
- $ Q- d% O2 t6 L2 |0 y7 k
- ;----------------------------------------------------------------------
: w* S( L% t, y - ;播放上10曲
9 A2 T2 r9 z0 E! b. o: s - Music_Play_Pre_10
, C" Q' R Z) v" L* }+ A \0 x( q - LDA FC_Music_Index
9 I( i6 a9 A9 O- f - BEQ .End6 ~/ \# Y" G( t9 e' v) }* P
- SEC
+ ~1 U" H4 N8 g' v - SBC #10
) u8 K8 m( S7 |# a! D - BCS .Pre_10
" t5 z6 S& x% b, p' n2 P0 a - LDA #$00
1 Z* O+ H: n6 g( P( \8 d- G% G - .Pre_10
0 q8 i7 v! f+ l4 E( V; { - STA FC_Music_Index
) |+ [+ |0 _5 G2 u8 b - JSR Music_Init_Process
: H' }8 w2 b2 j8 N" R, w4 ?* P - .End
2 U2 W% s ~2 g1 M - RTS( _, _. z+ R% n& E! T! V8 P: L! X4 _
- ;----------------------------------------------------------------------
& E! n7 F" ?1 y3 L" Z - ;播放下10曲$ k3 ]5 e9 S. e" h7 ?* U B& w% J
- Music_Play_Next_104 ~7 f2 Z' `6 \/ q, \% ?) N8 x
- LDA FC_Music_Index
4 I2 x) W- o# G# T - CMP FC_Music_Max_Index& U5 h; x9 ?' J- }) R" \5 |
- BCS .End6 p. s( \2 F5 o+ N* a ~
- CLC% K+ v; m5 l$ s. G! s1 C
- ADC #10
8 h7 f2 s; u5 p - CMP FC_Music_Max_Index
: T8 K7 U- f3 _3 `0 V3 S - BCC .Next_10
+ @9 q( t- L$ P1 n& Y* y$ s - LDA FC_Music_Max_Index& |# a6 E- d3 W+ i* n( B" r4 I
- .Next_10
* r- j4 T, u9 h6 R- H2 d6 H0 V - STA FC_Music_Index- e4 y! y% E+ e L# C: T
- JSR Music_Init_Process3 l# q1 s ~' G. k. [ |& w8 t; T3 D
- .End
" w1 }$ x, l2 L9 b& E6 T* j+ K( k - RTS: K# ^4 X3 D+ I: S/ k+ N' @) ~/ z
( z" X: s: Z+ J( { p( ]3 z5 B- ;----------------------------------------------------------------------* G% d- U3 F W; z* K
- ;8位十六进制转3位十进制制
" p0 q; j8 l2 F - Hex8ToDec7 ]: Y8 Z, b. v- q
- STA FC_Dec_Data_1
4 d9 K) v& v. `/ u' O% c - LDA #$00
( ~& r9 f: j, [" l - STA FC_Dec_Data_1002 }$ a* |( f% h" z3 G& A6 J
- STA FC_Dec_Data_10
9 F0 v( v+ l5 y2 E) e4 j - LDA FC_Dec_Data_1/ L& m0 f* J0 h0 _ |, W, T
- .Convert_1007 \! C6 G) ~0 w/ y5 i& Y" _) ?
- CMP #100; R( i% e; ?4 I% M0 W
- BCC .Convert_103 Y7 v P1 C L7 F5 S
- SEC
+ v1 @' v' `( ?/ R5 W: m2 @ - SBC #100% J- y# s1 r" @5 H
- INC FC_Dec_Data_100
8 R5 \5 g1 s8 t' }" Y. K: S+ r - BNE .Convert_100
" i5 }# l% m" }/ z- J - .Convert_10
, Q& f5 c7 X; Y# v - CMP #10$ L2 J% X1 H* d6 \- {0 q$ k
- BCC .End
) {1 k' F5 l$ J+ t - SEC( v+ G8 O3 M7 O7 E [! e- {& n
- SBC #103 l6 z) X$ z$ b9 N/ h3 \) k- Q
- INC FC_Dec_Data_10* U9 g; |$ g/ O3 `) [. a* e f
- BNE .Convert_10
2 m+ M1 u! e( u9 n+ c: t: F8 U - .End5 ^$ `+ i0 a2 O
- STA FC_Dec_Data_1
/ v8 H5 y( r+ X0 ], S - RTS# Z: f2 R+ }6 M& Z+ Y8 g0 [
1 K: j: j# t$ n: Q" U* g- ;----------------------------------------------------------------------
3 g% O" W* i p3 T2 M" P - ;显示曲目信息
9 m" S' r) o6 f - Music_Info_Display
# V! p- J* U) ]- p4 @ - LDX FC_PPU_Buf_Count( d! T$ D0 d) ?5 p# J; A B5 u5 N
- LDA #PPU_WRITE_MODE_CNT_LINE. M9 |" o3 L8 D) V8 i$ @* [1 J
- STA Use_PPU_Buffer,X
0 @/ v8 T' g# f) `) I - INX7 W( I# Y/ B. e* b9 s# m3 ?! W
-
8 V8 g) v# ?! h% ` - LDA #>MUSIC_INFO_POS& s9 I. C1 a2 @6 w
- STA Use_PPU_Buffer,X+ Z8 e; `6 |, g- C0 V2 h
- INX+ Q, {, Q* i( u* _9 g$ d6 E
- - i; r$ w8 ]- m
- ;居中2 u, x& }4 _2 M$ H& q& R
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2 K9 b1 ?/ ^( o9 |5 `# z& Y1 O. p
- STA Use_PPU_Buffer,X. E0 p6 m6 E. S4 e x+ N0 \' W
- INX% A8 ^1 _2 {$ Q' z! y. x6 x6 i
- . r4 ]4 E+ h, h$ v6 n( P
- LDA #$052 y: }& n' V6 s- d$ q
- STA Use_PPU_Buffer,X0 }' l* b; a5 i0 a+ R( g
- INX% Y. Q( N: E3 {5 I7 O* ^
- 3 t; J. j' c- R/ U& E- E
- LDA FC_Music_Index
2 v. c+ p( l; `( C$ y - CLC
: o" O9 c! D) R3 q6 q( e7 M! a4 m! |# C$ e7 O - ADC #$01
# Q+ ~1 e# ~1 l% x - JSR Hex8ToDec9 C, ?' d) c8 G! u
- 3 Y, }; N+ P* @9 r1 g
- LDA FC_Dec_Data_10( T$ }8 T# z" Y0 x) m
- CLC
5 ^9 h0 ~' E' l, d - ADC #'0'
0 \! ` ^# i+ B6 j) M! z8 K - STA Use_PPU_Buffer,X/ k: I0 D7 p3 a3 W1 c# j6 Y
- INX1 t- G) o' g' [) g/ e. C
- 7 v) F+ l3 u/ q/ @+ j7 I
- LDA FC_Dec_Data_1
- i; u- x# c" A7 i/ j% ^; v - CLC6 `+ g: q+ C7 `, i' Y% [+ M
- ADC #'0'
! M9 }5 r& H5 i P# d b2 a4 g - STA Use_PPU_Buffer,X$ i( T1 I4 }, S+ ?% e- g+ E. X
- INX) ~9 V7 G* l9 Z4 z+ t8 R( A+ ]
- 4 u" G' ~3 o/ H7 V4 x8 w+ N
- LDA #'/'# ^* |; i! H; n1 Z: s, X/ ?
- STA Use_PPU_Buffer,X
* z6 V2 o$ U Z3 D+ I3 y - INX
+ Y& y& O+ T( i. W4 G3 I2 x - . Z" y; p7 ]7 A7 _4 d
- LDA FC_Music_Max_Index$ A6 D+ K6 V" \0 D9 z4 V6 u
- CLC5 v! t1 K0 c0 c& N( H
- ADC #$01
$ L9 y7 n: ?' m- p' n7 F - JSR Hex8ToDec
! L: ?- G; ~( K9 X+ g2 |0 o# p -
" J) W6 p' h3 g. A7 Q. Y - LDA FC_Dec_Data_10
: O1 A* |4 B/ H- @ - CLC. X3 s, J9 d9 k( v: x1 a S# j- E
- ADC #'0'
# {8 Z* _/ u1 U; p& e W - STA Use_PPU_Buffer,X2 r$ l. p- X0 U; `$ s4 S4 m
- INX+ G8 x; U% T+ O C
- + M( U( K( g3 u5 R
- LDA FC_Dec_Data_1
: F) b5 a' U$ U8 ^1 N7 o5 j9 D - CLC
" f+ F9 B# J$ d( l7 z6 z l5 H% z" a - ADC #'0'
6 ?8 e( Q) J8 G( `( c; Z( Q2 E - STA Use_PPU_Buffer,X
9 v1 P- u. _8 D% r5 x - INX
$ z: Q7 M. o" W2 Q7 ^8 B -
2 K5 @( X3 `, ]* V7 }0 B - .End
% r9 Y6 c- k* ?/ k4 q - STX FC_PPU_Buf_Count" ], _, P2 S1 y9 C! p, ]0 j# g3 t
- RTS
# J- o, Q4 Z* [5 J. d6 M - $ a* B. H6 H! O3 O: h
- ;----------------------------------------------------------------------* L0 F. |+ G9 n, G% l, R
- ;音乐曲目初始化处理
0 J: e9 b6 d' e+ L3 M+ W& p - Music_Init_Process4 B( u# O: N+ `; |
- PHA; j- }0 {5 q& x, }# |5 T; l; Y
- JSR Music_Clear_Process7 U2 c1 K$ c7 |4 _9 F+ ]5 ?
- LDA #$1F2 L6 Q8 G$ }+ N% G2 k7 \
- STA $4015
h& H" {& ^. r9 K$ X - PLA/ A6 V1 V6 O' L! I6 I
- JSR Music_Init_Addr
$ L* s1 L6 D% y" ~ - JSR Music_Info_Display
{6 R8 X' y) x& b( x9 M1 j - RTS3 R& s- E7 D* A! V4 U
- / S% y4 H: w3 O' C. ^4 Z
- ;----------------------------------------------------------------------
/ P+ |& f9 \1 `; T* R, G3 O9 J+ z) ? - ;音乐播放处理
6 D7 L7 z& b- r, s% }1 G - Music_Play_Process; c' i) D& O8 [4 B# ]9 B# \0 c
- JSR Music_Play_Addr
( X* x- e& g$ j# B' o4 C( L$ J, c - RTS5 L, k8 p9 b$ b: B2 W
3 R2 c2 h' D2 g( j/ g" N1 }- ;----------------------------------------------------------------------8 p2 Y" @0 Y2 Z4 z c! W
- ;音乐播放处理( W# e: W' X: E3 }4 Y
- Music_Clear_Process
2 r2 m- U! G6 A/ k4 x - .IF Music_Clear_Addr( y, O1 e* n3 \7 Q- c. @
- JSR Music_Clear_Addr R6 d& v7 [. L8 Z% d. e
- RTS
/ I: M) b% d$ A) [9 k - .ELSE. W+ p. R# I$ F ~& o. T
- LDA #$1F$ @) G. L8 K3 g
- STA $4015
* @' L& F' f! } - LDA #$00
, j. B. z: O) Z" f7 {: E* p - STA $4010+ F. O, X; U* r: P; [2 A3 l. k) @
- LDX #$00; n6 Z- ~2 A) s1 @4 P! z/ L, d; l
- LDA #$00
( t) a4 N+ R" [8 ]9 P; f5 l - % Y' c+ d: m8 P6 G& Z2 ^
- .Music_Clear_Zreo_Page_0( w" i4 F) [- _7 l( X5 @- h# O
- STA $00,X
; `$ B: V( S# j7 h) R - INX
& t+ @5 L5 k( g. o - CPX #Use_Zero_Page_Begin. s; L% t) ~+ H9 w) I7 c
- BCC .Music_Clear_Zreo_Page_0; r! {6 L7 x" b" K( R( V
-
8 |- h# ?4 u# n9 ?8 P$ ^/ w - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- L; K5 _( a) _# O/ W2 Y9 t# v+ _# d m
- .Music_Clear_Zreo_Page_1
; M* f' [* e% }+ B - STA $00,X
$ B: p9 B: f! v - INX! Z) x* D3 M7 x
- BNE .Music_Clear_Zreo_Page_15 Y: T5 \3 r- {+ X0 y
-
4 t$ D: i6 `# B - Music_Clear_Process_1
, T, M# S: z# q( ? - STA $0600,X
$ b% v4 s8 ]/ Y; g0 q" F - STA $0700,X
! O, e; s( _5 c+ e5 t6 Y' C% O5 p - INX2 F% Y7 }6 j/ K+ d
- BNE Music_Clear_Process_1
. p; y+ h/ y! @7 n! ^# x$ k - LDA #$10
9 M3 i2 p* y% \) h6 z$ c+ C - STA $4000
! q6 T* q7 t0 [& N2 @' |1 Y( e - STA $4004) S& q* Y$ F" y" } J
- STA $400C
% ] ~) d: z- { {! h - LDA #$00" ^% I: j& g# P: [
- STA $4008
' Y6 S$ s: J. Q* K g* M - LDA #$0F/ C, N0 j: x9 F/ _2 E: u7 |
- STA $40152 M5 j m# M% r0 p
- .ENDIF
% _0 s0 H3 Z; h5 p+ L5 G, u8 C/ L -
$ R Z. i) y$ Y! X+ _ Q- ? - RTS
3 |; l4 Z6 X* ~% Q. W - 2 y# T$ V, ^/ W/ W
- ;======================================================================
+ Y0 B/ j" V* u- b# d - ;重启处理
, W1 h7 F7 ]1 V - Reset_Program
4 ]8 g: w! o1 R" w# w - SEI
" Y" D2 `$ p* E& F% y - CLD. u; g' f, e% G$ [$ W: k/ e
- LDA #$00* Q4 z' H' V& B; Y: x; m
- STA PPU_CTRL
V2 H' e9 ^% A3 ?% _3 | - STA PPU_MASK
6 p5 O' a6 z* d- J& Q. h6 P j - STA JOY2_FRAME3 h" g2 a' B* f4 X& k8 J
- STA APU_STATUS
2 B) A" [# c/ g$ S& F3 M5 V - ; o! e, ?/ U/ W' C
- ;等待屏幕准备完毕% F3 C4 h3 S# c( L
- LDX #$024 z! E q2 |5 u8 O% A, }7 w& k" N) a
- .Wait_For_Screen_Ready! G6 D3 W: S9 S2 D
- LDA PPU_STATUS
: d3 }' i" V. k' ^9 s" Y% q - BPL .Wait_For_Screen_Ready6 d: y+ _% c: F8 F" o
- DEX
0 e- I- C. v' I+ w. b - BNE .Wait_For_Screen_Ready1 {+ S' o N; r1 J% O; S% M( Q: m
- ! W/ a( |- N$ V9 B
- ;清空调色板
1 n9 t, P7 Q( ^; H - Palette_Clear
, }" X& P" {" } - LDA #$3F3 @6 t- k- {! s) Z$ g- C1 b
- STA PPU_ADDRESS+ G' o4 [% k, c. Q- s8 ^; e
- LDA #$00, a1 J# ?! E/ z/ ~6 o- B
- STA PPU_ADDRESS& m5 a7 u/ a7 h8 w3 q
- LDX #$20' u' t! }3 }- _
- LDA #$0F- o# c) e- p, r; k* Y- W3 z
- .Write_Data" O+ p0 W( o0 z; v2 K! O/ I! I, d
- STA PPU_DATA
2 O; Y- {, w' O5 _) k$ L x - DEX% Z. @1 P) y0 i9 ?( L, [+ B
- BNE .Write_Data3 L7 Z5 X& j& \+ U) p
: W1 ]# `, J0 W- ;清除声音 $4000-4013% v: l' V" Z' q' S! n
- LDY #$14 O8 G- x2 |2 A6 v' x' r! e5 S d+ q P
- LDX #$008 \5 m, L+ r& S0 `, m# X6 \
- .Sound_Clear" j# U+ K2 z" C" }7 X" \
- STA $4000,X
4 ^9 \. ?, l, m" ~4 b/ V6 O8 C7 o - INX
6 [( W: K! s5 G - DEY
+ k* V8 b7 w% o - BNE .Sound_Clear4 X+ ?4 z$ I- b7 H/ r
-
" O8 Q% U) u( e - ;清除 RAM $0000-07FF
8 r# G0 ?5 X7 e; v5 R$ w7 a$ K - LDA #$00
2 t) x; ]- ~* Z - STA $00
; f1 o7 f8 G) Y5 f - STA $017 Q6 ?% O0 X, R% t% S P; U$ n) E
- TAY
2 O2 f+ v1 @) q" \( i: j) B+ N - LDX #$08; w2 d7 A! u% F, t% [
- .Memory_Clear
1 `6 P6 _" x" U: O D - STA [$00],Y
' a$ w+ x' g8 ~ - INY
" @' M$ ^9 P1 [- t' ]$ ~+ o, C - BNE .Memory_Clear
, A- b, V8 p+ _( E/ N0 h0 j: v - INC $01
# @0 `. Q& T; {7 R7 j - DEX7 a; P1 W0 {* n1 F9 M+ ?
- BNE .Memory_Clear
- F( k! c% H# S# e' m/ Y - 8 p3 w& t8 ?3 F( P
- ;精灵缓冲初始化1 `# x& c7 z( q$ @3 ?( k5 }4 f
- LDX #$00; V5 y$ N. d: D( Q
- LDA #$F8$ |- e. \8 h5 E0 e ^1 v: ]' F
- .OAM_Clear
6 l! O" m4 |5 q& f - STA OAM_DMA_Buffer,X
0 ~8 ~5 I. @3 L& v - INX% k0 [4 W% F1 s$ l; X
- BNE .OAM_Clear3 o9 q/ h- o" ~
-
L' _4 ^ m4 f; Y d - ;栈指针初始化* b* Q+ i/ Z0 ^
- LDX #$FF
& N. P9 A- T+ U5 }* a- G. _ - TXS- F# a) _% F8 W0 c V" G2 B- U. C6 Z
- |. `+ F1 B2 U+ m
- JSR Nametable_Clear;命名表清空
; L5 V$ k" x% v: R' C# N - JSR Palette_Init;初始化调色板缓冲# ?$ E. Q+ h4 a. W; P# Y1 C' S
- JSR Static_Text_Init;初始化静态文本" i+ V0 [! B3 J5 u0 G: G0 z$ r& X
- # z6 M! ^* N+ y, O9 u; F3 X
- LDA #MUSIC_ITEM_TOTAL - 15 a- W1 p- R% H- a9 A4 c% H
- STA FC_Music_Max_Index
- ~/ Q. g" @2 l8 M: v3 N: ]% y0 G9 c - " N, Q0 }/ q# C9 ]
- LDA #$1F2 S* {' b0 S! S
- STA APU_STATUS
" @$ X+ D8 P: C/ d, N0 ` - LDA #MUSIC_BGM - 13 \8 G2 ^: Y4 t! ~7 C
- STA FC_Music_Index2 f- b, G) e- I, b5 g: l5 x- c
- JSR Music_Init_Process;音乐播放1 i) L- e5 J. z
-
! L% Q5 m$ A, g$ w& X' ^: W; f - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)% z5 t( B' L. @' ]/ q
- LDA #$1E- j7 P8 s: I4 {0 t1 `
- STA FC_PPU_Mask_Buf
% g7 Q- M1 |/ f4 z X( k - . ~- z7 _' A9 j5 O q2 N* |5 p& @
- ;启用NMI处理
& ]% n: v- y8 @5 B7 @9 N5 f6 L - LDA #$80
( B8 E/ h' S1 Y- P, L: Y J$ t - STA PPU_CTRL/ }0 J6 i7 M4 i6 b/ L
-
# [' u4 m/ s4 f; H" o - ;程序循环, 剩余工作交给 NMI 中断处理
+ r% A7 d3 C8 P6 L. Q4 A - .Loop
( p6 ?5 p9 C4 \( D2 e - JMP .Loop% Z8 E; r) n9 [- K* l+ S1 u
- 2 `/ I& ~, _( B0 ]
- ;======================================================================) G5 X' k- i9 O0 P
- ;不可屏蔽中断处理7 M7 u9 ]7 E7 U- b6 V7 A
- Nmi_Program
) [0 n! s0 a! B7 n7 Y; \ - PHA$ q) @, r- q/ v3 f
- TXA+ b) [$ Y; x* `' b/ M
- PHA0 z2 u" o7 u5 d6 @% f
- TYA
; b- T9 G) s9 k! _ - PHA# v! z6 O |* Q$ r% d4 g8 I
-
, I+ B4 ~ z( e - LDA PPU_STATUS;读取使得 PPU状态寄存器复位* V Q. q6 e9 ?7 X4 l
- - A: {9 ?6 {/ _! |; ]! J" ~9 z
- JSR FC_PPU_Procrss;PPU处理
* Q$ N5 J% i, z/ s9 \7 J" R - 1 _3 @+ N2 E0 t( O9 r# |. W
- ;精灵内存更新" F2 d. g* \; r1 Z1 M5 f8 V
- LDA #$00) D# }" P+ v* b, `( j8 J
- STA PPU_OAM_ADDR
) k6 k2 Y. W' W" H- n2 T - LDA #OAM_DMA_Buffer / $0100
+ x- ^4 C# R9 D' Q - STA OAM_DMA
; ^9 A, Q5 ~; a/ F' y9 G -
9 I( ` W4 \# k - JSR FC_Gamepad_Process;手柄输入处理$ S( T. t/ G2 E) a1 q8 s K
- JSR Music_Select_Process;音乐选曲处理/ I. ^, v! P$ B0 Y
- JSR Music_Play_Process;音乐播放处理
{" b. B% d' K - : P' D+ v5 Y; Z9 x
- PLA
+ P9 L* h2 m) }9 \' l - TAY
: l0 }+ \0 t, P/ V4 A - PLA
4 w9 A. P1 T0 D! G - TAX* n0 Y6 f" i8 G! r: }
- PLA
3 L) a7 \8 I5 z$ n5 X s& i* r: v- g - 8 w) z! J: [$ a5 x9 E" T+ y
- RTI
- }9 T3 X7 \ w5 b5 I - ?/ B' j0 V' G; T" E4 n" d$ \
- ;======================================================================
1 |9 C& b5 ^* D$ o - ;请求中断处理) ^0 z$ K ^$ w9 k8 T
- Irq_Program
" `2 l5 Z; P' R, B w - RTI8 ]" J. | C ?, b
- 5 @' }2 V/ t2 x4 H5 ]" r
- ;======================================================================/ A w1 k' R! N! \6 d
- ;中断向量表% X2 Y) x$ a+ X G
- .ORG $FFFA
7 e$ F( w( n1 l - .DW Nmi_Program ;NMI触发时执行
! k% J9 n4 [4 Q9 ] - .DW Reset_Program ;载入ROM时最先执行7 b1 k: p* G/ p% E A
- .DW Irq_Program ;IRQ触发时执行3 s3 t. }5 M' {( H3 X# n
复制代码 8 R7 a7 T4 a1 j* g4 c7 _5 X
0 [8 x1 O P1 c, b9 P+ B
* Y5 O, P/ Y! a+ W6 f3 O0 }
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|