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