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