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