|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( l6 [3 M" z D0 A/ v/ l9 N3 o% I 9 w+ {/ e, g0 H0 T- I% Q; [
以下是主框架代码:
% m1 `1 N1 ?0 k, o- ;======================================================================3 d2 s' I0 G7 A! [# V. w$ l
- ;文件头6 b# h7 O) g# E/ |
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量' q2 s$ P1 c" K3 Y2 D, i
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
1 W1 c0 }; A2 p5 ~: d - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
, y' H: W* F$ @/ D - ;======================================================================
9 D& O" h2 U8 _/ g( C - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 29 Q& M+ q; d0 R$ d$ K& a1 h
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
- l" g4 t# Q- W' T" D9 l0 B' w - ;======================================================================
q/ M' j6 E# V( h( A8 R - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1. G& f9 u1 [1 e/ t9 c$ V
- RESET_ADDR = $E000 ;主程序起始地址. o3 \) Y) C$ a/ P. g& F$ U; G
- ;======================================================================/ O1 b% \$ o$ M
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
6 k- U( k# B$ F1 Y1 P - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB% p/ ?, g% `; a$ F1 O" G8 l7 B7 V% g! E
- .INESMAP 4 ;Mapper号 (0-4095)- m2 O2 \3 Q0 T" P8 i# Q
- .INESSUBMAP 0 ;子Mapper号 (0-15)
) ]3 V7 f% M, A# I! n5 K, M4 G - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
; a$ l( b6 ?( X0 Y% c - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
L1 z$ Z3 L5 v9 A2 l s& M% ] - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
8 V) \- l- f. _" }) |# \ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
G7 G1 V( c1 {! v - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)! L9 w5 k9 c9 I
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)' C7 Y; Y2 b# C0 Z
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy) _( O E a3 c5 \9 v8 x: Z7 s
- ;====================================================================== T' |4 t/ D h3 w* N
- .INCLUDE "fc_demo_config.asm" ;全局配置
# k3 m) Q H+ N& v/ C - .INCLUDE "fc_demo_constant.asm" ;NES常量6 [5 e' X) ? F
- ;======================================================================6 ~" w% e/ u. X% b
- ;音乐配置5 \6 z8 h9 ^& z
- .IF 0 = MUSIC_THEME 4 d! D' L A3 n
- .INCLUDE "data/music/Gremlin 2/config.asm"
9 [* a/ a: _1 |% m( U- v - .ENDIF
- | t5 n; N& c; z2 Y) M4 f - 1 h# c' |' ~* C( O; I' ^8 Q
- .IF 1 = MUSIC_THEME2 k9 r1 `8 ^% @- F( W( m3 ?
- .INCLUDE "data/music/Raf World/config.asm"$ @/ C& |! a. o' H
- .ENDIF
& ~+ c% d# O" v+ C# n2 _* M Q - ! ~* N) H5 W$ {' U' x
- .IF 2 = MUSIC_THEME 2 J- B4 x* b2 I( _7 Q
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. @& Q: S& N b7 f" [/ {" I4 G - .ENDIF
- w5 \% m" M7 ]0 \. {% w0 D7 j, v - 8 I) i% q, \# Z4 L$ }/ z5 j% H; P
- ;======================================================================' {0 H# n& x9 x4 O
- ;引用CHR图像数据( }5 r8 m# e# ?) `
- .BANK NES_16KB_PRG_SIZE * 2
4 @/ F( P9 Q, A - .ORG $0000
& t- _0 Z' P) C0 X7 a - .INCBIN "data/bkg.chr"' Y2 G& z' n) i' H- D4 Z3 x) d+ G0 O
- .INCBIN "data/sp.chr"
, F1 T, J5 f3 ` - ; Z/ }. j `# M( L/ I9 S/ X" D
- ;======================================================================
( l1 z0 b8 x3 T! | - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
7 L) x( d9 G3 {* |: m' y - .ORG RESET_ADDR7 u/ b6 ~* j: u
- ;======================================================================. ?6 E! U7 y3 U! @. `
- ;引用其他源文件- |' s; K! ]; P: Y4 C# Z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理* c. x5 [ f+ Q) Z, }3 W, b* w
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
, y3 |: a/ k# } - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
* X) r8 L+ [ X - ;======================================================================. @) I9 u3 s4 z* e
- 3 Q5 s; I! T) o5 }
- ;======================================================================
1 L" R: {( m- C8 U - ;等待VBlank到来
- x* H3 U8 k' G: Y: ^4 o - Wait_For_VBlank4 a8 W# _8 A- m/ D9 \# _! W
- LDA PPU_STATUS. q2 f$ A9 v' T3 w4 ~
- BPL Wait_For_VBlank0 u% X0 m& R' u" y
- RTS
! `1 h, L8 |! p2 X! t) p! b: D - 6 s9 B4 N# f( p4 E. i( }) T, O
- ;====================================================================== x$ g/ H( q% g9 T; F N, @
- ;调色板初始化! d' _ v' \$ w( }) W+ b: a
- Palette_Init6 X" {. Q, w! E: v7 B: V
- LDA #$3F
6 m, Z: L7 b' {9 a: D - STA PPU_ADDRESS1 _& i* H" i- O3 s
- LDA #$00
- G f4 s6 ^ w6 b: C! F - STA PPU_ADDRESS* I% E6 x: }! o* j; e' [
- LDX #$00
1 `0 m9 E; a. m/ h$ J$ F7 _0 C6 S - LDY #$20
; t# \: i1 O6 ~- G! b3 C - .Write_Data2 w+ P* n" k1 r* e C
- LDA Palette_Data,X# X1 B* M+ H. D! @
- STA FC_PPU_Pal_Addr,X
; J. W; j- N. G - INX
' b8 [6 j" U9 |6 I - DEY
$ u2 h- }( L( L$ J$ |% S - BNE .Write_Data9 ^4 G9 K( P* c. N* _* M/ Y
- .End
# x0 Q& x9 B! i4 J - RTS; K% o) n2 H, |: w
/ x' ]& L0 {5 J: G9 V- ;----------------------------------------5 Z0 ]" w6 K2 J/ |# P3 F
- ;调色板数据
2 g; l d- B/ k% s) m. P! ~ - Palette_Data
# r _* ]/ J3 U - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B' E/ G5 i. z& g# _9 ~/ [" ^' b
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 k% b! ]- P( U( h - 1 `% _' G! P. d+ l8 g j
- ;======================================================================
2 A6 r1 ?" k& P1 ?5 [ - ;命名表清空, t3 i$ z2 G" a0 T
- Nametable_Clear
0 E) [8 N1 C; H! l - LDA #$20
: S9 X- }" c% N( P - STA PPU_ADDRESS9 v/ r/ C# b7 y2 G' H( c% a6 y
- LDA #$00
4 J' h, V$ q q1 `& K - STA PPU_ADDRESS
( T' z' L5 P9 v! X: w% K- i7 J8 g - LDA #$00
0 P. r2 U# w$ X' f: S7 C - LDX #$00
$ A$ u/ m8 O* D# d - LDY #$08+ h9 i" u" ]% ^8 ^
- .Write_Data
. e6 j1 ~+ n7 A$ M* t ` - STA PPU_DATA
5 q$ l" k& \; Z n6 x0 U0 l) W - INX
% [1 d1 m( U5 Y3 A; ~$ `2 k8 h8 ` - BNE .Write_Data
2 g9 L3 }3 l [ - DEY- k% ]; T; L9 H/ P6 x, L
- BNE .Write_Data2 [4 C, r" N" X! g* g2 L% ~" x
- .End
z( K8 H0 M. Q: [' O - RTS J1 |4 M2 V; L8 ^2 { w0 O
- J1 t! F# j) U9 V! h1 p
- ;======================================================================
% W3 b- w. j& Z% H. e- G - ;音乐曲目切换! E" _/ D5 i6 g: z- m
- Music_Select_Process
$ `, u0 n/ F+ Z5 v6 x& x
' t5 t0 t' z* s5 W* S- .Pre_Music;上一曲; @/ Z4 R+ z8 Q' l
- LDA FC_Gamepad_Once
; T. j( k# x; ]! x - CMP #JOY_KEY_LEFT. ~1 J& s! ^* `* p
- BNE .Next_Music) {0 y1 y% g. Z5 g! t
- JSR Music_Play_Pre
! p/ w; G0 a) {, U) }" j - .Next_Music;下一曲8 x) w$ s6 f$ o7 W5 G- m3 O: D0 f
- LDA FC_Gamepad_Once
7 h( K8 b9 {. r: ^/ w1 P7 E - CMP #JOY_KEY_RIGHT% w) ~# l$ O) Y$ d) N5 m2 \
- BNE .Next_10_Music
, U0 n w# G, D. \# U- o - JSR Music_Play_Next
8 D5 N' `& t+ S% l$ v* k - .Next_10_Music;上10曲
8 |# W. A4 E+ E& `; ` - LDA FC_Gamepad_Once% |+ K3 p4 t' j
- CMP #JOY_KEY_UP$ T% v: H7 Q% n' h
- BNE .Pre_10_Music' e. I) q1 r" u0 @4 I% d, E
- JSR Music_Play_Next_10
* u' N2 L) m. |: i - .Pre_10_Music;下10曲5 a. ^ ` U. U6 X2 U+ m2 Q; [
- LDA FC_Gamepad_Once
0 B1 J" W) I3 w2 Q1 C9 a9 l0 E - CMP #JOY_KEY_DOWN) l4 R* `* t3 t/ `/ T4 _5 r
- BNE .Reset
; P( ]4 F- Q( f# V+ `& P! e' H - JSR Music_Play_Pre_10+ z7 w$ P" J" D) M% L4 N
- .Reset;重播当前曲目5 j. w1 S6 |8 J& |
- LDA FC_Gamepad_Once M0 O0 u+ J6 q" f' z
- CMP #JOY_KEY_START
2 |# X# c- B1 p4 N - BNE .End
3 T* G8 O* _0 k$ z' m% J: t - LDA FC_Music_Index
. _5 B; ~; g, N$ {) R$ o - JSR Music_Init_Process
0 z4 r8 D$ ~( \8 p$ B - .End' N/ ?! `% {, ^8 o8 y4 K4 |
- RTS6 \: f ]; |- B( o
- O3 l$ K, A( B8 t' H) _
- ;----------------------------------------------------------------------+ l. n: b! A2 j9 I% M" [$ o7 P
- ;播放上一曲
+ S3 G* m; v2 g0 u - Music_Play_Pre$ j0 @, n! x- w u; ?6 _! Y9 `
- LDA FC_Music_Index/ ?8 g1 H& s0 y$ D. i( G
- BEQ .End
" y7 [- J* G. H3 a0 b - DEC FC_Music_Index; q3 J- m5 V% r9 `
- LDA FC_Music_Index6 p7 n0 v& i: D7 m$ c i4 j5 o
- JSR Music_Init_Process
& _' i' Y, [; r" b- N3 I/ l - .End v4 k! }: P9 \2 E$ \4 Y- W
- RTS
( X5 z i; H7 R! n4 j5 N - ;----------------------------------------------------------------------
1 U& j0 D: E; X5 E2 U& V8 s3 s - ;播放下一曲
$ h3 p0 e0 k0 Q( f- X2 L - Music_Play_Next8 f/ B: t7 N' @) R% S" {
- LDA FC_Music_Index% t" A+ t% B3 Y7 h% H" G
- CMP FC_Music_Max_Index& ~3 a# E& |8 b. l3 L
- BCS .End. J2 B; W- V6 W) l$ n
- INC FC_Music_Index) i; @, b( H3 ]
- LDA FC_Music_Index
9 }5 u$ n# Y% ]6 X) x7 }/ ? - JSR Music_Init_Process: A1 L. b( T6 q& i/ d* C/ G& [" c
- .End
8 r5 b& t; m3 c) g9 Z - RTS+ C( V; ^. r* G! `, k4 i- D2 j
- u/ _; W# Z* m4 B% ~
- ;----------------------------------------------------------------------
/ ^6 W7 V9 U- \5 B/ l* j - ;播放上10曲
$ j' v! z" k [, m - Music_Play_Pre_10
4 U' C6 D" A. p, n - LDA FC_Music_Index
4 [) c( G- Y! m3 v( ? - BEQ .End
3 A* {; X/ i( I/ b3 Y - SEC7 j8 j+ K9 E( p* S
- SBC #10
* |& T, R a* [5 ]8 c# Y3 G: J - BCS .Pre_10
. ?9 V& m0 ~4 z+ C - LDA #$00
/ r# G! x9 ^* _. ?7 F2 n+ a6 J) T - .Pre_10
' Q# E" j* R" L' P - STA FC_Music_Index
' A" I% X. _2 t; o - JSR Music_Init_Process
7 j5 O% m! {* a7 R - .End
; A% c7 M/ o9 | - RTS5 x, J+ v& L# {$ i$ \9 r# d
- ;----------------------------------------------------------------------; f, `$ T, X* D" e) o3 W" Y$ U: t
- ;播放下10曲0 n# q" g1 }5 n! R; \+ H) d6 u/ ?
- Music_Play_Next_102 w2 \( J7 a. R$ J
- LDA FC_Music_Index+ a7 f- Y3 x' P
- CMP FC_Music_Max_Index
: \5 w8 U" y: x6 ?' Q - BCS .End
1 Z$ E" r6 \1 x3 d1 i - CLC7 \- X3 \- ?: P! O
- ADC #10
# U' h) X, y' c, r4 \" F3 x; R8 n) C, W - CMP FC_Music_Max_Index6 K5 n9 m+ c# z) V- S# N D# ^; T% [
- BCC .Next_10
) D% R6 A5 W( D3 c, a, |& ] - LDA FC_Music_Max_Index
9 G; M& b" d( q, O8 e - .Next_106 n2 s# @) k6 `6 S
- STA FC_Music_Index% C2 `# d5 O1 A/ _: Y; k
- JSR Music_Init_Process
2 H1 O0 {# b1 _8 l& K - .End' G4 g" C: f. {, s/ `. u5 H- |
- RTS
R, [( z `- {+ ] - 6 n+ l& X1 A* w2 O. [
- ;----------------------------------------------------------------------
, ]6 i7 t: A5 U5 o( _6 z h- U9 M, z0 J - ;8位十六进制转3位十进制制
! p3 |, U+ W7 z" Y - Hex8ToDec
+ k* B; C$ u/ o6 Y/ @0 ]' R9 i" | - STA FC_Dec_Data_1$ ?( h3 K7 _6 W' c; `/ f3 e
- LDA #$00+ d/ i$ E& m# S8 b# X
- STA FC_Dec_Data_100! O. C6 d7 C& g, N; f3 Q0 K
- STA FC_Dec_Data_10
* ?2 h- C& M( E - LDA FC_Dec_Data_1- g% i$ [+ X1 o. U2 ~
- .Convert_100% }) a% X. [9 ~6 ?+ b! T( Z
- CMP #100
: b3 s+ a5 ~) G$ R - BCC .Convert_106 z. V* S Q( @2 ~! R- e
- SEC
' M1 ]( U7 ^: V/ e2 l( y/ g - SBC #100
* E% z/ B3 M& ^' ?9 ?4 p& j - INC FC_Dec_Data_100
3 F- T* C8 T8 [: G - BNE .Convert_100) v9 h; s: [4 u. Z3 V2 T8 p
- .Convert_10
& J& `5 K& r& J/ q - CMP #10
/ R" Q5 A/ n% T. X, j& |% s. a6 S - BCC .End
4 z+ v1 P7 q- I8 |- X7 r Y& | - SEC
, A+ }$ z, \9 W/ | - SBC #10
% z3 _! g- D) ]* K/ x - INC FC_Dec_Data_108 _* c k3 z: {
- BNE .Convert_10
! w. ~+ H. L, r - .End
) ], c- M' A8 L - STA FC_Dec_Data_1
0 X: `, g n; R( m V9 }* v u' g - RTS
) [8 ]% D( n! R" F t v
9 E# `$ t: o! D" T- ;----------------------------------------------------------------------
3 e5 g- v! ]) }1 \* t7 v - ;显示曲目信息
8 q( V) |% {$ a; ]& w+ F! ]+ \ - Music_Info_Display2 C' z/ F6 h0 |, C% t; Q
- LDX FC_PPU_Buf_Count" H7 m( P5 x: A- P% k% X' c, n
- LDA #PPU_WRITE_MODE_CNT_LINE, e ]0 {9 m& M2 q0 z! n& w
- STA Use_PPU_Buffer,X
8 s- O8 i7 j/ j! H - INX
1 z8 V3 l5 X% j2 A! d" w - 5 o, K. p" M0 \3 W! C; a2 u
- LDA #>MUSIC_INFO_POS- ~# X( ^, P1 M+ k
- STA Use_PPU_Buffer,X
; Q4 Z: V- E$ L& [ - INX
: Z% D! g/ O; c/ n: Y, c -
0 z; q: E/ h; W3 _) w8 x9 n - ;居中
8 {8 x% o+ t5 f/ x# X - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
1 e9 S" z0 F+ g" l" B) E - STA Use_PPU_Buffer,X" {; s+ L7 a+ p- w1 A7 C9 v; [
- INX
& {5 S! I; g. Y) z - 1 N/ o- S1 p. r8 i2 P& [: l
- LDA #$05$ ~7 E+ K5 H1 P" |5 d% ^
- STA Use_PPU_Buffer,X1 m4 l8 u& O& W3 a7 Q' V
- INX
/ b: Q& G2 r/ ? A5 ] \; T# `% l - ' q: t# h1 d5 I9 c& E: i' u1 A
- LDA FC_Music_Index
' a* D2 H8 i% }- _: r6 M4 W6 N- Z1 K - CLC* ~4 G: P9 a3 V; @4 O* S
- ADC #$01
Q' G3 C. G/ f4 x: O9 p - JSR Hex8ToDec0 z& B* U' j$ i- a
- ) P* |# f: [, [5 R. Y
- LDA FC_Dec_Data_10
5 K# K# _- C# l) b5 w6 Y8 T - CLC
; w; C" t6 l8 H/ l* Y, Y. y - ADC #'0'' Y" c, f6 W$ h
- STA Use_PPU_Buffer,X7 p; l3 T: D0 _- n) i
- INX7 x( h1 o) [* o* E( O" a, i0 M
- 2 }$ s6 g' g7 A; ^/ \
- LDA FC_Dec_Data_1
8 N/ {- H% h: ] - CLC
& H) z' N2 ]% b% d# L! K - ADC #'0'
+ B. s0 G. ^# g6 i - STA Use_PPU_Buffer,X
; {4 S# o' E3 w, m j - INX
$ H" A8 y7 O- d7 J" T) x -
/ O! |: X9 D9 o+ l v( Z: c - LDA #'/'
& U5 V; V3 G0 V( U - STA Use_PPU_Buffer,X
8 E* w4 T x4 | c' X# K+ F7 ] - INX
. \$ V0 Z5 R [9 D/ s9 @ - ; N. d7 l; y6 R: L
- LDA FC_Music_Max_Index
4 q3 [/ e0 i1 R! F) n - CLC
$ a. L3 T8 n" y. C; {; ]5 O* Y' } - ADC #$01
: h; P, G2 l* l - JSR Hex8ToDec
8 L, x5 [* z2 j; H: R( Z* l, g: G - $ C% o7 a# U8 A6 z+ [3 E1 i, P. Q
- LDA FC_Dec_Data_10
1 l( h, y+ Z# m# |, L8 r - CLC1 B5 L: {( m2 p0 ~. \/ K, Z
- ADC #'0'
1 \( f% _" T1 ?6 V/ n4 O# P - STA Use_PPU_Buffer,X- l7 V/ P/ s- E% Q# v6 p+ { I
- INX
6 k; n$ ]( z" ^' Q G4 I -
& Y% i7 r6 t, y* H - LDA FC_Dec_Data_1% b' {! t! B% O0 I$ h- P4 `
- CLC
! T, r2 r: `0 i+ B8 p' d2 n - ADC #'0'
7 F" b& J# y. u# y5 q a( y! j - STA Use_PPU_Buffer,X0 d! n$ W, L. a
- INX) `% P% B) f$ b3 V4 ?5 Z
- # e2 ]) l3 v) a& K8 _$ y! {% W
- .End
/ m: S1 r5 [6 j' B - STX FC_PPU_Buf_Count8 }% ]9 [2 ^# R% x9 o
- RTS
$ S- c( w- _) i* ]
- q3 v1 R+ m& P: y B* |4 M5 ~- ;----------------------------------------------------------------------
: o% k n5 J# H& P. c - ;音乐曲目初始化处理
8 o; S& _, \' q1 K( `. \7 v2 B x* C - Music_Init_Process
2 j4 X x: b n; \8 x. C( Y - PHA
3 y& R' z3 x7 B7 S3 G9 r* N - JSR Music_Clear_Process& S' M- C5 ^) n/ O: z: R
- LDA #$1F
& E0 ?( I* I; J Y' a - STA $4015
! v3 b! P# L" |3 e: w: i/ i - PLA7 U3 H H+ i9 S$ T* R
- JSR Music_Init_Addr
9 L0 @6 E. Z( w; s& u. [: M7 f( z - JSR Music_Info_Display" }% W. O1 A" k/ k V
- RTS
" }; X, M: T' K5 r - 0 P7 \, X& \) _ L+ \3 _
- ;----------------------------------------------------------------------
8 |5 Q1 z* z t! I/ f" S! @+ F - ;音乐播放处理
W7 i* K+ S8 y - Music_Play_Process1 ^4 h0 k* C1 X3 S% ^' ~! i
- JSR Music_Play_Addr
; E% ]3 z) z7 B, `* S6 a - RTS
- r$ n" x5 V8 l+ I: Q
/ Z, e5 {% B" K; U3 s* M6 O/ b5 t- ;----------------------------------------------------------------------
: T+ d @$ A3 t( V- l3 F - ;音乐播放处理
" {7 ]) h! S) J$ Q- ~* z - Music_Clear_Process
9 {6 e9 W A* r: @- {6 L) e - .IF Music_Clear_Addr
; `) Q+ O: ^3 w' N3 s; j0 d - JSR Music_Clear_Addr% V! Y0 _5 z3 K, V3 P
- RTS
" k( y$ |8 O& y% V2 @6 v! Q - .ELSE0 _* b; _, l* n
- LDA #$1F! b; G- I" M- S3 {3 d/ x( C
- STA $40155 l( w: R- g0 }+ ?/ U6 A
- LDA #$00
2 X2 ` e- Y5 I4 Y - STA $4010
' g/ o7 d2 M7 v' m* V - LDX #$00
* Z6 O/ H1 X0 ~ - LDA #$00) A3 @4 e7 @) N# e
-
- t. b4 ?/ y& [0 ^3 W. T - .Music_Clear_Zreo_Page_07 F. J8 B2 c) n" K# L4 n+ M+ Z$ @
- STA $00,X
) G# x$ Z: h- h5 n7 M - INX% P1 t* _/ v8 A3 V" p
- CPX #Use_Zero_Page_Begin
( @+ G1 {0 B, d) z h - BCC .Music_Clear_Zreo_Page_0
6 k& Q5 }3 M! f -
t, a2 a( c5 x. H4 Q( Y - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
7 `6 G V7 F2 \9 ]( u8 J1 c0 d% g3 z - .Music_Clear_Zreo_Page_1
* a3 _! t2 v" M5 E$ ^* b0 B - STA $00,X; C4 E ~( P, x% {- y# B. Z
- INX; `2 S2 H* n0 P! N3 A* D, v
- BNE .Music_Clear_Zreo_Page_1# o! k- u. P5 S4 P: a. A/ V
- a P$ c- i- i2 n0 o& J, X" M8 ?
- Music_Clear_Process_1
+ p3 N U4 b$ {7 D ~& N$ o1 F - STA $0600,X
! S0 W8 d9 c- i5 @. g* _7 g0 B: ]: C) N - STA $0700,X! W( v) D4 `6 t) x8 @3 p1 _8 O
- INX
4 C5 T% I+ U' l. I - BNE Music_Clear_Process_1- R3 y. E6 Y/ F+ F* l5 V
- LDA #$10+ V9 V. ?1 w* P0 m' h8 k$ d) [
- STA $4000
) l& Z. [7 ?; c- W% o+ k9 ` - STA $40045 R; @% i' w1 @- {% r
- STA $400C( n' k4 K) o; k; H, A
- LDA #$006 _2 v, J# K# P2 C' g% i1 x2 q* f' W( r* ~
- STA $4008( O. P9 [; a# i' ]
- LDA #$0F5 x* B! x% z; E5 Y
- STA $4015
/ A2 T: X9 C: Y* K+ Z3 ] - .ENDIF
8 ?7 |. G; d T- \ - 1 f {3 R/ Y# I9 o) j# u* F) L
- RTS
) b* S) {* v p( i! H! O( q - 8 f9 g* M2 T6 D; _& Z; _# R
- ;======================================================================) p, v Y2 v" g7 E8 _7 r# W: e: U
- ;重启处理
5 |; h2 D, ~7 O - Reset_Program, B- f7 l0 R- @8 G9 G4 K
- SEI
5 }& ^/ H% W2 e( K, I2 r - CLD" q d0 `2 `5 p6 h2 [% l1 [: v
- LDA #$00
% C9 h1 Y& ^4 B2 T - STA PPU_CTRL1 k$ Z J& ?5 D% o% |
- STA PPU_MASK
( v$ V0 x- S' ^' R* Z; F7 t; u - STA JOY2_FRAME
1 o! |0 B( V5 i5 N e; b% h+ p+ s - STA APU_STATUS
8 ]4 L- z) T: O _2 b9 ] -
% j# v$ D4 B( F7 M- m - ;等待屏幕准备完毕
5 G0 Y% R1 @" m" H# I - LDX #$02; F. X* ^" X/ K1 U
- .Wait_For_Screen_Ready
' B* D9 B* L {% k6 j1 m- o; K* f - LDA PPU_STATUS
- a a* Q2 \" y! I3 _# X$ @ - BPL .Wait_For_Screen_Ready9 ]; g5 ~& y+ o' Z; H, I7 n
- DEX6 S2 S# q3 D( A. J" E, t
- BNE .Wait_For_Screen_Ready
4 \( f" X, g9 d/ _, X - ! m# K! Y Q1 d2 g: y |
- ;清空调色板
7 x b+ B1 Q Q# o - Palette_Clear- k9 L- w# u' \) x! B( G* p/ D
- LDA #$3F
8 k, C' G/ j6 v; `- F - STA PPU_ADDRESS% l8 t$ F9 v l
- LDA #$005 `2 {0 @" J: T# D
- STA PPU_ADDRESS6 K u9 a& m9 r& a1 n
- LDX #$20- }7 _, O9 Z% I
- LDA #$0F
. |2 n" G% f' O - .Write_Data( V- y. X6 |* N/ f/ [9 K8 U
- STA PPU_DATA, V$ z' l7 t! `
- DEX
% p, O0 L; H. o& {! B; y - BNE .Write_Data9 j" I) C& K. O& U" o, F `7 {0 k
" J! @9 W3 \) H' t, l/ g _: r1 g- ;清除声音 $4000-4013% \# v1 W" m0 X9 \- r$ k
- LDY #$14* D0 h9 o7 |* q% J% o$ O
- LDX #$008 \/ O4 h1 E# A g3 W3 F, A& @
- .Sound_Clear% x" P; @# |, x
- STA $4000,X, S& S9 b. j+ o! S
- INX/ ~* w% ~) ]6 w& n
- DEY# ?! w/ J7 L0 j/ ?. V+ ?
- BNE .Sound_Clear$ L" \9 ^/ g5 R7 c, \* l
- 3 s" x9 y/ q3 S$ }
- ;清除 RAM $0000-07FF! F) k+ S# G$ t
- LDA #$000 U. C* t' L T* @. r
- STA $00
$ q5 u" }: p1 |2 ]. q) z. G0 F - STA $01
( |0 s; F7 M J - TAY
$ J1 a6 d- Q/ p) ?& D, r! L- \0 H. c - LDX #$08
3 G v* u( Z' u* a" k" j - .Memory_Clear& i2 j3 H6 j/ [3 r! u
- STA [$00],Y. v$ X9 L& Z5 e; Y9 D4 B- E6 z4 \
- INY
# M/ b, A% c$ w* a6 @1 f1 _ - BNE .Memory_Clear
* P5 v, \# o% g - INC $010 K: g7 |* ^: p/ u
- DEX
; }1 e' S9 x0 x - BNE .Memory_Clear
9 d6 Z0 W) E6 \$ q - , j. s% w# t# w L, n( Z$ \
- ;精灵缓冲初始化
7 g- E2 k1 G8 p- c - LDX #$00
; f( y; h9 ]1 @& a$ Z - LDA #$F8
5 L, p8 f+ n3 v1 H# j& d: g# B8 ^ - .OAM_Clear& {& @) f A5 `# M' u) M/ Y0 `. W
- STA OAM_DMA_Buffer,X$ R. G, h4 f+ Y+ P: A1 Y* B
- INX
f1 a6 t5 Q$ s( t+ f* j% O - BNE .OAM_Clear9 n, T8 k7 |) D, f% ]# j
- ) S! M1 N1 x! W, x5 z" I" ?
- ;栈指针初始化( T; l3 |' B2 f: K- C
- LDX #$FF
2 Q, J6 y; R9 w( w) c& H - TXS
; ] J3 c. r+ k! ] - % b! A1 N; I! ? h6 z5 @( C/ I( Y
- JSR Nametable_Clear;命名表清空* X6 \3 ~3 D+ r
- JSR Palette_Init;初始化调色板缓冲# `8 a$ l) l2 f3 t C& d$ h5 D
- JSR Static_Text_Init;初始化静态文本
6 F+ C3 ?. x) a# A. r - # A# u, Y5 b9 Z
- LDA #MUSIC_ITEM_TOTAL - 1
4 `/ E3 `0 ^/ q l& }( I1 t6 V( ~ - STA FC_Music_Max_Index9 n7 r! ^8 M+ X8 j5 k
- . k; g% a$ A' e
- LDA #$1F
0 i6 C/ c( a5 a N - STA APU_STATUS
) ?8 D+ G! s. u; G" j9 c - LDA #MUSIC_BGM - 10 h1 H* H: y; S8 X
- STA FC_Music_Index
3 D5 W) B0 ~! r7 r; w$ h - JSR Music_Init_Process;音乐播放: S* W3 U9 y w5 H9 e
- 7 _* x; u. c& |
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)" D7 ]2 i/ y- u& o/ n4 I
- LDA #$1E
0 {' o. A; s: s$ i7 C' \ - STA FC_PPU_Mask_Buf
G4 C; P% |* X; Y0 x - : J8 M3 V9 ^& J* w/ u" k5 J
- ;启用NMI处理
5 z7 o, P% d4 G2 ^) n* v3 M8 v - LDA #$80' |- `" ]) D* _+ X0 M
- STA PPU_CTRL
' l) L/ [- I k3 o' n8 } - - y* \6 T/ g4 C
- ;程序循环, 剩余工作交给 NMI 中断处理
U4 C4 A. q' y1 D) X+ ~4 t, g - .Loop
# T- J0 y1 r1 D' u/ L' [# H4 N - JMP .Loop
2 |! Q4 k/ D# {6 q - 5 v w/ X6 i* t5 }: }; [
- ;======================================================================3 ]7 ]5 T( P4 c+ A
- ;不可屏蔽中断处理
( P0 [( {# u" t$ y' v7 E - Nmi_Program% Q d6 Y9 |/ T- _" h$ v! ~
- PHA
' K$ J7 W4 G- v - TXA
4 K! w' s" X* E' U4 J - PHA' T% w s4 v8 l4 S( S: |5 C( O6 c
- TYA7 ~+ D& a' w/ M
- PHA. d) l/ G- X2 u' S; z: Y/ c
- + M, ?8 `7 X* W( n b
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
9 ]9 n1 ~5 j- c' G( v7 g - 8 P- m# A/ Y) D
- JSR FC_PPU_Procrss;PPU处理" W( m4 J1 Y3 w
-
. r3 M) ` w, U0 r# d1 u. U - ;精灵内存更新* E8 w5 X4 w1 U; g [0 b1 k
- LDA #$00, C/ R1 A# }" R, l) r9 ^* e" B" f
- STA PPU_OAM_ADDR( [/ |% j0 W3 |9 j
- LDA #OAM_DMA_Buffer / $0100
5 K$ i$ b$ D$ J, V+ u - STA OAM_DMA
0 t K% p: e9 V8 R; ~5 {0 }. Z) v -
2 l! c1 R2 i6 n1 x - JSR FC_Gamepad_Process;手柄输入处理
1 b% }6 h- S; F# n& T8 c3 L - JSR Music_Select_Process;音乐选曲处理
: l, {4 T' `" J' b9 z' [& T - JSR Music_Play_Process;音乐播放处理0 E. ^/ O& n+ o% q+ c
- 2 T& x; b' [2 {0 V1 f* s
- PLA
5 w- j3 [! t$ v1 l" L - TAY3 X. n1 W) _+ i, H, _8 F
- PLA) a- q: q6 @5 k" ]
- TAX
- Z" L% D) u' h# g" G/ Y6 T; m: A - PLA
+ O( y/ \7 Z. G - ! W" i6 ^4 u" K, Z1 r- D
- RTI! Y1 j' T4 B$ ]' p. w1 \, ~
- 7 C+ k) Y! ~$ q) r5 V
- ;======================================================================
1 B3 T! a1 ~; L- F - ;请求中断处理
2 F. W: g* s1 r, S7 t& z - Irq_Program
% y0 i0 g5 a* |" H - RTI
3 y" U2 i5 @# @4 P - - f8 L4 d# e* G$ E0 _
- ;======================================================================9 X3 O7 P n1 c! u! ^/ I
- ;中断向量表1 s6 p) g0 u, z4 U- O9 ^9 U, X
- .ORG $FFFA
5 A7 x% K% b" c0 |& T W T9 _ - .DW Nmi_Program ;NMI触发时执行1 ^% g+ d3 Y1 j- @- o2 A" j& h* n
- .DW Reset_Program ;载入ROM时最先执行5 Z- A' w9 c7 Y9 s9 `7 r' K3 w
- .DW Irq_Program ;IRQ触发时执行- l$ a8 G3 y0 X0 L6 {( ~/ k5 m6 a
复制代码 3 ?0 c' ?* \% X
- u! x. H U2 p6 y
" V& d: [; s3 fhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|