|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
* f5 p( o7 U# r; c; J8 H9 L T- d
' d7 s3 V- T: \& i, p1 [以下是主框架代码:
9 S% N1 Q! ] R% O. J6 q- ;======================================================================7 g _% F- Z4 F7 E9 s4 S; B1 s% \
- ;文件头
) K3 E( T5 |2 n4 Z% M - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
$ U3 M6 ?$ J2 Q! U, N - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量) B4 A1 g/ r0 H! e, M
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码4 D# V/ X3 e& W6 t' P7 k/ U% d; M
- ;======================================================================
4 M, r: f1 `- k) n) x4 u: f - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2 x6 o0 D) P) [
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1! p9 [9 W6 {) U4 Z2 m
- ;======================================================================
( J3 T5 N1 k/ K. j0 H - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! W3 w# M- c4 `! @& i/ z& V - RESET_ADDR = $E000 ;主程序起始地址# B3 b' R8 h; d& _
- ;======================================================================
; g$ G/ ?" J3 g: \! O) z/ B6 O - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
9 ?! X) X, N) l f; R - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
4 m( L& c% f8 j/ G* F4 v0 f) o/ L - .INESMAP 4 ;Mapper号 (0-4095)
1 i! A. b m1 V1 {+ |; u# t# ? - .INESSUBMAP 0 ;子Mapper号 (0-15)
* \+ n* `' E2 ^$ b, q - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
) K( v7 z a9 @ p- S' u2 H - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 A& I" W" B/ A - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)7 Z5 z4 f t5 ?
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
6 \) y" H5 z3 L/ ? - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)" M! p& \6 d$ n7 C$ M3 x
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
" \) o% Z: E/ j% U4 N) g - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)5 u3 @, P! K0 ~7 o, Y: g
- ;======================================================================- i. P; C/ o, k2 C% ^
- .INCLUDE "fc_demo_config.asm" ;全局配置( ]; X5 a/ _; y1 a
- .INCLUDE "fc_demo_constant.asm" ;NES常量
0 M$ V7 V$ @' i" W& | - ;======================================================================6 s' Q9 ~6 s: H7 O, I y. e
- ;音乐配置
+ y1 J# {6 I2 y - .IF 0 = MUSIC_THEME
3 s: w2 u! \! E$ I9 B8 h5 M - .INCLUDE "data/music/Gremlin 2/config.asm" J% X l8 {1 L6 _) z8 } j
- .ENDIF# V) M, P, M: b. Y$ h
-
: n6 P: u/ T& l/ x& T4 | - .IF 1 = MUSIC_THEME N: H; i; R$ o J3 ^/ @/ U0 D" N1 |
- .INCLUDE "data/music/Raf World/config.asm"
4 c: E/ J1 [" D; T - .ENDIF6 R3 X: h4 @$ P
-
2 _: `4 @& Y. J7 |& m1 n - .IF 2 = MUSIC_THEME " ?; ]0 a% u% L8 q
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
2 Q/ s+ [. t+ Z3 v% _! S& ? - .ENDIF
- T- D( b" S2 o1 |' ^ e; e - ) l* p7 `& o) d: q
- ;======================================================================4 n" n- T5 V3 Q
- ;引用CHR图像数据
- i% h" V( h2 J" M - .BANK NES_16KB_PRG_SIZE * 2; L3 N0 y5 \1 v
- .ORG $0000
" U/ K1 m* r' N - .INCBIN "data/bkg.chr"1 A$ F; N& N1 e/ _4 f0 A& G
- .INCBIN "data/sp.chr"1 U/ p9 H) |- y/ p
-
( D! H% t, @2 i3 {' Y - ;======================================================================/ g1 h6 q6 g( M0 W# e( Z! ]
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank K# k3 U- R r
- .ORG RESET_ADDR
. d3 f( a1 ~' S0 n( r% ]3 S - ;======================================================================) J- Y% w; \9 a" K* X: q" K
- ;引用其他源文件
# N0 @( ~% n% Y( `. C$ t4 i - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
! n' z3 n; M, t: l - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
6 l/ P) e! ]' w3 G$ k, K- w+ L - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
% p! E' A2 z2 B- i3 g9 n+ L p - ;======================================================================
9 t9 j, Q1 O3 _6 J z/ ~) w - + L6 R- A( j7 e/ b6 ~
- ;======================================================================
9 O+ P6 A6 D/ }0 I, I: j - ;等待VBlank到来8 `& G8 ^) x W' {1 r1 l
- Wait_For_VBlank
$ q) r( Z" H/ m8 e( O: M' } - LDA PPU_STATUS
2 ^$ }4 b: H7 Y% U - BPL Wait_For_VBlank
5 W# Y/ c& F( X5 }8 {0 C - RTS
# Z- Q9 M" o5 [0 U/ t9 Y - 0 z; ^8 o$ M% o
- ;======================================================================% M8 S; V* {' |2 \
- ;调色板初始化, D# b! O# {; J, A
- Palette_Init; s* u6 Q2 E6 R) g8 A4 f" ], b
- LDA #$3F
2 J# b& X. P4 v5 J. g, x2 o - STA PPU_ADDRESS5 [" V V0 G a8 ^: N r
- LDA #$00
0 J- z2 g0 }' y% R - STA PPU_ADDRESS
$ ^% A' Y& F3 f - LDX #$000 J+ L9 `7 v9 `
- LDY #$20
5 L8 H: `5 V6 J( ]- d& P L - .Write_Data- |/ J2 M% _+ K6 c
- LDA Palette_Data,X' i/ R! e* K+ A7 i+ _- O
- STA FC_PPU_Pal_Addr,X
+ B- X u( g; k) B8 Z1 _ - INX8 P8 C. G3 m. h
- DEY4 ] N! L) c8 w
- BNE .Write_Data
0 o+ l( ^6 Y: H. v& G! b* J7 p - .End) \5 l! d! N. `/ N4 J' Z4 N; t& i- |& X
- RTS
, H: t5 ?3 t$ K - , |' A- _: e4 i; K
- ;----------------------------------------' ^. J# |1 i7 v$ d- y8 B
- ;调色板数据
# ~' O# U4 D1 u6 b - Palette_Data' e- V. F: |2 O# O7 z
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B3 k2 l, T+ a. F( |
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22& g1 ]8 m9 u& b6 R5 {4 } C
-
, ^$ L$ N0 \& s, o$ B2 ?( A% i - ;======================================================================
, @+ E1 M3 _# k9 ^1 K9 U! G - ;命名表清空
! y. ?9 J5 Z6 P* l7 X; ?" o1 v! w- ` - Nametable_Clear
5 O& P9 V* Q$ v - LDA #$20
6 ]/ y$ v1 o. [/ @: D - STA PPU_ADDRESS
: O) `$ U$ @- ?- e& O/ Z1 S. ]' c8 S - LDA #$009 V2 M4 @+ h. i2 O
- STA PPU_ADDRESS
0 ~+ u/ @* e: n: i# ]( r# j - LDA #$00$ V5 B: d' J4 E* |& B
- LDX #$00
( b4 C2 I% L4 ]6 S- l - LDY #$08
& Z7 F: v3 @. t$ ~2 M2 b0 }$ L - .Write_Data
. ~6 R- T' ~! g - STA PPU_DATA
/ j, j! I1 v; T: k! P9 W - INX$ n- s) v5 Q0 ^% u1 a# I
- BNE .Write_Data( P( v2 _ e; S$ s
- DEY% v6 r; M' u& n$ U* j0 k, M7 Q2 O$ |3 L
- BNE .Write_Data
+ h! M3 R7 E: y) x% s - .End% v" R& C5 d# E2 N6 m/ m8 \6 S
- RTS
3 p! m* }+ Y6 u& B1 }7 D - ' T: V" N( D s! w
- ;======================================================================8 x" A) t( ~: w/ u2 A0 f
- ;音乐曲目切换
) d' a1 _9 q& \1 Q - Music_Select_Process
4 H9 C' w% A9 }0 ]7 y
$ g* Q+ B( O+ D. Q/ e- b- .Pre_Music;上一曲8 n* M* ]7 T) [0 l
- LDA FC_Gamepad_Once
; e$ X+ s; M- s2 E - CMP #JOY_KEY_LEFT) C& ^1 I+ M+ L5 v$ F
- BNE .Next_Music! u. Z9 p# Y' n1 c3 @- [' j
- JSR Music_Play_Pre, t4 M% J/ C4 i5 o
- .Next_Music;下一曲* X6 e( o' p2 M
- LDA FC_Gamepad_Once9 M W; |( b& M
- CMP #JOY_KEY_RIGHT
& k- i- R, R, [- [ - BNE .Next_10_Music$ `7 [, ?, U9 {
- JSR Music_Play_Next
1 H4 a/ {: j/ h2 O. s# x - .Next_10_Music;上10曲
/ W. G3 s! [/ y( i+ d X" J - LDA FC_Gamepad_Once) e& d3 L( y0 [; d0 N/ ]) c
- CMP #JOY_KEY_UP2 j ]. M) U: _6 c- k$ h
- BNE .Pre_10_Music+ E% {) B1 c$ L6 k/ f# B. G" C
- JSR Music_Play_Next_10
) J8 H1 M0 ^0 [+ A* _2 U - .Pre_10_Music;下10曲
/ n5 S! t B! S - LDA FC_Gamepad_Once8 {9 P" Y) n% i) E" k
- CMP #JOY_KEY_DOWN
- {+ Q! n8 s6 p5 i7 c4 g/ r9 z - BNE .Reset" A, @3 f7 w4 I2 m3 L2 r, h6 k
- JSR Music_Play_Pre_10( [+ E3 r' t8 H9 g
- .Reset;重播当前曲目
" e+ m. p. l& b$ ? - LDA FC_Gamepad_Once6 g8 Q* K# v$ c9 }0 @+ n
- CMP #JOY_KEY_START
. c. n: }" p' A" p8 o) m5 v - BNE .End8 O9 D \" e/ N3 b9 [6 a
- LDA FC_Music_Index
1 U7 S" E9 N8 g - JSR Music_Init_Process
6 c, C7 b+ T! t - .End
2 l8 r1 V2 q, c! s/ S1 L - RTS
8 Y. H! [ B4 v, E$ d5 {, x - # S. {7 h6 N l9 m. A) A& |
- ;----------------------------------------------------------------------
( C0 \ ^) {7 S' i% Y' _ - ;播放上一曲& u" I( _5 c8 V+ c
- Music_Play_Pre. d2 w) X& N" r& p7 q
- LDA FC_Music_Index0 H- a2 c6 p! X3 |! T( U
- BEQ .End4 [+ S" m, z" G, t- w' @3 l( o
- DEC FC_Music_Index, g b: a7 q! L6 ^! W& v8 ^
- LDA FC_Music_Index
& _2 `6 x* G. \) S - JSR Music_Init_Process
. o! t ?/ N: Z% P( `" j. E - .End' U# T2 z/ q- r k1 J
- RTS9 A3 ]* H1 @2 J0 o2 L" O2 X
- ;----------------------------------------------------------------------
8 E1 S9 J5 q/ U) I' y1 G/ Z, J7 _8 D - ;播放下一曲
, Q6 a s @: B! q - Music_Play_Next: T6 n$ C( ~* s& F9 ?; g8 a; N6 |0 b
- LDA FC_Music_Index9 O M7 u3 \9 k. {
- CMP FC_Music_Max_Index, J' ?. T: G2 h: q3 z
- BCS .End
' ~4 U- e+ X; o* ~2 N9 U# V# r, g - INC FC_Music_Index
4 L8 `9 a% k4 G# ^! w N, Q$ R - LDA FC_Music_Index1 H3 F4 ^# T) L2 o d
- JSR Music_Init_Process
) m$ M% l) d% q - .End5 G! a! J$ V" j3 w- A
- RTS
C2 Q+ k& I1 u
0 f7 o& b0 m: t+ D$ G6 H4 `; K- ;----------------------------------------------------------------------
2 U. u' n0 j% Y2 a; Y: N - ;播放上10曲6 X( d2 w9 q0 _
- Music_Play_Pre_10
7 _+ g; Q9 d) O/ k7 t: U( R - LDA FC_Music_Index3 G+ F3 W/ Z1 e/ \- x, f5 `
- BEQ .End7 J0 Q) f$ A0 ?" Z
- SEC
! U3 h& n( ~# Z w( G. B - SBC #10% m1 n7 t. }, b4 f8 b. q2 X j
- BCS .Pre_10- @' A4 V2 g) [, T
- LDA #$00
# R1 j* l1 E1 V8 B( v8 m - .Pre_10+ I3 S `- P) Z6 e/ N7 E1 v
- STA FC_Music_Index
1 n" T' h3 ]1 Z - JSR Music_Init_Process
+ x2 i, o/ C2 x/ l* ]1 l5 V# u - .End, y0 p: m. s2 a4 U2 P
- RTS
# b1 t1 _! @ w/ L0 ^) R5 K0 P - ;----------------------------------------------------------------------
1 f5 g) i6 D& g1 W2 i - ;播放下10曲' i+ {5 d- F& p- o) A
- Music_Play_Next_10
; z9 H& D. |' {& a5 B - LDA FC_Music_Index
2 i% ]1 b+ Q+ Z7 b) k9 m; _! L - CMP FC_Music_Max_Index
2 l0 Q4 y7 [' I9 v& C0 F y - BCS .End/ }: R7 o4 j' G) N' M- A
- CLC' J4 J' K$ Y! y5 s) _5 h- }5 v
- ADC #102 i' V, H! }7 K7 Y$ Q
- CMP FC_Music_Max_Index
+ p. G% u8 [! ^# y$ V# b: ~- ~ - BCC .Next_10
3 W' F9 u6 R+ u8 u - LDA FC_Music_Max_Index; B$ c' y( e% y. p4 N7 a
- .Next_107 p; ^6 s$ F% Y) ?3 V
- STA FC_Music_Index. }+ ^" M( f. [! k* C
- JSR Music_Init_Process
7 B. h: ?& D3 g" G/ y6 g4 n - .End- F) b$ G/ X( |. N4 D9 l1 F* \
- RTS
! `5 t! z6 h% j' _0 b
4 y: M7 A( e" H7 f* ~( G/ r2 h; B- ;----------------------------------------------------------------------; q; {: R. Y. I; u
- ;8位十六进制转3位十进制制2 } D5 y$ C5 f' @# Y
- Hex8ToDec( s2 g, d7 w1 q
- STA FC_Dec_Data_14 n! F5 w7 v0 I6 [ h7 w2 O
- LDA #$000 V0 l2 c: x& m; p
- STA FC_Dec_Data_1003 H- u9 l. Z5 c) {
- STA FC_Dec_Data_10
" {7 I! e7 }" h- w/ J9 b - LDA FC_Dec_Data_1
8 ?, N( x6 \6 y4 ] - .Convert_100; c, b j: B, H8 A0 ~7 C
- CMP #100
/ }) N$ H/ f3 _ - BCC .Convert_10$ y* h, ]: q, G
- SEC
0 A. Y7 r! J" F0 e - SBC #100$ c. s. ~9 }$ K( w9 v. Y+ y& c
- INC FC_Dec_Data_100
. g! E. P- t* _8 K - BNE .Convert_100
' f5 U$ H- Z" E2 ?* S - .Convert_103 F5 y1 ]% s: |( |& W8 Q
- CMP #10/ o& X0 b- S. y" ~' ]9 t" E
- BCC .End+ L$ k9 E8 ^) R4 b( l9 c& W' I
- SEC+ R5 P$ p. s+ Q" d/ y @* o- ]
- SBC #10% q) ~7 \( |: M7 u2 ^7 J/ U( n% |
- INC FC_Dec_Data_10
& ]* t* b- [9 A/ V4 k1 b: m - BNE .Convert_10
' t- _. S1 A! h' R1 }6 x' G# ]9 m - .End3 ~6 q6 s# U# L0 D
- STA FC_Dec_Data_1# r! L, W9 o9 G( ]4 N e! F5 ^+ S
- RTS$ e. j5 G8 P" W2 I. j: w
: e* \4 d7 b- d- ;----------------------------------------------------------------------
" k8 N' p. o; k. M6 t - ;显示曲目信息% ~, ]7 P( z8 t& I6 g4 ^
- Music_Info_Display/ R1 N7 ^" H; b7 H0 H
- LDX FC_PPU_Buf_Count
2 R9 [9 H2 a# Q& z, m - LDA #PPU_WRITE_MODE_CNT_LINE
; m7 q4 O7 C! L# G - STA Use_PPU_Buffer,X; ]& C5 U- ]# L1 x# n
- INX7 f6 z: ^% B# E3 @; n
- ! j8 K7 T) c" L4 l+ R) c
- LDA #>MUSIC_INFO_POS
! j+ C6 Z# ^/ h0 Q: n1 w - STA Use_PPU_Buffer,X
2 {; m* e7 K6 y3 M - INX
3 \0 _# n; }- S$ \' h -
# t0 B9 J3 M3 z4 U. Q - ;居中
& e2 [3 P3 b* L. c6 n3 ~ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/25 b7 b2 z* ?/ f5 H. [" U R
- STA Use_PPU_Buffer,X
1 k. @+ q9 a- _ F$ P7 } - INX; K: z4 l5 r( V
-
; C5 C9 I! B `- u9 J - LDA #$052 L+ c7 N4 v. f4 O2 P
- STA Use_PPU_Buffer,X: X0 O$ {- Q; N& l3 R7 k0 b
- INX
) L d# K; l( }; J+ ] -
$ e/ A0 v2 z4 u - LDA FC_Music_Index' z9 G( W; A' E8 F3 M0 m* S
- CLC: | u9 O6 O; I' T
- ADC #$01; p# n5 P+ J1 B
- JSR Hex8ToDec
# ^0 b A" r2 o# n: s( m - 4 R2 v9 s) v, n- a3 G
- LDA FC_Dec_Data_101 q4 A6 F$ |" ^, L' y0 F
- CLC
0 Q+ V! B7 H0 W' _, ^3 z" w; v - ADC #'0'- w! a X% {( F, I- Y5 \4 N
- STA Use_PPU_Buffer,X3 |6 Y3 a& z/ Y$ x
- INX
0 Z$ L* _3 l9 j; |! E. c* ]- H& V -
! ^( e& {5 `! N9 X - LDA FC_Dec_Data_1& B+ i9 I0 R1 l
- CLC: w$ ?7 F" @+ S& M8 d. @
- ADC #'0'% m2 ^3 m' ?0 D6 k. j9 x' e: Q4 @
- STA Use_PPU_Buffer,X
* a) r% ~$ T+ I5 Z - INX$ p2 M( E' G- s$ \6 h% @
- . X8 U" f2 D' w4 m1 u6 S2 R
- LDA #'/') I n3 F9 X2 P6 {5 E; A/ C7 _
- STA Use_PPU_Buffer,X
" V, G5 l) |9 e. f& Y - INX
# `+ p4 Z5 ^/ ? - 0 z u" D) n; s) _3 m0 ^* h
- LDA FC_Music_Max_Index
# D1 ]" }8 @) ]2 d1 c - CLC
+ ^3 V" O6 i) Z0 }5 L, ? - ADC #$010 G. M. L2 q- W3 U) b3 Z; O
- JSR Hex8ToDec
- w) @! {* }( _4 C: g1 G# U# p - ; ]. F; q$ E2 M) E' S9 R1 V& v
- LDA FC_Dec_Data_10
/ A. ?$ s5 Z3 N* x; y8 E - CLC# E8 d" }& t8 C
- ADC #'0'
. Y) s2 J0 F: c6 A - STA Use_PPU_Buffer,X
, {- g3 U) k$ ]2 r6 m: J8 ~: A5 S - INX
) o3 s. D) X) S/ j; `2 @7 @& D - " L- C" q9 T) V3 I# j, T
- LDA FC_Dec_Data_1) q' z* g3 r) k! h
- CLC6 s+ Y& L8 V; A
- ADC #'0'
5 B4 D6 P [ P+ a1 ` - STA Use_PPU_Buffer,X
0 ^: \6 _) S3 o% W7 D( ` - INX
3 K3 M4 Z; \+ V -
* f# D: T$ ^' z" r e) J - .End3 e7 u( i. x# ?
- STX FC_PPU_Buf_Count
4 A/ F+ [, E0 D! ^ u; [) b - RTS
- y! d' p, w4 E( J
& g J7 A" L% e- Q5 h; b" G- z. P- ;----------------------------------------------------------------------: r! A: O! S) L- M" i+ z
- ;音乐曲目初始化处理# g, x$ V! s2 a# h U0 I
- Music_Init_Process0 z0 ]0 Z5 }+ e6 z" |/ @
- PHA5 R8 G$ U! S0 t2 I0 a6 H0 j
- JSR Music_Clear_Process
& Z" W. V( b$ W- {/ M - LDA #$1F) `9 _$ A( m% V) Y$ @, o" ^" B
- STA $40152 \* i& T4 i5 ]5 i! M
- PLA
6 _3 \" Z* w2 c - JSR Music_Init_Addr' U1 s) F+ D/ |) M1 _
- JSR Music_Info_Display
2 s' Y4 S% Q; ]1 s7 H( x - RTS2 M* u) V9 B$ }
- # {) d- E8 K6 l' Z9 {, S
- ;----------------------------------------------------------------------
( R9 X# t" y* @ - ;音乐播放处理
0 B, z+ x) o& |8 |$ v' ?$ C - Music_Play_Process
) p4 ]- Y/ p; a4 }; E$ H - JSR Music_Play_Addr) J2 }/ N, M+ V; P7 I2 i# n7 Z# c8 W
- RTS
3 u6 v4 M0 a5 x/ N( h - 9 s F0 J+ I7 x- [) y8 d: _
- ;----------------------------------------------------------------------: s6 D p8 u) E
- ;音乐播放处理: @( f8 w0 y/ G4 x* k
- Music_Clear_Process
/ h4 L& M3 Q' P3 _3 F/ u0 H) p ^ - .IF Music_Clear_Addr+ y# Q* \6 o5 B4 _) v* t! [
- JSR Music_Clear_Addr
6 z' r( y/ @$ ~* V - RTS5 X# K ~; E9 G0 D x4 ~; z. k
- .ELSE
# m) i3 P# ~4 p3 e4 ~ - LDA #$1F
$ F5 F K0 N6 _3 I2 A* G - STA $4015
# n" ^) X! b: E; h - LDA #$009 a! @( p, l# w" ~. k
- STA $4010
6 B# O; p5 G( O! s0 y, X3 u - LDX #$00
. F9 a- j) r) B0 p5 ]! V - LDA #$00
% @$ x- A9 B) M1 h5 F - 8 y; s% `7 `3 }2 Z
- .Music_Clear_Zreo_Page_0
" D& e) a4 h! l - STA $00,X
8 \6 H, i, N6 ^. b) @, w8 Y# U9 P: z - INX- ^8 b- |1 M5 d( ]% o, G
- CPX #Use_Zero_Page_Begin Y0 ^4 e( f( S3 h0 i
- BCC .Music_Clear_Zreo_Page_0' Q% O# p& h$ m" v- d* b
- ' n( k' f; `& \! L# I( y- U
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
" m. e* `" \6 I5 s [0 d/ V - .Music_Clear_Zreo_Page_1
; a$ N' V- C2 y6 l& W# Z) X8 q: G - STA $00,X8 P0 c Q6 k9 Z0 g1 z
- INX9 @' `! ^4 ?- B, a, Q. f
- BNE .Music_Clear_Zreo_Page_1
2 l0 C$ N8 Z% b" F1 p# y# Q S4 j - d; e8 r2 G$ {' d7 o
- Music_Clear_Process_1 L: V0 g, v1 ?& Y/ z6 E/ R7 a
- STA $0600,X$ ~" q& Q2 U( X" |4 H9 s
- STA $0700,X3 y# s# z* ?+ j% ~( ~& }! |* e
- INX) h8 i' Q7 j4 z" W4 H
- BNE Music_Clear_Process_1$ {: y [& p- y, c
- LDA #$10- g- |* b5 c- X/ [1 C
- STA $4000$ ~9 [" C1 I8 P
- STA $4004
& S. A6 L0 Q) _7 A - STA $400C
; h1 _: v; U) Z2 \. D$ G. v - LDA #$00/ _& u' _# f _6 |+ w
- STA $40080 q5 P# Z( k! x5 \7 o
- LDA #$0F
! f. G. q; d# m4 B - STA $40152 v7 E8 v- s: Y" q4 E* d
- .ENDIF- V$ o( C& e# ^, U$ ~9 B* X# R# L
- 2 n; d7 k2 V+ [
- RTS( Q- t2 b6 I, ]8 @" |; E
- * k2 Q9 |! G/ a: q+ H8 {
- ;======================================================================+ V+ M0 I1 V* a( |2 Q; s l
- ;重启处理
& {* h3 I7 N/ q2 C" R - Reset_Program
2 ^& z+ _# }3 X7 v# Y - SEI
0 V/ r& a; O0 G) D7 v - CLD( s+ k, V7 z+ d! T. H1 X3 ]
- LDA #$00
3 b5 i. F& x) A' b% J- T - STA PPU_CTRL7 i; h) I2 z' j" R- F( ?
- STA PPU_MASK
& L5 D$ J4 x# H# l1 c( R0 ]( z - STA JOY2_FRAME
# J+ Q( o& V, T4 }! ^; c2 r C - STA APU_STATUS. [! G* \7 r4 s) ~& r
-
6 n( l$ T) X* g/ o - ;等待屏幕准备完毕
/ E% G8 ]' M. T0 N7 u' S - LDX #$02: S+ Z7 q5 k+ p
- .Wait_For_Screen_Ready( N1 K+ S" r* m: a& V8 @
- LDA PPU_STATUS
9 h0 q5 r3 y- j4 t% ]0 l w - BPL .Wait_For_Screen_Ready- D' ?% `* o3 f# @+ u
- DEX6 x7 S1 A1 Z# X' M3 C% g
- BNE .Wait_For_Screen_Ready0 E t; O) C! j+ g5 {
-
6 J( }, ]* |6 P4 j9 E - ;清空调色板
6 U0 m( @) O5 z- n& J, k# x$ u - Palette_Clear
5 W0 a5 W* ^- [3 u5 R8 c - LDA #$3F+ }4 j0 T( g0 f, I
- STA PPU_ADDRESS1 ~- j' H8 L# y( P0 ?* I+ b
- LDA #$00+ h {3 `5 K% K9 d
- STA PPU_ADDRESS
) p4 j9 n. i: Y& Y" | - LDX #$20
' c( C( M. x: {4 Q3 F - LDA #$0F
: N% Y' e3 X" s. K5 v - .Write_Data v7 r9 L( s# c. ^
- STA PPU_DATA
4 `+ ^: K( g* w+ P# X8 z) h - DEX
8 U8 v7 \4 H* Z1 C/ v* j' P - BNE .Write_Data
4 f/ p/ g$ l- ? - * {# u- }- M* i! I& I
- ;清除声音 $4000-4013- V8 z' D z- y& x6 o6 t# A3 i
- LDY #$14
1 G* V0 L2 t& F4 Z4 Q9 I/ N+ H) G - LDX #$00
+ r% `1 A7 c2 t* ~5 t - .Sound_Clear
( ^9 e7 J! R* I" L, y - STA $4000,X l& A% E& ~# G* ]* I' |0 B0 B4 U
- INX4 B* r0 I! s0 Z0 q
- DEY
; Z! ~% _- s6 R F7 O - BNE .Sound_Clear- v5 p9 N' I4 p/ w7 ^! ]8 ?
-
2 N2 c5 J+ Y9 u - ;清除 RAM $0000-07FF
5 g _; |9 B$ D/ ]) l) }+ J! [ - LDA #$00
: U* ?0 N) C/ Y2 V* \ - STA $00 m/ M, _& R$ y) ]% z, c
- STA $01
2 D" B7 E+ \9 ]) @5 V! A7 ? - TAY6 s; v% d- y4 v, {
- LDX #$08
5 {- _4 w! Z/ Y" ^) l) b5 Q; h - .Memory_Clear
- R6 y5 M. Y x - STA [$00],Y
/ ?& I+ P& W3 L" Z/ f5 ^ - INY
% [4 ~9 s. C- D% e9 U - BNE .Memory_Clear/ [7 Q$ Q/ z, B
- INC $017 N) l" o5 g" W( {3 c9 [! F
- DEX g" ]/ w$ h: o/ z/ s7 K
- BNE .Memory_Clear! u' @; s1 T/ _8 u0 d6 |5 M/ C4 L
- 6 g2 K2 E1 L1 d! I
- ;精灵缓冲初始化
8 w3 y5 L1 ]" H/ N+ U+ f( m. X - LDX #$00
- K; R" S& g1 f# h9 v - LDA #$F85 F" M: C j" W. z4 T; f8 X
- .OAM_Clear, H* i \# d5 b6 k8 \9 i' T) \9 \
- STA OAM_DMA_Buffer,X- U5 c( _* f" g9 A
- INX$ h U7 w& Q1 m( Y
- BNE .OAM_Clear; K5 ?0 d, I! y
- ( m/ A0 m8 B1 n# i. w
- ;栈指针初始化
$ e7 F( v1 y# F - LDX #$FF
5 ~6 }3 B8 R" d' i - TXS
, c2 u9 N9 a2 r; t -
0 T$ W( U+ O* f5 _1 ^9 {' p - JSR Nametable_Clear;命名表清空 n9 r# k v1 t4 C! J+ t* n2 k
- JSR Palette_Init;初始化调色板缓冲1 j+ n- ?1 ]" {0 z
- JSR Static_Text_Init;初始化静态文本
. Y( s \6 I: S9 `$ ? - 0 F9 J- R9 p' a( V
- LDA #MUSIC_ITEM_TOTAL - 1
- G. q3 }/ H3 a5 S/ C) e - STA FC_Music_Max_Index p+ H' q4 O+ u
- * U6 E# d/ x; c$ ^, [, n7 ?
- LDA #$1F
1 d4 v7 j7 ]% c/ S3 s - STA APU_STATUS
5 ?/ I& o1 W) U) j0 c9 M, D - LDA #MUSIC_BGM - 1/ i5 E; g, e8 N( z; Q
- STA FC_Music_Index5 L; e7 i9 O0 p- _" Q
- JSR Music_Init_Process;音乐播放8 H8 G7 I/ |( q
- 5 C: C( T0 v8 J% v* t
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
! v$ t1 W& [3 q* D8 i - LDA #$1E
7 n. f5 P6 Q! k7 c - STA FC_PPU_Mask_Buf8 N7 p6 e7 I2 L
- ' [% h1 G1 ^9 ]
- ;启用NMI处理
5 L6 P# Z1 g+ ]* B5 T& `$ X0 t - LDA #$80% c# X+ g$ X0 D; w6 Y' K5 t# ?
- STA PPU_CTRL
# a P ?* d/ ]/ W, U8 H& K( c -
8 P8 w9 y7 }; A - ;程序循环, 剩余工作交给 NMI 中断处理; R6 n* w+ P# [0 s/ ?
- .Loop
% r1 s Y$ E1 o" ~$ T7 ? - JMP .Loop
9 j+ R- {# b" g/ l
: j, z8 ?' b/ O5 l4 V: Z- ;======================================================================
' j B% F+ F( Q3 z2 o0 @ - ;不可屏蔽中断处理
0 K+ h! |! s& g6 C7 D - Nmi_Program
$ p7 g1 n: |# m, W' e) U3 [ - PHA
9 e X2 |6 a, f! ] - TXA
& X3 J/ V5 N9 y0 S1 Z7 L) E5 w - PHA
6 h1 x+ r; p) I - TYA
' G2 Z( L' N4 y9 W# t - PHA, m7 d/ Z P7 [) ~
- 2 L9 j% X0 i0 b$ B& ~4 @5 I
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 w2 Y* |, I5 e% ?
-
; U( r7 z" E$ B1 c6 n - JSR FC_PPU_Procrss;PPU处理" {6 E% U+ G/ c& }
-
) h. h4 P$ r" q: A/ y) Y! i' E - ;精灵内存更新- ~" l. s% \" A( D* U/ s8 L3 `
- LDA #$00
! I6 z/ Q- Y7 D8 a - STA PPU_OAM_ADDR+ d% s& _* @" ?
- LDA #OAM_DMA_Buffer / $0100
' s% e9 B1 E% M - STA OAM_DMA: M `" |7 ]4 ~
- 0 K; W: }- B$ ~8 N& s/ E/ y
- JSR FC_Gamepad_Process;手柄输入处理& p$ J y& V' J/ j1 O
- JSR Music_Select_Process;音乐选曲处理2 Y$ c4 |, U+ D$ n0 k# ?* }
- JSR Music_Play_Process;音乐播放处理
9 ?8 r) H4 _4 }% ?3 ]% X& u - * J5 x9 S# J/ E! i3 K3 K/ E
- PLA
) ~9 @5 {" X+ x5 Q F - TAY1 P; ]( T; H+ ]. b+ ~2 C0 r4 u
- PLA- f4 G: q/ e6 S5 A4 u
- TAX
0 G8 J4 ?: h* d: w, S - PLA" {( F8 A) _( |0 V2 M& x
2 U. L0 I7 o6 d3 h u3 D- RTI! K/ F; s1 V7 W$ R. c: O
- / R$ e; I" x: g: m
- ;======================================================================1 L* P: R- W8 E& n
- ;请求中断处理6 ~1 B. D$ l, A3 s4 z l
- Irq_Program m6 b$ U/ v* n; {4 i
- RTI0 z g" U% L/ a1 M5 g
- V& ?% S) c# ]' r8 [
- ;======================================================================4 ~6 \. g+ ~/ B @
- ;中断向量表; H% D* i( ~8 X2 W
- .ORG $FFFA
( r8 B- F' `" C( U$ q: U0 r - .DW Nmi_Program ;NMI触发时执行$ x$ e& M9 M& P% w' v" U/ {
- .DW Reset_Program ;载入ROM时最先执行) `$ {. c" F. m
- .DW Irq_Program ;IRQ触发时执行
2 d6 q. G0 I/ f& H
复制代码
9 {, @6 P1 O; V" U0 f7 N+ Z- b" ] ~, L3 d& O# m+ F8 ~
- x' L+ c5 f2 ~) l- f( p; ohttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|