|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
6 j2 n( L, k4 i& ?% y
& h& J1 _) b5 l' }以下是主框架代码:$ q+ _/ U, A6 W6 r* D
- ;======================================================================! T4 w: J3 V# ]
- ;文件头" a% P% f6 c+ I% _" p4 }6 S
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 F. \- t7 E5 f8 f& b l8 i - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
; G! e; `& p E; ] - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
( D" k# I& {7 n - ;======================================================================
* v4 U# i7 T2 ]% a - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
2 H6 i8 p. Z% q - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 14 i5 L% T$ ?2 n' d$ \: M! D$ p
- ;======================================================================
6 N" G' W$ _) ^' [+ p' y - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 S- L" l5 p9 p7 a% `4 B6 [ - RESET_ADDR = $E000 ;主程序起始地址
* A1 S; O- N( b& D0 j! J% k - ;======================================================================3 I; T7 K, p7 V: ?3 B5 d
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB0 h5 j" S; [! t9 P) U R
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB) d0 [, q. N, O h' r4 G5 f$ j
- .INESMAP 4 ;Mapper号 (0-4095)
7 d/ M1 _, `* L4 u' V7 T - .INESSUBMAP 0 ;子Mapper号 (0-15)
6 m3 C5 ]+ N4 J8 m( g1 Y8 s9 j1 A; S - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
8 a6 V; D! z, } J* D; f }- g - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
8 C$ E! p0 \. ^8 R+ l! |3 t' y - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
' ^, P; z7 a! Y- B% g - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
9 H1 E8 a% N. j1 m! c/ y% m - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
9 V; h) O) R7 B. M5 Y# E - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)4 @0 O; E0 n" i% J' B
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" e% c; T. M5 {+ q. g; \! c ] - ;======================================================================
8 z' c9 _' Y% ], Y$ @ - .INCLUDE "fc_demo_config.asm" ;全局配置
$ N" w2 ]& b& E1 h R+ K - .INCLUDE "fc_demo_constant.asm" ;NES常量) B9 D1 z7 @, Y$ r
- ;====================================================================== D" J7 b- l# j5 ~
- ;音乐配置$ T$ p3 N' Q( {) z* ^, @5 l
- .IF 0 = MUSIC_THEME & K& o8 R- Z/ [& P+ o8 Z: p9 h
- .INCLUDE "data/music/Gremlin 2/config.asm"2 f$ f0 ^* n: L3 y, ^
- .ENDIF
, e! r |+ l% ~6 Q - : r& ~- |) S5 A4 i/ i' z
- .IF 1 = MUSIC_THEME: A( W( C2 H. ?' l. h
- .INCLUDE "data/music/Raf World/config.asm"* B2 g; j) x3 B1 |
- .ENDIF
. y+ }# P3 s. e+ v& X0 O -
( j2 l; i1 F, ^2 E' U3 c - .IF 2 = MUSIC_THEME 5 }& D, }) o# ^- W
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
3 u7 h& S- \- Y% w1 B - .ENDIF
6 A/ A/ N8 C# f3 r6 d - & t2 z; b* l/ `8 y" H
- ;======================================================================$ H/ G3 K9 i( j) x" [
- ;引用CHR图像数据2 W( j) a H, x4 J( u
- .BANK NES_16KB_PRG_SIZE * 2
1 }. M! }6 M: x1 S - .ORG $0000" ]. Q/ r# X$ @/ i
- .INCBIN "data/bkg.chr"+ J+ q9 A8 u3 T) C: ~! S5 ~& _
- .INCBIN "data/sp.chr"- ?7 n3 c0 _: h
-
0 K5 G4 A: N) X, S. D- X - ;======================================================================
: U ^, u2 _0 U5 h' r& Y - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank+ _' x! e) z+ ^9 I1 F+ g, l7 A/ Y
- .ORG RESET_ADDR; V; A- S @; _4 h; b8 w6 U0 P
- ;======================================================================
- G) n# c" u8 k4 G! W0 `" q" w - ;引用其他源文件
; X3 \- _0 w' g! u - .INCLUDE "fc_demo_ppu.asm" ;PPU处理4 |! c c: s1 ]! g
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理+ Q* l0 N( |3 K3 s
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理# A$ |7 b' t( g. q* o V5 G, k
- ;======================================================================
+ |. u" Z1 I* P4 u/ B
( L: |% r+ L% B9 U+ O- ;======================================================================% s: e6 Y4 n) U4 ]/ i/ B$ t8 R
- ;等待VBlank到来
2 i% i8 }7 D5 h5 N- [1 x( b8 H - Wait_For_VBlank. x( _4 R$ @3 v" W3 j! ~( P
- LDA PPU_STATUS) ]' f. B. c# y& k5 D
- BPL Wait_For_VBlank
/ X& c4 m& ]7 f1 X- O K4 F% G - RTS2 c! b+ o; t7 g0 H
$ J9 {' ~4 [! P! j- Q$ k% D7 h- ;======================================================================
0 r8 ^% s1 ~ f+ A J3 k - ;调色板初始化
8 J6 X' I' n( v" x - Palette_Init
3 N( U$ X; p6 Q0 C - LDA #$3F- `& i6 m7 r: P i1 R
- STA PPU_ADDRESS
( e! L$ t o# c [ - LDA #$00* @* V1 L: a4 Y* g
- STA PPU_ADDRESS- ?0 M3 P: o/ x* E$ _( R5 g& z
- LDX #$00 s- M, C" {0 {- A7 R: _1 n8 h. g
- LDY #$209 E5 L& C) |+ ^3 E
- .Write_Data
) p* t- L: f8 J" |- e" W - LDA Palette_Data,X
! J! K( ?- e) P' I - STA FC_PPU_Pal_Addr,X5 T$ a i, y! j" M
- INX
, n5 u' k# v: u, r' `4 K; n - DEY( ?& f% U3 T% ~+ g; f& L- W
- BNE .Write_Data
- E( B+ g6 Q$ I% ^ - .End3 A1 \4 o/ x4 B7 d# h/ |
- RTS* m8 Z7 g P U4 I% E! y I
- 6 W& t- X8 K1 `! k9 r$ J. {
- ;----------------------------------------& m+ n1 k& B2 y! R. ?
- ;调色板数据
. ~ Q. S! V2 Z5 m( k0 Y) C - Palette_Data
6 ]# ^- A5 y& a2 g - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
6 D3 _7 a& ?& J - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22$ J3 F' y5 c( C2 N5 ?5 F5 q3 ^
- 7 Q6 D2 F5 Y% p4 {
- ;======================================================================3 _- {' [. u% X6 N
- ;命名表清空
/ w" y8 m! v4 [, B, n& N1 M2 o - Nametable_Clear
* ^8 h% c0 j6 W8 K: O' _5 D- I( y7 }' D - LDA #$20
$ [2 Z8 ~! P1 i) O1 [ - STA PPU_ADDRESS( M" y) E5 g" J% k" {
- LDA #$00
/ `3 G( _% Q& V9 Z: z1 q0 F1 q - STA PPU_ADDRESS8 ^% {6 c. m3 k% W
- LDA #$007 j* t8 ^. o F8 Y
- LDX #$000 w6 B0 u6 L# C) o+ c
- LDY #$08. V+ o& k2 K& |2 A/ F( z/ E
- .Write_Data
% |7 _: r' ~5 J: c. k4 c7 G - STA PPU_DATA6 h! t. W$ \) x4 ]+ d# Z
- INX9 T L6 v8 h' r. N, y- T# V
- BNE .Write_Data
/ ~" X% Y4 e! o/ f M$ D - DEY" C& j- |2 `+ o4 X3 N; U
- BNE .Write_Data# j2 d& z6 P& G) Q( @* ~ y, a3 o
- .End
/ h8 a. G' B* T" ^ - RTS
% ^" f) k4 Y5 n/ o, o
/ O0 t- G. W2 ]6 D, o- ;======================================================================6 v( \4 G2 |" z) X0 u" n+ s; K
- ;音乐曲目切换8 V8 r9 z! C+ B/ G' D1 L
- Music_Select_Process
, \- U4 h4 D! W" y. E0 X J4 s - ; @; ^# Z) ~9 a) n+ Z. P
- .Pre_Music;上一曲
: L# u6 L7 b, x Q+ { - LDA FC_Gamepad_Once4 i* Q' Y+ i! ^7 W3 N
- CMP #JOY_KEY_LEFT$ F, [( c9 X6 ^- q2 G- Y
- BNE .Next_Music- z; V5 J# ]( i7 `; r
- JSR Music_Play_Pre: w* ~" d; b: V& ]6 S9 Y! O/ l& j
- .Next_Music;下一曲
, U2 o3 R; C" | V+ K; B$ { - LDA FC_Gamepad_Once# g6 u5 H. ^' o$ ]0 P& v+ Q n
- CMP #JOY_KEY_RIGHT
Z* l) I9 K$ F: Q - BNE .Next_10_Music
& Z) `: ^( _: c( ]; E' g - JSR Music_Play_Next
1 J: d. Q! A8 o/ l9 F - .Next_10_Music;上10曲7 U( h' u. @! O* S2 A, Z% k# Q- B$ |
- LDA FC_Gamepad_Once
# B. @' y3 c z1 a - CMP #JOY_KEY_UP. k1 N- U$ W. F1 n4 D) N
- BNE .Pre_10_Music0 B- G& Y% _' Y6 i& o. g. J
- JSR Music_Play_Next_10 g( h0 {( e" Q( Q$ u
- .Pre_10_Music;下10曲 \. w- K0 l0 Y3 G7 C
- LDA FC_Gamepad_Once
6 h1 P7 t a9 }# | - CMP #JOY_KEY_DOWN
9 ^/ ]( i& L, A' [0 t+ M; F - BNE .Reset
U8 z- g, c0 D- G! ^ - JSR Music_Play_Pre_10
, p, c8 H2 X! f) t* w - .Reset;重播当前曲目, R. ]1 F$ n) H; e* |$ g" q
- LDA FC_Gamepad_Once! f+ n+ P& L- U# s. c8 d
- CMP #JOY_KEY_START
) z! C- ~" G2 u% G, H( H - BNE .End# z, h! L( K! m: O. c: w
- LDA FC_Music_Index) J0 s7 I& ]5 s# x' x" Z5 y& _
- JSR Music_Init_Process
0 s5 X$ c$ F& H! n - .End
; U' D6 |+ g! C - RTS
Z+ L+ f, Q( _1 n! [4 u) V - : C* p. a% G' }3 ^6 K$ V
- ;----------------------------------------------------------------------
! h9 F% W% J* N" q7 w4 } - ;播放上一曲, n9 P: U [: k. W. L' J+ k" Z1 b
- Music_Play_Pre
7 R# s+ f3 E" S - LDA FC_Music_Index
& m, b& b) j5 i8 H+ a j; ~0 R - BEQ .End
" N: |8 q$ U; s; b8 a9 s - DEC FC_Music_Index
9 }; V: O* x- _5 y9 \, k6 \ - LDA FC_Music_Index8 d/ X* K1 S9 \
- JSR Music_Init_Process9 D2 d& V7 q" P) s3 _
- .End
: @; d {- g/ w1 h8 I6 | - RTS" |; v, Y* m8 H& Z
- ;----------------------------------------------------------------------
; p: W, c8 S j( C1 @! `2 J - ;播放下一曲
3 w: z* s5 k4 r" i. Z" n+ R# w - Music_Play_Next4 U+ a6 V) g1 L% ~3 O
- LDA FC_Music_Index3 {2 o8 L( B w7 J; z
- CMP FC_Music_Max_Index
4 @! D& q8 X2 Z' U1 g% m& ?, v - BCS .End
" `/ H$ b4 x" O& O6 T - INC FC_Music_Index
# P6 a! N" p' F% r% ~2 _1 E - LDA FC_Music_Index% y" t8 | g: P$ |. T/ a" G% b
- JSR Music_Init_Process
# B8 } ]' `; k& [, X9 C; q b - .End9 S8 q/ E+ m7 f( P& Q8 b) k2 e3 X0 l
- RTS" d K& ?# R: f: ^ [8 a
4 J* a' [; {3 A. V, x( h8 _- ;----------------------------------------------------------------------
+ a$ M9 m* l* o. N: @, @ - ;播放上10曲
0 }: ~% ?% g" n. i; j0 S - Music_Play_Pre_10
) K( c3 J' }3 Q6 u. S - LDA FC_Music_Index
+ {, K/ Q8 p1 U. H - BEQ .End! u* B3 ]! w; V6 E
- SEC
" q; o$ y! h+ K0 E1 F3 d - SBC #10: e+ o X1 U% R/ z* @! F
- BCS .Pre_10) f: x' R8 f+ S. I1 a* ~
- LDA #$00
; P6 z4 |6 }, e - .Pre_10* ~# I6 X6 ?4 i. S& {1 S
- STA FC_Music_Index }4 y! F+ u6 ^/ k
- JSR Music_Init_Process
, `3 i; {; ], Q. d! S - .End% |# y8 L* }! ]+ P
- RTS
( y5 m* {$ d. Y Z - ;----------------------------------------------------------------------5 v' e" I: {1 A8 ~+ R+ L
- ;播放下10曲7 I3 e/ _+ C- L
- Music_Play_Next_10
; k L, c# K: X& \ - LDA FC_Music_Index9 N& j" F: F- u3 g
- CMP FC_Music_Max_Index m! ~9 _ f3 x
- BCS .End
0 ], ?8 B+ n$ b4 f) F - CLC
7 `4 `: T% R8 y& k, i - ADC #10, H* e. s, M7 r% O3 x' O, u% m( [7 e* r
- CMP FC_Music_Max_Index
) a! p1 ~9 T3 B9 C0 b9 g9 C - BCC .Next_10
) b5 X# u0 i3 t8 W - LDA FC_Music_Max_Index Z& M/ W; C& T6 \. e, o
- .Next_10+ |5 J0 m& b/ V( t% g9 i5 x5 N
- STA FC_Music_Index
3 u8 {8 c; Z9 ~6 t; s0 _' G - JSR Music_Init_Process) ]( r0 l( q2 o0 x" z' B* v& i
- .End
; T% Z& I" k- A3 C% l - RTS& ~5 u8 ~7 @# H8 I' @3 ~5 `6 c
, Z% P7 l8 q" v& u) b$ s- ;----------------------------------------------------------------------
8 u; X% a) ~% @- B" _ - ;8位十六进制转3位十进制制4 f8 J7 D }9 `
- Hex8ToDec1 q2 O" ^) u, d7 ?# ~( U0 G4 l4 e8 O
- STA FC_Dec_Data_1. [* Q& O5 ]/ F. d* g6 b7 a3 J5 b8 M
- LDA #$00, n: g& v* O$ M: `2 e, Y5 S
- STA FC_Dec_Data_100
% R+ U# q; t* y( x# h) r/ o3 n6 V - STA FC_Dec_Data_10
+ b' B- C5 ]) C6 I - LDA FC_Dec_Data_1# w" w. [4 }8 ?6 a
- .Convert_100) ?" Q/ R3 H5 _' K Z0 g# `
- CMP #100
; I4 I& ~/ C; Q* F - BCC .Convert_10. t" f% Y2 Y! P
- SEC
( K/ B( L/ W& M+ ?; J' w - SBC #100
3 @# r9 O! R; Q - INC FC_Dec_Data_100
& C0 v! d% Q) t- U9 L1 ? - BNE .Convert_100
2 P7 V4 m0 i5 `! n - .Convert_10' k0 G1 h- K/ g2 }
- CMP #10
: V( F/ |% k9 y( v* n - BCC .End6 G" c1 g6 Y7 p
- SEC) W- X/ }! f k
- SBC #10
/ ^4 a$ I: P4 K7 ^- d( C - INC FC_Dec_Data_10, `0 j$ {6 J' d
- BNE .Convert_10
1 r* e( E. {" C ?3 K - .End% q& b" ?- t' m: \
- STA FC_Dec_Data_1
- P+ I8 x2 B1 f, R/ `' B/ F - RTS
% B& c9 T$ ^5 K6 K
' `) U" B; ^0 O, G' N7 ^8 r- }3 Q( q8 y/ I- ;----------------------------------------------------------------------# r+ `7 r2 d$ A a/ v/ Y0 T
- ;显示曲目信息
& e5 V C1 K6 d* {9 W - Music_Info_Display$ {: ^* a5 m" e1 C0 b6 k
- LDX FC_PPU_Buf_Count0 V H1 G0 o( [* u8 Z* I3 N/ u
- LDA #PPU_WRITE_MODE_CNT_LINE6 x5 A% S; O" t1 V) s) a
- STA Use_PPU_Buffer,X
% t0 i$ X1 x/ v: g% @ - INX2 y2 v5 T( H2 C: ~
-
% V! X9 m: b3 ?% Z+ Z" @, j' d+ O - LDA #>MUSIC_INFO_POS2 t2 o) _- V! \$ B! l
- STA Use_PPU_Buffer,X$ c+ o; m4 W" r2 U, ?/ q
- INX8 g! B2 K/ x8 k# S0 x
-
' ]3 d: I) J- r. Q - ;居中
7 K0 w+ m4 S. R - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/27 s3 u0 g; G8 V3 F$ {* `
- STA Use_PPU_Buffer,X6 r8 u' h5 s3 U9 M9 C, C) C9 z
- INX- u% F/ x& H) K, J" C. D
- : |- O9 k6 z: P9 Q" Z m
- LDA #$05
7 ?3 O7 B# ~4 X I- |. B: e - STA Use_PPU_Buffer,X! \# G# X* E( p0 {
- INX) W" p6 k) i0 F! z
-
3 D2 O8 c/ F0 Z( h - LDA FC_Music_Index
) q7 ?# H7 a. n9 ] - CLC
. g" J2 {/ E1 `. J+ W l - ADC #$01
* t. p# {% b+ g8 ], H! ^) x- w - JSR Hex8ToDec) k6 K1 W7 {% K7 r3 Y* a2 \" X
- + X' X" Z3 X! E; o
- LDA FC_Dec_Data_10* Y- w& F* k. w) \5 C1 P
- CLC
8 N7 ^- H2 k- i% q5 a2 ^ - ADC #'0'
% |& o; o: e& @: H3 y& M - STA Use_PPU_Buffer,X
. s& O/ D/ [6 x- t, Z) w - INX: w0 ] q p( @3 [# b! n4 a. J
- * [8 d( v* q; f1 [# @# m9 v! C. O) |
- LDA FC_Dec_Data_1
$ v9 E2 H( _" W1 h2 Y* p - CLC6 r3 F# C! {/ `1 H0 @
- ADC #'0'0 [7 H% R0 p. v$ N3 `( N5 K
- STA Use_PPU_Buffer,X
% K. w9 m% n1 ?, O8 G - INX' C3 Y; m: I# w; c. g; }
- # H6 e3 f# p! [1 m
- LDA #'/'
+ K4 p. J8 }# p% ?! e7 [ - STA Use_PPU_Buffer,X
5 L6 q% |& Z/ N0 v2 e4 O - INX
& Z; q, N8 E: r9 K9 R& V. m/ M - + n7 R9 C5 p" Q3 ]7 U4 V
- LDA FC_Music_Max_Index
2 Q- O; o$ h# t% l. X0 M5 I - CLC
% ^' @* B& Q8 q% a; W - ADC #$01
, Z% C2 [6 [; v+ { - JSR Hex8ToDec
4 x: _/ y4 I1 y - : N& L* @# b* q1 |0 D
- LDA FC_Dec_Data_10
3 T9 E; x2 P _1 x% K - CLC
' r; Z; n5 \- Z' s/ [ - ADC #'0'
; a5 z J) W9 J - STA Use_PPU_Buffer,X
. `/ }1 e' P; k' v' h. ` - INX
" M. ]- A$ j: |7 E" G% k -
! \ {0 Z. b- R6 A' l- B - LDA FC_Dec_Data_1# P% p$ X* y! X4 `5 G; r
- CLC V8 ~/ B8 P/ I( j; \
- ADC #'0'
9 [$ W- G9 e4 @7 U# R6 V# b - STA Use_PPU_Buffer,X1 D& c( _8 e; g, I( D T$ `
- INX
2 q) v- g7 }$ l! J5 t( g -
) L0 p6 f0 H% w& d - .End* C2 T2 F" E% ?7 ?/ Z- q
- STX FC_PPU_Buf_Count
3 r1 y0 k) I$ n- A& K0 s! e) @ - RTS- E; T( |3 I2 G0 o( L T
- J5 D& X0 L$ q
- ;----------------------------------------------------------------------! X5 p. @/ B' |! \. }( \$ ?
- ;音乐曲目初始化处理0 {3 m; U$ o% R9 H$ y
- Music_Init_Process$ n/ N: ]! S9 V; y) P7 o7 s
- PHA7 ^* F9 x, j) I" O* V
- JSR Music_Clear_Process
; W) J1 A8 G4 {& z& k; f - LDA #$1F, n/ S6 I0 \8 m- _. D
- STA $4015
7 `% |+ x6 D: |# K" L! A1 ] - PLA
: `( d2 M& L- x/ Z: F6 Z7 U) `3 \ - JSR Music_Init_Addr
' N, H6 @7 v/ a$ B4 x0 N/ W/ Q# _5 T - JSR Music_Info_Display; f4 R& A2 m5 @ _6 ~
- RTS
/ t8 d& N* n0 m8 f+ P
: P" O) {6 F2 @1 @+ X- ;----------------------------------------------------------------------
* g) |2 v7 ^3 f& [9 r" B5 g* X- k - ;音乐播放处理8 R5 j! H0 I* b. d
- Music_Play_Process
8 M8 M5 ^( T; u, c9 b; j: x0 i( t - JSR Music_Play_Addr
0 O. V M$ y+ Y! J; D - RTS
) C% k8 h- t# f! i# r
9 A" g. `9 u$ ^$ i' e4 L- ;----------------------------------------------------------------------
4 M' {0 b8 D- x( I - ;音乐播放处理
/ W9 v/ i0 _9 `9 a* W - Music_Clear_Process
1 }4 Y7 P7 m1 {9 P - .IF Music_Clear_Addr7 {- Q% i9 h9 m8 l
- JSR Music_Clear_Addr
3 @% u3 r# ?; c- @7 M; W: q# J/ B: f - RTS
Z. j3 @* f2 o$ ^ f! |; E n* ` - .ELSE
, N- f- b: F N N! l - LDA #$1F
+ c/ c8 x1 p8 a. p - STA $4015' z3 q. Q6 v' ^2 O% w2 i
- LDA #$00
4 I5 v- f h5 ~: x$ S' I6 l9 J - STA $4010- t$ R" C8 A* ~5 {; E) J# w6 {9 r
- LDX #$00+ }/ h7 o8 k% N" e1 |
- LDA #$00& V; }' L7 t% _% |
- * B8 o3 D- A6 w" `7 R* V- d' r
- .Music_Clear_Zreo_Page_0' F1 P) P1 w/ B5 o( u0 Q
- STA $00,X
4 v" s2 `. K+ R; h% D+ l; z; R - INX) ~# `" q% q3 R+ o1 d
- CPX #Use_Zero_Page_Begin
; j1 ]- B' C$ h- J - BCC .Music_Clear_Zreo_Page_0
+ v) Y* ], }: X* A; B# P4 r8 X. v - 2 I) I& g' i. K: e
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 H+ [0 d4 ?( f+ d/ b4 D/ H - .Music_Clear_Zreo_Page_1
: h4 ^0 G: V# l l" T" b/ c - STA $00,X
. N/ ]4 M9 @: w1 ?- o% ] - INX
3 s- M/ z$ l2 Q7 w9 J# ] - BNE .Music_Clear_Zreo_Page_12 F d7 \$ Y; _% i' P7 i* K" }- M g
- * ]2 a3 s! }8 g) I$ x
- Music_Clear_Process_1
& n% d' Y, y$ g. Z- \6 h0 ? - STA $0600,X
/ R/ n1 |& E p6 \" E - STA $0700,X; Q8 }% H* ?( Y3 y
- INX% ~' _3 Q |. ~: c
- BNE Music_Clear_Process_1) ^9 {: G- T' T0 a$ j$ P8 q
- LDA #$101 m( Z4 W7 Q9 n; O
- STA $40001 P# f4 P/ \& _: q
- STA $4004
7 q: G7 s2 u8 C1 V - STA $400C$ e) p7 u7 F' N$ N* y
- LDA #$00
% j+ [3 f* s7 F7 p7 c, t7 N8 Y7 e - STA $4008! U- H6 Z/ {6 M& @/ y3 @
- LDA #$0F" R2 e# v' E+ N E
- STA $4015
! o# K j! ^/ ?2 }6 m - .ENDIF& b6 h6 f4 ?1 h- }; M8 T' V5 C
-
: B0 [% y j, T6 j - RTS* ?+ D3 z1 Z+ I% ]7 O" l
2 R) a. h) S/ q2 f- ;======================================================================2 Z9 ^- a9 q% z, {' r4 x
- ;重启处理
& S! Q' X8 S$ `) z8 [ - Reset_Program
. S/ G+ P3 C8 o- M" M - SEI
' r: d% O& E" X: p3 R/ J! C! [, \ - CLD5 F* z6 {8 G% N' F; B* B
- LDA #$00
/ H7 }, e3 x, k5 W- m5 a; s - STA PPU_CTRL# D& u3 D& N/ f/ ?5 O' A) [
- STA PPU_MASK
$ _: ^% M2 R1 X' ?; @! x0 o2 e - STA JOY2_FRAME
2 z5 z" }$ }' C$ d& r - STA APU_STATUS: E' z6 w6 \% O- G+ _( c) e3 p2 p
- ( J+ T3 N8 v& V# R7 J
- ;等待屏幕准备完毕3 w. ]) x, w4 D3 \
- LDX #$02' w& W. l Y5 |: G, j: e
- .Wait_For_Screen_Ready# s6 Y( Q. i6 D7 f2 y& g
- LDA PPU_STATUS# ?' A7 o( ^* ]( u% E- _
- BPL .Wait_For_Screen_Ready* i. N& G! }% C+ v/ j: E1 E
- DEX, c- }/ {6 X. ?
- BNE .Wait_For_Screen_Ready
' y7 r$ B9 ^. j0 \1 U - " m% z% O, g) j! O M* n. ~& t
- ;清空调色板
& n$ h9 {$ o |; J3 d; C" | - Palette_Clear6 U) ^( \. A; ] D- K5 ], h/ I* t7 k
- LDA #$3F# \ m2 W- _: u0 t- C+ D
- STA PPU_ADDRESS
9 d1 ], P5 x; @; t7 G% O - LDA #$00
* o# t; Q5 k8 g& x - STA PPU_ADDRESS
9 X- o v% E! A - LDX #$20
$ `- g8 h4 a! F0 d7 ?5 V - LDA #$0F5 r. ]5 K" S' V( L. D/ z% I, x( Q
- .Write_Data: R) w7 s0 f. y. q& A' n6 u
- STA PPU_DATA0 J" w) h, c" `/ G* L6 f6 o
- DEX' y; j" K- V- X/ u
- BNE .Write_Data0 ^' v6 I" J3 s R0 j0 d
- ; F& E$ w$ K9 x# f- e% y+ r
- ;清除声音 $4000-4013
& W; J" |2 t4 K1 o& w! j+ Q - LDY #$142 S8 m" C4 Z+ X) y7 t
- LDX #$00 F7 D# i X& N+ B t( `4 D
- .Sound_Clear1 M, i9 S7 N) ~6 Q) c$ u
- STA $4000,X8 S. U- G8 N4 J4 v6 h1 [7 L+ l
- INX. i* w4 o! e/ V, |8 d7 f
- DEY
3 @: k1 K+ d: m. ] - BNE .Sound_Clear% x' n( M- S; }2 I2 b% b) S
- 3 h; R' ?( d" D' [) T+ M# e
- ;清除 RAM $0000-07FF
" {- @2 U" k N/ i, v' \ - LDA #$004 r4 e( D5 s- H m" B' K1 T
- STA $00: w) @8 h2 V- V X0 n$ X- Y8 ?
- STA $01
& H* }% T' f& S1 N) k% a. L3 F( Z - TAY p; p3 K& L$ N/ z: g5 S! m
- LDX #$08
, X" @7 [$ Y k+ ?. ~* `. b - .Memory_Clear- t" g" O' Z7 B* d; Q! V' f {
- STA [$00],Y! v. G! s$ u( T q8 j2 Z4 r# s
- INY: h0 ~ v% q. A5 O8 }+ g( G% i
- BNE .Memory_Clear
; g5 \. r; B; w$ T; f - INC $01
5 P3 n( ?1 \$ S+ C - DEX7 s; n9 l9 Q" K/ q! V( W( [+ P
- BNE .Memory_Clear3 t9 {) p# o" ^6 X$ f5 p
- , c4 y! E- Z5 O, p
- ;精灵缓冲初始化
* M* B- N: R& N0 e- P - LDX #$00
& K: h6 V8 u' G+ V: }, m" t1 m - LDA #$F8; e: O) F" X8 a2 a* ]
- .OAM_Clear
) ^% j3 ~ |' a8 d8 \ - STA OAM_DMA_Buffer,X
8 {" ?/ Z1 y/ I' } - INX3 Q/ C( y* J' o/ J
- BNE .OAM_Clear& J" U& _7 e6 C1 k" M
-
$ M V! i' v& U - ;栈指针初始化
" a* B# v) @+ u) D8 D - LDX #$FF
/ R' r- R/ `6 {5 b - TXS
6 D% A0 \' e/ C5 H -
4 s; s4 e( M. u8 d7 L4 O - JSR Nametable_Clear;命名表清空
o/ P4 r! K( d - JSR Palette_Init;初始化调色板缓冲
% I' X) ]' d0 `7 c* L9 O - JSR Static_Text_Init;初始化静态文本
$ Y0 S2 z- M4 _ - / ~# r0 g8 l4 l0 c- G+ D
- LDA #MUSIC_ITEM_TOTAL - 1
8 ~5 @. c( l( a, a$ u7 {4 q [ - STA FC_Music_Max_Index4 {; j" c o! V% A: O
-
& D3 a9 M3 ^ ^: s - LDA #$1F
' d* i2 d1 H1 ]1 F6 b - STA APU_STATUS
# _8 l9 J, w* P$ x! n4 @2 _ - LDA #MUSIC_BGM - 1
3 i$ J2 r3 a) U+ T - STA FC_Music_Index+ \0 W* q) {+ W- F' p
- JSR Music_Init_Process;音乐播放% r- S! v" s7 J1 R7 A5 }/ [
- . Y( M' l! D" ` v |9 z
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
0 p! ~8 S. J2 o# S - LDA #$1E. f$ H$ q' s* C
- STA FC_PPU_Mask_Buf
# h2 ^( M1 M! ]4 r -
2 [6 Z* `' n2 }6 m, N/ G- g6 R - ;启用NMI处理# c% C# T( @1 q ]( F
- LDA #$80
9 P8 D3 Y& q+ Y - STA PPU_CTRL8 V! \2 y5 d8 M2 M& c5 e+ `* @- P1 ]
- ; p( C: J& v- i, M/ c
- ;程序循环, 剩余工作交给 NMI 中断处理
6 ]' w) b* u, `) A6 S3 N) e. Y* M% V$ g - .Loop7 h e. {5 {$ C: G1 S$ r
- JMP .Loop
0 ^* m1 f: X1 X/ A# R
m% J: U2 y, A+ A- ;======================================================================! y. x( b# ~$ g' S% i
- ;不可屏蔽中断处理3 F5 J Q8 {! \; ^1 m( h" k
- Nmi_Program
6 b1 C! T7 \" L - PHA
. `) r/ g+ I3 O7 B5 p - TXA$ R& g2 m8 a" X: q
- PHA
, M: K0 a& b$ Y- X# i; F1 i - TYA
1 f7 {1 o9 C( G) m* q4 H - PHA0 ?5 I; l' I8 {' R# R5 Y
-
0 a% J2 W4 H" b6 C3 k% y q - LDA PPU_STATUS;读取使得 PPU状态寄存器复位3 K) F0 V4 D p% F2 F2 s: q
- ) `3 c0 _3 {- x$ s7 e# x6 M& z( ?
- JSR FC_PPU_Procrss;PPU处理7 k2 C1 Y, d! q4 |' I# f
-
& A8 K* R# ~: O9 } - ;精灵内存更新
6 b# g0 V3 \0 l# \# t - LDA #$00( {/ y% v+ m; J
- STA PPU_OAM_ADDR2 i" @6 d9 q8 B$ [& e/ q2 d0 i
- LDA #OAM_DMA_Buffer / $0100* z+ s+ \' J" G: P" f7 q$ `
- STA OAM_DMA
) P1 u# b* l H5 y- v4 n2 w9 ^ - $ l* d ?( ]! R6 s: _
- JSR FC_Gamepad_Process;手柄输入处理6 H& g- g3 g3 D; N% `
- JSR Music_Select_Process;音乐选曲处理3 W% Q9 g9 \/ \2 u$ V* t/ S
- JSR Music_Play_Process;音乐播放处理8 `' V. D4 P: q0 m
-
$ c6 J/ z: K6 h+ R - PLA
* |, z/ y. e6 U8 C - TAY8 ~6 A X7 d3 T' q
- PLA
, t# K; y/ j1 R6 S - TAX, Y/ ]* M7 ^1 R5 I& {. S; ]
- PLA5 e7 j( P& ?# l9 W
- $ O, r& U0 x! t5 G
- RTI
$ S" A) A2 W) b' k& g3 m. B7 z - $ H, t ]* |" X( y
- ;======================================================================/ G3 H- H$ s7 e+ h C; a5 X2 p' m
- ;请求中断处理
3 R) @& a2 D7 y- {0 X6 t' H0 d, d - Irq_Program, T" C c( v. j& ]6 O6 j" w% z) S
- RTI
4 t0 p9 X! z) U7 J
: i, k; z) G( p, l- ;======================================================================) {4 q( e0 r& S. t( {- m( z
- ;中断向量表
. m" J+ y7 v. {0 v( b! R" R - .ORG $FFFA
; C% X" |" r8 C, m! x9 Q - .DW Nmi_Program ;NMI触发时执行/ h4 L& V+ x e) q F* [
- .DW Reset_Program ;载入ROM时最先执行
: A( z* c' |* \& I - .DW Irq_Program ;IRQ触发时执行* w, F' u4 v! a \0 k: }2 X4 E
复制代码 9 Y8 F9 L6 d2 `7 m/ S' Y
1 x; ?& a) l, H Y9 w, h5 X
5 W E) l# p3 O" m& u+ f" `https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|