|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
3 Z0 U- N/ g+ |! l8 J ! L; I$ ]6 ~, A# X! g
以下是主框架代码:
9 t5 w2 T" `) a2 _ R8 {" C/ S- ;======================================================================
9 P, [) X% G" F, f - ;文件头6 @; u/ V8 u9 P8 o" w% J; _7 ~
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量. b* Y9 ?) f9 M
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量* C1 Y8 ?/ B! y" n
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
% d; q' P0 I) w - ;======================================================================
, I- D$ d+ T$ m - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& L1 S, N3 V7 c9 \ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& y7 Z4 d1 w' b) w; B3 Y - ;======================================================================
& m6 _3 O V7 A8 J1 b2 a - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, J" @% w* S2 `# w$ v
- RESET_ADDR = $E000 ;主程序起始地址
2 ^" `- Z9 S A0 y1 a0 v) C8 r - ;======================================================================: d2 X; A+ d4 ]! @: R. b
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB! n% ^" ?' X6 F! T1 h
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB% U7 |6 |- g; h: h0 h" Y
- .INESMAP 4 ;Mapper号 (0-4095)
2 w; G6 q& t* d: a, o - .INESSUBMAP 0 ;子Mapper号 (0-15)" U9 U! k- S+ {6 F+ q5 w- S/ M
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
/ a+ @- n6 \; A+ S+ U3 f8 V# M - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, ?: V: ~: d$ |6 E - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
) m6 j" K- q8 U% q6 R- a6 U - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
8 N* ~7 _: }9 ^7 A& i I) [ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
/ S. [; n) ?+ ^% s& M - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)$ u7 v, P! T. b( I/ e* g
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy). `% C( Q( v9 J! _& A7 X" V
- ;======================================================================
& o4 D. d0 X. X6 d D4 {& g+ Z - .INCLUDE "fc_demo_config.asm" ;全局配置& m7 J4 R4 P5 y. M3 s3 z" N, \
- .INCLUDE "fc_demo_constant.asm" ;NES常量
2 [3 f1 i9 E$ S( u - ;======================================================================
7 e; A' |: o* c$ B4 N - ;音乐配置
7 \$ c) S! x" e0 C - .IF 0 = MUSIC_THEME - b: L/ @$ z( u& ~4 p: {. q9 t
- .INCLUDE "data/music/Gremlin 2/config.asm"
: @* c0 H9 a4 y3 }9 l: ]9 ?& Y( q - .ENDIF
- R, |2 g" F/ F9 Q& y - 0 s Q% y1 q' i6 P _5 r' q% `
- .IF 1 = MUSIC_THEME+ Y4 ]4 k t! K$ f/ |
- .INCLUDE "data/music/Raf World/config.asm"/ ~* E1 X7 b% a& t+ b
- .ENDIF
' S: z! j8 s' R0 j# q -
9 c9 u5 {! f3 |- L& N - .IF 2 = MUSIC_THEME 6 T+ j+ N9 ~ f' v
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
: e6 z9 N }! r% ~! \ l$ H6 b - .ENDIF+ e1 B: Y) m1 t% q2 t; f. W3 M: f
- 1 O: Y! L. I% ^9 b
- ;======================================================================) D( I; J+ z2 N! ^, S
- ;引用CHR图像数据
/ i) m/ O6 _3 ? - .BANK NES_16KB_PRG_SIZE * 2$ ^2 R! W! |$ n" B
- .ORG $0000
6 u9 P- U& ?- L4 ?- c - .INCBIN "data/bkg.chr"0 F! ^- W! e# J; r
- .INCBIN "data/sp.chr" |: N% A6 `: Z( K& P; A0 R2 e( I: r
-
+ s! l+ n6 O1 n" r& i4 ~9 H - ;======================================================================4 ]1 T( o( \* G8 p6 k' A, @; q) \/ y
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
! K5 v! ]% m. |3 O0 V - .ORG RESET_ADDR- M1 M+ \+ a) W8 ^4 q. k, k
- ;======================================================================7 r' K3 c- X* G2 w
- ;引用其他源文件
$ v5 ~2 X) Y3 T, _0 \ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
) `2 w4 U. W( d6 e2 c4 E2 h+ ]' a - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
) W/ }0 {+ p0 v" @0 d+ h6 _6 o - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理# d% \# ~) K6 T* c
- ;======================================================================
6 u' B, d+ k2 p- T- O' R) V
G; F6 h4 o9 [+ w& ^: [- ;======================================================================; o9 G0 O9 X: O1 ^6 @" _7 z; ~
- ;等待VBlank到来
" N3 k; K" Z0 X+ C/ `/ w x - Wait_For_VBlank+ Q @0 A4 s( ^' K n4 W' I* }: e* z4 U
- LDA PPU_STATUS
* x8 H( @8 Y9 @0 | - BPL Wait_For_VBlank8 Q1 e/ Z% I5 h5 h2 t* e
- RTS
9 p+ r. R/ y% W4 R5 O' b: F5 _ - ; b' a1 [' y# U
- ;======================================================================
6 _. ?' e4 w. s - ;调色板初始化
4 U% h: y! T+ _$ u7 p - Palette_Init$ Z! z! r& d( w) r& e( s
- LDA #$3F4 S _. r: o6 o x
- STA PPU_ADDRESS, X7 |+ f. X: @, H; s+ J6 _+ N) f
- LDA #$002 U4 x$ K9 M/ ~0 h+ t
- STA PPU_ADDRESS1 B$ q; m! H0 i# S* L
- LDX #$00" X/ v! n j* F4 L1 H
- LDY #$20
" S" r5 k- R* [ S& ^7 _- E - .Write_Data* i" t: s. a5 S. O. b# S
- LDA Palette_Data,X
* Z9 |6 ~+ r' D2 G2 z - STA FC_PPU_Pal_Addr,X1 B6 Z1 s/ @/ D4 Y
- INX
' N- K3 W" ]& L - DEY
. A! j' x' p' }1 i+ e7 _7 v3 @ - BNE .Write_Data4 E( G- f6 M; ?8 \: D
- .End: i- D/ R7 c4 z& i7 _$ y5 L
- RTS
8 T/ `" m7 N+ E4 u2 X4 \. X
6 c5 V2 J, }1 a9 i: r- ;----------------------------------------; G+ |' x1 c! P5 d% r( w
- ;调色板数据, w( B+ N2 H) Y: a: i
- Palette_Data) q6 ~0 h5 v7 E. y1 u' z) `; u) ~) y
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
/ c0 p. D( O a0 H( i - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22 U v% @' J3 h T+ M! G# l* D
- 3 B0 K- P8 [* J/ N
- ;======================================================================5 {4 ]3 p( p3 k( ?
- ;命名表清空
# e+ D. [# s7 h - Nametable_Clear
( E8 p$ n; m H% L6 t - LDA #$207 b% G- u5 q' O% f+ e$ T9 ^
- STA PPU_ADDRESS
0 I# p0 |. [2 n - LDA #$00
3 M7 F* b3 w. d: Y& _/ J, k - STA PPU_ADDRESS! o8 p5 P( E9 j) ?/ |
- LDA #$000 K. h( M* \! a
- LDX #$000 d5 u9 p6 r/ f* B' s* M5 t3 F
- LDY #$088 Q5 E$ j5 |& e! |# \4 |9 k
- .Write_Data
# y0 Y* b) h2 Z* h8 @5 k( V0 z - STA PPU_DATA3 ^' [+ `+ F; x
- INX
8 n) x% a5 y, @+ h9 w1 e - BNE .Write_Data5 c! Z1 `+ {" ?
- DEY- H, }& I# x7 I5 a( I- B
- BNE .Write_Data* Y. N! x! X6 \5 h; {6 m
- .End; N+ E7 X8 y) D3 s& i
- RTS& {& _6 k* Y M$ {$ I
- ' J w3 s. L- G- J
- ;======================================================================2 k+ ^6 i5 G* v- f+ b: w1 Y
- ;音乐曲目切换
, s( ~, R4 v4 |& H$ |6 i - Music_Select_Process5 I# O& j" \% {
& z% S# M' T* o5 M9 E- .Pre_Music;上一曲$ W) S+ h& H: r2 s" ~
- LDA FC_Gamepad_Once9 A, }: U" J, Q4 y$ R" F5 b! P
- CMP #JOY_KEY_LEFT
( B' |7 [% P0 l. M6 K: s8 n+ c - BNE .Next_Music. _, @& F) {( ^" n% \5 j
- JSR Music_Play_Pre
- w9 G% p: c S0 L: j) w2 Z - .Next_Music;下一曲
- u4 {3 m5 @1 b. T: c - LDA FC_Gamepad_Once
2 F3 T: T: f- j - CMP #JOY_KEY_RIGHT
) z% S; d. G* V3 w+ ~ - BNE .Next_10_Music
8 X' ?$ L* y6 s7 z* \; a! p4 R) k" P - JSR Music_Play_Next
$ U$ _" S. k* V" h$ K- T - .Next_10_Music;上10曲: [! t. b1 n8 v$ Y( D! }. [5 Q+ b* e
- LDA FC_Gamepad_Once
6 B) c- A- O- L4 B - CMP #JOY_KEY_UP
& B' Z/ W4 S/ u3 G4 d - BNE .Pre_10_Music* ^9 w+ Y; Z' f' O9 R7 p
- JSR Music_Play_Next_10: y9 ~( r K" s
- .Pre_10_Music;下10曲
# ^% \/ e3 N; b9 [ - LDA FC_Gamepad_Once X D0 o. ` s6 z& Q8 r; k0 a
- CMP #JOY_KEY_DOWN! L7 k3 y5 ^+ D7 i! q
- BNE .Reset- G+ p9 | I* t5 P |1 |/ Q
- JSR Music_Play_Pre_10
$ |; @6 x0 N1 T" v8 H2 x; U7 G: U- c - .Reset;重播当前曲目+ k% v+ D. K( F4 z; N) F) s
- LDA FC_Gamepad_Once
1 h9 G: Z3 |7 E - CMP #JOY_KEY_START: ?9 R5 \' r9 G% M
- BNE .End
; O# U' {& Q) J. V' j0 z - LDA FC_Music_Index
H# I1 `4 x! T( T( ^5 P - JSR Music_Init_Process# h2 T5 W/ O! R5 C! x1 t: [0 K: }, O
- .End
; A% C) {$ }! L, B - RTS7 h5 F9 F0 E( Y7 S
6 u5 ]+ ^" [" z$ k" V# z6 @- ;----------------------------------------------------------------------: @% L* F: B: |
- ;播放上一曲5 ^5 x4 M7 X# \
- Music_Play_Pre. P, y" [$ I" w; L
- LDA FC_Music_Index, y4 n: Y9 E! F% F' E3 @2 c. k
- BEQ .End
) U' h) e: X9 K- E. O9 Q - DEC FC_Music_Index+ }( n3 K6 a1 i: D
- LDA FC_Music_Index* l2 I/ E8 g, c T" _
- JSR Music_Init_Process
, e+ [+ s: j( ] - .End2 }0 e2 m2 w; |4 _' B! c
- RTS
T1 L* {0 r9 F/ N. N2 j - ;----------------------------------------------------------------------" t: V6 H2 Z8 x E! B
- ;播放下一曲
5 N. Q, n# |4 ~6 n - Music_Play_Next% T8 G. r/ o* [$ u5 j+ B# F
- LDA FC_Music_Index& q* C$ ]5 O+ ~+ g- _2 z
- CMP FC_Music_Max_Index& g) Z- y" J0 k0 G# `" \7 m
- BCS .End3 C' l [6 g# L
- INC FC_Music_Index
/ A! f }3 {/ u) v; P1 L; X2 ~ - LDA FC_Music_Index5 n( w* @2 A& O6 E, B
- JSR Music_Init_Process
- i {: P2 R9 I+ v1 v" |% P' F - .End
% A$ w8 N; @1 \. ? - RTS
, V/ i' |; R" L - * z' G) U- V+ ]- E* ?9 D# F/ ?
- ;----------------------------------------------------------------------3 P! x$ O- _6 V$ t1 C
- ;播放上10曲
4 }) d3 L4 y8 w - Music_Play_Pre_101 F. s6 h# j# f6 p: d* I* i* s0 Y
- LDA FC_Music_Index
! O7 n4 O: x- ~( ~ w - BEQ .End
* l' `. o# l6 l6 g( f - SEC
: N. G# J9 u0 a) I) | - SBC #109 O. F/ N$ ~1 C2 R
- BCS .Pre_100 h" \) f3 t8 H
- LDA #$00
* I; i3 x% [' @! G: M" u - .Pre_10
: D9 F4 ~' S- _6 M+ g+ g - STA FC_Music_Index
6 S- g! G2 |; |. R* @ - JSR Music_Init_Process
* k0 z. x5 j6 s+ [0 E5 h5 a - .End- k2 g+ _( Y2 c- {) Z
- RTS+ D7 z" K% u. I8 F
- ;----------------------------------------------------------------------
2 w; Q. S* W( A, K - ;播放下10曲" e% A/ k/ g L$ B7 ~9 z$ k
- Music_Play_Next_10
! B1 ]9 f# W& ~( i9 @+ `8 s3 L - LDA FC_Music_Index
% P+ o& X8 N3 K% ~# A - CMP FC_Music_Max_Index; }( s j! q* U4 |( U7 k
- BCS .End; E e# P1 ~2 M: c3 j
- CLC0 V8 _6 i8 |+ w5 S4 \' k
- ADC #10
; c/ }* W5 u3 v: P; d5 b4 V - CMP FC_Music_Max_Index3 u1 L2 k9 T7 E: ]/ P
- BCC .Next_10
/ P) M( J0 ?! s, s7 x - LDA FC_Music_Max_Index. ^, {6 A5 K& N: ]
- .Next_10
9 M1 m6 z3 A3 D& P& t; V7 G( L - STA FC_Music_Index8 e; l8 i; s" c9 R7 ?
- JSR Music_Init_Process
- y) Z: @" ?/ b3 Y, ?2 R4 O - .End
7 _ x, b+ C+ G8 W# O& W) {: i- } - RTS% t: X5 [$ R3 B: S
2 ?5 F4 s2 l) Q2 f) X- ;----------------------------------------------------------------------& ~* N9 `0 j7 z$ k( C( d% G! X
- ;8位十六进制转3位十进制制
- {0 |6 N, \& Q P- I$ F- } - Hex8ToDec
, h! p" }! g" o; w, K& t - STA FC_Dec_Data_1' X! y0 x+ k+ X3 O" I
- LDA #$00: l' L9 z' I: X- e8 f
- STA FC_Dec_Data_100
/ Y! ?" v* M/ m8 J& n0 e1 d& E w6 o - STA FC_Dec_Data_10
+ e3 k6 M% B0 y2 ?( s - LDA FC_Dec_Data_1
e, R9 a7 {; P. T$ H - .Convert_100
9 j$ t* Q+ E# A6 n: N - CMP #1004 o+ q* e' B, n, r
- BCC .Convert_10
9 G3 x2 T" `8 [ - SEC
+ E* a: _% _: z& T3 z" Y# y3 t - SBC #100
; i# m, S: x$ i } - INC FC_Dec_Data_100
( w$ N* l" [, S3 j; L$ @ V) [& } - BNE .Convert_100
7 [ t+ Y; V. t6 W4 q - .Convert_10' z0 o; A& C# d! w/ n! L
- CMP #10
% p2 e/ }; |: s" l% R" b - BCC .End+ S) Z/ a& N7 x U% y0 T. V0 G
- SEC
u/ [ q- ^3 o h! g8 I8 Q0 R/ m - SBC #10% \- Z- y# d. E# L
- INC FC_Dec_Data_10
! y: M! Q: E, Q- Y. m2 o$ X - BNE .Convert_10
7 M: V. {8 N: y( m# k M - .End8 I3 }" U& ~7 y k$ ` u0 E
- STA FC_Dec_Data_1
! i8 V0 Q$ F8 e8 e8 R - RTS# G+ l; A/ z1 a9 i
4 ?' Q8 R N$ y+ V, z- ;----------------------------------------------------------------------* I5 j- Y5 V/ s6 m
- ;显示曲目信息$ y8 m) ^' H- E% j
- Music_Info_Display L0 W$ S. d1 r$ P+ b
- LDX FC_PPU_Buf_Count% ?, a; I# x, j; A
- LDA #PPU_WRITE_MODE_CNT_LINE- u+ `$ F6 V* }$ m0 ~6 [
- STA Use_PPU_Buffer,X
2 c. A' ~2 R2 ? - INX4 ^0 T) j/ L- o P4 x) w
-
0 Q4 k* M3 S0 z& g+ k" S$ h - LDA #>MUSIC_INFO_POS/ r- z0 {) |6 s% K
- STA Use_PPU_Buffer,X
v( K0 a9 ^" s - INX
4 w+ B$ S/ v/ i$ S/ s7 F9 w9 v- p2 f - " f% n# ^5 s: |4 H/ G0 ]3 @) L) [
- ;居中! c0 ^6 ^( j6 O! d$ _
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
W# u! b3 ^; m- A' }( t - STA Use_PPU_Buffer,X* ~% h8 S) G1 n. q0 F
- INX$ T( g- `% z* {: h' r
- " e3 @. ?3 E; H) F" D
- LDA #$05
: Z/ h, ?8 S7 E* t% A1 Y2 H - STA Use_PPU_Buffer,X
- |9 ]$ b8 R4 W( \ }$ Z; L2 ] - INX* b% X$ C* L5 ]5 M, F% c
-
0 [2 J/ }1 K$ o - LDA FC_Music_Index; G. j- E. B( g4 {+ N
- CLC
7 a/ N5 o& O, \) {/ G - ADC #$01% K A+ l0 _) f& E% W( Y0 a
- JSR Hex8ToDec
5 e- N f# ?) _ - 2 W: F; ~' i6 @1 y7 X% |, @* L
- LDA FC_Dec_Data_10
' K' ?/ Z0 s3 ?/ ^$ [2 E - CLC1 ^' r) }7 t& d+ x
- ADC #'0'
1 S* s6 V9 E3 W# L: N" J+ z - STA Use_PPU_Buffer,X
: m) J; L3 F } - INX
; T8 D+ s! @& e" a( i6 Q' I! I* j# d - 2 U) ^9 A( y; U/ I- K
- LDA FC_Dec_Data_1
2 k! O: B4 r& a - CLC
2 \% j7 Q1 G+ O- ]! q - ADC #'0'
! G+ _4 V1 x4 }1 J* G. D6 }. l; O& ^ - STA Use_PPU_Buffer,X1 A3 }% |0 Q ]4 n
- INX
- Q& t: g; z5 l3 U3 x$ _: U -
, L# y6 J6 s! n, J# Y2 L# X - LDA #'/'
& }% O% e: N3 q/ Z" M( O1 t. s6 G$ { - STA Use_PPU_Buffer,X& I8 f& V, e+ n E) {) C2 p! Y1 j
- INX) `- S8 d+ a7 K9 t$ @7 S i
-
. [# d; |( N: p8 r& n5 S( @ - LDA FC_Music_Max_Index/ u. C2 e. K1 Q0 d$ h! e
- CLC
n w( M2 o. `, X - ADC #$01
; b) Y! A* R8 Q' {( M* g - JSR Hex8ToDec
1 R( r1 D- t% ^) f) m. U5 i: i -
; R- o) C" T1 t" j2 ^+ \! R s9 J - LDA FC_Dec_Data_100 ?9 l& y, @# ^0 j& c) Q+ `
- CLC9 J# W6 F( e5 m+ j6 x W
- ADC #'0'
7 }* Z: c! z, `9 s { - STA Use_PPU_Buffer,X
' R6 z/ Q* k) k: M1 [4 }1 r - INX1 q% i8 p. ^0 b# G1 p! a
- ) t, [1 B8 O8 O: t' v% A
- LDA FC_Dec_Data_1
0 M) g: H! Z$ v% o5 _2 U - CLC, ?0 d$ Z. X7 Y% \6 _
- ADC #'0'
6 {$ I& q8 ?( D - STA Use_PPU_Buffer,X4 a8 Y( M" R& w+ | e' ~
- INX
) l' F" L8 k! Z5 a: ?" } - 3 O# K/ S6 D: l- I5 c1 T1 P
- .End
- \) ^& ?, M( h" `6 B - STX FC_PPU_Buf_Count
1 j; Z9 s" w: T( ? - RTS) \* O5 ~( ]$ W8 ?
1 W! h: X( q! Y! A2 E1 u- ;----------------------------------------------------------------------4 ~0 i3 M6 ]4 Y
- ;音乐曲目初始化处理
0 U: f; ~. S( C/ S - Music_Init_Process9 |! m6 V' R! o! _7 w" ]' O
- PHA
" |, c% F% z# A5 @+ R. G9 Y - JSR Music_Clear_Process
4 ~0 J# S: t8 }5 B: }: G - LDA #$1F
6 E- a. u6 V2 y4 r3 D2 ^ - STA $4015
4 R5 f$ Z# t U! p7 G9 ? - PLA* Z% C( m) K3 g$ M/ q
- JSR Music_Init_Addr
1 R4 A0 d0 }& u$ U6 i - JSR Music_Info_Display
# O- O/ f# K! d - RTS
: r- a. V" S, K% W4 P( r! N. u
0 e- S1 @" |% K, j( F7 s- ;----------------------------------------------------------------------
/ z Q% F; p, b9 V% y - ;音乐播放处理6 H" p1 f* U8 M, q
- Music_Play_Process
6 a1 @9 k. m$ ~9 T3 p3 N, [ - JSR Music_Play_Addr/ U* ?. k# P8 t# c' w
- RTS7 d* ?! h) C. y
% _7 w% U7 c0 x- ;----------------------------------------------------------------------
* D' q2 |$ N" e% X0 O9 {2 i q2 p - ;音乐播放处理
$ h7 a7 ?6 M! R9 f7 ^ - Music_Clear_Process
% e5 t1 d* @1 i( i4 M - .IF Music_Clear_Addr
1 v* v- N! Y5 H$ O/ W& q; j+ Q8 z - JSR Music_Clear_Addr
6 n9 s% i/ }* m - RTS( y u% t2 j2 ~$ r7 f2 [; I
- .ELSE
5 U6 O/ z( c2 K/ Y& A/ x8 E - LDA #$1F
$ {" P# _. u5 r$ @8 Z) p$ j - STA $4015
2 Q1 Y. l+ ~5 q - LDA #$006 L" Q' z4 z+ o- Z
- STA $4010
! R) r2 x7 k q5 q& z0 r9 f5 v - LDX #$003 s; C1 h' X) Q( H; y
- LDA #$00* E2 K7 h5 n, [+ x% C, S' m
-
) D! w0 O z6 Q/ J* L- s$ K+ b - .Music_Clear_Zreo_Page_05 p, m7 `3 G$ V0 }4 ^
- STA $00,X0 X5 w. x3 [8 j1 V1 w' `7 N H4 A
- INX* v, z0 r; d$ B* Y% G1 }# V% U
- CPX #Use_Zero_Page_Begin
) u0 Y% W+ X* r- r; @ - BCC .Music_Clear_Zreo_Page_0. d! s; Y6 D6 }2 ?
-
% |) u+ d; X" M" ~8 O - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
0 a3 \* G+ O9 O+ } - .Music_Clear_Zreo_Page_17 x; \* N6 Y$ n. D p
- STA $00,X$ M' k4 ?4 R6 ~3 F
- INX
3 l( s* L7 A/ B& a! s5 ? - BNE .Music_Clear_Zreo_Page_1, n' Q: T0 M: H5 S+ B1 s0 x
-
- v8 ]8 @, P- R3 {: @- q4 @7 z - Music_Clear_Process_1
2 n# X' `3 H. m2 ? - STA $0600,X
o' i7 L* f9 S; j% l o - STA $0700,X! p9 t& ^- a% b$ B9 r
- INX
# v6 Y7 c ~3 H - BNE Music_Clear_Process_1
! @, F t# Y/ A1 K1 q& ^- t - LDA #$10
' X( G* ?# `' |1 W" i# U1 G - STA $40002 Y0 g2 G, [$ C' ~) f, f$ g
- STA $4004
+ e1 N+ ?$ s u# K7 \ - STA $400C
, A1 T" J. Q" q& J* l - LDA #$002 n; N- K2 U; x: u* }% @
- STA $40080 K: U! L" ~4 ^9 E$ a% V; ?" F' t
- LDA #$0F
" y; E) x8 ?2 p. Z0 T' b9 [ - STA $4015
4 ^( M( `4 l" \ - .ENDIF' `- c$ }3 g g
-
% a! i' z: \" h; w) S& A - RTS
6 g: O" ~, E0 n: |6 ?+ b# Y - ' d' J# O8 n6 [9 f* r9 Y1 h
- ;======================================================================
' f; r! M) @1 Z4 j3 i - ;重启处理- a9 `$ K1 Q/ d$ X. v
- Reset_Program
$ b- D7 o+ ^; m- u8 O; @ R; w - SEI
; m3 }: e( ?2 n0 O. u8 h - CLD
0 Y7 v/ ~6 w. h1 @( \& f - LDA #$00
+ `# @2 D+ Y+ E - STA PPU_CTRL' \2 l4 Y/ ]- {5 c
- STA PPU_MASK
8 `& Y. `# E2 {* T - STA JOY2_FRAME+ G+ P9 a3 ]) t) ^) ?3 r
- STA APU_STATUS9 w( k. S3 m j: |' T
- , @, T, D6 Y" H2 q
- ;等待屏幕准备完毕# u9 p- k/ ?+ t3 l3 T' m
- LDX #$02
' X. i4 v. N' k1 } - .Wait_For_Screen_Ready8 h8 G6 |6 r: r: G1 u4 g( N T
- LDA PPU_STATUS# f; v8 K2 K$ @& R, z+ L: n
- BPL .Wait_For_Screen_Ready
3 T8 u! z: u; w - DEX
. q( Q" y- `5 Y' x8 n - BNE .Wait_For_Screen_Ready
* p7 z8 W2 Q4 w, x" E" n -
9 E( I( ]0 c- R) w - ;清空调色板
+ B/ J4 z: X9 x) s0 [ - Palette_Clear
S- i. A9 e' |/ q O4 v6 L - LDA #$3F
9 q3 S, e6 V! Y& j - STA PPU_ADDRESS
2 ^2 \. W# q d( a - LDA #$008 L9 v0 `' H$ B$ ]; v9 y
- STA PPU_ADDRESS
' z3 k1 P+ `% v1 L4 t) O. W- c: O - LDX #$20
9 Z$ s1 P. C* i- l0 B - LDA #$0F
8 G9 [5 L: }1 R, O - .Write_Data
5 v" u' X1 }( b - STA PPU_DATA, l5 Z6 X. P1 q* l6 E! M4 U
- DEX5 V( d7 d5 s2 ~ \; T
- BNE .Write_Data
* o+ o# v, R9 x+ B7 u# N( N - 1 ?& O0 l/ G( j! Z+ k1 M
- ;清除声音 $4000-4013+ V! e5 m$ q" G! g0 Q1 X
- LDY #$14
% _, C6 F d( D; _# j4 L - LDX #$00( l0 V/ _7 ?/ T' B; f+ f
- .Sound_Clear
4 f( q6 b* W. s f- i4 J7 H! c - STA $4000,X
( x2 Z& y* l4 l; B( I, F - INX
% X1 Q8 x' w" Z7 d+ z; ~ - DEY4 Y8 g* F! O. F8 k
- BNE .Sound_Clear
! u1 x6 T9 Z8 A - $ p0 p* h/ Q5 ~3 l& @
- ;清除 RAM $0000-07FF5 y) K$ a1 ~9 K4 C# t* }
- LDA #$00
& r1 e/ S+ O# \4 I* Z* q8 u - STA $00
1 u% A, S7 v% V) T) |% O - STA $01
& f6 @- ^$ H J8 b. j/ h" A& _( I - TAY
6 d" a" y3 s' h+ m - LDX #$08
1 x7 J4 R1 X0 _0 r3 w - .Memory_Clear0 Y: A. R% @% D/ |# [
- STA [$00],Y2 v/ l7 ?& `; m/ Z
- INY0 r3 q6 [% Z( m8 c4 _
- BNE .Memory_Clear$ d/ F' R9 t/ V' v2 ^
- INC $01
- d- I: c2 ^" }5 G: f+ R - DEX
+ A: a1 P" O7 A, l) b% a ? - BNE .Memory_Clear# m6 i; l. O* I2 W
- 8 b& S- b9 V! h; a+ A+ d9 c$ L/ g1 E
- ;精灵缓冲初始化" ? j$ D- x% N) D) ?( G
- LDX #$007 o; y4 b& v0 ~; o7 M5 g4 h0 [, k# U) B
- LDA #$F8. e0 r, N8 ?+ P+ x
- .OAM_Clear$ w8 Y# t2 C# `/ T# O3 ^
- STA OAM_DMA_Buffer,X f0 U0 L) Y2 Y, g8 m$ D% N
- INX$ c6 G9 f1 N) Y% M
- BNE .OAM_Clear
$ o/ H# b ~6 B1 Z - & v( {+ g6 p0 q" l0 Q0 c! R
- ;栈指针初始化
1 R4 T; U/ D; b1 c! r+ w# k - LDX #$FF9 y2 \5 J; ^: i# s9 F2 B6 H$ t
- TXS
0 x7 v/ f) _( a# S2 k/ f -
: m/ k' U! T2 H+ \0 l - JSR Nametable_Clear;命名表清空4 A/ _' S9 m( f* w
- JSR Palette_Init;初始化调色板缓冲
' E3 S" }% g2 {- m4 P0 p, D) X1 C - JSR Static_Text_Init;初始化静态文本$ f: l& ~0 Z# i1 \
-
& B9 P" h3 H/ w% @6 e7 M W - LDA #MUSIC_ITEM_TOTAL - 12 E! {3 z" G9 W" }/ T( l- C/ v$ V
- STA FC_Music_Max_Index" E) Y, X0 y+ P+ G
- O$ b; c" M1 I) K& Y: T+ ?. D
- LDA #$1F
9 P% I( C+ V# h% c6 r" I - STA APU_STATUS
9 R$ x* @) X+ b1 {+ v - LDA #MUSIC_BGM - 1
( G4 N5 i% p# _+ ^: ? - STA FC_Music_Index8 C+ H0 n1 L3 H! [+ H
- JSR Music_Init_Process;音乐播放* G, N; V) R1 o
- ; P& J) B8 y3 Q( f" u
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
+ x) g/ O$ W9 \ ] {9 ^ - LDA #$1E
! c$ R9 i2 b6 i0 U% p) V+ ` - STA FC_PPU_Mask_Buf
( q+ t/ z0 o# C0 C3 a: w -
2 k# c: W- z: Y: H% w0 }; F- [ - ;启用NMI处理
' b3 a R# a% t5 \5 t: W) g) S - LDA #$80
5 P# N" g+ T: @ G5 a R# s: G1 r) o z. | - STA PPU_CTRL5 Y- w7 |7 l/ q" f2 s" [6 Y; e/ C" c
- 4 I* m4 F B! k
- ;程序循环, 剩余工作交给 NMI 中断处理2 @' ^2 e; k. j9 _7 S
- .Loop
" a3 q" \( j6 `$ z5 c \6 l9 g. Q - JMP .Loop5 B+ l0 O9 H2 h a/ ?3 t
- ( [5 U% `5 O) I
- ;======================================================================& \& y/ }3 A# i4 L0 G4 R0 p
- ;不可屏蔽中断处理7 x0 W6 E% C" l- R$ P
- Nmi_Program7 E& u. N2 U# e6 H4 v$ {- F
- PHA
$ R- Z6 h/ d; j& V% j6 q( ^ - TXA0 N% L9 G4 {2 t: | c
- PHA
. y, f- j* a z7 t - TYA: a) x: ^+ S, D P- {& b. A1 E
- PHA
7 Y/ r: g7 `" s7 b4 l - ( [: a; j/ |7 {& ?- T5 M& j
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位9 U' l, V9 K5 m d4 K
- 8 j, \ t& |, f0 i, M. O: O
- JSR FC_PPU_Procrss;PPU处理- V3 `7 H1 z& N0 G9 R! _
-
8 G$ i' R$ ~/ D+ \" }, L6 h - ;精灵内存更新
3 D& q7 f' N: V1 | - LDA #$00
: p" m* i B6 s7 G3 M T# R5 Z - STA PPU_OAM_ADDR
2 A8 r i5 Z5 ~8 W - LDA #OAM_DMA_Buffer / $0100! T9 s( E$ p ~8 S: ]% \
- STA OAM_DMA: U( b5 w, z0 n% I9 z' C0 J
-
; y8 |7 x k( h: N0 ~( I2 y4 [ - JSR FC_Gamepad_Process;手柄输入处理8 x1 [6 a7 D1 X, @% K- b
- JSR Music_Select_Process;音乐选曲处理/ d. y0 R) T( Q# |- V
- JSR Music_Play_Process;音乐播放处理0 f* U! f* ^% Z8 u* n) [
- ) O* G# L- ?" y: G4 z( R0 e3 ]
- PLA
; L* q8 g$ Q8 g& W9 x - TAY
# ~7 B8 l5 O2 r. | - PLA8 S. S% E, ]# v9 f
- TAX
4 s9 h6 l, W$ l9 N - PLA
& \+ j" m9 N- G6 ] - 2 X+ C" K( |! @8 u6 Z; X9 M8 O* g
- RTI7 S: @, ?1 ~$ ~0 `, [8 [
- * Q5 u. T# r- @+ e
- ;======================================================================" Z, Q$ ~+ ?3 d
- ;请求中断处理
6 d9 |% J. h0 a9 x - Irq_Program
' s6 J/ j4 q5 M' ^ - RTI" z0 @7 J- R; m6 O) f
- 9 f* s% s8 r3 O" ~8 F( p w
- ;======================================================================
, t7 z6 d8 n- W p# o: V8 E - ;中断向量表
6 @5 e; u& ], Y3 Z1 V( { - .ORG $FFFA, K/ j1 y0 M, R6 ~# m- U+ X
- .DW Nmi_Program ;NMI触发时执行/ B* Q1 H) {, K8 `# [
- .DW Reset_Program ;载入ROM时最先执行
$ n; g* o( i, {3 y5 n; p - .DW Irq_Program ;IRQ触发时执行
6 Y+ H* p; v y5 v; s( n' c
复制代码 ; N) D! b* Q5 |8 x
) _0 }$ h( p2 `9 a" U/ e
; n* ~5 h% T" Ehttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|