|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
9 j, `/ A6 w- R- x @9 [- |
) Z: s1 U) z i) f5 e( |4 X以下是主框架代码:
3 g) o: f0 H. O) H- ;======================================================================. Y) l, L+ T4 d: _- G4 D7 B2 W
- ;文件头
4 h, K( q8 q5 y* ~' Z/ S( H+ ?, L7 [ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
* e: p- n1 _2 n2 z/ t - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
) f n0 D5 X% r: l* K @3 \8 L, z - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" Q, l( Q6 T$ \4 C) C - ;======================================================================
# R2 U, W7 f% ^ - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 28 z, n, u" \3 B$ O. H1 b V d
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1- U. I- ]$ P+ g+ Y Q Z
- ;======================================================================
* J) r4 h' X! k ?" T% H* ~3 J( O6 w - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1$ G. b/ O- p5 a4 U% w" ^9 C \
- RESET_ADDR = $E000 ;主程序起始地址# y( e; l( c/ R+ Z9 f4 j7 _
- ;======================================================================/ i* Z9 o8 v e: s9 `! C, w
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB3 z4 m3 V+ n# F8 p/ Z- [
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB8 D8 x- I4 H- K: F: ^' ~
- .INESMAP 4 ;Mapper号 (0-4095)& W0 Q: x+ b) V5 j* f7 {
- .INESSUBMAP 0 ;子Mapper号 (0-15)
' t! c* n* T# ~+ s - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
$ K4 M% i7 Q# Q6 i( Q. @$ s - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
5 [4 W+ Q* j' q3 R2 Z* r# f* M - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)9 r/ P' _6 {5 X1 S
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
! w2 R+ I4 Z9 g0 i" p - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
0 o9 o" {, o1 d - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
/ i* ~" z+ a4 c. {) e7 \ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
/ l% z. O: p5 f0 M* ] r( l - ;======================================================================
( ~1 | L' y; _5 O( q - .INCLUDE "fc_demo_config.asm" ;全局配置/ k- B, L8 n- p9 v Q8 ~
- .INCLUDE "fc_demo_constant.asm" ;NES常量
( U/ F9 p# [ D) j - ;======================================================================% P/ J5 n" ^3 p8 ?8 |1 q
- ;音乐配置8 s2 t5 D. y# F: O. e, _* K% ^
- .IF 0 = MUSIC_THEME - ^% x6 F+ N' ]- x( P* |
- .INCLUDE "data/music/Gremlin 2/config.asm"
! q3 O' H x- i - .ENDIF. C! s1 }, s* X/ R' b% e/ v
- ' C% c5 u7 Q( R4 ~% Y1 o: u, u
- .IF 1 = MUSIC_THEME
* j/ z" `6 r6 u4 T$ B$ o5 n - .INCLUDE "data/music/Raf World/config.asm"
a% H: M9 F8 ]/ ^ T8 g - .ENDIF
* U" p/ G5 F; q -
1 ]& w5 Z) G& n) N5 _; j. T& Z5 ?( O - .IF 2 = MUSIC_THEME 0 y) b- s! D0 z6 P. O t" q: ^
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ v% k- q7 X6 i, O! l+ U - .ENDIF' `7 s" g$ j1 H9 m
- " A @1 \0 R0 [' [- c) c8 ~* Q
- ;======================================================================+ Z; p- u1 ?) |) ^4 t
- ;引用CHR图像数据
5 ]2 |5 s$ C" M2 P4 u - .BANK NES_16KB_PRG_SIZE * 24 ^# n; T0 S5 h" b
- .ORG $00005 }& F% u3 Y2 a* f$ x3 ?
- .INCBIN "data/bkg.chr"
* h q7 M, W" r9 } - .INCBIN "data/sp.chr"
; M$ c/ h& V; H+ G7 C8 c - / [/ L. l: M9 Y0 U3 o( _0 i
- ;======================================================================' x+ @2 X) o4 I7 }' C( G2 D& t1 J& f
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
0 T- e: E. s1 I1 y' c! l& d8 X: u - .ORG RESET_ADDR' t9 d# P# h% \, V @' |* V1 V
- ;======================================================================6 E8 }0 o* [0 ?0 q$ z1 u
- ;引用其他源文件* l/ r3 y) @8 @: A$ n
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理! S6 K. ]& t4 t' e# k- ?4 Y
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理8 N" Z9 n/ n3 A, [! S
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
/ s# R! r6 u @6 z4 o, D' q - ;======================================================================
$ h+ O5 t6 Z: I, Y6 `9 H# r( o
% |' K, i6 r; j" o! }- ;======================================================================- |- y# i- K4 J, r: `. [2 }
- ;等待VBlank到来
4 I3 v( h; i7 A# [ l6 Z7 x - Wait_For_VBlank5 j# S& i5 z- _: {4 R! q! w/ A
- LDA PPU_STATUS
9 F! g K* b& v# Z0 i+ I! T m4 i - BPL Wait_For_VBlank$ y/ L( b2 Y- _8 i. {' y$ }1 c
- RTS
, f" w E- z$ p& `
% U" J# J9 I8 ]: F7 ~, ~% c# d; |, p- ;======================================================================
2 v9 }5 Z& _6 U2 l% Q( Q$ l* { - ;调色板初始化8 y c. q4 t7 @. O
- Palette_Init
$ Z! v: h, `1 Z# W( \5 G - LDA #$3F
6 f5 q( ], i. ]$ G+ H" [; G$ I - STA PPU_ADDRESS
) w. O3 X6 M6 p$ g2 T) \: F+ O - LDA #$00
! \- A& c! C+ Y2 z' T) J: ~4 t - STA PPU_ADDRESS
6 s: ?" G1 d3 Y+ A2 H - LDX #$00' A; p ]8 h0 r
- LDY #$209 ^7 P& a% I: X" P1 e( ]
- .Write_Data
$ |9 J' b+ T& V t' u. ]8 ] - LDA Palette_Data,X8 ^! W+ i/ I7 q/ x$ F1 ?7 D
- STA FC_PPU_Pal_Addr,X
) j0 O+ D2 _, J* Y8 U6 S7 ? _ - INX
p! L' \# D. H3 I! y. U - DEY5 O. K0 K* w+ q& c- j* B& ?
- BNE .Write_Data+ v5 I% u0 D* ?+ K7 Z- A
- .End# d5 \( Y2 p0 I @$ I
- RTS. i% I O& P- ~: R" w4 f
- 6 V( [9 v! C3 L& M
- ;----------------------------------------. g% R- l: L. J+ a" ~8 G) G: z
- ;调色板数据
# G5 u* _' W" K" g# y - Palette_Data
7 q; O( f. [- l! ` - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
7 v2 t( n9 X! d, C! D7 T - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 y5 l" U+ c% ~/ P
- 1 ~+ R( d; @) {+ P; \, _
- ;======================================================================
6 r, O. H9 J0 q, J$ E9 M - ;命名表清空. U5 u3 E& S( V
- Nametable_Clear* `! F% r; [$ j) S+ `7 w" Z* k0 h
- LDA #$207 I% z" g9 I; G# E; _
- STA PPU_ADDRESS
( U/ C: X+ W0 C - LDA #$00% ]5 c9 h8 y/ }% i! Z
- STA PPU_ADDRESS. N) M6 p1 l- Y: m0 q2 K* [
- LDA #$00
; f9 [& M1 b# x) v+ T' f4 I2 |6 M - LDX #$00
F" C9 z7 x8 G - LDY #$082 F% S* h i9 o" u& m8 {* E
- .Write_Data/ h- A/ D3 s7 I
- STA PPU_DATA, e% [' c( K7 t6 x) U b
- INX3 j& q; n: }$ ?' O
- BNE .Write_Data% D6 o1 H' m4 F' |) ]; g
- DEY
3 n6 t4 V' v7 C; b# [ - BNE .Write_Data9 [+ B" B$ N3 a
- .End
* Y& M: Z# O7 N- F: q - RTS# i c# r7 p5 l. z9 p/ L
7 T' u, E0 X; q7 H( |+ k" S- ;======================================================================
6 i) M5 _# j0 W - ;音乐曲目切换8 C( \% m3 k- D/ z! A
- Music_Select_Process/ |, q+ j8 C5 V ^. U3 u
- * ^. Z0 Y' h# e
- .Pre_Music;上一曲
/ R# ?! k6 v5 v! a+ t, G+ O - LDA FC_Gamepad_Once: m$ H3 n5 g; F" {2 N
- CMP #JOY_KEY_LEFT4 m( p$ h1 B# S7 X- z
- BNE .Next_Music
0 K1 A4 U4 G4 o; | - JSR Music_Play_Pre$ n- ?0 [& W/ b; }. V& T; r
- .Next_Music;下一曲
/ i: x* i9 ]% I @/ W) f$ F - LDA FC_Gamepad_Once
; L, x7 R$ ]. u& J) J/ O! f - CMP #JOY_KEY_RIGHT
- R/ Q; F" n7 k- a; R l - BNE .Next_10_Music3 ?1 h5 c* {& H; U, ~/ U; d$ Y2 {
- JSR Music_Play_Next
9 d+ E, W% |3 {1 i; J - .Next_10_Music;上10曲
- L6 y- X a, A: N7 E - LDA FC_Gamepad_Once0 \2 I2 B7 @2 f8 d1 f
- CMP #JOY_KEY_UP
7 m" J- X+ _* k$ g0 c9 y- U - BNE .Pre_10_Music
, X, q, `! n( H2 N - JSR Music_Play_Next_10
; ~/ m! x: [, |& @ - .Pre_10_Music;下10曲
. r* g& d9 z) b( S4 d. e3 b - LDA FC_Gamepad_Once+ i/ U9 @% m, e) W
- CMP #JOY_KEY_DOWN
6 {9 U$ n2 C/ i. r6 C7 F- ?+ Y - BNE .Reset: C/ }+ S+ y" U8 e e$ S
- JSR Music_Play_Pre_106 T2 E5 D% D* ^' ^. y: A \, j
- .Reset;重播当前曲目
2 A7 B7 l. t. N7 m - LDA FC_Gamepad_Once3 S+ r I! u. V8 g0 T! ?4 G! y, K- H
- CMP #JOY_KEY_START [- r2 ^# A' m$ o8 c- N& v8 a! y, B
- BNE .End
3 A& q7 f( h/ B1 s9 [: j$ Y - LDA FC_Music_Index; N# C5 G+ b* ~2 [* o6 b& e8 z4 b
- JSR Music_Init_Process* Y8 ~% n D' W7 ^ Q: f
- .End- R( j' k: g8 c0 x
- RTS
0 E8 _ s7 l6 a& }* u! d6 D8 j
1 T$ }/ [! `& W6 L- t0 y- ;----------------------------------------------------------------------
9 s9 g* U9 h& Z: R# S2 t! z - ;播放上一曲
Q" J/ ~. H' V4 Q" K( l4 T - Music_Play_Pre
+ j. U. t) Y% f8 @: h$ X* | - LDA FC_Music_Index
) h3 f# e2 x' m6 Q - BEQ .End
- t8 T8 e3 x. ?9 w - DEC FC_Music_Index: C! z6 W9 k% U+ K5 h
- LDA FC_Music_Index
6 e; W: O1 v# K' X- |. B9 F - JSR Music_Init_Process
, y% q$ I+ T4 F+ E" `' X' h - .End: o" f$ r r8 S/ K3 I5 [+ c
- RTS: r0 v3 k6 B- n* N) p0 \* {# v
- ;----------------------------------------------------------------------; M. B! H% |/ r# `( v
- ;播放下一曲& {( ]# v9 r. D
- Music_Play_Next& |. P8 T, F& u
- LDA FC_Music_Index
( r: ~) c8 m# y' L - CMP FC_Music_Max_Index! v, ]( r6 V. \( y- F; G
- BCS .End
$ ]" y2 v1 O* L - INC FC_Music_Index2 @+ Q# [$ Z2 R; p K T8 P
- LDA FC_Music_Index6 S2 [4 i( Q- c
- JSR Music_Init_Process
8 m( ?: U: P+ E! t1 `( Q6 q# [+ G - .End3 u8 a, z: D" }3 | r6 O
- RTS# P% H3 {0 ^4 c# ?3 H; m0 n
- ( z0 r. ?6 u5 p7 ^ L& [
- ;----------------------------------------------------------------------- X) h5 C+ |: f3 a$ ^
- ;播放上10曲
6 _& J0 W/ }. K& c& y$ s - Music_Play_Pre_10
6 F$ |6 m/ q6 B. D" j) B l | - LDA FC_Music_Index. ?5 k! n( p# u* e5 |. r. a5 ~! b
- BEQ .End
. N1 n/ E' S; J- L6 M - SEC
( _' O! n! S# S - SBC #10: u( \* e4 s9 n! A$ t6 C# e6 ^9 G
- BCS .Pre_10 W" z% M U6 b. G& r* K5 m' x/ y
- LDA #$00
% [; _2 @$ K: Y2 Y - .Pre_10/ v% a; F7 p0 G. ^
- STA FC_Music_Index# x# E) S8 D0 p& U: ~
- JSR Music_Init_Process
: }& E' p* H1 e) o - .End
! d! |# f+ q! y+ ?; e5 [; n7 A - RTS# W1 p1 K" P; p% P+ u' F5 Q
- ;----------------------------------------------------------------------! f3 M* R2 h6 \4 G+ f# A
- ;播放下10曲
$ ?3 t1 D! Q. L2 e( A - Music_Play_Next_101 a) i( U- S4 O
- LDA FC_Music_Index
8 Z* P) `, ]6 N" v$ J- i9 ^1 a$ Y - CMP FC_Music_Max_Index
) {9 k1 r! C7 u1 s5 [6 l! ~* @ - BCS .End/ L9 z3 i9 X* G
- CLC
2 _, q7 C. j* H0 k' z3 O - ADC #10
% \* A( W. X& ]- G( f. { - CMP FC_Music_Max_Index
K$ Q% M. |7 i; s( p5 P8 Q - BCC .Next_10
( B, Q/ C( [" s' Z5 e; O, {7 _* g - LDA FC_Music_Max_Index
X% D% _0 b) [! \/ c" R - .Next_10
3 r+ v) S. P2 ^$ x- Q - STA FC_Music_Index. @! U3 X4 j. D8 J/ u! ~# @
- JSR Music_Init_Process" b) h$ O5 H- R: N' j
- .End, O7 R6 M; a3 ]( U1 |
- RTS! ~/ V* k" ]" s9 I L5 ]
- 9 c f* r- O$ r4 Z
- ;----------------------------------------------------------------------6 F# @- h! H: @9 S$ r7 @, [0 C3 l3 C
- ;8位十六进制转3位十进制制
3 c3 `( k7 t: E7 T' ~ - Hex8ToDec6 R Z" ~' W1 [! f
- STA FC_Dec_Data_1
% E& P/ R7 t( K+ c - LDA #$00
3 l, D$ g5 B+ C, `- j - STA FC_Dec_Data_100# B4 b4 _; O i6 B9 Y: f: V) D
- STA FC_Dec_Data_10 S9 a! r- f0 I4 p. S6 C4 B
- LDA FC_Dec_Data_1
% a' G5 Z. _) K8 B( _ - .Convert_100) X/ u/ ^# L& B5 [
- CMP #100
# E) t( i/ Y$ k( d - BCC .Convert_10
' z( U9 K1 ^. m3 s% |; D - SEC; ^0 j- x3 G8 m- ^* }* t
- SBC #100. _3 e9 u6 q- k9 [- ~2 e3 w8 Q
- INC FC_Dec_Data_100
! x& O( q# D. T4 C0 n! q - BNE .Convert_1004 H, X0 B3 s" r' g2 Y3 X
- .Convert_100 M) w- }2 N: K) |* g4 y6 s, n% g
- CMP #10
7 a: f3 z* t) o, m/ x* { - BCC .End6 H- F# K h; M: B) ^
- SEC- w7 O- \4 i) b4 y# N; `
- SBC #10
0 R \7 D, H& u2 A5 u+ {$ h$ K - INC FC_Dec_Data_10( ^# j; z( F& h* _! R7 ]
- BNE .Convert_10: Z- q: o& q! m2 V
- .End
7 {, `% L: a4 v! T _ - STA FC_Dec_Data_1
$ V1 [. K1 [" c. r - RTS# H' J) }8 E t4 c
: ?4 q# @0 d0 b+ X& H" f! _- ;----------------------------------------------------------------------! m) w$ Q4 I: U7 r) ~; b
- ;显示曲目信息
3 y! U0 t7 x9 w4 v - Music_Info_Display
+ a& { {* w8 f1 v - LDX FC_PPU_Buf_Count% ]. k/ y# S7 y. }* x
- LDA #PPU_WRITE_MODE_CNT_LINE- I( l6 H; k1 j. G. u' Q' R0 S
- STA Use_PPU_Buffer,X
) e% g4 n1 z1 e8 W# e) `5 y - INX R7 T! D' a" y9 Q1 `$ u
-
4 d' {# F4 g4 M/ r6 c* } - LDA #>MUSIC_INFO_POS
- f4 V, [5 ?3 i - STA Use_PPU_Buffer,X
! r5 K6 E; Y: f; I/ y) z - INX4 `* V @8 p5 Z3 B
-
) l7 w1 d4 R" a0 q - ;居中
) v) f( f9 E- F3 w - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2! x2 x' s+ o X' y. m" u, y3 s9 i
- STA Use_PPU_Buffer,X
' ~( {! U# X: _! E: ^# n - INX
+ I {, h1 R/ K5 o& z4 G. P - - t3 ]! e8 T: h" A) p: n2 Z
- LDA #$05+ ~, y4 Z& t2 H F* h
- STA Use_PPU_Buffer,X2 W+ W. a( |3 I; D
- INX
; H* o& r d( @2 E - 2 X @6 T0 t% ?) j& C
- LDA FC_Music_Index/ T/ U8 N* r& J3 J+ ~' m2 E+ D5 b
- CLC( y F3 n- E' M6 A( ~( d
- ADC #$017 v2 l9 w' U0 K7 q2 ?6 E
- JSR Hex8ToDec, L" t' M- P* h- v# S( {7 s' Y9 ~
- 7 |) j; ?( d) }; V9 Z( y4 ? K
- LDA FC_Dec_Data_10
( ]" a7 V. H# z - CLC
6 q( P2 L/ y$ g5 |+ u - ADC #'0'
9 p& D d3 c D' Z+ V: [ m0 V - STA Use_PPU_Buffer,X
; G/ I# J# I; Q. R& f5 V - INX
5 @5 \; r% l5 n - , {6 Q; x* n) \" p) t7 Q
- LDA FC_Dec_Data_1
" v9 m9 u" q! |6 g f - CLC
: d) m6 B8 }* B3 r - ADC #'0'
# @3 S2 }/ K# r& k - STA Use_PPU_Buffer,X+ F- u$ F5 B7 @. a# w9 b( t% ]6 X8 o
- INX( t: M$ F# Z: v, N0 e( [
-
. \$ `; \' G* {4 z9 C& A - LDA #'/'# r& M3 ^# V, m+ C& m! l
- STA Use_PPU_Buffer,X
$ H5 r& z; m$ X2 ]1 T+ ? - INX4 c) }3 F0 o8 |! S$ {! z, S) @
- 2 w9 k$ F, w r- ^: e0 \$ ? u2 |
- LDA FC_Music_Max_Index( l' r% y2 M4 l5 `/ o
- CLC
/ A W: X$ z( b - ADC #$01
2 m+ W) l- C F - JSR Hex8ToDec
' O, S3 T% ` Y+ i% {6 q -
" v- [& V: F( h - LDA FC_Dec_Data_10* a/ l2 m _! A: o
- CLC
5 Z3 P: Y" ]- p' n - ADC #'0'
, a" z1 ?! j3 G0 F - STA Use_PPU_Buffer,X9 a! x6 g- I0 R0 D9 [
- INX- o( H2 a/ F+ J# M+ `
- % c! R! n8 c! h' @6 l
- LDA FC_Dec_Data_1$ y# n2 g) L9 J' k2 G3 Y& a T
- CLC
; w) K1 A8 U5 n& K( ~# G8 z - ADC #'0') K' N2 J+ t* I% d9 K& F/ z+ M( p
- STA Use_PPU_Buffer,X5 v, C- p; d8 i2 K
- INX M/ u( ~8 Z) I& e% |; Y o o7 ~: g4 K
-
) m8 N. Z7 Z" l- v8 U - .End
5 F# C$ X3 I# d: v9 s, ?% l - STX FC_PPU_Buf_Count+ Z+ B, g% s9 ~0 G% k. @1 w2 H' ?. Y
- RTS
5 L8 h* M& K/ Z3 c7 O5 Z8 d - ! z$ C- G E. b7 F
- ;----------------------------------------------------------------------+ A( l; D, n+ }; V ^! ^5 ?; v2 M6 c
- ;音乐曲目初始化处理3 \: C# |. D. ^/ K7 Y# C
- Music_Init_Process
8 w$ A) @. v/ u2 a - PHA! i8 }, c: w3 E, V3 Q
- JSR Music_Clear_Process
1 q- b$ D) V5 n! f - LDA #$1F
! A8 r6 c) g; A; s/ H, k - STA $4015* m5 Y$ R1 J8 S4 ]
- PLA0 K% r1 r7 v1 C9 y- b
- JSR Music_Init_Addr6 I+ P5 q5 G. ]8 k- O& d9 ? b# [. c
- JSR Music_Info_Display) {9 n3 g/ ^, Z& F3 }
- RTS" d% ]9 }7 D C" a0 m1 a
( ?1 G1 L4 ?/ c9 H7 z- a- ;----------------------------------------------------------------------1 j6 A/ f x1 {& \: L9 r
- ;音乐播放处理
- W1 d" j( g' T. q" j - Music_Play_Process5 j. A' P& \. m3 s' U( b& S
- JSR Music_Play_Addr
0 |! w9 ^# {! ~ - RTS
! Y) h6 z$ _4 \. s
4 p+ w- g1 E0 [" W/ W0 K- ;----------------------------------------------------------------------* f& L; Y9 K0 r" t* K4 Y# n, T/ ?0 |8 |
- ;音乐播放处理
% I. s( w+ }$ @ - Music_Clear_Process5 O5 m! S% ]: n" i. m9 p/ Q
- .IF Music_Clear_Addr" m6 x% f0 P7 j$ O" Z- a4 A. c" d0 D
- JSR Music_Clear_Addr) e% B) Z4 w5 ^5 I. _* O
- RTS) R- X8 }! v+ q1 H9 {2 K8 s5 v
- .ELSE
7 Y3 H1 O; D- n" d6 d7 d3 ? - LDA #$1F$ N- d4 W/ U% z q, @( U: x
- STA $4015; U9 R* E. M3 Z7 [
- LDA #$00
2 ~8 M# q* m/ D9 Q/ g - STA $4010
5 G' Q' I# j- [' Y5 { R8 M- Q - LDX #$000 N/ d, l1 b9 E' K
- LDA #$00
. E% f0 I- K0 _/ b- ~6 i* _$ \1 f- p - ) g" k* n" c/ G# i; i( a1 x; E, D N
- .Music_Clear_Zreo_Page_0* s1 X7 f6 P: C
- STA $00,X B& g' B8 |7 P* y7 n& v! F
- INX
# D6 U! O. X7 y. E4 _ - CPX #Use_Zero_Page_Begin' R+ s/ V! c3 X& W
- BCC .Music_Clear_Zreo_Page_0
; n# R( m& j6 o$ n, K0 @ - * U- @; \/ n. q! U
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size/ K, Z4 e% l0 M5 r
- .Music_Clear_Zreo_Page_1
' r1 L1 h; q! k _! H5 u% ^8 F - STA $00,X7 W; ?3 L: V7 W1 N
- INX) n- H+ K8 {1 g9 g' v* |4 y* s1 ~! z
- BNE .Music_Clear_Zreo_Page_1
, Z2 h- J& V6 _( E) Y/ l8 _ -
# A" Q" X1 Y* N3 ]3 B$ f' c - Music_Clear_Process_1
. a/ ?4 l$ o3 j$ ?) {" }7 ~ - STA $0600,X
' E6 t; w+ _$ [) u; c6 Q e. E - STA $0700,X
0 i0 X9 ?# l. p6 J - INX% d$ F1 Y V. Y0 E
- BNE Music_Clear_Process_1
) W0 w! z/ y0 |4 T. E% z - LDA #$10! B* b+ s/ z7 x4 l$ k
- STA $40006 P) @+ [8 B- J& ^, d$ E
- STA $4004
3 u6 q5 @+ N. _5 f; [) Y - STA $400C' {1 s- T" w9 n+ r+ }; g8 _- I
- LDA #$00
9 _+ m& l. {* {, U) X - STA $40085 R3 o9 T# w ]8 u7 j4 p6 E
- LDA #$0F
5 Y5 [5 ~& }0 f* ^% O - STA $4015+ n; q& v% i! }* G6 ~! W# A
- .ENDIF
% T' G0 k$ G7 p: ]. `6 ~. }3 R -
& R& z# Z, A1 G ` - RTS: I# ^- ~3 }# T2 g+ k2 \2 }
2 U& M3 v! V. o! B. v- ;======================================================================( {8 F- X! Z; J( {) t! Z
- ;重启处理
) I: Z2 b0 [0 { F! p9 `7 B$ F - Reset_Program
3 M" e7 M9 a- ~! ~# w- O; L - SEI
5 ^2 B v ^! S3 F) c; R! y! X, s - CLD
/ s! T, s$ Y: C% l1 O4 b - LDA #$00" ^$ i& K. K, v. c$ o5 H1 S# N
- STA PPU_CTRL( a7 V0 Q+ M4 E# b( @/ c$ p
- STA PPU_MASK2 n3 G0 u1 a4 D" z7 m# M6 V
- STA JOY2_FRAME. C) O' f8 z. t- B y5 B: s& q5 u
- STA APU_STATUS5 x8 b9 N. L! ?* U0 U& h
-
; ^: @" O0 o" `& b* `$ e1 W - ;等待屏幕准备完毕
* a+ I$ F& ~) d. X d4 X - LDX #$02
" t3 e% Q1 e' r! S# k& ]1 v - .Wait_For_Screen_Ready
' R5 t/ l5 @" n/ L1 O3 r$ X - LDA PPU_STATUS
# ~4 c1 U i% O x - BPL .Wait_For_Screen_Ready
$ S; v0 ]8 R. q% G& W: _# L3 s) Z - DEX9 ~& [. x- ~" E
- BNE .Wait_For_Screen_Ready
. _$ w6 b, }7 p/ } -
" ?+ g6 X8 x* ]7 r- ^ - ;清空调色板: e: E$ g% [7 H7 D+ h+ v
- Palette_Clear
# }4 q7 J0 }8 }1 O' ~. B - LDA #$3F
+ B8 l% f/ \% @' Z0 } - STA PPU_ADDRESS
, X: x0 } P- O# p - LDA #$00
$ k' w1 N7 s) T' u) G0 D - STA PPU_ADDRESS% \% Q) M4 {0 U. u; @
- LDX #$20
2 W S* ^1 _% a, H/ o* h. _- [ - LDA #$0F' B! I5 i2 w1 i- r0 O; ?
- .Write_Data% k# M- X0 J4 m5 R
- STA PPU_DATA3 o D8 b, K& H% A/ V
- DEX0 m6 S* R6 c& d$ s( V
- BNE .Write_Data+ A" a% ^& ~3 J" p- F
- ! \; D/ G2 ]6 o
- ;清除声音 $4000-4013) h) I9 V- P7 d6 u$ t$ y
- LDY #$14
2 F0 G! R% Y; O/ f6 Y7 b6 B - LDX #$001 {- N1 A) ?4 b
- .Sound_Clear0 ^/ i: N4 ^; P! X
- STA $4000,X3 S& r: m5 M- t. o6 \6 c1 C- C
- INX! ]7 z' P9 K& b
- DEY" c# w, ^$ l( C5 a
- BNE .Sound_Clear o7 h$ ^9 M @3 J+ T
-
& b% V/ W* Y/ q' y0 T - ;清除 RAM $0000-07FF4 l) Y4 R$ ] A7 A3 B3 h9 V
- LDA #$00
: ~1 h+ O( i2 v9 L5 R - STA $001 n2 ]8 y; t+ X! F5 M5 E
- STA $01
1 z% }& l% t) O6 f# z+ Z - TAY5 @ b1 O& G2 q. F9 I8 {- A) k
- LDX #$08
! V, l: F3 h9 D6 S& m8 { - .Memory_Clear
& A+ l9 I1 a2 I. E* I* Q1 S j - STA [$00],Y
/ _: N- O/ ]6 Q% d8 \6 e: u - INY
/ N, y& U( L% [3 |; u - BNE .Memory_Clear% B$ e3 I `* ~: t
- INC $011 o3 F( t% C6 \3 B5 e
- DEX
! o/ K6 h4 h. [/ H - BNE .Memory_Clear
3 L( R& T) H1 ?& W; E - $ [( a3 F; W' m" H
- ;精灵缓冲初始化8 f8 \5 S Z( d. Q6 e& B
- LDX #$00
' I }. B- r2 n7 P - LDA #$F8: r( q+ q+ B1 p8 u0 l& R/ j. k
- .OAM_Clear& B3 H- ~! n) v9 Z
- STA OAM_DMA_Buffer,X: i O5 ?1 K$ _. o5 {3 G
- INX0 O0 U8 a( H$ M1 G& y$ z" i
- BNE .OAM_Clear
. W @6 ?1 u3 i+ L& }0 ? - 8 v0 B* B- v$ B/ x
- ;栈指针初始化
. _, l# M, {- t- v - LDX #$FF
; x# J0 Y- B3 \3 K/ b - TXS
" p# ]/ s4 |/ b$ @: `* X" U0 U -
7 r0 I, w1 k# F) p0 _; w - JSR Nametable_Clear;命名表清空7 g; J% k" @! D% o2 U, a7 e' b
- JSR Palette_Init;初始化调色板缓冲
( @0 Y2 l* T' j/ @& [' E - JSR Static_Text_Init;初始化静态文本4 ]6 C0 m) F9 U! L% _* C: _5 l, d
-
5 s# L- U: v: W8 S - LDA #MUSIC_ITEM_TOTAL - 1
- @, O X6 Z# K6 ]6 H' d - STA FC_Music_Max_Index
7 ?0 j" D3 h$ t" W& c: j2 T -
- Y$ E d1 x! |0 Y/ f4 g - LDA #$1F8 S# J% E$ [3 y: P: t
- STA APU_STATUS
: y {3 E- t! v$ p1 R% i; L - LDA #MUSIC_BGM - 1! b h$ l+ p& e: I; |# L9 t' }
- STA FC_Music_Index
0 _+ q3 R! X9 | I* | - JSR Music_Init_Process;音乐播放3 [+ C- Z9 U, u2 g4 m- B; I
-
' }1 I; w+ D5 X - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)" ?& h0 c% Z7 r7 g' \
- LDA #$1E1 ^) v6 x- H2 y$ k9 ?/ \
- STA FC_PPU_Mask_Buf! K8 G: Q m3 Z& E$ F4 `8 O
- 9 i* O0 F; E) @" H% a6 `
- ;启用NMI处理
# l7 V d' ~3 U8 a - LDA #$80
1 I% k R3 Z {3 f% L. N - STA PPU_CTRL1 w; p5 f: c# a( F7 }2 z4 y* u
- 7 t7 T' l+ O. s0 ?9 q9 e
- ;程序循环, 剩余工作交给 NMI 中断处理
6 E, @/ V2 s$ l - .Loop0 U2 _6 ^- C; B# I
- JMP .Loop
) K9 h8 }" A$ p - - z; g, V( K& e
- ;======================================================================
6 |, ^0 P3 @8 }% r9 y - ;不可屏蔽中断处理7 L) @7 \- a; @& B7 {
- Nmi_Program
( C) `! ^* }. _. [ - PHA' r, Y6 o& m6 p2 c9 B: `9 }
- TXA
. H6 h1 X; r1 G8 i. c - PHA
; q) D4 S6 p0 C. G& n* j - TYA2 O& |& i" w' m( c1 x, t( k
- PHA/ Q7 f& F4 U" x' Q+ `7 o% ~( e0 _
-
4 t$ n& Z- L+ i1 k" L+ L1 w - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
/ {* p+ T4 i3 z7 O - 1 W8 [* F- ~7 h# v
- JSR FC_PPU_Procrss;PPU处理4 |7 Y3 z7 |; q4 K: h* |
-
& d V* S$ }* P9 Y5 @7 O5 x - ;精灵内存更新( n; e; J; T) w& p9 d" Q& o
- LDA #$00
, `6 C2 ]5 o1 W0 E0 Q - STA PPU_OAM_ADDR
5 Z& C2 y0 P! W" V4 y: Q - LDA #OAM_DMA_Buffer / $01006 u2 l* j. }+ q7 {8 t
- STA OAM_DMA% u U& O5 w. S4 }
-
7 z; Z J8 _% h' _$ M. @3 L* p# r+ O. k - JSR FC_Gamepad_Process;手柄输入处理2 Z* h4 P. L' u' @( n4 S9 @) V
- JSR Music_Select_Process;音乐选曲处理
3 f) f' ]4 `1 q o4 j8 R - JSR Music_Play_Process;音乐播放处理
1 v3 g8 g- ^$ ^0 B/ x& Q( S3 F1 y - % u; H- u+ t1 Z" ]$ A' q
- PLA
; y& F. W! O5 y. v# J! O& S6 s% n - TAY' o9 `7 v7 n& ^0 u" Z0 L9 c
- PLA
% V6 }! y% Q" ~ - TAX
% k0 A1 g8 z# ^' e - PLA8 Z; [1 H% ^9 C+ M e2 I% s2 d+ Q/ K
, v! y8 F4 s) P5 V( @# o1 B: D6 e- RTI/ B" {* E; N3 t& s+ j
6 e) e7 Z- p' O9 Q. r7 h# J; Q2 n- ;======================================================================
4 F2 _, N9 C6 o( D: E - ;请求中断处理
0 Q8 a/ S9 t U+ C: ~ - Irq_Program6 ?4 H3 c* ]) _$ o% E7 v
- RTI
0 L9 v+ V- i, M/ x - # r! e" r; u# t) z+ ]
- ;======================================================================
# P& d5 a6 w+ t4 \7 B% v - ;中断向量表
; O; B: d/ X) j8 }$ i1 |% ]4 L - .ORG $FFFA9 u& ]4 m m! X& E# n% Q. \
- .DW Nmi_Program ;NMI触发时执行
: \( u7 K" E) v% }) p8 f) l - .DW Reset_Program ;载入ROM时最先执行
' S( r7 ^" z' u- n' ], }5 i - .DW Irq_Program ;IRQ触发时执行
. a& K# d# @ P2 K% i
复制代码 3 d* E& @3 U4 y- X" u- d8 g
! L8 B% Q2 s" A& x) H8 o. G
8 |/ ~/ o6 \4 a1 M5 t; n6 ^
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|