|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( \) w$ g% |2 e _4 @+ p 1 z' C% S, X8 F
以下是主框架代码:; u$ R& D) V `. b' M5 \+ ^
- ;======================================================================/ ]7 E b1 S& X+ g" j
- ;文件头
+ A- X# v u1 B/ `- K: o' {0 J3 d5 n$ U - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
5 a( X* j: @# W- g2 M+ t! \/ d - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量" ?+ Y+ f5 D' r/ b0 g
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码! {( X6 D! f: K4 {9 f
- ;======================================================================
" v+ t9 u: L" I" s2 e1 } - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
: z7 m( c7 _' d* z6 y) p2 M - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1. {9 r. S( O, ^# y+ B9 a
- ;======================================================================
2 k! K/ {0 ^6 M$ w - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1* n1 b+ p7 H. S, N+ t2 ?
- RESET_ADDR = $E000 ;主程序起始地址
% R3 q8 v: z7 y - ;======================================================================
5 H" }7 c7 l6 t: o+ s - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB+ r# k. m; L% O* S
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 |) s1 ]7 t! s" \* `
- .INESMAP 4 ;Mapper号 (0-4095)
, ?1 @( k% k p h, q - .INESSUBMAP 0 ;子Mapper号 (0-15)
$ j( f$ H% a% w, t - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)) T" w$ M1 ]' {" [6 a. Y0 K1 U0 }
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)) i( |6 i g5 t7 q2 j, u9 Q9 R; B
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
( P# v/ f( y' w# {$ |& N - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
7 L( Y W t* L8 x' B. Z! a - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
; }! j1 U& Y0 Z1 q - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
% i4 ]( D5 d% {: \2 ~3 t - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)" k! S8 t+ ?) i/ U s9 l: f
- ;======================================================================3 M) }/ N: |+ H4 }8 ?" J
- .INCLUDE "fc_demo_config.asm" ;全局配置" v% g$ C/ o3 s4 M7 T: n+ O8 N7 l' b
- .INCLUDE "fc_demo_constant.asm" ;NES常量' K: ~ r7 i. T/ ~" M$ F
- ;======================================================================8 @! @1 H V( @4 d: B% N) G
- ;音乐配置
3 ?& |, U. J# ]) O, O/ e - .IF 0 = MUSIC_THEME $ t4 R. t. J( w' Y0 U! S
- .INCLUDE "data/music/Gremlin 2/config.asm"
+ {5 C9 h I* h" a8 Q& d2 t - .ENDIF3 C* _; q9 h* r, C
- * V6 [) J, K0 O% w4 B# Y
- .IF 1 = MUSIC_THEME
$ k, z l+ ] l3 j9 z - .INCLUDE "data/music/Raf World/config.asm"
' {8 Z- ]9 x8 U' Z: |- U9 K. q - .ENDIF# q J. w, r+ |5 {: G1 C' d3 F+ v
- , T; i5 N: q6 C
- .IF 2 = MUSIC_THEME
) Z& _3 }3 [: J: A3 e0 o/ i - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
+ k$ X5 L( t% Y6 V( m9 \ - .ENDIF
9 @0 F/ u4 V: Z$ p$ s: t8 q
( `" Y. \% a0 S: N- ;======================================================================
& M9 [+ K) X! p. W$ _# i9 K V - ;引用CHR图像数据4 [) |5 X2 k b+ S8 D
- .BANK NES_16KB_PRG_SIZE * 20 Q, E4 e# O+ r; d
- .ORG $0000
2 F" y% C+ `, e$ L J! Z. Y& @ - .INCBIN "data/bkg.chr"
/ Q. t1 ]5 _% l7 A% _ - .INCBIN "data/sp.chr"
, z; W4 l, p- J7 E3 b* C8 r - # f/ F! k- [% N; [6 |4 y- T
- ;======================================================================
0 G. b" r/ v y& n1 Z - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank* c7 z7 C4 S* _. T/ p0 C! I9 s
- .ORG RESET_ADDR* y9 u4 x6 }) q6 N7 D2 a4 K
- ;======================================================================
0 {# |& b& s& P# F2 O# K' @3 t - ;引用其他源文件
& y: Y5 ~0 Q/ s+ ^4 h% R% A - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
# O' O7 u: H, }6 d8 R - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
" B7 `1 ]/ N& T7 z1 v* `: Q, d. Q - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
6 A; n3 N1 \. c9 H7 u1 R - ;======================================================================
: x% ~' _& k/ @/ a% C; W) g
3 r+ B4 v& Q: p: B2 @- ;======================================================================- b$ G" Z# M5 D4 P7 J! d2 e
- ;等待VBlank到来6 Y0 g, M/ \3 U6 Y r4 u* p; ^
- Wait_For_VBlank5 M' g% K5 x. j f- V! M
- LDA PPU_STATUS2 p: o8 `, B4 H" Q
- BPL Wait_For_VBlank
, N; _: n, D6 Y! F. ? - RTS; O+ X V% j' H; b& _
2 J! s1 r' N7 ^6 \, [ O2 S- ;======================================================================
. T% K8 j$ e, v s% B2 ~8 X7 ` - ;调色板初始化. Z4 B: r: O" c7 C9 W7 ~# V* q# N
- Palette_Init
0 c6 A1 p' e& \ - LDA #$3F. T# }) \. E: F$ p2 E
- STA PPU_ADDRESS
4 `# h! G7 O2 M3 m ^' c& v - LDA #$001 K. P1 a& a* ^4 p& Q- @0 n! T1 {& r
- STA PPU_ADDRESS
$ O: a: b1 p! x4 d8 n - LDX #$00
" R+ w3 O! p6 ] z' B0 l0 m" ] - LDY #$20
3 V6 x4 k! `: H' P9 @, g - .Write_Data
2 D" F; l% D& Q I1 I4 w2 h+ X - LDA Palette_Data,X7 Y7 U" V( `3 _" r' A% P
- STA FC_PPU_Pal_Addr,X
; b1 p8 S0 R$ B# x5 h. M6 G8 ?' } - INX
/ M- v7 ~) q$ h" {! w$ j" M I - DEY0 s- `; z* G a* |
- BNE .Write_Data
3 A7 Y0 c" q) K7 F- x/ D. @ - .End
4 I3 a! @) w! D - RTS. _( U+ d' T- g) K
- n/ F1 `% m7 t: l9 N5 U
- ;----------------------------------------
1 t5 B' I7 J3 r& s - ;调色板数据
5 z6 e) k4 j1 P9 u - Palette_Data8 O( A+ n% q, E" T
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) C# l7 E/ y$ ?4 K: N8 E& X - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
, g4 p) ?( ?5 L4 C6 l -
; \: D4 O2 @- B! C0 i% m - ;======================================================================
6 B' C8 w1 O c5 L( V! j - ;命名表清空( G& L, w! \( q5 Y/ H# ~$ d8 H
- Nametable_Clear
- Y2 ^" g* z# |5 D u$ x/ w8 ?: i - LDA #$20
, j) w- m- s$ `! r - STA PPU_ADDRESS+ [0 P( X. t- f! S/ e' g' e
- LDA #$00
/ |0 m" r( h2 ~) k2 x - STA PPU_ADDRESS
/ s+ Q% q h$ r# K - LDA #$009 C2 [4 d- I( g2 h
- LDX #$00
% \3 z+ x6 d' n+ q2 Q8 N - LDY #$08* V. P; G6 R6 N1 x d
- .Write_Data
' g4 J+ U5 ~0 p7 `5 U9 V - STA PPU_DATA
# N+ W) y: V* T$ U+ ^ - INX4 [' h8 w' e/ A' D# m. {
- BNE .Write_Data/ m0 f3 n7 n) l8 @& ~$ C
- DEY
j$ B' y$ Q' e( C/ s - BNE .Write_Data
7 F4 B- ~7 f) Z8 F - .End9 G/ U: [5 |7 H) a, N' m$ V8 _
- RTS7 r9 i8 ]3 P+ W$ l" [7 k) r/ _* R
- ) h: e/ k) ~+ G9 f9 U% q, V% e
- ;======================================================================* m4 }0 r8 C3 A+ R* ?
- ;音乐曲目切换5 @/ V1 h0 }3 J/ o
- Music_Select_Process( w) x6 }* @) k
- ; F, m2 y* A" p Q) C6 B
- .Pre_Music;上一曲. r z9 G3 @/ f" @! ~
- LDA FC_Gamepad_Once" `2 r( e1 i8 C- Y- P6 b
- CMP #JOY_KEY_LEFT5 F, [! ^; d. M3 u8 |8 G6 p
- BNE .Next_Music% Z' j* L3 ~' J+ i' @
- JSR Music_Play_Pre' D o% f: F9 Y9 Y
- .Next_Music;下一曲
a% \/ G/ j" u - LDA FC_Gamepad_Once
4 o: J* x: U( Z- U8 @5 \& Z - CMP #JOY_KEY_RIGHT
+ ?9 ^ i0 ` Z; g - BNE .Next_10_Music9 @ l& H! k& k# d
- JSR Music_Play_Next/ v7 O4 Q! f$ s! u1 A. V. y
- .Next_10_Music;上10曲
! {4 J0 r: w) T* R! C% ~ - LDA FC_Gamepad_Once
4 V# Q; q* M, y+ f - CMP #JOY_KEY_UP) N$ o8 R4 y- {. p; C2 l3 M
- BNE .Pre_10_Music2 A: Q& i1 t' M, s
- JSR Music_Play_Next_10+ D) o& q' z f/ Z% L a
- .Pre_10_Music;下10曲
+ X5 E: @1 ]- y3 @ v - LDA FC_Gamepad_Once1 L) z4 o# k( K7 E* \+ B
- CMP #JOY_KEY_DOWN& B# t' A' W: H6 X- U( T6 p2 o+ x
- BNE .Reset0 y7 C+ k. U% ?, S& X
- JSR Music_Play_Pre_101 m. A" [! g0 N% A4 X5 @
- .Reset;重播当前曲目
5 s2 |9 U T, c% ~4 D- H# e - LDA FC_Gamepad_Once. {8 s7 ]- F" h' ~" B/ d* b
- CMP #JOY_KEY_START
8 t# [. D) v9 e# I - BNE .End
, H( B3 U; W& m! b. M4 L; k- l* p2 G: J - LDA FC_Music_Index
/ [5 B( v4 j2 h0 N7 m7 I - JSR Music_Init_Process
+ H* S: h) k4 W' l& L - .End- o- q- H1 T3 m5 v! m
- RTS$ `, q9 c- N f$ t# O
- 4 r: o% y- E( o0 N
- ;----------------------------------------------------------------------0 n9 f" V3 d {) d( h7 h
- ;播放上一曲
5 z+ W/ I7 L. J% M+ d; x0 q6 v - Music_Play_Pre
: T# r5 d$ d$ d* ] m' t+ D - LDA FC_Music_Index$ G2 _& ?+ T' O6 z6 P: U) k0 [0 l9 s
- BEQ .End+ @* B" K1 Z8 ?0 O2 W7 e F& V
- DEC FC_Music_Index
$ F- T& \2 D r - LDA FC_Music_Index) m$ ?0 ~6 ^$ F1 s2 ^' Y0 X0 C/ a
- JSR Music_Init_Process- ?7 t% C3 A1 o% d8 A
- .End
4 p; `' e/ _6 ?) O/ a Y' L! { - RTS
& s: ?; u5 i$ f( Z7 }1 h - ;----------------------------------------------------------------------
7 ^4 T' U2 Q# B L1 y - ;播放下一曲$ k+ P9 d5 l- e& i/ Q
- Music_Play_Next3 D& a0 k, Q9 E" [: W: S0 t7 X
- LDA FC_Music_Index" H o+ e) E9 @$ I" Z9 B
- CMP FC_Music_Max_Index
9 x+ H% I, Z3 B - BCS .End
; C( j. q7 p; k1 R1 a - INC FC_Music_Index
4 C! @$ U/ d. X - LDA FC_Music_Index
: b; F: G: p! n8 w1 E1 t - JSR Music_Init_Process( n2 E, k5 B) i$ U
- .End n1 L6 s* W& o* d$ B" W( v
- RTS
% ?4 _9 ?0 m1 O @# M3 p2 v
7 Q0 R" x* K# |+ t0 F- ;----------------------------------------------------------------------# p& P3 L, g- B. N ]: g7 }9 L
- ;播放上10曲+ \: Y0 h1 N/ G3 P
- Music_Play_Pre_10. D" v$ m( K' ]4 n
- LDA FC_Music_Index
3 e& p! R/ _; h - BEQ .End
0 t- l4 p0 _1 a5 f - SEC# e W3 N, }5 v5 \: e+ Y! M& u
- SBC #10# c$ p6 Y! R2 C8 y# f l3 z8 ?
- BCS .Pre_10$ _1 w3 E$ p- ^0 r' q
- LDA #$00
% s/ l- Z+ E6 k! S- n1 \0 d: M - .Pre_10
6 t# X9 V( a$ t+ g- f - STA FC_Music_Index$ F U; R2 p5 x7 e( N
- JSR Music_Init_Process
; G: W: b' @% v: \5 [ - .End
3 U; t% [( N8 P0 D! j4 T& `: ~ - RTS
7 G# i% X9 _* g" H. |) G" n3 B - ;----------------------------------------------------------------------" |/ o) j2 d: j. ?, X
- ;播放下10曲
6 G. T2 u9 ?# h! b* z/ s - Music_Play_Next_10& r* h- P: Y1 j8 u3 T9 h2 i( ?$ m
- LDA FC_Music_Index
; S+ [) ?- X3 ]2 | - CMP FC_Music_Max_Index2 }- X4 G: G6 E; c" j$ U6 B
- BCS .End
* y1 G' e$ r4 ^8 P - CLC r L" G2 N+ c% n
- ADC #10
) U* X2 W2 ^% u% H: l( m A - CMP FC_Music_Max_Index
) R2 v7 z5 ~$ G/ x) w- U - BCC .Next_103 I& J: v' X# M1 w% n; ]1 s/ J& @
- LDA FC_Music_Max_Index
0 \- T$ y$ F8 u q4 m - .Next_10
9 B$ i- R8 h# r) B+ \% | - STA FC_Music_Index- D0 q* ^# @/ c+ ~" {0 i
- JSR Music_Init_Process
; j- F; l( P6 `1 z" m+ \% ` - .End
6 j I5 U/ S; y. E$ V9 n: }( }7 G - RTS
' n# N' B" e: K- w( x; P' i6 n* Q
7 E4 ]. r: D5 B; O+ L- ;----------------------------------------------------------------------/ r. b( G( g7 m, e
- ;8位十六进制转3位十进制制
z! C! i0 e6 V% @ I5 Z% |! p: } - Hex8ToDec! s9 z; _" N8 S2 ?: E0 Z' o3 L
- STA FC_Dec_Data_1
2 n! K7 M' f9 [4 c2 S2 m - LDA #$00/ ?" [0 R+ Q) L$ D9 R$ Z1 x: D
- STA FC_Dec_Data_100; \: z4 Q. H/ O
- STA FC_Dec_Data_10
% l- N/ G" \& d. n' t" M7 ?4 I - LDA FC_Dec_Data_1
7 [8 Y) C1 ~( h) Q* R0 A$ C - .Convert_100$ Z- C0 @& H! Q: ]/ {/ V) [- q
- CMP #100- h/ |$ D7 P6 ]3 d3 X; I
- BCC .Convert_10: { N5 j! F( i. ?( ?
- SEC; P& T) f& z; { o) N; S, f0 F: w
- SBC #100, _( j( }0 ]7 J
- INC FC_Dec_Data_100/ k8 h' h" U, u- r. M" G7 T( r
- BNE .Convert_100
# n1 X6 f* Y. U1 ]0 W; S6 c2 z - .Convert_101 p; ?+ @6 J, n) C1 v, h+ `
- CMP #10
, C4 w" \6 p9 z1 r+ s - BCC .End
# `/ d9 g. { O - SEC) B) F) Z u1 a9 |# u
- SBC #103 g/ ?$ V; |. O& `7 q2 C# K- G
- INC FC_Dec_Data_10% K z. s) z- J9 @, }
- BNE .Convert_100 G0 a4 ]( D: o! A& K
- .End
$ l: f( m1 E: }4 P5 e - STA FC_Dec_Data_1
/ ?( e, r7 \! W# ?9 e8 s/ E0 t0 V - RTS
w# _& W8 P, H# g1 h1 ^# D
3 H: X* K, L# |: m- ;----------------------------------------------------------------------6 V, [- y$ T' T2 m
- ;显示曲目信息
/ e- @: {3 l8 F' U6 y) r$ o- R3 D' r - Music_Info_Display2 }, Z4 V" J5 H5 v+ J
- LDX FC_PPU_Buf_Count& H6 N+ C7 I' \- @
- LDA #PPU_WRITE_MODE_CNT_LINE
T9 J5 W# w t - STA Use_PPU_Buffer,X! a* V+ x$ k; S' S2 T" B8 I
- INX
& J3 ?' V% q. {: Y - 8 x* `5 [. _" A) @ _1 @/ y
- LDA #>MUSIC_INFO_POS
8 @0 L: G0 B( O; U - STA Use_PPU_Buffer,X- g1 Y7 N9 v. l. L
- INX% H3 n- }) g( k3 a
-
4 v# z+ Q8 p) G: l& X( R) ] - ;居中
, l$ [8 k: f' i5 l - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/28 o/ \' \0 c6 M- `3 G
- STA Use_PPU_Buffer,X
" I/ k# w: O* m - INX( L5 D- @* P* d, K- c4 J
-
/ @1 Y7 E( Q1 ]. B0 L1 W+ [6 ~% _ - LDA #$05" K* c: n Q: _0 J* E/ [
- STA Use_PPU_Buffer,X% A6 y" R/ @4 \: }' z; J
- INX
+ |1 n7 g( } s; P D% g - ( {) N* D0 s# Q% v. T
- LDA FC_Music_Index/ R& I+ b9 t5 s4 w# r
- CLC
- z( g: i! O8 u8 @ - ADC #$01# r! F7 @" M$ c; h: q+ m
- JSR Hex8ToDec
) e! \6 q, f+ Y7 q -
" P+ N2 q" f# w( o0 M - LDA FC_Dec_Data_10, O" t9 S/ H! e3 x
- CLC$ I! O' [% D3 T0 q/ K
- ADC #'0': s* I# r3 e' J) g. p
- STA Use_PPU_Buffer,X
, i+ h7 V9 E) @+ z - INX3 k- j& Z3 N- X/ }+ v* o
-
0 M! m0 m4 Z0 u; [6 i - LDA FC_Dec_Data_1
. X1 R* B, o8 @3 x5 O* S& Q5 s - CLC8 a2 j7 K1 M) ~1 `
- ADC #'0'
, o! @/ F8 b) {5 S7 h+ u - STA Use_PPU_Buffer,X' o, J1 r. R- f5 v9 J1 y, {% ?1 i
- INX( I. {/ ~! O9 L
- . U6 _3 |, ^7 S- O3 }% ?6 C" b3 X' h
- LDA #'/'0 `- ]: [' @6 i* L o* G: `
- STA Use_PPU_Buffer,X& C8 s. d9 c9 `( E
- INX6 B7 ^' N. q% t7 V
-
6 g* l! W5 @4 G - LDA FC_Music_Max_Index
% ]1 c6 R! ? d) G. W1 f - CLC E) ^: f% J8 _" b/ K
- ADC #$01
: s: z& d5 ~9 q4 F - JSR Hex8ToDec
5 a& |1 d- K/ K( d9 Z -
% z9 b' M: D$ a, u, Z - LDA FC_Dec_Data_10. K0 q9 |+ F ]8 w& s }1 _
- CLC9 s8 @1 S) c6 }7 s$ R9 Z
- ADC #'0'2 w9 _ t7 f. X. h3 g# W% e( K
- STA Use_PPU_Buffer,X
9 L' M7 A" \& q0 I5 N5 o- Z - INX) z" N- i j8 S r
- 5 q- o A$ {) D* u
- LDA FC_Dec_Data_1
" v' ^& |% X7 o! D1 L* o5 _; F - CLC) V; P1 v. i' v' o
- ADC #'0'
i4 F1 T! Y' [ - STA Use_PPU_Buffer,X% D+ t. I' A# k6 L$ E) B
- INX
( H0 ^% l9 G9 Y0 N0 g, O p. s6 ] -
6 I& [/ `, _% O( m/ W3 {. \ - .End
, j5 `4 y' N' b - STX FC_PPU_Buf_Count
: `6 v8 _, s0 w" e. R% v0 \ - RTS
5 M9 P0 s, B. r
( z: q* j- o, M4 T, f- ;----------------------------------------------------------------------9 l# {- [( t! |& b2 d- r' z
- ;音乐曲目初始化处理6 I# V" {2 y+ m7 ?
- Music_Init_Process1 [/ y M2 U3 j7 Q
- PHA) Z( w6 {- X& l$ r& D0 U, b$ ?
- JSR Music_Clear_Process, k6 O' {* T" F3 j1 Y4 a$ }% V
- LDA #$1F
8 ^- K1 E1 i. \ ^3 {! o - STA $4015
2 x1 q1 \% A9 o/ W - PLA
( |3 k! Z v% i4 E( {7 ?8 \0 E - JSR Music_Init_Addr
6 Y @2 q5 w1 v6 T+ ^( Y. Z7 x - JSR Music_Info_Display& D% R4 c' [- [5 O3 Q7 U; {# e) I
- RTS) h" u' O) X# k: D. k2 V
n) x! O7 c- Y; {+ M' O& g- ;----------------------------------------------------------------------
* j7 } b- N) U$ k2 h$ H - ;音乐播放处理1 e. Q6 _0 o7 m' L" i" M! l6 p6 _6 |
- Music_Play_Process4 V" P6 E' U) s1 ]9 _- J) `( y- g
- JSR Music_Play_Addr
7 X% ? v: X- p0 W, G8 J, I - RTS
7 y) V3 b1 {0 K
0 U) G* u/ y, C7 O4 K- ;----------------------------------------------------------------------+ T( \; ]. g5 J; {, K( U7 k
- ;音乐播放处理
1 j- v2 Z) v. b7 k5 O" O U, N - Music_Clear_Process
l w& q" P& `7 Y0 K( \0 Q - .IF Music_Clear_Addr. b& g: U& A; m6 g! P8 d' {
- JSR Music_Clear_Addr
% N& b f; l5 d1 S W - RTS& A6 C+ p3 A/ H7 Z2 q
- .ELSE3 V) y3 {! v0 {( K1 r9 V
- LDA #$1F* t7 M1 m- @( Q* W0 C4 n
- STA $4015
( b7 l# t" Y, a - LDA #$00. w, D2 G( n e ?; s" o, Y% U' r
- STA $4010
0 \$ g) B! c7 O& C2 p - LDX #$00
0 X& [" m3 D# f6 f7 S x5 R - LDA #$00/ E2 z- @- P9 d! M7 C
-
7 \1 ?' _, @7 e. m. @4 |* Y - .Music_Clear_Zreo_Page_0' I6 n) V8 f0 N8 O6 L& ?9 [& y0 ]
- STA $00,X$ \% Z6 K$ Z: B8 j; W" n
- INX
/ V; Q; U5 T Z* Y# W- a' k - CPX #Use_Zero_Page_Begin
6 `& t8 Y; b; U# M s( N - BCC .Music_Clear_Zreo_Page_0
3 b- o- P$ e2 r! W -
. p6 x! f# {1 y - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size1 R% Y r2 ^6 ?8 t
- .Music_Clear_Zreo_Page_1
: d5 H. E% a" S! x0 w1 R - STA $00,X
3 @9 x" n" |" ~& w - INX
, J, o2 Y* @" x d- H - BNE .Music_Clear_Zreo_Page_1
6 ]! E3 U& M' t; M - ]" \ T9 \1 ~; K- x- i
- Music_Clear_Process_1
; C1 E/ K2 B; L/ K4 h6 W - STA $0600,X1 s$ F# q' {( C0 t
- STA $0700,X1 h) ] F Z) P
- INX2 A9 d2 s: x* n/ s5 c) I
- BNE Music_Clear_Process_10 ^3 M# j- K+ U3 F
- LDA #$10
, A# z% R, U) v# L1 u - STA $4000
! ]( t% X' J" {' Q/ c3 A - STA $4004% r" [) ^( J4 [; Z) [9 z V
- STA $400C. Q- T* W8 n' ]: R) I3 `
- LDA #$00
% d1 q, c% e1 {# ^! q1 G - STA $4008
% \* A+ P b! ~% X9 {) j - LDA #$0F
- |$ V! r! Q5 b$ X - STA $40155 W0 h. ?$ u( D
- .ENDIF5 P' W% B# Q& U( C! F
-
. a- H" r1 g8 r+ X, E1 j! Q3 k - RTS
! e ^" b, i7 _$ a - : I! b7 s+ O/ ]/ v
- ;======================================================================
; ]5 F; w. w. ?( J% { - ;重启处理
+ Y9 Y) l5 a" s8 l: [ }" S - Reset_Program
/ F7 t9 O6 T3 S n2 o B - SEI
) ]- H$ Z0 E$ b% v1 ~ - CLD3 ^' S5 S6 [: x/ J c" Y
- LDA #$009 f6 R: O& Y& B* f3 e1 Y
- STA PPU_CTRL
( `$ |1 T3 V1 p1 Y6 U - STA PPU_MASK
5 U4 A1 V" l% N! Y5 A* s; z9 Q8 o& i - STA JOY2_FRAME
% e5 x- j0 D1 B! ^ - STA APU_STATUS
6 Y$ F- W) m. U5 i+ ?4 \$ z -
/ S$ t6 K7 M$ i4 R W6 e2 q, d - ;等待屏幕准备完毕) C) c& ~, ^ a) S* O1 N' d
- LDX #$02
3 d) o: n+ \* ?3 K - .Wait_For_Screen_Ready
: w4 e2 b3 O: V! u) C# U! t - LDA PPU_STATUS
! v5 }, z% l2 X8 f - BPL .Wait_For_Screen_Ready
7 o3 F% _3 k& J: R* g7 L4 V" W - DEX
8 e& p8 n* D" F) x, k) |3 [5 A - BNE .Wait_For_Screen_Ready# v0 e" E0 v/ _' Z" u8 S& `( |- @9 l
-
# x$ ^/ }7 h" } - ;清空调色板
( x5 x/ m( ]# |( A - Palette_Clear
+ D% I9 R7 g: ?% y - LDA #$3F
* ^. ~, \2 y: Y5 z; L1 p" B0 n - STA PPU_ADDRESS
. D6 t' x/ \+ i6 J2 b$ O: \; s - LDA #$00
* V1 P2 N' l* a3 ~! H* g5 N3 U - STA PPU_ADDRESS
: Q5 Y( H7 u5 e u$ P - LDX #$20
+ G* ?" ^0 N8 m: Z$ s. q/ z+ }4 N' O( s - LDA #$0F
$ z$ Q8 i& M2 n - .Write_Data8 t4 E: ^) E0 V# Z( D. B
- STA PPU_DATA
/ z2 a5 r/ _+ G' ~- N& e - DEX
, L* ^) Z* J) `1 B) y# M. C/ u* n- c7 ^ - BNE .Write_Data9 K7 t' Z- L; g& C3 x; w
- 4 i: ~6 [" S) W2 H
- ;清除声音 $4000-4013
r/ o/ ~0 m+ [6 l* A% \ - LDY #$14
4 v+ N7 m$ v4 N8 k( @" u - LDX #$00
# N% R3 Y$ o9 Y* G - .Sound_Clear3 Y# T, { u5 ]6 v: ^
- STA $4000,X: C4 r! l6 L' E
- INX
( y: c0 b5 ?! ?4 K' w* ?1 y( W - DEY
4 W7 @! B: F0 B- V6 W" t - BNE .Sound_Clear2 z; w4 t) J# n0 d
-
5 D, f7 T& P. r2 D/ x - ;清除 RAM $0000-07FF! P8 U+ U( A4 J4 z- K3 J
- LDA #$00
3 s: w2 b7 P) t: ]$ Q- y: e - STA $00
7 H+ S8 w: S* \6 h& z+ m - STA $01
( S( X6 O; J" X1 R - TAY
8 m+ u# }/ R4 _/ W) D - LDX #$08 }- m) K' V, e6 X
- .Memory_Clear
; y- y1 ]3 b( L6 p# Z. Y* w - STA [$00],Y
8 V/ e7 n6 P3 K0 c0 [* h - INY/ z" a* x1 A' h: k7 G! q* C7 A; ~, p
- BNE .Memory_Clear
8 i7 S6 {5 M2 F3 R/ m - INC $011 U7 t, F+ S" d( i
- DEX6 @+ V B3 @$ J, U
- BNE .Memory_Clear
2 _: a9 o* T& j/ y - . ^" A5 q& ?& B$ ^; ?
- ;精灵缓冲初始化9 P3 v$ F+ s' ]9 |
- LDX #$00- w+ C( u; s3 @2 j/ ~
- LDA #$F87 Y' a- a9 @- I4 K z
- .OAM_Clear
- w; x% T/ X: p0 ]; z4 E, t - STA OAM_DMA_Buffer,X9 _! P+ A- W* H% ]. y; c) y) e
- INX+ u' n, o! g; @: A
- BNE .OAM_Clear9 o- a8 Y$ |8 J3 S
-
$ h; k# h+ O7 f# z! S - ;栈指针初始化7 }/ l) [- Z) Y
- LDX #$FF
5 ?6 z* h. n4 ^$ M0 t - TXS
, y: @, P+ T* g d; o - 6 W1 O: a& P+ C s( O# m7 L, _: K
- JSR Nametable_Clear;命名表清空2 p/ D, Q+ A2 P6 U ]% q: j
- JSR Palette_Init;初始化调色板缓冲. a! O* o- G4 H3 G" M$ M
- JSR Static_Text_Init;初始化静态文本
9 _( g% V: p% T* j+ z! t - [8 d% Q$ H B9 i' |' U
- LDA #MUSIC_ITEM_TOTAL - 1$ c8 A' z* |: e9 P
- STA FC_Music_Max_Index- P, s- E4 F# K9 c- f& ]
-
- g' c; H) M0 E4 e( s% m. } - LDA #$1F" G9 j$ k2 [& [
- STA APU_STATUS
) k- P+ u0 B9 u$ l - LDA #MUSIC_BGM - 1
% x- E8 @5 w, C8 e& i - STA FC_Music_Index
) j" D/ F+ b+ a, s - JSR Music_Init_Process;音乐播放' B U+ P1 d- ^6 U/ a. ^
-
/ J H, D4 c; q. E7 `: V! u - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
" Y3 t4 a# i4 h( e6 x4 b: I - LDA #$1E; a, R9 y! G( h% a) T+ m0 p0 i6 J0 i
- STA FC_PPU_Mask_Buf, e m& r/ U; X! z+ i" F0 W; A
-
" S! r8 |6 F/ p& r7 _" e1 h - ;启用NMI处理9 w" ]; K H7 ^( ` i. J0 R
- LDA #$80: t! p2 ?, V8 \5 ]
- STA PPU_CTRL% U/ h& W2 q- |0 I
-
) G# v2 j) C: l; |# V: T) Z - ;程序循环, 剩余工作交给 NMI 中断处理
) [9 i/ D& u% m- r4 P( c - .Loop/ F+ c. P7 r. a5 g8 u4 }
- JMP .Loop
7 }# L7 _" b, e0 g& p
2 |! [* c5 d, c u- ;======================================================================
$ F8 v! I) s' F3 ~7 c - ;不可屏蔽中断处理
9 O* K0 y! X' G - Nmi_Program% _! }3 J1 t; b# z; l7 `" L
- PHA
. [, J( Q. L# v7 u - TXA9 Y3 x- V0 u6 H: d, C/ a9 |+ \1 x
- PHA
: X2 O/ g# J N6 s& X - TYA$ a1 Y3 o) e( l! S0 P2 Q
- PHA
/ E6 j; {- N7 w: U4 J L -
1 h- O* M# x) ]. k" n. c/ e - LDA PPU_STATUS;读取使得 PPU状态寄存器复位" y# U: o& X0 G8 `
-
& d5 D) s# t7 m7 h% f9 x - JSR FC_PPU_Procrss;PPU处理
4 p- o$ K$ \' W T6 c5 z% h9 a - 8 z- E% W, u$ q$ e+ K
- ;精灵内存更新' Y! @: v/ G5 `" Q0 ]
- LDA #$00
4 }- c7 H- R! {& b" j# j: e* U+ A- h - STA PPU_OAM_ADDR# J4 w, q' M* [: f- o! c( z
- LDA #OAM_DMA_Buffer / $0100
5 r1 ]+ a7 i L& }$ H" A0 B* ]1 D - STA OAM_DMA
, Z5 D' C' H: a1 A -
0 U. L, t: \6 t+ K/ Y - JSR FC_Gamepad_Process;手柄输入处理
9 C7 n" B( U& B; n- k& _ - JSR Music_Select_Process;音乐选曲处理, n% y z6 l( w) _8 L
- JSR Music_Play_Process;音乐播放处理$ \) ?: K- @8 ^5 X1 R
-
7 h5 s# k- V/ V. P7 n2 x- ] - PLA3 ?% [& g$ ?; q9 S- Z
- TAY- K1 q* B2 n. X% t! c
- PLA2 H2 X% ~$ _* J% ~& c B) H: i
- TAX
! s) k. v. A% v$ H: j! V% a - PLA
+ z$ X2 p, J" p3 V& `2 I
5 d; {2 @* L# P% p- RTI- k" R9 ]* s% [& u
- ( {) u6 E O/ h+ I& {+ r
- ;======================================================================
, Z2 |9 A5 x' X3 ? - ;请求中断处理
( a7 p6 K6 l& y5 ?4 z o7 F- k* @ - Irq_Program! T0 _; j1 v; A n
- RTI
: R9 I' P. C, V) t: T - 0 s3 X) {' s5 Q2 k a5 H9 g
- ;======================================================================
+ L% G: M& {4 G5 R: e+ Q7 f - ;中断向量表
& N! G; B3 n, b - .ORG $FFFA
# V6 b0 N: f& a) z M8 w6 b" ~ - .DW Nmi_Program ;NMI触发时执行$ \3 ~. g7 I* L
- .DW Reset_Program ;载入ROM时最先执行
' g! K I4 W2 \ - .DW Irq_Program ;IRQ触发时执行
6 m0 p* K5 {5 e8 M" m+ Y+ r
复制代码 & @& E- m! T! j4 h: p) E
' J8 `3 M% C) L0 n# k- m
9 w( t& f. D H: M! i9 D
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|