|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
5 {2 ^0 q% H3 {" `' c
1 F. o* C6 s% U' u* o+ f- ]- b5 L以下是主框架代码:
* ~% \& `$ D3 _* }9 e# x2 t$ l7 i- ;======================================================================
5 ]" t1 a- `' M% I2 q - ;文件头
& ]4 o9 t2 {$ I( n" y9 Q1 {3 |( c - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! h" d, Z- C! o. |0 n; S - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量! g. h9 P) J5 O; S
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码' q: S' y. _+ w% M- Z5 r8 a
- ;======================================================================( Z; W. f- @" i$ X# q6 f5 @
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
; \9 ?% f( m4 ^% u" M) Z% c - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
6 ]) G8 r, @% p) r) G. ?1 D8 M - ;======================================================================8 O* m2 D4 c5 _' ]+ N; H! v# w5 ]: p
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1$ ^& K, Q# f: c9 B6 `) o
- RESET_ADDR = $E000 ;主程序起始地址5 W$ p% j! v) P
- ;======================================================================
' G E5 i% k. J, F$ }; q: o0 g5 N - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
2 c8 W3 P% B/ ]( P - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
( d; W$ t6 n/ W3 g( M - .INESMAP 4 ;Mapper号 (0-4095)
! P) H9 D' e' G6 v# T( t3 a- E: M% S - .INESSUBMAP 0 ;子Mapper号 (0-15)/ B* B& T( B8 B# R
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)9 R& U, z+ C; v9 G! T1 x
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在); O5 S! c% ?6 Z) k( Q0 I
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)# I( t) z9 T+ X* s8 W( v3 u$ c
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)5 _& r: a3 X9 ]: E& H d8 V9 N
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
& P& L6 ~+ c- O( l. p7 C - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)/ z/ S0 _' m/ p5 E
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
; e, w0 F+ ~. W- m1 D5 H - ;======================================================================
! o! r- f! v3 v+ {& Y6 R- b: Q - .INCLUDE "fc_demo_config.asm" ;全局配置
' j' {, Y' r' l4 r - .INCLUDE "fc_demo_constant.asm" ;NES常量
: i( \& U3 G! G1 D5 @1 ^! x4 H- ~ z - ;======================================================================( i: ^3 c+ M! H# K( N$ V9 B
- ;音乐配置' g( a S+ q- R' k
- .IF 0 = MUSIC_THEME
' C5 j" q1 a; U- {2 B - .INCLUDE "data/music/Gremlin 2/config.asm"
- v8 `' K- P+ A6 R - .ENDIF
x8 b$ w$ x0 F# k. Y+ V - - e+ y; W, g; R9 V0 z
- .IF 1 = MUSIC_THEME( a* h' ?/ h1 ^3 W
- .INCLUDE "data/music/Raf World/config.asm"
5 \% m6 ]$ l3 @3 h - .ENDIF
/ b& ]+ O) f" J* c9 }5 i -
" H3 u0 Q; {4 D' b; G# g - .IF 2 = MUSIC_THEME 9 E; f8 R2 _4 x
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
& N* U2 z/ y/ O( r1 }8 y4 y8 ]+ y - .ENDIF
8 ~9 N! X$ ?9 s0 l, C
K3 o. l4 j5 G$ T- ;======================================================================- N0 L l% R2 L
- ;引用CHR图像数据
2 f2 P+ \7 i2 a1 Y% P - .BANK NES_16KB_PRG_SIZE * 27 `+ B- w- V9 C8 U
- .ORG $0000
- _9 L+ [5 W$ n - .INCBIN "data/bkg.chr"/ ~) e/ f! D4 _( u
- .INCBIN "data/sp.chr"
7 o+ m |0 n) }- _0 q# j -
9 g1 y2 e P* P - ;======================================================================
" N3 _- s& ^. L; H" A' ]1 T4 d5 H* q - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
8 n) |5 C" v3 Z7 `- a; e6 b - .ORG RESET_ADDR5 c& K0 q1 F; n
- ;======================================================================# P+ I$ ^* \; Z' B8 |
- ;引用其他源文件 r0 Q4 |; D( i
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理# B% ?* q+ K. I, O4 R
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
/ f. d2 C* Z5 R/ i9 i - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理( ] m) }& a$ M4 r7 z3 v
- ;======================================================================
$ A3 s* Z' `/ U' i6 h3 ?* _! k5 ~
1 O( d- t8 N. B# T! L6 R3 y& q) Y1 c- ;======================================================================
% `- s4 v3 c2 _! O. {. b - ;等待VBlank到来
5 A& v- X" @* P& Q+ y - Wait_For_VBlank; Q. w7 C$ F6 x( J
- LDA PPU_STATUS
8 K% u7 P" N C- I8 Z( H - BPL Wait_For_VBlank \* h4 A; R- B, b; H G, `& J
- RTS
& [5 M1 g* }5 x3 W
3 d, y$ p/ N [$ U; O- ;======================================================================
1 [, Y1 Z9 G) _; P, N/ {( s - ;调色板初始化
# [% g$ K5 Q$ A3 Q$ C, B1 A - Palette_Init' q6 F4 K' t) L! a
- LDA #$3F
/ l2 i1 Z8 E+ H" j - STA PPU_ADDRESS
" [' U3 U2 [( w- l - LDA #$00
, }7 {1 F; v3 e& p0 F6 T) Q - STA PPU_ADDRESS
# D$ u+ n( g: c - LDX #$00
' s9 r& p+ O4 D6 ~+ L( W5 V - LDY #$20* R: l0 p# X% k& S3 _- ^3 T& P9 s
- .Write_Data
7 q$ C, Z: G" ~$ M( Y9 I - LDA Palette_Data,X% m- _- ^" Q7 V! `6 w
- STA FC_PPU_Pal_Addr,X
; ^7 W! k% x0 w: V: { - INX6 l$ X8 c5 {+ k* a
- DEY
# l- K: ^( j9 o0 z4 x - BNE .Write_Data
! C; R+ P6 w. o, ` - .End- v8 K; O; S3 e' s, d; q
- RTS) Y% Z+ t! G1 b* Q7 K
- : G0 J4 s% O5 S5 a: |1 f" Z
- ;----------------------------------------" G5 t7 v1 s# l; K
- ;调色板数据
0 l2 z q, O1 l" F6 Q# D - Palette_Data) a& d. p2 \* l
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
2 M- \7 i3 m D1 {( \ - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22$ g% V$ M+ V% e0 s% |
-
1 I% W) c$ ]5 A* X5 b/ T - ;======================================================================. N+ x" z3 Y/ w: ?9 g9 L9 B6 z
- ;命名表清空# L7 z" r0 ~ v0 O
- Nametable_Clear& j' `2 |+ ~, j! G f, O
- LDA #$20# E0 L+ d( `, F0 g
- STA PPU_ADDRESS6 C0 O- S; H! Y* l8 L- b* h% L( i
- LDA #$009 i+ E' S0 M z* e( K2 q$ ^ m
- STA PPU_ADDRESS
! W# @1 L& d9 C - LDA #$00" A/ C) M; \. q( ^. i5 l1 R
- LDX #$00" t: a: x# ~+ g- X% D! K0 }
- LDY #$08
2 l( ~6 c5 b0 W6 h. c; t6 M0 m$ e1 | - .Write_Data5 I6 O( A+ g- G+ \, m* k4 D# s2 A
- STA PPU_DATA
4 [, V6 W2 t( I' k( P t* X6 ? - INX- I3 p1 K) M3 C# r
- BNE .Write_Data
0 o Z1 y1 }( G. o - DEY
5 ^: y5 {3 e; P) [ - BNE .Write_Data% W9 M/ J7 b+ g
- .End
& H K8 `% `2 V% i% a - RTS
1 m/ |, l7 K8 i" d - ; E( e" w9 l& ?) t5 `+ o: W0 y
- ;======================================================================
* p8 G! |( @, ^+ g4 @& X$ u {, } - ;音乐曲目切换' Z- j! ~0 h4 d9 L6 b
- Music_Select_Process
1 p# m4 H) b* P7 H" h4 z: ^6 U' K% ^ - 2 l% x: t/ q+ ?
- .Pre_Music;上一曲
! L9 r% v$ r' ^5 W7 i$ Z - LDA FC_Gamepad_Once' [) v5 m- y- v9 D; U$ E
- CMP #JOY_KEY_LEFT8 c$ K( ?4 @& d" C5 ]! k$ d) E
- BNE .Next_Music# `: p- P3 W& i9 P
- JSR Music_Play_Pre
- _. J# z; [# w - .Next_Music;下一曲
+ u' ?" Y" p8 i* e" g! D - LDA FC_Gamepad_Once
$ \* ^; v( @( b2 R - CMP #JOY_KEY_RIGHT
0 e3 ]2 J J* _# k - BNE .Next_10_Music
2 X7 r, S; L: e( r6 D& i - JSR Music_Play_Next3 z6 _4 ~% c7 z9 l
- .Next_10_Music;上10曲# i# h+ p% q! r/ y9 |0 n
- LDA FC_Gamepad_Once
9 H, x3 ^" d% U2 z7 e1 }" \8 A) k# I - CMP #JOY_KEY_UP' ?0 T. u; X, R* f
- BNE .Pre_10_Music4 E' y/ F# J0 z* G* m9 O. V
- JSR Music_Play_Next_10
7 C( N. g8 v* m5 W. E4 y - .Pre_10_Music;下10曲
( ~9 H! Y; j$ {- a - LDA FC_Gamepad_Once
0 o5 Y( @/ N% P+ D! n - CMP #JOY_KEY_DOWN
( `: ~( j7 B, ` - BNE .Reset
3 Q3 p( j! x% W2 J0 C8 O! A - JSR Music_Play_Pre_10
4 [9 b& g; n, o/ k9 p+ \8 M* H/ X - .Reset;重播当前曲目5 w6 R+ v) S5 Y/ T
- LDA FC_Gamepad_Once
! g+ F `! T# K# p- u - CMP #JOY_KEY_START# B+ V0 U7 f0 g) J* d& R7 L# e
- BNE .End$ n: N" G( X7 x$ @# i
- LDA FC_Music_Index" u& Y/ R" F. w+ \' i
- JSR Music_Init_Process1 D8 N, N+ G. A
- .End
/ K3 V! z4 O# o, q9 r, T - RTS
% F% B/ Z. F$ Q* u& [. z" Y - 4 U3 b6 B& [ l
- ;----------------------------------------------------------------------* l2 B- N- a4 z* k) W. L
- ;播放上一曲# Q' [. }. R) {' `
- Music_Play_Pre4 a- H& s) Q5 ?6 M
- LDA FC_Music_Index
. v1 y) i: ?5 y: V. w% J - BEQ .End9 W" [* s1 ]/ h$ C9 f/ q
- DEC FC_Music_Index
5 v( G, n9 n; u$ l0 ^) N# _' H - LDA FC_Music_Index
; U2 x2 u0 G# r- _ - JSR Music_Init_Process7 ? ^: Q9 O0 l5 |' C1 ?8 u
- .End+ v2 x! d. h% o6 m
- RTS9 \8 l8 P) p5 {
- ;----------------------------------------------------------------------
: g2 P9 l* \; ]! j+ q( K. C/ q - ;播放下一曲( z+ e$ |( w/ i0 H# F4 t, E0 E2 ]/ p
- Music_Play_Next
- N R5 `2 u3 [: O! m1 w - LDA FC_Music_Index
! z4 N5 X2 \$ N+ @: f, @5 h) `) |9 Y - CMP FC_Music_Max_Index
2 h& W: I, R! {5 B8 C# W - BCS .End
* N/ {9 d+ T9 {) H; S; i - INC FC_Music_Index
& @3 ]2 m6 V3 g ?; K' y" Z7 ` - LDA FC_Music_Index6 ~* d/ z0 C6 D7 B( J- \
- JSR Music_Init_Process* {5 z7 R/ s ]6 j3 D; V
- .End
( U4 N0 B, p( c - RTS+ Y5 J7 W! y1 Z* g5 t
- 4 f8 c% u2 y2 o! b, R5 g
- ;----------------------------------------------------------------------( a: p2 u8 b5 z0 I# T8 t) N
- ;播放上10曲* ]$ ?9 ~. t v0 F- w! d; B
- Music_Play_Pre_10& J$ G- {- A+ `
- LDA FC_Music_Index! s; R: [& K/ R6 d: H
- BEQ .End2 i* M; u% b5 @+ T; `
- SEC
: d8 L8 f8 [# l/ H6 ] - SBC #10
+ W0 Y' z; z, A& p- ]$ }) } - BCS .Pre_10
8 {3 r/ @+ }+ P4 s; r - LDA #$00
M; ]% j( L6 f6 r - .Pre_10
% C% a7 o2 J0 j9 e9 Q4 J - STA FC_Music_Index
/ {2 Q3 j* j( r5 k T2 i8 {9 k - JSR Music_Init_Process
0 g# h/ d6 c0 N) N$ O - .End
# i8 L0 g+ P9 R - RTS: Q9 g( p' I5 B! \$ ~
- ;----------------------------------------------------------------------
# M) Z4 I- }( m) l/ M* { - ;播放下10曲
8 z8 h, \; R0 X7 m& q - Music_Play_Next_10/ R! N( x% F4 y/ U$ F
- LDA FC_Music_Index
& c2 R( P( K7 g - CMP FC_Music_Max_Index5 H0 C* G7 \: @# k* _5 x- E5 Z" C
- BCS .End
: G1 Z9 b$ k' d# ? - CLC
+ `- _: i+ @% p& \ - ADC #10
/ s: S: }9 C( C3 D' | - CMP FC_Music_Max_Index
8 ~2 H) _$ t& U- O5 y - BCC .Next_10, ?( k3 ?4 ]: r
- LDA FC_Music_Max_Index
* O. e' I7 u9 b - .Next_104 k c G g4 _( t$ E+ K
- STA FC_Music_Index( A+ k. @3 Y4 _) [) U( |# T: _' e
- JSR Music_Init_Process
$ ~8 ?# h) M5 d - .End
7 Z* W# d, z' P# m - RTS
/ U* B" u: s( D3 U
& F1 U0 ^ W4 Y5 g0 }1 R- ;----------------------------------------------------------------------
- n6 h$ m- a" U1 ~6 r, [) ] - ;8位十六进制转3位十进制制
6 s- V- q3 A o. A7 e% p - Hex8ToDec. I- H* b. }* C* M5 y- A! @3 o
- STA FC_Dec_Data_1- K+ H, z5 a- i, Y) F0 v
- LDA #$00) [% Q6 `) ]% X
- STA FC_Dec_Data_100$ H+ _, W4 e5 H1 k
- STA FC_Dec_Data_108 X% k! C$ @1 b( b9 G! m
- LDA FC_Dec_Data_1
4 H5 x8 \6 @- T8 g# c* V: v - .Convert_1002 P! D1 Y+ r( f! N l. y
- CMP #100
1 G% n; b4 h Q" V - BCC .Convert_10
2 P* N, {( p( `' n3 P1 C7 \' k' x' ^ - SEC
9 r% ^' O& s$ a$ ~4 g4 m - SBC #100+ K5 U1 G0 Y A% S' s1 ?* r, D
- INC FC_Dec_Data_100) _0 z$ L9 C- e* X [% y
- BNE .Convert_1006 o, t& s3 V; a: _( j, }- [
- .Convert_10
& f, m& s9 {& d4 o+ R8 t - CMP #10* F* H3 R) _9 X, S8 O
- BCC .End
/ @3 t& k; U* h$ b - SEC: E. r4 J3 g/ R! Q/ O
- SBC #10
! T5 ~& A% X( g7 p1 w" s - INC FC_Dec_Data_108 e* u" W5 U& q
- BNE .Convert_106 X' h( C& X+ L+ v7 k( C
- .End7 v. S$ L0 r( K$ C U
- STA FC_Dec_Data_1
# ?" _ q3 x. `3 e. C& ] - RTS$ ?( q6 ^$ R) z8 k# V& b! V
3 g( a# V; l* e# b; ]- ;----------------------------------------------------------------------
' ~% c0 @1 f. B7 E3 }- K5 f( U - ;显示曲目信息1 p( a! M9 E+ _. \5 {2 O$ c
- Music_Info_Display
. B( o' S, @8 {* E6 A" Q - LDX FC_PPU_Buf_Count
) S ^+ z' {! x, Y$ b F4 ~ - LDA #PPU_WRITE_MODE_CNT_LINE6 w& R4 i$ w; {" A
- STA Use_PPU_Buffer,X& c! s1 W. ^& W+ u- D0 @. Q6 j9 l
- INX
: e& @8 S7 K& g5 B - # s( J- P6 n* G6 [) c" p& z
- LDA #>MUSIC_INFO_POS
. n7 P7 M# t7 T) t, j1 t2 d9 N - STA Use_PPU_Buffer,X
& Q$ }1 u! U. C! m - INX. ? g' J' N/ i: B
- 6 o8 Z: }4 x- L. v
- ;居中3 X1 G. l* l5 u: h- X6 e
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
8 c5 \0 {* H0 N - STA Use_PPU_Buffer,X5 P Y# @" V: e3 L/ }
- INX- W- P, G! T5 a% x x
- : A) O. W K* ]/ G) a5 C+ M
- LDA #$055 f/ d& R+ j% V0 G A
- STA Use_PPU_Buffer,X
9 q% a& K, D- e7 w5 U - INX
. L- m6 g! _6 J7 | -
6 O5 b6 _% Y* x9 p8 E$ ~ - LDA FC_Music_Index3 J S @( m7 G. c: {5 E% @! l
- CLC; m- n/ D) C5 y! ^$ s" S
- ADC #$01
& u$ S6 W6 W) |4 [2 H7 ] - JSR Hex8ToDec: |5 k8 Y$ r' W* C8 c% ^" U2 c% o
- 6 s: u/ O& Q/ Z1 j+ l( b/ l) r
- LDA FC_Dec_Data_10$ ^: t# m" A, \4 t* F6 r8 ~1 F
- CLC
6 g V, |8 y3 {' q2 @ - ADC #'0'
. {8 n" K6 E, \* l6 r' X! W( |: ` - STA Use_PPU_Buffer,X
* n6 Z% c. F& c, ]# d$ H - INX* P* H, j) S% x
- 7 h" d& J r0 t; a: y9 R* H2 j
- LDA FC_Dec_Data_1& E0 O* J! s& m7 E; N3 c
- CLC5 x4 ?" B; \ A: d
- ADC #'0'
: _! f" b5 \5 A; R0 y - STA Use_PPU_Buffer,X
7 l) y. T3 Z4 M9 w, I: E) o) ?% \0 Q - INX7 D) s! D( W4 Z: _4 m+ ^5 J# X* n* Q
- `; `. E3 |$ w7 {( |
- LDA #'/'
3 f4 p: ~! {4 B, a# ?3 t; C, @9 l - STA Use_PPU_Buffer,X# Z6 a( ]% L0 D. i5 Z, u
- INX
/ i. F* Q/ F! _% q7 D) {. E' s- w -
" ^% o0 v0 N9 G* B - LDA FC_Music_Max_Index
1 t; R+ v5 E) M! g% y& W0 A - CLC! x* D9 A# m w
- ADC #$01' I0 O$ M* V+ B& _1 n1 ~
- JSR Hex8ToDec
+ T( i. J2 W& `6 _! V; c - : ~: c0 H* d/ r* R) y, E
- LDA FC_Dec_Data_10
% W2 z. Z! `* P1 @0 P9 Y - CLC! S- ~/ N3 }- J3 x: e
- ADC #'0'
- y3 V* _4 m8 b: v3 B7 ]! l: @ - STA Use_PPU_Buffer,X3 |# {: X, C$ D6 i3 p
- INX
7 {( m8 E' X! [7 U& N+ E7 u4 ~ -
! ^4 ?0 o2 q6 d O5 U0 X/ P - LDA FC_Dec_Data_1% ]2 d5 J7 w4 m. Y& A
- CLC
; S F$ q# K; e" e - ADC #'0'4 ~8 V+ A# @6 w1 J1 `
- STA Use_PPU_Buffer,X
. }' Y$ J+ a) t- P - INX/ G) l& V+ ]. p1 A3 W* v
- : r& V9 P t! p! ~3 }# V
- .End
% X4 E) G6 V/ P5 J2 I - STX FC_PPU_Buf_Count8 k! v9 @* a, A" G* K, F* C! J
- RTS
, t8 [ g3 I4 }1 ~
4 B" X9 j, D6 n& N# {- ;----------------------------------------------------------------------- _6 L2 b8 U8 [9 |- n. |% o
- ;音乐曲目初始化处理
% X+ j! o: X( L- r5 w$ m - Music_Init_Process
2 b6 m: k- c* k1 y1 b( W1 O - PHA* N! J$ O1 L; h! }. I0 c2 G
- JSR Music_Clear_Process# U( E2 Q& A' u% p
- LDA #$1F
3 p! Q4 I! Z% J0 \6 e9 D2 |# f - STA $4015
3 B3 U! V; V9 @9 ^) _2 o& S: J0 Y - PLA7 v$ u8 V% f% `' B1 ?
- JSR Music_Init_Addr; M* H( E8 \/ v( q
- JSR Music_Info_Display
' k/ A) V; Y+ h, \( Q - RTS
9 j9 ?- i/ Z* L- ?! |7 h& P" B. y
' z }7 k- g3 y' y5 m- ;----------------------------------------------------------------------! d: Q' D. S6 S7 [% t; i; ]; I* |
- ;音乐播放处理: R7 n- }8 N& @: {: f8 o( u4 I
- Music_Play_Process
" a1 q# _& s3 u' E- l- ]2 z) z - JSR Music_Play_Addr# U( ~, ^1 c% p5 U, p" \
- RTS1 H# k: }& A; W9 [8 a" B* r; w
- ! Y/ A6 W$ @5 u. `
- ;----------------------------------------------------------------------+ z. I6 Y# n. S8 X% k6 \
- ;音乐播放处理
) d! b' ]) @& L. x - Music_Clear_Process/ u7 ` A, _* \2 @/ i
- .IF Music_Clear_Addr4 Y' t" w% e8 d" h8 j; V
- JSR Music_Clear_Addr
' Z7 M2 x" E( I+ w - RTS: I7 n* ` i+ X2 z U7 _: o
- .ELSE
. x; M4 q; b# ~8 C - LDA #$1F
5 T/ R( a% N. F: M4 r/ H# p9 z - STA $4015
h! x7 n) R [- ~+ J5 Q - LDA #$00
" p4 I/ I: s# W% _& k) I" { - STA $4010* _/ T" J3 J; O! d5 Q3 n. q0 l4 S
- LDX #$00; O6 {3 d: [ H2 W) M7 G/ C7 _
- LDA #$00
$ A& |) O& [: F' J - $ n6 H+ u' H. H7 L$ o
- .Music_Clear_Zreo_Page_05 M( O4 }2 A. d1 i5 E3 m0 k9 ]
- STA $00,X# ]2 O3 O$ C7 Z4 d0 a$ s& w
- INX! c+ V( S; \" E1 _% i+ [2 j Z
- CPX #Use_Zero_Page_Begin. M# v5 }4 m9 f* A) I: Q6 E) ~/ j
- BCC .Music_Clear_Zreo_Page_0
% e' G) t4 Z7 F" v O1 w/ p - 6 ^# j1 O- k5 b d' [3 ~
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size8 i& E! T# R$ k/ P, S7 J6 q+ @1 l( D$ `
- .Music_Clear_Zreo_Page_1
: y7 F, P- b8 b0 s0 ]- e8 t - STA $00,X
7 v* O: ?7 R% ?4 z ~, d* u7 F - INX
4 F7 ?& B) @: c& A% a# a - BNE .Music_Clear_Zreo_Page_1
$ x) f" P( [1 y3 Q3 r! _% Y: U* A - ( O p5 }4 x: o5 b9 ]- D8 F
- Music_Clear_Process_1: o2 M' O0 ]7 u% @
- STA $0600,X/ ]4 z5 E1 s5 ?6 Y
- STA $0700,X. B/ c h$ J. b* a/ v! \
- INX- D: p4 K7 g# D. B8 Q6 I+ I) @( x
- BNE Music_Clear_Process_1
9 B5 V. K) ?( @: C: b& c - LDA #$10# T d9 ~, J' D$ E
- STA $4000
' G# F0 B( J" z - STA $4004
# p( g+ g" T1 }1 i - STA $400C
4 |5 q* y# E5 ?4 [6 Q- P - LDA #$00
0 K$ W' d( _' P - STA $4008
, k: z4 J# u1 _9 Y2 ^ - LDA #$0F! V& ]3 N `3 H7 k/ Z1 F6 `, o% @* v
- STA $4015
$ Z, x& T; C) ~/ l; O - .ENDIF
7 G, A6 L- A% u. J6 A - 2 i& s. Q+ q% F3 l8 J3 o
- RTS
% h/ u5 \' l# m, N
1 N+ i: u: g- u! o- ;======================================================================
1 k! ]. X6 u3 |" ~% {7 L - ;重启处理4 B8 `$ E; G& l, [. V- b
- Reset_Program$ u V( }: P$ ?) p# j
- SEI
; D& H2 h% n; B% A6 c: E - CLD
1 ?! ?' a7 |- g: S, s( l9 _! d/ i - LDA #$00
4 @, B1 r, L+ a6 Y3 v0 e - STA PPU_CTRL
! D5 h" L/ Q* s) S - STA PPU_MASK
/ P' y$ Y8 s! _" B |' C1 b - STA JOY2_FRAME3 j8 I! [( u% H$ k9 `4 k. @. c6 v
- STA APU_STATUS
* A4 l: S8 r9 ^' Y2 f+ H - . d' _ r# N3 O" w: r! w1 b8 {
- ;等待屏幕准备完毕
! t7 d8 d [0 c+ w& K - LDX #$02
# }$ x& n7 U6 E% v; Q7 c8 E& e( [ - .Wait_For_Screen_Ready7 {/ G( m+ i* n) |
- LDA PPU_STATUS
# G, w! }8 J3 S) o4 k, v* Z' P - BPL .Wait_For_Screen_Ready2 n8 D6 j6 V4 v9 ^. v) H2 v
- DEX+ p; w9 k1 B; s. G
- BNE .Wait_For_Screen_Ready
; u# S6 n& n5 F -
. }2 P/ ]: o# p5 V: b - ;清空调色板7 K; a) C; R- g
- Palette_Clear) n, m$ y ~5 Q" W! u y
- LDA #$3F# u" a. k# g/ [: Z3 g
- STA PPU_ADDRESS% p9 o; [ F* s
- LDA #$00; n- \/ |/ F0 f, A# o
- STA PPU_ADDRESS* P& y$ F9 }, r/ ]- T
- LDX #$20
$ w7 j! W/ w# L( n* ^* D - LDA #$0F
( M+ o: z) u2 ~: P/ K: }0 f# d" O# R - .Write_Data
: W# q ` o, |0 a2 k. l) V - STA PPU_DATA
) x8 j9 P2 g `8 N5 f5 X0 D. [7 ]' q - DEX
& w# e. V" M% C4 K9 w& b8 c - BNE .Write_Data- l! i9 u+ O, |* o
- * u( h/ z. E4 I6 I* l
- ;清除声音 $4000-4013 j9 O1 y; D) N0 `. q% G5 l
- LDY #$144 k- P9 I6 X, `
- LDX #$00
) V l! k) R8 [6 o; e( H* D8 h - .Sound_Clear
+ `) S7 o# \! ` - STA $4000,X
* M9 \% J8 |* J) d, X7 l - INX. c$ L: a+ c+ O9 P# z
- DEY2 H( v: `3 n' r+ U
- BNE .Sound_Clear1 A! y; R' L/ b
- 4 U* {" O3 X% z/ f! D
- ;清除 RAM $0000-07FF
f8 f8 W0 z2 Q; P- r - LDA #$00
% ^$ |4 v n! N. E& X5 R - STA $00; |0 r' n' Z) x7 K
- STA $01
% u2 l5 n8 ?1 J - TAY2 Y2 q2 U& W* `: ]- T4 ^, v& p5 F: F
- LDX #$088 k+ S5 T9 u; N/ z, X; z, @
- .Memory_Clear0 c/ P% r& m, d/ z
- STA [$00],Y
) v5 `! l0 r& E4 ? - INY" L' M. Y4 h5 U4 E0 N4 [
- BNE .Memory_Clear
6 F: d) p7 P* C/ R& V1 M$ B - INC $01
. c4 k! h1 ^7 J' u# ], _ - DEX
" Y9 p# t- I6 E4 d2 y - BNE .Memory_Clear7 e, ^- Q5 P" n- n, a3 g% k" Z4 j
- # I; B) T2 @* P1 D S0 c
- ;精灵缓冲初始化# a, `* g3 D4 x
- LDX #$00
/ l% G3 z2 N2 ]1 Y0 f, P - LDA #$F8
; O3 \4 b* F# T0 ]& g0 F - .OAM_Clear/ \7 f! ?) O5 D7 C! n* @5 _* `
- STA OAM_DMA_Buffer,X
4 d1 `! A4 r0 q( V5 h) } - INX
; a* U$ J) F+ \# R7 i - BNE .OAM_Clear
5 s7 M9 ~- Q. e8 m: c0 Y, ^ M -
7 g, E' B: O9 e& c, t; J/ p. k/ R - ;栈指针初始化( Z+ W$ ~6 W! \' d
- LDX #$FF9 S% ]/ B+ V% o
- TXS% {7 ~5 a5 m& ~- s: G% t: ]& ] O0 v
-
% \ M# l4 Q2 H - JSR Nametable_Clear;命名表清空 [2 Z* f1 `2 n" m0 u- b R
- JSR Palette_Init;初始化调色板缓冲
( a4 ?& S/ s% l& L - JSR Static_Text_Init;初始化静态文本4 {: K9 b* S7 f A
- 4 m; E" A; d3 s i. f
- LDA #MUSIC_ITEM_TOTAL - 1, D ~( d5 f. ?" U
- STA FC_Music_Max_Index3 s) s L3 M s! ~" g7 D
- * N f; r/ m' z8 l/ V8 d R
- LDA #$1F
, w. h2 r, Q7 n# {6 i4 x# s: I, j - STA APU_STATUS1 X" O$ q) s3 U, m. I
- LDA #MUSIC_BGM - 1) V) {2 n' X3 |* b& g
- STA FC_Music_Index+ Q* o4 K' x( ]) s. V
- JSR Music_Init_Process;音乐播放' j7 n: [ P8 u3 }
- 0 Y9 e8 ?/ y3 a y
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)$ D3 w6 g; H/ T$ H* N. q
- LDA #$1E6 K% Q, l5 M8 y5 L8 Z
- STA FC_PPU_Mask_Buf
; L: L$ e1 i2 ^% D - 9 |! \& u% d0 B- j7 A' Z# a
- ;启用NMI处理
7 `$ Q9 x3 k8 \2 z# Y" g' I - LDA #$80" ]1 L; F: \: V
- STA PPU_CTRL& F% `7 ?' B* h( M0 h
- . G5 c, l) x0 a# W3 i1 X2 M2 [
- ;程序循环, 剩余工作交给 NMI 中断处理
+ s& x4 o$ |+ J, e - .Loop" M% x! s) l5 E7 Z% d; e
- JMP .Loop$ D! k5 {# Y# E1 z9 _
7 O6 x' y( O6 A8 s7 i, }6 R- ;======================================================================) p+ T" Y& ~4 w M9 P4 u
- ;不可屏蔽中断处理* {1 b1 |6 C0 s# ^1 I" }. n: d d
- Nmi_Program
6 M6 G, n4 V' I8 O) a! h& G - PHA% O7 Q% j& N: \3 N
- TXA) L- N, ]# D% D% ?! F& I
- PHA
# {' }7 h, G+ T# s: o4 ]" [; A$ S/ } - TYA
6 N0 B* z: S( \1 D! ] - PHA
6 K7 _. w9 H, r. h$ C$ T. S5 Y+ d -
1 y$ T- F e3 f# Y8 }% j - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
8 `4 _5 D; d& _8 a7 Y - & M" Y$ K2 D+ V
- JSR FC_PPU_Procrss;PPU处理8 {) ~6 s" R+ o! j$ h5 o
-
; R4 A' K& k) z9 x! I - ;精灵内存更新4 N$ d. c* D1 H3 z- a
- LDA #$00( K0 a9 ~- {4 Q; Z8 r, G
- STA PPU_OAM_ADDR% N+ l7 r# N* B; ^0 f
- LDA #OAM_DMA_Buffer / $01000 s: N& h% N. Y
- STA OAM_DMA
/ m9 U3 K; u8 x0 e& `0 @1 q - - Q" ~+ E* G8 y
- JSR FC_Gamepad_Process;手柄输入处理
6 D' Q8 |- v. k - JSR Music_Select_Process;音乐选曲处理
: z8 @1 r/ ?, c; D - JSR Music_Play_Process;音乐播放处理
: G! d) ~+ s+ P$ a7 K; D2 v -
. D. r+ u: f" k5 I- P v - PLA X$ s( s3 J, \0 H2 T
- TAY
+ Y5 J, n; W, o* a% j) u3 w E - PLA
7 X4 Z* n3 p* f7 a- m5 H - TAX
8 e9 u$ t! J; v. E - PLA
% B) Y* |, y+ {6 b0 J
7 S* X; k9 N9 M9 D# f# ~" x- RTI/ g7 w2 {; a4 H5 F) A+ r
% j$ i) w8 s; g6 u I' s- ;======================================================================
; f& E0 j+ x! n; q2 h6 `0 C2 \ - ;请求中断处理
3 d5 x& [7 E4 W+ r( P - Irq_Program
$ w1 p4 Y7 D! ^/ g o' G( k - RTI
+ y+ U, A7 u$ @! @" U# C) Z9 a - , B+ E' X9 y) d8 |4 t0 q( c
- ;======================================================================
; Q+ Z5 m# O+ o/ y+ P9 x - ;中断向量表
. u9 m/ t7 L* j, \7 y! i7 q - .ORG $FFFA+ z. ]$ g, z0 ~" S5 l
- .DW Nmi_Program ;NMI触发时执行
- s& F1 w, X2 R" _+ f, N F# j7 _* z - .DW Reset_Program ;载入ROM时最先执行8 }) U, J' W& f, m& }
- .DW Irq_Program ;IRQ触发时执行8 e9 b: Y1 g' H8 Q2 E$ [9 H
复制代码 % }' Z3 f2 l; b4 F3 a
/ u' P# `9 T- O, j
, n- F# C3 N7 a- l! O2 a
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|