|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
: i0 d" X, t/ P 3 K" _* G9 A& A2 V
以下是主框架代码:
4 v# N1 Q+ h8 F- T5 E- ;======================================================================3 H1 i) p& N! U+ A. f
- ;文件头6 m1 {8 y" D( ^& U# q
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量- }+ d' q2 x9 u5 V9 H1 i/ Q+ {
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
8 ? d/ Q( E, o# F - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
# N: w3 D* V8 u9 u. I& v: l2 Y - ;======================================================================% d8 A& l! \6 s8 k( l5 G8 d* R
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
9 v0 \9 C @, Y - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1( `% H( C! j/ m8 g. T' b! ]4 R
- ;======================================================================4 M' t8 A3 k' P- u% Z. \
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
, p: u$ M* C) r7 ^ - RESET_ADDR = $E000 ;主程序起始地址1 Z4 n: i- z# X0 m( L8 S" |
- ;======================================================================
- Z6 Z: e0 C5 X4 S" n/ K: f - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
- M# g5 d* w* e: K - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB" X5 N4 V8 ^8 [. T4 f! C+ S% ?% A
- .INESMAP 4 ;Mapper号 (0-4095)7 P% @: w( {, l3 G2 |; l1 _
- .INESSUBMAP 0 ;子Mapper号 (0-15)
# m8 s( c1 ^$ Z3 a8 m# b, x- G9 @ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- i$ u1 J! x, s1 O8 D$ g* h
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)1 m' P+ `4 w- s( z/ D- O7 ^
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& R0 X! q$ z7 W$ y6 x - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
1 n4 h- D# _. }4 ~/ j9 J+ s - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)0 a# I% p4 V# p$ B. i3 U6 f) s
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数), R& x3 U3 F; `; U( N
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)& ~6 g2 P$ \# K% G
- ;======================================================================. j. F f2 X' w$ r5 i
- .INCLUDE "fc_demo_config.asm" ;全局配置
! X" F/ s9 g# x4 Y5 r- B9 f8 C - .INCLUDE "fc_demo_constant.asm" ;NES常量
" g" a7 r" `+ ` G* } - ;======================================================================
& Y1 H0 @; @- t- y, l8 C7 _ - ;音乐配置 ?: b, p, ^6 x, C
- .IF 0 = MUSIC_THEME
: Q3 _; M" e5 k6 C R - .INCLUDE "data/music/Gremlin 2/config.asm"7 L2 N7 q; | h2 \# D
- .ENDIF+ @) g4 h, U) W
-
" n% a W* }/ g' z* s - .IF 1 = MUSIC_THEME# C: K7 l" D2 F4 M$ ^0 A
- .INCLUDE "data/music/Raf World/config.asm"
; U8 k$ @% ^9 S7 h; \ - .ENDIF. _. h- o8 T4 b( w& z& |' w9 J/ V
-
/ k: V3 ^3 \. g6 {; U( D - .IF 2 = MUSIC_THEME ! C" \8 v* L2 ?
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"5 |( h6 |' p0 U* L6 c
- .ENDIF a; a. t# i3 r, N/ l# G/ M, h
3 f0 L$ Z, P* q+ \ S+ ]0 k3 a% o- ;======================================================================
! U2 i6 [8 N( f. v6 Z, V) h- K - ;引用CHR图像数据( M8 ~. I: J! O5 V8 y$ n
- .BANK NES_16KB_PRG_SIZE * 21 Z' t; W% T# ?* m' A' r/ b# O+ M9 r/ g6 J
- .ORG $0000
4 ^7 a! m0 F& w# A/ n) u - .INCBIN "data/bkg.chr"7 q# b( r( y: p# s: N1 e( E+ f
- .INCBIN "data/sp.chr"' s! Q. N" Z/ n9 T2 k# L: f
- ) [- \$ X/ R' Q. {
- ;======================================================================) a- f% O, _' G: ?
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank* L2 u% ^+ f" }: _: I
- .ORG RESET_ADDR @ G$ [: e) U. \/ d
- ;====================================================================== e$ d3 ]; z6 ^2 L9 ]- w7 @$ v) N( F
- ;引用其他源文件
: Z2 X2 X1 o; Y5 T - .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ o# d/ V1 v9 J* N
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
8 d1 `& R' O: v4 m - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理( x8 X5 b% G- f: G+ I* k7 [
- ;======================================================================
6 a* n: K' `6 r- `" L& r% h - - c# `- a/ X$ W
- ;======================================================================/ X3 A! c. l9 Z1 I
- ;等待VBlank到来2 F0 [" l/ A, d" g
- Wait_For_VBlank
8 \4 I8 B* x+ z% b# @ - LDA PPU_STATUS
; [: T2 p o4 \7 P4 Z- m' I- m: G8 O - BPL Wait_For_VBlank0 j8 Z5 u5 a+ X
- RTS
$ i" @; D! z) l. y2 \9 Z- Q - p* w8 `/ [2 {! y; ~5 \% \9 [" |8 y
- ;======================================================================% D9 s* J. D7 Z C( ^: Y
- ;调色板初始化5 q6 y% \6 R E' I6 X; i3 r9 x
- Palette_Init2 ?5 B9 B7 f7 I4 @
- LDA #$3F
Q s7 L4 J7 W7 f8 M; o |& | - STA PPU_ADDRESS
: _# n- I- ^4 e; i+ ? k! [ - LDA #$008 x) w7 @ s2 R9 A F
- STA PPU_ADDRESS
. b* J7 D1 r6 s- z - LDX #$00
0 }$ X! w6 ~. C8 F+ G - LDY #$20
% p& t. x6 O& \, K/ m% O' U1 e - .Write_Data& T3 m i, b" d
- LDA Palette_Data,X
/ h0 F" q/ C, _7 p" e - STA FC_PPU_Pal_Addr,X3 t) R" b/ p' l7 Q" M) u: p
- INX
/ m, R8 q" [+ j/ t9 M6 \ - DEY
: ]! i) |% Q) o% o: D - BNE .Write_Data0 P2 |3 |/ u5 y# w4 f& s, ^' D; f
- .End
5 ~0 R, h) u0 ]4 s* u - RTS
/ T- P5 u+ j* R& g; `8 I - ! X O* \) }% h1 A
- ;----------------------------------------" {+ D9 y0 t: }# m2 J9 |7 O" e
- ;调色板数据( b+ J8 u6 x: F- K4 ~* S/ B
- Palette_Data* t% L9 U" q7 o' r9 `2 T" P+ g7 P
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B# x& f) ^+ C2 u* e1 F8 c
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
& U* n! G/ z5 Q - 9 N ^9 s* S6 A6 w0 ^. H
- ;====================================================================== c/ O8 k7 Q5 m2 q# k0 i+ E- h
- ;命名表清空
, ^: N' K& n7 L% @ - Nametable_Clear
1 }" c! [2 L/ q+ }& S9 H2 i7 }. b - LDA #$20
7 Y# u; w3 x0 W- o+ F - STA PPU_ADDRESS
; t! _9 h4 r' Z7 H - LDA #$00
2 l8 G( q$ h# r! j/ w: B - STA PPU_ADDRESS
y: z5 Q# P# W# B9 I; }3 o7 t - LDA #$002 C! e W% \# W$ L9 C
- LDX #$00
8 y! M3 Y. T6 P - LDY #$08
! X/ X2 n: @' y9 t - .Write_Data
8 R6 M0 x' R% h. N - STA PPU_DATA4 v) y4 P Y2 v8 x" \
- INX
6 w K" a' V& r# j" j& U- @" x1 Y - BNE .Write_Data
% C X. t. a+ r6 G2 D3 Y( d - DEY
* P' Y8 @; Q4 L7 X - BNE .Write_Data
* C, `/ z. G4 [ |& k- t - .End
/ M/ ~7 X: C. b - RTS6 a6 H2 s4 y3 j
' a1 a0 o: [6 u3 y: n- ;======================================================================
" R3 I6 k: i& K/ }5 T& D7 w - ;音乐曲目切换 X: p: y4 }5 }/ s1 \3 c) v# @
- Music_Select_Process
( a9 g" f3 A; @# C - 4 y: ~0 a9 }" G, G
- .Pre_Music;上一曲
b! D8 U4 D. D# y+ g' E - LDA FC_Gamepad_Once
% L& c: H- O; W3 | - CMP #JOY_KEY_LEFT
7 l) J/ G4 z, J% c4 V. X - BNE .Next_Music
+ p8 f ?; B4 [. y - JSR Music_Play_Pre. b. K% B! r9 b1 A1 M
- .Next_Music;下一曲
5 ~; n' D1 D) N. v- n; _' C0 d7 s9 f - LDA FC_Gamepad_Once+ e$ O- q3 @# F' M5 i
- CMP #JOY_KEY_RIGHT5 K6 \2 E/ b) g* d/ x
- BNE .Next_10_Music
2 @7 Y( _. M! x; L9 B - JSR Music_Play_Next
3 p0 Y, o1 S, k - .Next_10_Music;上10曲
0 ~7 z& ]' ^7 H1 d2 l - LDA FC_Gamepad_Once. {! Y% d9 H/ N
- CMP #JOY_KEY_UP& ?( V6 G8 T4 c8 n
- BNE .Pre_10_Music6 s+ U* y; H/ ^: p- G8 S
- JSR Music_Play_Next_106 H; v$ M% @5 p* ?8 S" l) I( W% J
- .Pre_10_Music;下10曲 _- ]' i* @% Y, n
- LDA FC_Gamepad_Once% z1 M* u, x/ i$ l" X4 G" J) y
- CMP #JOY_KEY_DOWN
' V/ Z7 W3 e. R4 c) l& W/ g* F - BNE .Reset
9 e m8 W- C& B, E* n& o( M - JSR Music_Play_Pre_10
: T N6 A3 @; m% W - .Reset;重播当前曲目; m9 ]0 J2 A, _; Y& N: E
- LDA FC_Gamepad_Once$ X3 v' C2 V$ r; ^' l s
- CMP #JOY_KEY_START4 n/ V6 D* o% P, x I* G
- BNE .End# i- a. w7 g! n j, [: N9 g: I+ Y7 [
- LDA FC_Music_Index. j4 t9 L/ V6 {8 V
- JSR Music_Init_Process, D+ t) M0 m1 M" K W- y9 W" r
- .End0 L+ F. [% }! c& H
- RTS
; ^9 T% W$ p% ]: e
8 Y6 w6 @ Z. o5 y- i* x- ;----------------------------------------------------------------------3 R6 y3 J! E7 X# L- w. C7 Y
- ;播放上一曲
! ~9 y8 G2 b, [# ^" F1 N - Music_Play_Pre8 o( y/ ]7 H- Z
- LDA FC_Music_Index
. F, y5 Y4 h9 i6 { - BEQ .End
; B) c& \ g- O6 k3 E - DEC FC_Music_Index
. |$ m8 V, g$ ? - LDA FC_Music_Index
; Q+ i9 A2 t0 k1 r& { - JSR Music_Init_Process
, r O: |) g' o+ {8 I$ y* h! s - .End; I+ D4 d1 i3 O! a
- RTS4 c/ a/ e0 ~4 p
- ;----------------------------------------------------------------------4 N- F4 z3 A5 k* v l
- ;播放下一曲, Q9 ?3 q0 ~3 ^- Z& K
- Music_Play_Next* d& |8 J, J5 h/ g
- LDA FC_Music_Index
7 r. o$ H S9 b3 H8 E' |; x& v* X - CMP FC_Music_Max_Index, [: I. Q/ A' k( x
- BCS .End
, a6 d% {+ c/ c5 z5 r# d3 S6 N - INC FC_Music_Index+ L$ ]* I* [4 c4 N
- LDA FC_Music_Index3 F A/ ^. j5 L' F
- JSR Music_Init_Process% s+ ~% A8 p! \, {0 R+ [! d- y
- .End4 r) \- g. Z) e
- RTS D) ~/ g/ g- S& P% Y. t4 N" } G# Q
- - u8 _ y* g$ U: G* o
- ;----------------------------------------------------------------------
5 B* v! h( `7 @ - ;播放上10曲3 _* C' [& x1 ?% T8 k% k
- Music_Play_Pre_10% M5 E/ K3 n- C" R% P
- LDA FC_Music_Index% e0 |6 V: i3 R7 H7 i7 G
- BEQ .End- I( Y* P+ _: {& V
- SEC3 K) S7 F$ W& m! V3 Q5 ?0 a$ e
- SBC #10
- W% @8 a7 a3 |: H( i, F/ O - BCS .Pre_10
) S+ H& }- [( h/ D6 v1 M/ e4 Q - LDA #$00 y8 ^" ^" @7 N0 P% x7 z- t
- .Pre_10
; W5 D+ [. \# z9 t/ T - STA FC_Music_Index
6 L6 M$ A: B) p, n% X8 Q - JSR Music_Init_Process4 T. U8 N4 X6 s
- .End5 D. [( o' L7 Y9 \
- RTS* y" ]" G, B. j
- ;----------------------------------------------------------------------
* n0 R( j# B2 g6 o8 e - ;播放下10曲+ D$ a$ i+ A; P
- Music_Play_Next_10$ M& _ }/ n8 E/ X" r' t8 U
- LDA FC_Music_Index" |( ?- C! k* k' }: N( I' I
- CMP FC_Music_Max_Index, b6 m. R2 e. W
- BCS .End
9 N; |! m- W! s7 @6 P9 _4 @ - CLC: W1 p' P7 M1 {6 K7 o% n8 F
- ADC #10$ e+ C' |3 X }# e& E5 g9 J# g2 v
- CMP FC_Music_Max_Index) N: i9 J: ~9 h4 x/ |
- BCC .Next_10: Y6 o2 _& l+ [! \* S# n Y
- LDA FC_Music_Max_Index7 q1 W$ {, E _, ~
- .Next_10
; e; o% N7 a. T; O# } - STA FC_Music_Index A2 p$ R% a- M! E- L3 E, A1 ]
- JSR Music_Init_Process
' y; F3 Q2 G6 Y - .End4 g; I9 D3 G$ l5 Z7 w% P
- RTS
6 E: _- o$ \$ {- L9 C6 s! f" F% e - ' x2 w% r6 J5 X! ?
- ;----------------------------------------------------------------------; M9 z( R6 Q( F( r' K- W
- ;8位十六进制转3位十进制制0 n3 t9 S) P/ n ^) \ [/ h9 l
- Hex8ToDec0 j" y. M- k& W
- STA FC_Dec_Data_14 G' D* z# N( _: l
- LDA #$00
2 x3 |9 j" h0 L+ A, j8 Q - STA FC_Dec_Data_100# O7 H/ r, S3 f! a
- STA FC_Dec_Data_10
; O, R0 i3 T7 p. V( ?9 E - LDA FC_Dec_Data_1
7 Y6 F& F7 X1 ]5 o: @ - .Convert_100
7 J4 `1 {( a: o2 u( @ - CMP #100
6 Q% N& |: `2 d2 z3 r- x7 |! U - BCC .Convert_10* T2 [/ }; h: p9 n+ s
- SEC
9 b3 U$ l: }8 h* f V - SBC #100
0 Q9 p7 w1 _: W# s - INC FC_Dec_Data_100- P9 B* g) B: D b/ K% \8 @) f1 Q
- BNE .Convert_100
. S, k+ i5 C7 u, v7 s0 q$ v) Y7 t3 L; v - .Convert_10/ ^3 i+ @' B* p( m! J0 f: f
- CMP #10
6 W: U* q& _& L2 j6 ~- h1 N/ c4 F - BCC .End
! O$ g. a+ C0 ^) ~: v+ ?! U' c - SEC" a3 z* m, K9 E( {
- SBC #109 [1 k" o9 V7 g% A5 ?
- INC FC_Dec_Data_10
* G9 r0 `, K u, @/ U! K! c; w/ A0 K3 { - BNE .Convert_100 }! H- F2 q- y7 H8 f5 W
- .End+ s9 s2 O& r' \/ P7 N
- STA FC_Dec_Data_1
; j. a; C- T3 ^ - RTS8 m# O" t4 ~1 T4 Y* W4 J
- # e# C" i% Q+ Q$ L$ H) T& v
- ;----------------------------------------------------------------------
: m. D; f T% J9 q" V - ;显示曲目信息
3 [0 Y) W. E' N* n$ g - Music_Info_Display7 t# \# g* H1 W0 I+ b) I6 R& Y
- LDX FC_PPU_Buf_Count
+ `* c: p. I2 U. k r; r2 r - LDA #PPU_WRITE_MODE_CNT_LINE
" B" J/ T! T$ D9 e - STA Use_PPU_Buffer,X
! e; G n$ x$ i5 c1 e - INX
8 [/ `% e) V: P3 I) V, ] - 6 C% t# V" w- g
- LDA #>MUSIC_INFO_POS% q/ \3 ^7 p: [8 m( |
- STA Use_PPU_Buffer,X7 K3 |* b T3 v
- INX, l+ s" d# V' }' }5 U$ w2 r
- 1 x6 o& x1 X, O' G
- ;居中+ Y ^1 e& Q c" r
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2# j) m* u9 {% N( b Y, ~" a
- STA Use_PPU_Buffer,X
9 W3 v1 e) P7 E. ` - INX: i; C# v3 }- r; E r% Z* Z
- % p! w+ H& c! E7 J, g* g
- LDA #$05( _( n0 Z$ O2 X9 E# J0 d( n8 K
- STA Use_PPU_Buffer,X- N, y, _& m/ Q, W0 |. k& n
- INX( s# }2 K6 a3 x I2 {
-
" O& V+ q* i5 q - LDA FC_Music_Index( Y5 o6 W% ^. }+ j4 T W
- CLC/ W* z+ `8 h( [3 P- c1 t, j
- ADC #$01
9 U0 O( D; H* @0 s7 \3 k2 d - JSR Hex8ToDec# }2 o- U/ g6 [4 ^6 u* J- u
- _ L& I# {0 }8 { d3 P2 ~
- LDA FC_Dec_Data_10
( {- j* b7 @% e% Y - CLC# y$ a) }+ r% ?9 Y5 h# G" Y( x
- ADC #'0'; c6 B% E0 |) S2 v7 P% y/ p
- STA Use_PPU_Buffer,X
, s- ^3 o% e2 a; e' H' s - INX3 W# }$ g$ M( L l& e% @
- * q7 K3 D- [7 Y9 ^
- LDA FC_Dec_Data_1
/ x8 q2 Y0 \5 x4 r: T - CLC
3 g* ?3 D, Z- x - ADC #'0'
! w" ~ W8 I% n0 ^ - STA Use_PPU_Buffer,X6 _8 m. b2 ?2 I. U
- INX
0 c& |) A- S, e0 t/ K - ]% n- h8 F4 w! n; r: D
- LDA #'/'
H T9 i) @$ ^, l - STA Use_PPU_Buffer,X+ x) v# [; [- Z% \7 h5 G7 z& j) E
- INX
/ l. g0 G6 _7 \1 h1 { -
1 X7 D5 |! G4 P' w6 `3 d9 z - LDA FC_Music_Max_Index- G1 ]# X5 @' ^5 Y% J; `, p
- CLC
, B7 C. f9 L& P. X5 H - ADC #$01# o5 K7 x: a7 z. C1 R$ ]
- JSR Hex8ToDec8 X; L. H, z0 ]# c6 D& `0 A$ I
-
5 D% Q, B0 ~6 H) B - LDA FC_Dec_Data_101 I$ S" I9 ~1 J4 d2 F0 Q5 u, m
- CLC% E$ C4 @& n- {9 s8 m; ?
- ADC #'0'# n G0 q) U+ E- L3 n
- STA Use_PPU_Buffer,X# h/ w! Z2 b2 S9 d; n9 L) F
- INX
8 g/ [3 C. B' n7 a" f9 a -
+ Q# b- {" Y% ^ - LDA FC_Dec_Data_1
* p% O6 `/ ?7 ?2 h4 E - CLC
+ E( g6 s6 R. r+ X: a" j% E$ k - ADC #'0'/ d! M& @; w/ G
- STA Use_PPU_Buffer,X
) w" `3 b* [ z: f$ c - INX
' [; B3 I" I: q F3 s4 Y4 G - % B# S: C# z* _' W6 g
- .End
2 B1 q B/ d' D% {9 A - STX FC_PPU_Buf_Count
. z! I6 w, A b+ ~9 ? - RTS
9 |' K- B" c1 T# ^7 o
S3 w: [5 e. D- ;----------------------------------------------------------------------2 y# u) H4 X3 d+ A# {! ^/ {4 V
- ;音乐曲目初始化处理- r( ?- k$ s! y4 a9 v, s2 ~1 v
- Music_Init_Process/ A* T: _; C, {0 N6 e
- PHA2 v' @% H) f, A. q0 L$ e4 i! w% L$ W
- JSR Music_Clear_Process! \ S8 E' g3 A/ g; `" ~
- LDA #$1F
" V* A4 d& t0 F6 ^& v - STA $4015
W5 U1 Y" Y$ `6 z, H# B - PLA
7 Z4 P4 G; ]+ Z* x& M - JSR Music_Init_Addr( }7 j: i! o9 _- A- ^
- JSR Music_Info_Display
& `5 ]4 x- v/ A8 K1 l2 x% h - RTS
6 t! y+ d7 r! O6 c! V! J) E8 R+ R& h
4 {& d4 I; v% Y3 j8 l5 f G- ;----------------------------------------------------------------------
' ~; G+ s4 w/ t - ;音乐播放处理1 K o8 n M& f
- Music_Play_Process! f3 l( x5 k( G
- JSR Music_Play_Addr+ O/ m* x9 [+ R6 X0 t
- RTS
b y1 L- \2 F - - A6 T! V8 _% ~
- ;----------------------------------------------------------------------9 x1 N. |( i) J! C5 k
- ;音乐播放处理
3 ~5 |% Z8 t. V U - Music_Clear_Process
. j. Q* s( X3 i2 g- { - .IF Music_Clear_Addr# t3 u$ a% U9 H1 a2 \4 N1 T! d! }
- JSR Music_Clear_Addr
& w7 `. F* r" C" v4 O; N - RTS" j& i7 W' i# {1 s, ?( \ L9 n
- .ELSE" e9 x. T6 {! a' v: y* h; a! v% I, n
- LDA #$1F6 d* Z" b% A6 Z/ o* B# o
- STA $4015
5 w( w, F) u4 C$ e$ w5 N - LDA #$001 S3 P! A! n# q+ I: e/ j
- STA $4010
$ j: D9 x7 w) L0 A' n P- L - LDX #$00
7 H& s# C" |1 \- }+ a) b ^ - LDA #$00# [/ y7 G; T. Y/ u- v/ o
-
. a" _. K# \1 Q3 U& H0 u - .Music_Clear_Zreo_Page_0% R5 w& T6 `" z9 e! v* `% V
- STA $00,X4 B6 z3 j+ ]0 `" U1 t
- INX& d5 |9 F! j9 j3 C0 a% u/ o- a v
- CPX #Use_Zero_Page_Begin- ~7 j# K* |* r7 G
- BCC .Music_Clear_Zreo_Page_0
0 w: [' Q* E7 z( R. R" M4 K -
0 D- ?5 N4 D" h: x! a8 I - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size+ B# f4 Q8 A7 M
- .Music_Clear_Zreo_Page_1
! F8 h0 H$ Y' }' r* ~! T6 l' s - STA $00,X
9 T( E1 L* K/ t3 N% A3 L4 U - INX
1 ]3 f$ `/ b1 V; i% {1 x. j( {2 K - BNE .Music_Clear_Zreo_Page_1# }6 h5 w. k2 @% p* x
-
$ X9 T! W6 b- E2 d! H2 O - Music_Clear_Process_1
1 A, X' y6 ?1 |/ n* L8 W, |: `, z' j2 z - STA $0600,X6 y d7 @/ I# O/ r% l' h
- STA $0700,X
/ X" o& I, |6 v1 {2 O4 R" ~ - INX
7 G$ I+ B ]1 J - BNE Music_Clear_Process_15 Y9 o$ `8 C* z1 m+ Y: G
- LDA #$105 Y, y- u' [( Z7 [; h9 `' G
- STA $4000
3 |( t, l, j. R$ a. R% t! ? - STA $4004
. I0 Q. a1 b0 C& v6 w - STA $400C
! t% ^* y3 {& g+ f; I7 X) D - LDA #$005 T) l5 K9 y) t6 b; b
- STA $40083 V: @, H' z! L( W. k
- LDA #$0F# e. \- a& G+ `' b g t- @
- STA $4015
4 W$ | A- \% _) H - .ENDIF
8 E0 |5 |; P- O- v U -
) M) ?% B( Q% Z0 M" ]: Q1 A - RTS8 z2 d7 D2 w* n z, |
" D7 V* S# k( F' _; {6 E U- ;======================================================================6 [) _! S. i5 W0 g7 F% P
- ;重启处理3 U4 g! b7 |, I0 ?5 N1 t, V
- Reset_Program! Q: q' z- |' P+ K. x
- SEI2 V9 c" A* s( z6 n5 F, A0 p
- CLD
1 b) h# C( c5 L! T' R; Y. a - LDA #$00/ Q6 d d& Q; a* @" J
- STA PPU_CTRL
) y8 [" ~1 H! p$ v! `" u - STA PPU_MASK
0 e6 d. Z2 B8 m - STA JOY2_FRAME3 ?5 W9 J% K. n7 f+ w/ ]
- STA APU_STATUS3 j. _6 K8 [: G5 z4 {3 e6 R3 L5 f8 _
- 6 y9 a- b3 X* { c
- ;等待屏幕准备完毕
" O; S& J% p9 a2 k) O; w - LDX #$02
K5 D7 M4 r) y4 \# _2 u3 T% _ - .Wait_For_Screen_Ready3 e5 b- e' L. Y; j e+ k/ ~
- LDA PPU_STATUS
* T. T# K' Y( m0 O3 ]( n( ~% I y+ M - BPL .Wait_For_Screen_Ready& H6 D. h+ o& |- T1 x: u4 }
- DEX) |; k w% P4 _8 H, P% u% J
- BNE .Wait_For_Screen_Ready
, G P7 y2 d3 |( s7 O" G1 v' d - ; }7 Q$ n# P+ Q- p% o# U. V2 d
- ;清空调色板8 k& }, C5 J$ X( A0 q5 E9 b) K
- Palette_Clear
( M! V( F) [9 l# E1 w# }& w& p" w - LDA #$3F
# }! N, Y+ H6 d6 G& M& ^+ _ - STA PPU_ADDRESS! C% D" R! U1 v4 i6 n9 v
- LDA #$00/ h w6 r! U, g# `( k* x9 e! V
- STA PPU_ADDRESS x2 h V. E' ^6 b: s& V% W( o' g/ \
- LDX #$20* j' Z- v- v' u
- LDA #$0F# u2 a6 R9 j4 `: m
- .Write_Data
! j3 I ^& ~+ s$ f; C8 T5 W - STA PPU_DATA0 H( {" |9 q) n6 Y/ l$ \
- DEX# P6 Q ]$ d1 b
- BNE .Write_Data
?3 ]2 S( j! p1 g+ P* q( ^
2 L8 L' r* j& p: s6 _' `0 Y; x- ;清除声音 $4000-4013' z/ y' W8 t3 H
- LDY #$140 N l, @, [9 b1 J4 V" L8 [
- LDX #$00
! ]: ~ I& J5 L# g - .Sound_Clear8 D) U# Z. F' s: j- `0 I$ M
- STA $4000,X
* i* D6 m5 @+ B: @6 B" F3 K - INX) `/ ?! p+ @' ?8 o4 S
- DEY# L: s, }3 j5 n8 t! A7 K
- BNE .Sound_Clear) O# J# L( p' d) n+ M
-
- U1 r @5 |% O, n' F1 a b8 b7 A - ;清除 RAM $0000-07FF" k8 Z9 {7 @! i7 M; X6 e; F! d
- LDA #$00
6 G! q$ u3 C8 ~& q - STA $00
/ |) t6 {6 ^3 ]3 \& d5 m8 f/ W - STA $01) _& M$ O8 @5 u& F0 a4 P
- TAY
) p6 B [3 ?; ?: @; ]: h2 j5 L - LDX #$08. l- b: H6 ]+ I" |5 p
- .Memory_Clear
q. [8 F/ B" I+ m1 U - STA [$00],Y
4 ~$ K" G$ t! A, {$ f! C - INY
! x7 S6 A! i0 m) G8 z - BNE .Memory_Clear$ ^6 B8 i+ f% ?) e, w
- INC $01% Z/ w0 V# ^+ G" u* C' i* C
- DEX# v! P- |) @2 o* q
- BNE .Memory_Clear- X' k3 S7 f) P
- # V1 V) U, P4 Q+ H- t# ]
- ;精灵缓冲初始化& N+ d$ N0 t5 t& I7 L
- LDX #$00" F8 x8 t% q6 J; K+ v
- LDA #$F8, Z7 t* J9 Y5 P+ m" j7 c
- .OAM_Clear2 {7 ~4 p; a. j1 p% f0 v
- STA OAM_DMA_Buffer,X9 A& ]6 A/ i8 ^6 e& F2 d
- INX
8 R; K+ G* w+ f" d0 ] - BNE .OAM_Clear$ U; `5 z3 r$ G l0 G
-
) f- Q- }6 p! u* H3 c/ B- D - ;栈指针初始化
8 _' J7 p2 h+ z9 `- K - LDX #$FF
5 _7 f. `: }7 ]0 W. |1 O+ V0 Y - TXS e# C, r( Y0 F4 u6 |" \
- ) R, J5 j3 @+ X/ F* k- U
- JSR Nametable_Clear;命名表清空
! E9 L/ }9 H' Y - JSR Palette_Init;初始化调色板缓冲1 \8 g) M) n9 z. c, d/ \
- JSR Static_Text_Init;初始化静态文本
% f; B6 y$ d' p7 P& d: H -
) d- K( [$ b' B& w) F% A - LDA #MUSIC_ITEM_TOTAL - 14 X+ v/ ^6 J$ W" g
- STA FC_Music_Max_Index
" n0 I/ I: `" Z( G" H X% F - / H8 t, W" [8 j' U& I9 U! u- L+ f
- LDA #$1F$ [, D) a& V* |/ u, S, S$ A( e
- STA APU_STATUS
! s `/ M% D- S5 y - LDA #MUSIC_BGM - 13 i. u, J5 ~: j, S% c
- STA FC_Music_Index
0 Q9 t2 C- A( \' _2 `$ {; N - JSR Music_Init_Process;音乐播放/ |. C* R' h' @2 i6 Q8 V; e/ |
- " w. q. [, O" Z
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 F' R% p: m+ R - LDA #$1E& U. F% S- ^8 G8 n2 D
- STA FC_PPU_Mask_Buf; h4 T9 j4 h# G
-
* [$ Y" G" t; [# e. ]6 N# W - ;启用NMI处理( g7 Q3 M9 W5 k' I1 }
- LDA #$80( j, l9 ^. S( b. E& ~/ `
- STA PPU_CTRL/ n8 j8 j+ m" R" ^' w
- + g( j- q9 o& B" i
- ;程序循环, 剩余工作交给 NMI 中断处理3 q1 D. v8 v1 K6 k8 R. E. S
- .Loop6 \, r0 s) o3 e- Q" R5 O" \3 y6 ^
- JMP .Loop
1 E. Q' ~( @5 e( x
+ \! W' i- U1 d* E& R" N3 K- m0 O- ;======================================================================
7 t6 z8 S. i1 `0 J7 O2 | - ;不可屏蔽中断处理
9 ~) H+ _* h( s! @ - Nmi_Program
: I5 i, @: S. y5 P0 B- s' V - PHA
: n. s% b3 h" J8 R - TXA0 V7 {$ U) }/ f! R0 y
- PHA L- c1 n+ B) Y6 r
- TYA
% j c& G W2 G6 B5 E4 s* R- Y - PHA
, b% P9 z" h4 y0 S1 }+ S; { -
8 a, T: P6 R! `& ]+ j - LDA PPU_STATUS;读取使得 PPU状态寄存器复位; L- U% a. _1 G6 _. t
-
9 t! Z# O! Y% E$ d - JSR FC_PPU_Procrss;PPU处理1 o5 n) b3 {, e7 A8 f
- . L" @7 P2 ]* ?- I1 F& H
- ;精灵内存更新; K6 a5 L' J, {- o* ?
- LDA #$00
0 \6 W- `; k* c' W8 s - STA PPU_OAM_ADDR
, B4 g' c% u% ~6 ^ - LDA #OAM_DMA_Buffer / $0100
2 l2 B. K6 N3 r+ l! [& n - STA OAM_DMA
# M6 r9 Y/ Y6 q: ~. k - ; n$ `, O* B t3 D- z7 Z2 [9 M
- JSR FC_Gamepad_Process;手柄输入处理
$ G' F( U; G/ q! w - JSR Music_Select_Process;音乐选曲处理% K. m( g& d- k w: h- c
- JSR Music_Play_Process;音乐播放处理& J$ g) w' s. z H6 n+ S7 f
-
8 ]7 w7 @/ s, m/ ] - PLA
' H1 E$ h" n, s: p! H/ |) k - TAY
; f" f* Y3 \: p1 Z9 N( B - PLA" \! z7 x" D1 s- m- T# \
- TAX ]5 B; m6 c3 M- [& W
- PLA9 K' s# f+ T9 A! b! ?, V' K' X
- . i/ u4 }5 v/ p g
- RTI
: T2 {9 I) K8 W - 5 B- ? M$ P6 Q! D
- ;======================================================================
$ l1 |5 f3 F5 c, D - ;请求中断处理
) c9 g' P5 s j \" p - Irq_Program% h4 s3 F4 M; ?$ ~* q1 F( g
- RTI
3 `- C% H" g. n - 6 S+ M$ n; O0 H6 _' Q4 [
- ;======================================================================
/ |% x) G" X& W9 w - ;中断向量表/ |/ V, j: a- \! F9 m% l
- .ORG $FFFA
6 u4 M5 X/ W' @ n2 Y& O" j - .DW Nmi_Program ;NMI触发时执行" |3 {: k/ V/ W3 j! I# I4 n! S$ _
- .DW Reset_Program ;载入ROM时最先执行$ Y4 J/ |2 n, ~/ f7 K
- .DW Irq_Program ;IRQ触发时执行" @5 }6 _! w. b0 t2 F
复制代码 # _2 X7 V; X1 {
% s6 n6 |& h3 D6 {
$ H; G0 {5 O5 n9 k6 k/ xhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|