|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
" A5 M7 c" ^. [+ `1 J4 j' |% S4 x. \ " x- E0 D0 u' P1 @( {
以下是主框架代码:
' w$ v7 ]6 d% g" h" W, e" L5 Q$ @- ;====================================================================== f2 R8 p' P& G7 s/ @) u
- ;文件头
5 A9 s: T- @% z% s" @' G - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量" ?1 G% o$ ]: e( }
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
. M- B8 b' q# K2 D5 V - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码3 y5 h2 t! `' S5 T' t9 X
- ;======================================================================
) a e4 I7 M8 X0 H - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* t. d1 Y$ q% u) U8 I
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 16 ?) F" d- q- c- o7 I; M
- ;======================================================================
: Q1 V7 }9 e9 b1 W" b9 W - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
/ s, R% S# w$ f! i2 D - RESET_ADDR = $E000 ;主程序起始地址
6 H% C/ [3 K. b# p0 m+ L' G - ;======================================================================# q2 N# q \7 w+ Z5 k* p
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB+ D D/ a/ T5 g8 n
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 D; r3 @& {" n1 V( v- A/ l M1 Y9 ~
- .INESMAP 4 ;Mapper号 (0-4095)7 W, E; Y* t) Q8 |. x% w
- .INESSUBMAP 0 ;子Mapper号 (0-15)' `6 V/ D/ F' K/ F" }! Q
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
5 B7 {7 e3 Z, F# n6 L - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
* _/ H) J0 K7 R' G% Z% K6 [ - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
( j9 l+ R2 P1 u9 r n9 I h1 S+ A7 T - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)1 \0 ^. x) U; K+ W# L0 j3 s
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)& k: Q+ ^# g: d. u* }5 i8 {, Z
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)7 _& \" m) M \- d, w f8 e _- O
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
4 {0 r" D' O8 W! v, K - ;======================================================================
1 m- e8 {9 G4 ^3 E( x0 o7 g - .INCLUDE "fc_demo_config.asm" ;全局配置/ ?! S$ V7 L8 b& S' L" n0 M
- .INCLUDE "fc_demo_constant.asm" ;NES常量5 x. I! k$ O3 C2 x$ c7 P
- ;======================================================================
/ A7 x9 a6 f. N( p( n - ;音乐配置
% l7 q" O8 e2 Q) }, f$ ~ - .IF 0 = MUSIC_THEME
! k" z" N# L1 A3 v& Q - .INCLUDE "data/music/Gremlin 2/config.asm"
( G+ ~0 C- Z) t5 q; ~ u - .ENDIF, H4 A. c$ d" X( J
-
7 j0 i4 ~+ M) i( a. Q - .IF 1 = MUSIC_THEME
+ }6 S+ D9 D) G; O' q9 i* g o7 s - .INCLUDE "data/music/Raf World/config.asm"
/ ~5 X% G: T8 B9 H Y/ r - .ENDIF
/ M2 `# z- [0 n8 ~! t6 x -
( Y1 a5 f$ C! T/ g: [ - .IF 2 = MUSIC_THEME
( Y; g9 C: v. Q8 U; R - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
' p9 `( `; k# ? - .ENDIF6 @" Z* o4 g }: N
4 F1 Q% { d3 D6 y' l0 A4 Y- ;======================================================================& I; j( v3 \1 t8 C. w7 e' N0 S
- ;引用CHR图像数据
) u: @5 _- L/ n4 Y4 { - .BANK NES_16KB_PRG_SIZE * 2
) X- V( ]1 L' u+ ]/ c% A3 x - .ORG $0000
7 B# M5 g0 C) ?# t+ ] - .INCBIN "data/bkg.chr", r* E$ X9 h$ Q, j2 T
- .INCBIN "data/sp.chr"0 B* Q4 k. D2 d! l
-
/ E$ ]3 W+ v3 K D$ T - ;======================================================================
9 v3 a. H- A: _9 j9 w2 D! }- | - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
" z0 Z# ]' n( V9 X S( [ - .ORG RESET_ADDR
1 v: m) {8 J. q/ d$ \ L! Z6 h; ^ - ;======================================================================" C$ u" Q) {/ r/ G, O* ]8 ^
- ;引用其他源文件5 y) b- S/ R) Q- A7 u
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 ]3 B8 z j+ z2 {* g
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
& x ]. W, W# [! a C# h9 o5 Q" m$ `: T - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
4 W+ s" g8 d8 c: W; ?, s- f - ;======================================================================* M: b, i, ^3 {' h% F
- r' a B* [( E3 J# h% r- ;======================================================================
; o8 e0 Y& @; m. W- G - ;等待VBlank到来, z( U$ g, ]2 a9 o
- Wait_For_VBlank0 K+ r9 ]0 F5 [6 X0 C3 M7 b4 Q
- LDA PPU_STATUS
2 n) ?/ {1 J' {7 g - BPL Wait_For_VBlank
) M* y1 a8 S% e) w( N - RTS) X+ O l, N; n1 U; a4 \
2 S8 M7 `. O. @$ v4 n2 ]; o9 r- ;======================================================================4 J8 u7 c. ]' I! ^6 P" b! S
- ;调色板初始化
% P9 l% N+ D4 O) e - Palette_Init
% t) h& y4 X5 ` - LDA #$3F) K8 k4 v' W' l' _
- STA PPU_ADDRESS6 [$ d6 P% i0 I8 t1 Y% J# @0 |
- LDA #$00
7 d$ V! W; b G3 p/ o% {% X4 G/ c - STA PPU_ADDRESS
4 C8 `4 v9 T0 x1 G9 S, F; D* s - LDX #$00. x. O9 M3 E! Y9 g0 x
- LDY #$20
7 x; U7 g8 E6 {4 x+ V/ h- j5 E8 ~ - .Write_Data
* T0 T# v7 `- g* `4 X2 e - LDA Palette_Data,X
( w7 O) O. }# C) o9 z - STA FC_PPU_Pal_Addr,X6 r0 {; O, i h0 @ c0 ~( g! W
- INX
. B5 S7 w& J" A& d. ^) Z - DEY }( P. {5 x1 c$ y# w5 v, n
- BNE .Write_Data% H/ z h3 s4 C" y6 v* b3 E- B
- .End
% c1 v# \5 e& Y' b. }* N - RTS
% \( f8 w. a. v* c+ J# H - % |+ N5 g8 f- C; b* ^4 m
- ;----------------------------------------
* n% u' C/ W; C8 P - ;调色板数据, N) Y. ?( o4 J
- Palette_Data
}) K( I+ F# B7 @" L4 N# A( O! V - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
1 k; X" L, q* d6 Z1 r7 N) u - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22 X! _" H5 z+ O3 F; A- A9 r
- - ^, v' x0 y2 y5 t& I' f2 D! G
- ;======================================================================. |, q8 H8 U! } c6 ^7 {
- ;命名表清空 E7 r: v' O' o3 X1 M" M& [3 U
- Nametable_Clear" N9 B' s) I& u6 J; T) Q6 C% d
- LDA #$204 V, a, V# x. [
- STA PPU_ADDRESS
8 G3 V8 ?' P- Q7 P2 X+ y - LDA #$004 X& W* p# F h6 V
- STA PPU_ADDRESS6 g# j+ o" F3 w2 N" J
- LDA #$00
0 Z' s3 n- Y2 o; g% F% N- { - LDX #$00
) G: o0 u" j9 s/ e' L3 R: C1 [ - LDY #$08( k/ b! Q" c# C6 G
- .Write_Data
0 e2 r, P; M9 F* x0 Y - STA PPU_DATA
2 I2 |! C4 @* C; f. k! y: x - INX. I& u; P3 T0 Y* g- }3 y
- BNE .Write_Data
3 G0 |% |$ V: v# o - DEY6 ?/ e$ F% d' e- T% I) i& `
- BNE .Write_Data& R- \! Q: D" q0 P
- .End' S* j e; D, _9 l: ~9 S
- RTS- M1 f$ x7 F3 }- F4 y
- 7 V* G w9 ]+ K+ d/ E8 [8 e K
- ;======================================================================6 E4 s+ ~2 G( b+ [, k
- ;音乐曲目切换
% {" S9 E2 ]( _% e - Music_Select_Process
: j4 h A4 W* p. w - U4 c, _* Z7 W* \- g' {7 l0 h" v
- .Pre_Music;上一曲
0 N" l; ?( a. x/ ]- B - LDA FC_Gamepad_Once
( e+ O* o+ G3 e- g& ]1 B - CMP #JOY_KEY_LEFT/ ], ^: u% q/ g. D/ i1 o/ i
- BNE .Next_Music: `$ S! e B. b3 R7 v9 o+ ?
- JSR Music_Play_Pre
% `3 X/ Y, H) H - .Next_Music;下一曲- K% ?/ e7 K4 U6 a) p9 @
- LDA FC_Gamepad_Once# N3 W0 Z8 H6 ^/ V4 K
- CMP #JOY_KEY_RIGHT
2 P( ]6 c* B }# I - BNE .Next_10_Music
- l$ n3 B" A1 H5 U - JSR Music_Play_Next+ F0 v' c: L t4 ], C; {% m: ` m
- .Next_10_Music;上10曲5 e. a2 l) I4 V( m8 q; b
- LDA FC_Gamepad_Once
" p! M& p4 E6 \ - CMP #JOY_KEY_UP! y. ?( ?; C3 V5 j d! k
- BNE .Pre_10_Music
W* Z' o5 V/ I- h; R - JSR Music_Play_Next_10# [6 `9 \% P3 ?) V9 k4 F
- .Pre_10_Music;下10曲
6 C8 ^1 Z" p. y& q - LDA FC_Gamepad_Once9 j! h+ z, m& ?* @2 ?% W* a& P
- CMP #JOY_KEY_DOWN# @6 X+ ~& M7 `; l
- BNE .Reset1 j8 c5 a! q) d- a( ~8 r3 t
- JSR Music_Play_Pre_10
; ] d* E% Y" j2 u: \ - .Reset;重播当前曲目
3 }4 U4 k+ p& I- \ - LDA FC_Gamepad_Once
' J3 t9 q7 K; |9 b- X$ n - CMP #JOY_KEY_START: B8 Q& [5 v+ D
- BNE .End; m3 D& f( i% J
- LDA FC_Music_Index6 E- ?' V8 [" ^7 ?; x. b3 z
- JSR Music_Init_Process: r/ r3 X8 ~6 m8 x1 U3 K8 [
- .End
7 S0 G5 I3 E1 k( `0 {0 b - RTS
8 i7 t8 ?$ o P4 g$ K l; M8 |3 u
8 G" n/ v$ J6 V; C- ;----------------------------------------------------------------------
u9 f# D Q4 [' A - ;播放上一曲( Y' w1 o- J. v q8 _* D8 v
- Music_Play_Pre8 k' V! p d/ V) g4 s# q9 L
- LDA FC_Music_Index) L9 C' a0 U$ t1 Q" k% D
- BEQ .End2 D. U& s: z2 P* e! M
- DEC FC_Music_Index
/ P( \; d& i- i/ q3 I - LDA FC_Music_Index
+ m. \) S J- E' E. l1 x7 P8 w8 M4 [ - JSR Music_Init_Process1 n. k1 ~( U* e
- .End
; a" X- x C( d7 x/ I - RTS4 r5 x3 `. x3 j* S- @/ {
- ;----------------------------------------------------------------------* }4 _9 }! C' Y0 c3 {/ {" w
- ;播放下一曲! z5 g9 Z0 w D4 e0 m4 y
- Music_Play_Next4 f# c1 z- v9 T
- LDA FC_Music_Index0 ?" f( ?$ e/ H4 {. y
- CMP FC_Music_Max_Index/ W6 v5 a8 U7 v0 A) e. _
- BCS .End: w" H, T5 K# @/ N6 \
- INC FC_Music_Index3 C/ Q# W+ ~( y. L) A
- LDA FC_Music_Index2 _" G. n8 m+ N, v
- JSR Music_Init_Process4 z/ b* |( h" y* W" ?" _( G! t' m
- .End
4 B' M1 {" `2 ]% { - RTS# S% C% F7 Z7 q$ e
4 A" @5 b1 Q* q- ;----------------------------------------------------------------------; C6 ~ y. R+ c2 w5 ~
- ;播放上10曲+ a7 X A9 r/ M4 j2 l6 A* _
- Music_Play_Pre_10, x) u+ D( X% s! ?6 W
- LDA FC_Music_Index
8 D% c5 T% L; B" r# y - BEQ .End3 Q8 u3 x1 V. v4 W$ \) |
- SEC
' n6 |1 r( l- z: Z! {0 s - SBC #104 p2 [( U8 U$ a% e1 X: f
- BCS .Pre_10
$ x: |3 G' b8 @+ Q, r+ y - LDA #$00# s7 I G+ t' A9 K$ }4 V6 |6 O
- .Pre_10
9 |8 q" ], r5 {7 ]/ [ - STA FC_Music_Index O: b) u7 L; p
- JSR Music_Init_Process% z& Z" f, |+ a; a+ W' A
- .End2 x6 Q* U6 ~7 B$ n& s
- RTS
% ^5 C- Y0 \0 ^3 O% T - ;----------------------------------------------------------------------4 r; R" @- N0 V- t$ }+ H
- ;播放下10曲
0 R2 v3 q& k3 O& b" Z" ~, n5 H, t - Music_Play_Next_10& s; S% L- M4 W* y1 H
- LDA FC_Music_Index
7 E' D6 n# {! f+ L5 T. a - CMP FC_Music_Max_Index2 o, k* z9 t, G& A
- BCS .End5 e) J! P8 J$ u' U! A2 `* q
- CLC
: Q ]: p$ ~+ W. c - ADC #10$ g! T4 G- G5 |
- CMP FC_Music_Max_Index
1 h, z, V2 T& }4 w1 O, W - BCC .Next_10; f0 j3 z, O9 V3 [
- LDA FC_Music_Max_Index
9 S; {7 G- ^: I$ g - .Next_102 P5 k' u* N% L, K, f1 B
- STA FC_Music_Index5 I3 B8 [3 v. c7 v7 E; i
- JSR Music_Init_Process
9 h' n9 ]% ^3 D3 z - .End
/ o5 b! }. E& s4 w# |' G - RTS
; ?, T5 [) U, B' l; i" U; f
7 J: t& J2 E; H" g- ;----------------------------------------------------------------------' {5 E' s8 B& i
- ;8位十六进制转3位十进制制4 C i7 G _; ?. n* b) @
- Hex8ToDec3 z- }- Q. ]0 i0 R
- STA FC_Dec_Data_1 y5 }& H( o+ M W4 p. N) j1 s! t
- LDA #$00
; B0 m! r/ b, ?+ M" ~2 x% f% f. O - STA FC_Dec_Data_100
. r7 \, o9 K$ Q" }0 J - STA FC_Dec_Data_10: B# `! a/ c" i! R/ T4 c0 [) j' z0 |
- LDA FC_Dec_Data_13 v; e6 H. |9 a. `3 n6 N& n
- .Convert_100
, i- k2 t( {, i# I8 Z2 w - CMP #1003 x6 z. d0 c( s
- BCC .Convert_10
, o# M Q; r* w9 A1 S# ~ - SEC
) B( K# V! M' s# S2 M - SBC #100
9 G9 l k8 y; m - INC FC_Dec_Data_100" g% d1 x0 M* l. t
- BNE .Convert_100& }2 e, h& f1 r$ X, X
- .Convert_10( l( |. _; R% e' E% \9 ~, L
- CMP #10
: ~+ }2 M7 |2 p - BCC .End
& G; T' r5 o/ x( P Q - SEC
, f8 O0 L8 _/ z - SBC #10
" }+ p' V3 F1 |" L% Y; e/ V - INC FC_Dec_Data_10; u" g2 M0 h; R$ U1 V# t% }
- BNE .Convert_10- c4 I9 B8 w: ~/ {! ^- p; a
- .End
* o4 W* U6 t1 M" T5 T - STA FC_Dec_Data_1 X U; M" H1 H+ d; Q7 t
- RTS
* l" M2 E7 C ]" l% m
4 w1 y2 ?8 {# O+ K- ;----------------------------------------------------------------------: @' A. p& M, K( r9 X$ ~. s l* n
- ;显示曲目信息( a6 Q/ @! I% p
- Music_Info_Display
- Y; E3 e4 J7 a0 R" J, o: h8 U. d - LDX FC_PPU_Buf_Count
$ B6 ~* @0 @3 z8 a3 u - LDA #PPU_WRITE_MODE_CNT_LINE. X6 C6 C, \/ R" _1 N
- STA Use_PPU_Buffer,X& R; _0 w8 ^; A% O4 S' x# H
- INX
. N( j8 i5 ] Z$ e: j: T -
3 F) |3 Q! v% e - LDA #>MUSIC_INFO_POS
$ ^ C. \0 ?4 K! `) L; j/ A - STA Use_PPU_Buffer,X
0 }& T/ l$ D4 J - INX4 r6 {* g+ m$ d4 J) ?* v/ [
- 3 ~) V# I; c7 I
- ;居中& E7 \; k6 b" o
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/22 ~1 {& @- s8 b5 N$ K( f7 O
- STA Use_PPU_Buffer,X
( g1 t7 h/ s6 M. G, o - INX3 q- T- z$ A x: S6 X
-
& M T9 Y, a' E - LDA #$051 `* d1 d, V3 x5 H9 t+ a! ]5 Z
- STA Use_PPU_Buffer,X
, d7 h# h3 d5 k - INX
/ X+ K- }+ N9 o7 M. D- c& q -
2 W3 V) c) C' _( Z2 _0 \! |! e - LDA FC_Music_Index
h0 F' Y, a) l - CLC% ^+ A# K* {, g7 @
- ADC #$01% g( @4 ]' h% f" ~
- JSR Hex8ToDec# d7 X& w O+ S0 J1 u+ f. C5 ^
-
( X( {3 n7 h. O - LDA FC_Dec_Data_10
. \; B2 E# C _6 p' Y9 C q9 M; E# H - CLC
' z' a3 J! f! ?- b' }3 J* E# Y - ADC #'0'
- G6 a* |: E: b; F7 O1 B# b - STA Use_PPU_Buffer,X* v3 ?9 S& Q3 L
- INX8 N2 \$ \5 A# V3 w
-
7 p h$ r% X+ y - LDA FC_Dec_Data_16 }8 Y- Z! }" b6 E/ \
- CLC+ @- h& H/ H2 W. t3 y
- ADC #'0'
1 m) ^, B, c. B3 v; e1 t - STA Use_PPU_Buffer,X3 p2 j1 u; ?! _: `6 K; T
- INX
( ^+ ^1 T3 s8 C$ h3 o -
9 L# U& x# J$ w - LDA #'/'
! H* V+ e: ]4 d; U% } - STA Use_PPU_Buffer,X
8 k: d0 l& c. P" j. | - INX
i2 |4 [2 |! p7 A6 [2 V% n) b -
! P6 V) Y1 a) |0 v& Q/ l - LDA FC_Music_Max_Index: [7 Z- F s6 r f
- CLC
' R& d+ x c0 N1 D1 c3 \: p - ADC #$01; g4 ?) v( \( n. c
- JSR Hex8ToDec
8 N* p! O. i% m* B' v7 y - ( ? y3 \" i! d2 j% ]* V
- LDA FC_Dec_Data_104 z* V6 N1 p& g& c
- CLC
! B6 {( i1 u( h+ y - ADC #'0'- J; Y% [$ x6 `; `& Y9 a
- STA Use_PPU_Buffer,X8 C) k: s: ^. j4 X, ?3 ?" |- V
- INX
+ ~' b9 a6 K0 ^7 m% a/ z# W! N. T - ; Z: l) K! S2 _9 `& Q0 R. T: g* y
- LDA FC_Dec_Data_1" {; U8 L7 K9 t0 \* H
- CLC' _; n4 ^( P. `8 e
- ADC #'0'
3 J9 H4 Z; o X+ C' d( } - STA Use_PPU_Buffer,X' v% k3 Z( g# p- y
- INX/ N; b, z+ j) c* `5 ]1 a
- 1 F) A3 I3 |! S/ }( C7 r
- .End
. u! G1 o( d) K. L, L - STX FC_PPU_Buf_Count
q" v6 g. D1 x& o' ` - RTS
S+ l" W9 |" S& R& Z" V0 @" |4 w
/ B S, a) P* K/ ^( W- ;----------------------------------------------------------------------
Q- s5 w3 o9 X6 j; D) e - ;音乐曲目初始化处理2 D3 M: u+ \: @4 X7 T7 i6 S. J
- Music_Init_Process
+ X- k* z) a: p6 N- d5 I* \ - PHA3 c5 ^8 J6 j! t% F' A$ n3 Q
- JSR Music_Clear_Process
- d& W0 |* e; y+ y - LDA #$1F
: Z/ l( C0 C: e8 N - STA $4015
$ i/ U2 X- ]4 D* a6 I5 U& F4 Q - PLA
/ j. i( H v& a! [* W4 M7 J - JSR Music_Init_Addr9 ` E4 `$ j$ U4 C7 s) R7 E
- JSR Music_Info_Display' j! w% L$ K. @3 n& x5 M8 Q
- RTS
( y& h, Z, O: R7 o$ g% c: G
5 ~' O! O/ f- c3 ]5 m- ;----------------------------------------------------------------------" ?. I" z) S6 o- w4 b
- ;音乐播放处理+ D% B( G$ u4 [# |: m
- Music_Play_Process
& ]( F5 E( Y$ `; m _4 T% D- I/ _ - JSR Music_Play_Addr
H. e3 E) ?% N3 w5 P - RTS
w. \5 y3 q: f6 g ~. c
+ R3 \- a. Y$ d6 I+ u2 t! s$ g- ;----------------------------------------------------------------------; X; `) u# q6 g( }; |4 @
- ;音乐播放处理; r$ |' i" ^$ T& u# W. R
- Music_Clear_Process. h0 O D7 ?4 m" n: z
- .IF Music_Clear_Addr
6 b2 f' S) T; z: c, I6 z - JSR Music_Clear_Addr& Q% G3 L' i+ H( J2 R) Z
- RTS! C- C' B. V5 F C3 c* f
- .ELSE! S0 P. Q5 O' u
- LDA #$1F
1 @( T$ u/ ^; a% |, a - STA $40155 O+ L4 u" @2 p( F0 J1 |
- LDA #$00. X* P' u R. i! U7 _+ B2 A& _
- STA $40105 k5 t0 Q% q0 C- h/ a" S# N
- LDX #$00! a7 B( z* U( F; _) }2 Y; I
- LDA #$00+ m& d: z. r( d, z9 B
- 7 F0 Q X6 J$ n/ o
- .Music_Clear_Zreo_Page_0
* U" A" B4 P3 R1 X( D( C - STA $00,X% s \7 P6 ^2 j; g; u
- INX
' Z: N8 p* G8 e2 c, |+ E E$ c - CPX #Use_Zero_Page_Begin) c& q' x% r Y$ i, u+ V
- BCC .Music_Clear_Zreo_Page_0/ l0 u8 ]# s5 B5 J+ C& v3 n
-
" \$ _9 ]$ w: \% Z$ P - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size% [% U/ x8 k; M( v2 ~* ~2 s4 _
- .Music_Clear_Zreo_Page_1
9 ^( _ P! V9 O7 D' V - STA $00,X4 }5 p1 J, M0 u1 E4 }8 L7 Z
- INX
6 {& h0 j& v! p: p8 E+ e. o/ {, L - BNE .Music_Clear_Zreo_Page_1
9 m% F0 \9 W8 A -
, x2 Y! f8 |* H# z! o1 i3 y: L - Music_Clear_Process_1$ ?+ G; s# @5 R2 h
- STA $0600,X7 L; P5 N$ I, u( |+ r5 P
- STA $0700,X
* V& X9 W) W/ A$ E2 c2 b. v# v9 } - INX6 ?- @3 t5 J) ?
- BNE Music_Clear_Process_1
; i( a; q. f# C& F& y. H% p$ p - LDA #$102 ^( U" {* u; ]( R
- STA $40009 u% V; Z9 f5 w* d% }1 X
- STA $4004
: q6 N* k& g, E, K, o. E3 M$ ~ - STA $400C) i0 Y+ _, [8 `; f
- LDA #$007 z) B! B, |2 _% {
- STA $4008$ g, U8 ^5 G3 E f
- LDA #$0F
" E* \3 S( p" `8 w: | - STA $4015
8 ^5 h$ {: A% n' Q0 X% T9 G& Z - .ENDIF
9 c3 u. |. K$ ~) R% l' x5 L -
! ^! s( }8 A9 V/ t - RTS
, A# U8 [% L8 J9 e- q8 }/ L$ M0 u' Y
d$ }2 _3 B Z J5 U- ;======================================================================
6 K" K/ G3 L3 B# f - ;重启处理
9 N8 u5 o) R! _% u7 d# l) s- P' K - Reset_Program5 Y4 H" r+ v% c; }; v6 k4 T
- SEI
3 l4 G% o) p$ C8 x - CLD ~4 K8 t# S% l% M; o( |& B% }
- LDA #$00) i7 _2 }) U2 n" l/ K" e( R) T0 p
- STA PPU_CTRL
# k+ {7 Z; Q A2 M6 [ - STA PPU_MASK
, Z( M- F. L7 R; } - STA JOY2_FRAME
. N1 C- w7 w4 ^) f - STA APU_STATUS0 [5 ` [4 P/ [4 k. g7 n
-
* T6 F0 Q1 N' e& W' Q3 U - ;等待屏幕准备完毕
! \" `- T% x+ N2 K# a' f A - LDX #$02/ `1 ]4 m8 S ^. r+ g. z$ \) s! j
- .Wait_For_Screen_Ready. N/ f2 U2 X$ b/ s- ] O
- LDA PPU_STATUS& l, `4 J! r3 R9 G0 i' V
- BPL .Wait_For_Screen_Ready8 O1 p$ n7 T3 h! R3 `
- DEX
# }7 B" b; R% @6 n, ]: }/ Q - BNE .Wait_For_Screen_Ready
3 y; }. w3 _8 O0 D9 `- L; A+ Y/ r" I - ! B4 |$ q; k' V9 r; r1 w- E7 o* o4 t
- ;清空调色板9 R* a& z: N O/ @" ~# c5 m/ i
- Palette_Clear
9 [9 `' y( l( O$ }! f- G - LDA #$3F: {1 c r2 [! l7 j3 H2 Z/ m6 y
- STA PPU_ADDRESS; J! A# S; A9 X% }8 V! L+ F
- LDA #$00/ x9 X9 D# C# a5 y# k
- STA PPU_ADDRESS, U/ b6 v6 P3 K, E' K/ ]
- LDX #$20* }0 R2 K. L" A% B! g
- LDA #$0F
" g3 K" W( j3 U$ O+ M: _( a - .Write_Data1 }/ H4 j( l0 E0 L
- STA PPU_DATA
/ u! ?9 K& N5 _; ~. Q7 M* { - DEX
O8 O/ ]/ e! j3 U - BNE .Write_Data
! d+ W3 U6 j- V6 Q
; q3 c7 U0 U- K5 v/ a: m( J( p- ;清除声音 $4000-4013
7 D. `% H/ a: }' @" o - LDY #$14
6 T) e+ q5 F, u - LDX #$00* d7 ~) S4 R" n8 w
- .Sound_Clear! ^" Q3 ^7 U1 J' ^6 K, W
- STA $4000,X
0 T0 q6 f! P G: e* A; D - INX. t+ S# j1 s- }) o3 Q
- DEY7 u: x, x+ E8 {
- BNE .Sound_Clear
/ ^+ T8 L6 K! h+ u- q6 R - 5 {- ]- K$ W% l0 e, }
- ;清除 RAM $0000-07FF" D$ `& f3 k; a0 r( J: v* r2 O
- LDA #$00
] U* h: P# [7 B - STA $00( y: y& B c* l! w; ^
- STA $01
; t0 }6 `( S9 W8 Y" n1 W - TAY& F5 e& d m; F. d3 ? h4 n. j
- LDX #$08$ U+ W4 O& h$ x3 q Y) C
- .Memory_Clear
' E% w8 @% I% f% ?. E7 J& I - STA [$00],Y
$ V. h: K; E6 N' ~( u9 m - INY4 X( a5 k8 D7 G& V- m5 w; s
- BNE .Memory_Clear
+ Q8 | z! }7 L. k% M% t - INC $01
, f" X. }. N. y4 N9 @: Y. N9 z - DEX
5 U$ C# {8 G8 L: ]& | - BNE .Memory_Clear
2 N! N+ \ t" O/ J( Q4 R -
, z1 x. j0 E0 t - ;精灵缓冲初始化" h: t- u1 R6 j! w' c: J- w
- LDX #$00
) f% `+ E0 H% x. L' N' j: h1 c - LDA #$F8
$ X. ~& u4 `& c. x - .OAM_Clear
; X1 [, d7 D3 g/ A3 ~ - STA OAM_DMA_Buffer,X
j( z1 m) f( h3 B6 I" c - INX) u) w$ C2 `! E* X
- BNE .OAM_Clear
* F' Q8 q" N6 g' u% ]; e7 z - 4 \) l" ]) q% f7 x; V S2 V$ ^, F
- ;栈指针初始化2 D: G/ m! q# }. S7 Z# P
- LDX #$FF! B4 T% @, \" j0 Q
- TXS" w$ v" k/ T" G. `8 f9 h) r) l' l
-
- L$ ^1 y. {- _ - JSR Nametable_Clear;命名表清空
* d: M: G- q! J2 n: h$ j# p - JSR Palette_Init;初始化调色板缓冲
3 N1 u+ L4 q. [+ r! C; g8 m& b% Y - JSR Static_Text_Init;初始化静态文本0 p/ @% _) k2 s3 ]5 a
-
; q' E0 f4 _; t( W - LDA #MUSIC_ITEM_TOTAL - 1
( C2 c& I/ v8 I8 j. D$ O. S - STA FC_Music_Max_Index3 z2 g \* G) F5 G5 f2 q6 [
- & K+ @2 `: k; v
- LDA #$1F5 R; h2 v1 Y* V2 ^
- STA APU_STATUS
* O9 G6 B& B, {! n% k! X' N; N; G - LDA #MUSIC_BGM - 11 Z- ~7 S& _' a- I- v& _/ N
- STA FC_Music_Index
, \3 w: N Q7 r4 y - JSR Music_Init_Process;音乐播放
* b+ m. }/ h" X4 _1 v% |( O' f -
3 W. P" C! r& U U0 R6 ` - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)5 A; V; k7 ?% M1 @2 t8 u
- LDA #$1E
' \6 ^7 t, u8 W! J. | - STA FC_PPU_Mask_Buf! P2 I) o0 @3 \
- 2 C7 f4 B" m/ R& J
- ;启用NMI处理
! ?. B. T& j% q6 _2 U3 Z. i# u - LDA #$80
! y5 ^9 |% P# g3 p4 y& A3 Z - STA PPU_CTRL
! p% P4 o; q& E! F4 p2 Y5 i. D - , u- h9 W" k8 z
- ;程序循环, 剩余工作交给 NMI 中断处理
/ a1 R I* h7 O, `& k7 i - .Loop
- c& ]; ]1 r! o/ F3 v# N2 v - JMP .Loop$ S' y; _: l' {8 J! {
- 4 |, C6 @* h, p* y8 A
- ;======================================================================9 i0 g0 V; h5 `. M% [
- ;不可屏蔽中断处理
% h G, i7 R. c+ h - Nmi_Program
% P, C; U/ V5 r" N7 c3 H+ J - PHA
6 j0 Y/ e) u( g5 f! F - TXA1 J! |) @5 ]) c8 Z& @
- PHA
3 Q; Y3 ?8 G1 ~9 A - TYA
8 H, t3 U' n/ l- w5 Z* ~0 V9 m4 O, w - PHA
9 w/ b/ S, [. }, V6 ?$ Q - " n2 G6 I B; t- ~1 D
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
) c4 Q2 G2 W9 v2 R# x6 ~% b -
- K3 E5 `; [; d+ R3 m - JSR FC_PPU_Procrss;PPU处理! N R+ ]0 [1 l% g% Q! n4 m7 w
-
, W8 Y* V6 O- T- n0 A - ;精灵内存更新
6 o- {( m$ I" h& I ] - LDA #$00
* y* r9 t0 M" O8 {: Z4 B4 O - STA PPU_OAM_ADDR
0 i2 Z) h$ A8 b' G9 o - LDA #OAM_DMA_Buffer / $0100
, E1 l5 T; y2 A - STA OAM_DMA* E3 E9 I$ Y$ H8 ^6 T
- : M3 ]% F% | U8 P6 D
- JSR FC_Gamepad_Process;手柄输入处理% u7 C: H$ j4 s" W
- JSR Music_Select_Process;音乐选曲处理
6 | P2 v3 l% t/ \ X$ r - JSR Music_Play_Process;音乐播放处理, K, N& O- M+ O0 T& E
- ' p9 l, v5 J4 e- c
- PLA
' S2 A; i* C2 f, c0 K7 B - TAY; `" v, P# c' t/ E2 v
- PLA: F. @* I/ U- h" f
- TAX1 d6 W. t* t* O1 p3 V( s
- PLA
: V' I5 `9 v; T) x, x - ) D y: r# `, C& f% q; r g% `' R" |
- RTI. l3 Y9 P! a# V5 f k+ _
- 5 e' m/ S8 L0 ]
- ;====================================================================== c( P$ |- S w1 k" I- J
- ;请求中断处理! ?0 k5 k" a! T7 |# H
- Irq_Program' w }/ r: z8 |! k
- RTI
5 y/ O2 M& j1 h. z. k8 q( O - ' v! z/ I, @! m1 g! f
- ;======================================================================
; P) M2 b$ [2 O - ;中断向量表! G# @/ i# G# B
- .ORG $FFFA5 m' m9 d: o: E4 u' {- D$ @" H
- .DW Nmi_Program ;NMI触发时执行
' q8 R t. k0 g, R7 E- a - .DW Reset_Program ;载入ROM时最先执行
7 Q2 d0 i2 ?& Q' x, e - .DW Irq_Program ;IRQ触发时执行
3 V* q7 ^# B% \! X8 S: [
复制代码 # q, m! B( C0 Q! D
6 Z* F! e* S/ H; F" ~9 G2 k2 J
( ]' i6 T- ?( ]https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|