|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 S8 V5 I1 u; j+ q0 s. _7 {
% s9 T$ j. }* H+ y* l7 [
以下是主框架代码:$ Z7 J* V `1 F7 k
- ;======================================================================
; G0 e1 P( Q+ z( _0 k/ m& i - ;文件头' a6 m+ Q' x2 t6 S+ W6 G
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量4 Y9 w- G" e2 [+ C- n# W
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
( { H# J8 @- V% x - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码* r# U5 \, y9 f6 x! U
- ;======================================================================: u" D; u7 p6 D g% `
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2! V; d [0 h5 C9 R
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1& V! C5 m1 L8 R
- ;======================================================================9 I- `1 D" X1 }+ \
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, b' {6 l& H+ {4 k% @4 L6 C
- RESET_ADDR = $E000 ;主程序起始地址
{/ `3 ~& Q! Q+ n j* U - ;======================================================================
$ T5 \' X- E( [) ?4 O6 G: U8 e - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB0 d B% y: U* l: B1 q; j$ m
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
9 R' C+ R: D6 j2 D2 I9 K - .INESMAP 4 ;Mapper号 (0-4095)
( w- d, h( C. O7 B - .INESSUBMAP 0 ;子Mapper号 (0-15)
* J- y5 n$ y& u2 c - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
0 o( _8 [, B A# Z# g! U - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( F4 x- w# ]0 R. `; D2 N/ J - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
- g3 l' C9 i$ s3 @ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)# {$ n8 I: c2 [8 y) Z# c) [' f
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
4 Y' Y7 A; e0 _- I) s - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
; }. n7 {, Y. M( q - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 ^' `2 t4 V. \* T; u
- ;======================================================================7 w5 f9 c+ ^7 ?( H+ `
- .INCLUDE "fc_demo_config.asm" ;全局配置
" N* W6 t: M7 J$ m9 n- R - .INCLUDE "fc_demo_constant.asm" ;NES常量
2 M: \, _9 U8 q# ~) o$ M+ k8 w - ;======================================================================0 M0 x0 j' a7 S+ z4 @! g2 d `
- ;音乐配置1 B8 N1 V0 d4 M
- .IF 0 = MUSIC_THEME d$ L% k6 Y, v; T" a
- .INCLUDE "data/music/Gremlin 2/config.asm"
; U" m2 l; x0 p7 v+ Y - .ENDIF
; e6 N2 x2 {# @ -
+ V0 @1 N* n+ ]5 a; U+ |- v& S% l1 O - .IF 1 = MUSIC_THEME- D* i) N! k' b" r, O
- .INCLUDE "data/music/Raf World/config.asm"+ C& _( ~9 \: \0 ^& E" n
- .ENDIF
2 w0 u, f7 c9 ~" P, P5 n - 0 {( T4 l9 G. J2 @4 g4 t
- .IF 2 = MUSIC_THEME
1 `) G( F, u/ P7 }8 Z ]8 C - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
* S$ _5 Q% F6 I0 \6 N- F - .ENDIF
' A! v t1 k" `+ i* a - ! |. ~7 J$ \$ q
- ;======================================================================
1 H! h8 I# p0 n! T - ;引用CHR图像数据 T5 v9 b3 l5 p
- .BANK NES_16KB_PRG_SIZE * 2, f% k# p4 |% D4 e- F x( ^
- .ORG $0000
) ?) t" b! v6 _ - .INCBIN "data/bkg.chr"7 l0 ]% Z+ ~( ~. j
- .INCBIN "data/sp.chr"
" T! u |1 S: V1 H* y% h- a! q -
5 J0 z# g4 b6 H- g5 [ - ;======================================================================1 b C& _! H' l1 g4 E/ R& u& q
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
+ ^. Y) V3 ~ {( C! ^' ? - .ORG RESET_ADDR
6 ~( C- ~6 H; p5 l9 w - ;======================================================================+ U" c }% g6 T
- ;引用其他源文件' U6 L2 M8 s6 N) b9 N" G
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
1 L; a. Q5 F- D' u - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
7 e2 L( R0 s5 U0 n* M/ O* H, x - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
7 P+ m2 M7 G. F1 o( s - ;======================================================================. H; ?& f/ a3 W0 {9 S6 I# k
" x/ q, Z, o- {3 Y1 `- ;======================================================================
{+ |6 i1 {# v9 ~& r - ;等待VBlank到来
0 x1 A; f' I9 z, {9 G) a, z! H' u - Wait_For_VBlank
: a+ H- Y8 Q4 y- [ - LDA PPU_STATUS
D/ a N: O$ ]# s/ \ - BPL Wait_For_VBlank
% P7 T; b s2 I# i# S - RTS
1 y7 r( p1 f2 D6 I' \5 y
3 g! w" A. u' x6 L) x% G- ;======================================================================
1 Q# C+ J E N, W6 o' B - ;调色板初始化. \2 I9 E6 \( S8 w( ]9 F
- Palette_Init& U% Y1 n! @7 C5 V- ]3 n; q% N4 e
- LDA #$3F
' w4 y& D9 `3 H- \% ~ h - STA PPU_ADDRESS
6 s" K: p8 |1 i$ J - LDA #$00
* \3 W3 e' D( R8 t# @6 |# J* |( `0 ^ - STA PPU_ADDRESS8 j8 N& |! p9 D3 F' O; Y7 b
- LDX #$002 p! p+ r- h5 v4 U# D
- LDY #$20
4 v: D" q# Y" T) r - .Write_Data5 E: M% c3 J' g. T' n8 Q' C
- LDA Palette_Data,X
; H+ j& W% b; r& ]; g8 H" C5 W - STA FC_PPU_Pal_Addr,X* G9 s3 q: H6 K6 F8 L6 _9 G
- INX; m- @3 }/ V% ~; p
- DEY# w- F- H' C/ f* D9 y- L' f
- BNE .Write_Data: v7 y* P8 Z L8 {/ B
- .End, r) m% f# b5 I
- RTS+ {& f9 N P* D( `6 J& e1 N$ I0 M
- 1 I3 S; D. j/ f# ?. ?0 z
- ;----------------------------------------3 |/ |! g$ M5 I. v- r5 Q
- ;调色板数据' P& M/ b1 e- |6 A# o5 H) x
- Palette_Data/ p' t4 b9 Z. u# d8 ~/ D1 H8 V9 p1 p
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
# M% i5 s" w7 m" I4 q9 M - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
6 Y7 Y. R h; a: n4 k V0 j: o+ b x - " Z5 q$ X k& x p3 o) {# E5 w9 \
- ;======================================================================
8 F$ R. [! ^& K; T4 F$ N - ;命名表清空
/ v9 |+ g4 a# r! K - Nametable_Clear# E/ I! @+ ~! Z3 u: w' F: j
- LDA #$20
: ]) _ y2 t! q - STA PPU_ADDRESS' _* n0 \9 [$ K( L8 x+ g" s
- LDA #$009 T& [$ c8 D6 `2 C @
- STA PPU_ADDRESS( o2 @* [; y. Z1 x
- LDA #$00: F$ N9 y, Y+ n# E- |/ j+ c+ \
- LDX #$00
+ B: z) K8 G! w) n$ v, e - LDY #$08
+ M! T5 B H1 P0 k - .Write_Data
! q: U9 X3 o5 ?) S% F( v/ Z4 h: ~ - STA PPU_DATA) b# k: w- {7 A& l! ?) D( v
- INX$ p; V, ~9 Z% a% X: d5 O
- BNE .Write_Data# S5 x) ?7 V- D x1 C9 [
- DEY5 O7 |7 {" e' O" d6 l% ~3 N/ |5 G
- BNE .Write_Data
1 x$ |5 K' S$ l, W& M' k* P+ w - .End
7 R. Y3 }$ ~% J5 \5 p - RTS* {% S+ `2 H8 L2 V' S4 n4 p
- " |- Q0 e9 A& d" ]
- ;======================================================================% c/ E8 x5 v" _1 G j6 A
- ;音乐曲目切换
4 _( b0 Q& T" z+ D/ n4 M - Music_Select_Process' m: ?2 A' i6 g% a! I3 e4 H" F
- 0 Q; H' c/ \* w
- .Pre_Music;上一曲
- \3 b* z* R$ ?- c& l# Y - LDA FC_Gamepad_Once
- f/ O6 X$ z( z6 C/ h, L$ Y; Y - CMP #JOY_KEY_LEFT+ B! Y7 `2 V# f5 ]
- BNE .Next_Music8 f! P8 p2 b( W. y% r) E
- JSR Music_Play_Pre
# I) s$ y* b+ c% n" a# q* { - .Next_Music;下一曲) s; P* ~! Z0 O! \
- LDA FC_Gamepad_Once
9 t; W3 u |* i# R4 _7 u - CMP #JOY_KEY_RIGHT
( i# I5 R- a8 e8 ~2 z9 J( w4 N - BNE .Next_10_Music. q* D+ W! D' ^1 y
- JSR Music_Play_Next
+ ?' T# ?4 {: Z1 o) B2 `( \' _ - .Next_10_Music;上10曲
( Z# b! `" j8 ] q- G5 M1 B h - LDA FC_Gamepad_Once) P( l/ _0 m6 f4 K* P% v" T4 u
- CMP #JOY_KEY_UP
, P# X) I7 |6 G% B, G* C - BNE .Pre_10_Music
% z0 M0 v4 k3 R; J* E - JSR Music_Play_Next_100 F; h; {" g' W8 J
- .Pre_10_Music;下10曲3 A* c% e. h6 h& D6 @! S$ R7 V
- LDA FC_Gamepad_Once3 L5 g+ U# d+ k! m$ q
- CMP #JOY_KEY_DOWN
. F) B' i6 Z+ q/ T6 @' S4 M - BNE .Reset
1 _% P {+ J3 u. W% A - JSR Music_Play_Pre_10
3 o# f# w+ F$ b - .Reset;重播当前曲目/ s G, V! c& D* Y2 [; m+ x
- LDA FC_Gamepad_Once2 g7 u# g; X" _$ i1 r% H; y
- CMP #JOY_KEY_START
" ~0 o8 k3 g# _$ |' [0 Z7 A3 j - BNE .End
1 P! u3 n! u8 P | - LDA FC_Music_Index
* G, c0 @0 s w3 T# _ - JSR Music_Init_Process: [% L6 x3 g, w: J) W
- .End
8 U( G0 \5 x5 K z4 K- U& R - RTS! G' W! K8 D# R
- ) h, ]8 S7 S" k5 ]/ ?3 m* I
- ;----------------------------------------------------------------------
; \6 A6 `$ t8 I. u) E5 [- w9 ?$ W) X - ;播放上一曲" Z. k% X. x4 T6 L
- Music_Play_Pre/ {2 z4 m$ A/ `9 f' K
- LDA FC_Music_Index+ a4 w6 K9 P+ }5 X& C" F
- BEQ .End' W4 S2 C) z' x! J
- DEC FC_Music_Index
' {3 Y, X: {! r! W: ]/ u - LDA FC_Music_Index% Z0 S# |) V y7 d+ R4 Y
- JSR Music_Init_Process
5 b9 P7 T' s `/ k- P - .End
# f# A$ M& _. Z: n - RTS
, t& t8 W& K8 c" M! Q% U - ;----------------------------------------------------------------------5 C& c) ^9 V6 Q l
- ;播放下一曲- s+ `, L. K6 W" u& i: }
- Music_Play_Next! D0 d R( f% F9 J* r+ `" y3 _
- LDA FC_Music_Index
4 E, k( P4 P E4 H - CMP FC_Music_Max_Index- ^/ J' o+ Y0 u0 M
- BCS .End
) ?- k. V( m! ~$ i$ ]+ e0 y1 X% ] - INC FC_Music_Index$ f$ _ H& K+ L* R6 q' x h
- LDA FC_Music_Index
]4 g- y9 k' X/ f3 S6 L - JSR Music_Init_Process8 v; C3 p) b0 ]$ r1 r. q
- .End* A2 f$ B' M: P7 N$ p' U. M @
- RTS$ u0 L6 v \2 J+ n
- 9 @3 d' j2 a! v, I- S' x
- ;----------------------------------------------------------------------
( U. \6 i" u9 [- s: p u - ;播放上10曲7 H: M3 s# Y5 l; I
- Music_Play_Pre_10
2 t; _$ `8 z7 l K* v - LDA FC_Music_Index
* t1 g3 [! ]; H a# W P. K - BEQ .End
8 {# C) u- j$ d" H: O4 f4 s0 I: d - SEC. n2 s$ ^7 d( A9 X5 b6 a
- SBC #10' l# V, \+ i) w7 D( _8 e6 C
- BCS .Pre_101 H% c- u% Y# B+ F: @
- LDA #$00
6 _! |, P# _% M, k - .Pre_10. N; m: h7 {9 i
- STA FC_Music_Index' h2 p7 ]! J6 h7 m3 S
- JSR Music_Init_Process+ O5 s9 j- [5 H" {! U0 T+ @: n# O
- .End
" Y+ Z' W! a" H+ O) j. J" F% B - RTS
; v$ J7 |6 M! K ~ - ;----------------------------------------------------------------------$ i4 J% X* ]6 j- I l* e* x
- ;播放下10曲9 ?3 a8 u- }8 T; m H: w; Y
- Music_Play_Next_109 Y) @* U" @1 B9 m8 i/ n% g
- LDA FC_Music_Index
0 X" b- F$ w- p5 z! z% ^3 x - CMP FC_Music_Max_Index
) {% l: I5 G$ z - BCS .End) |& _3 A N1 m* z$ r
- CLC# _% m0 P/ ]& k! u& s J
- ADC #10
" x: {2 `/ p7 m' ^- r) G - CMP FC_Music_Max_Index
( j9 Q$ c/ r$ X - BCC .Next_10( F. O; R7 ]$ U% d- c0 b0 p
- LDA FC_Music_Max_Index
2 \1 S- T; v. ^2 ?5 C ]2 N/ a - .Next_10
: f$ g/ m5 M6 W" i - STA FC_Music_Index
. ]) ]2 G/ O. ~! d; G - JSR Music_Init_Process
! m+ ~, [6 }- i8 I" @) ~1 ?: O" v - .End
" h6 S4 t$ d% j4 b - RTS. r& P# Z: y. T% d( P9 H# Y: S
6 b% F* @& B5 N) E- ;----------------------------------------------------------------------' O; S( I: o% l$ }. W8 g
- ;8位十六进制转3位十进制制
; e- q* B Q7 q4 i - Hex8ToDec# t$ j0 x1 k9 R
- STA FC_Dec_Data_1! _2 x5 m$ W- W, Z' ~/ S) ?, v8 p
- LDA #$00
$ a3 Y! F3 E% { - STA FC_Dec_Data_1004 B |/ `, N' N; a L) y# O5 Q
- STA FC_Dec_Data_10
9 D; J% C" s# k4 D0 H: i - LDA FC_Dec_Data_18 H8 x% |' {9 L' B# _
- .Convert_100
+ P! Z5 y' Q0 n# I - CMP #100
( h0 ], i( F1 W z! X5 ^ - BCC .Convert_10* Y# P- y! a0 |$ Q! U9 [
- SEC6 e+ ~ n Y% c1 C) ]' ~
- SBC #100+ h# R& }( U. V8 ?- |
- INC FC_Dec_Data_100
* l4 }, r3 b3 e( i - BNE .Convert_1002 O5 p, q9 w2 L8 H+ S' R
- .Convert_10
4 s; |7 ^6 F1 }4 J1 y* W0 w8 t J$ l - CMP #10/ o0 Z* b5 R O; X Z2 s: }
- BCC .End* w& M! r$ r5 g L2 E; V
- SEC
1 h* ]3 Z2 _& ~) T& [+ X% h+ P6 w - SBC #10
) ~* f/ I7 b# E# a' D - INC FC_Dec_Data_101 H+ k e% q* d. J& T$ w+ Q0 e' q" V
- BNE .Convert_10
( ^% I( I& z( ]4 x+ Q. g - .End
0 E" o( A' f: d$ j$ H - STA FC_Dec_Data_1' Y2 q# F3 F" o
- RTS" x# \* E, H6 b: @: I
- + Z7 w$ A& V$ U$ B
- ;----------------------------------------------------------------------
7 D+ B5 x2 q) h2 H8 C - ;显示曲目信息
" x/ M- i2 K0 m. L- v( U: c - Music_Info_Display
2 d% m9 u4 ]+ d - LDX FC_PPU_Buf_Count
* e' z, a2 P8 k4 ?1 Y& [* u, { - LDA #PPU_WRITE_MODE_CNT_LINE5 b# o9 B/ }9 M0 B5 ? p
- STA Use_PPU_Buffer,X' z7 D2 l* Q4 i" \
- INX
1 d" A( S( t( F/ h7 v( _ -
# A$ N! j" w5 J# [ - LDA #>MUSIC_INFO_POS, {& D; o0 |; E6 M) `/ V
- STA Use_PPU_Buffer,X f O% c) P" g* N
- INX
7 a0 `- P, ~% f7 e -
$ c# c6 O5 ]* G& N7 \ - ;居中; _0 B+ B" M4 y, B2 ^
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/22 { u8 C% P8 W. q! c8 J/ s* ^
- STA Use_PPU_Buffer,X" [' t! Z5 z$ ?0 {: `! z
- INX
2 o0 ?2 L( a2 \6 H$ \) Q - 9 T; H. p0 a+ `$ e. x
- LDA #$05. X2 E# X- n& H3 E4 H. Q" R4 ]5 k! |
- STA Use_PPU_Buffer,X7 L- i- l1 i0 `* o g/ D. [
- INX
, H% U: p+ e% j7 m - ' Z0 p8 W+ [4 M9 u! } v
- LDA FC_Music_Index
& V- R3 i, i' D P' p# k9 ` - CLC
' A& `" E: {. t, }2 S7 ]1 Q: v - ADC #$01
" i3 g( G. a7 d" F* U - JSR Hex8ToDec0 ]: {/ r" t1 Z/ Y. K7 F
-
( a$ G1 I B/ Z& }( `2 Y. j) k - LDA FC_Dec_Data_10
3 |) R+ w" l M- X: ]& w. z- C - CLC" R q u; L$ P' ^7 [) \/ b
- ADC #'0'
6 A( f3 A+ B0 D9 s: \ V - STA Use_PPU_Buffer,X7 p7 X( I9 }+ F; v6 q
- INX+ @! U6 x$ b1 G% ?
-
- P! A; e8 u3 ^3 Z* l7 y, K - LDA FC_Dec_Data_16 a( G. p8 C! d2 _$ j
- CLC
& M8 n9 x) V$ }9 L6 _: b1 O - ADC #'0': b# }! v& D$ n* @4 [$ m/ }
- STA Use_PPU_Buffer,X+ q& I5 H r3 A$ ?* c9 a
- INX
# h- B& R# }, ^- o9 c' L6 w/ G - : [/ g+ o# T" J$ c6 o5 ~4 M
- LDA #'/'
3 w" c& X& t. i - STA Use_PPU_Buffer,X
# j" Q* _; ]$ r/ t9 B6 o6 A/ l, Z - INX
3 y! S( ~" S4 a -
; d f4 v7 H: p; S" M. H5 u - LDA FC_Music_Max_Index
& l- L' ~. T" \( n% ] - CLC
+ Y/ [" |8 s: n& A, @ - ADC #$01
+ O' `0 T; y+ n6 x4 l$ R - JSR Hex8ToDec
# _# [, }" |* E. w1 g' j- c -
: r, \& Z/ ~ m2 o& ~+ |, m - LDA FC_Dec_Data_10
3 V+ t" G# l8 q/ z+ x% z' O - CLC" }1 {5 }& [- T/ B$ m5 Z5 d
- ADC #'0'7 ^9 m: k9 y# H7 T; e0 a8 w
- STA Use_PPU_Buffer,X- N P% Y3 B2 ? z* i
- INX
8 U/ m/ X7 K- {! c1 J -
( O# }( l4 V: Y4 x5 S& ` - LDA FC_Dec_Data_17 W) K; b6 w; g
- CLC5 N* L" [4 X# w N2 @, [/ ~) n
- ADC #'0'- n* m0 E, }5 x4 c* ^' C
- STA Use_PPU_Buffer,X
S* a/ [0 n/ ^2 r5 W8 n5 k* T - INX
0 }2 Y5 J7 i$ n- r - 5 Z, Y' |) l$ Y8 }' Q* N
- .End
$ d, Y8 x- O( h9 {' s - STX FC_PPU_Buf_Count
/ E, t4 m" G& V7 m1 y- j. S - RTS. b8 ]+ k. q- C8 P
- - u. r3 W5 ~3 `; [
- ;----------------------------------------------------------------------
" ]4 }# K* u8 _ - ;音乐曲目初始化处理
) I4 S( r# P. y1 x# ?6 d$ j/ z$ u - Music_Init_Process
/ H' H$ a) m; ]! x. E% ~ - PHA+ {/ ?# |( }7 }8 S0 C2 w: R Y6 R
- JSR Music_Clear_Process. K3 D2 O* r3 }5 \+ f7 N
- LDA #$1F
' e5 h' N; o/ n& b& c0 R, j- ? - STA $4015
/ J" S' u7 p- r# _' U5 ], m- v - PLA
4 p5 x9 E6 ?* z7 u: M4 S - JSR Music_Init_Addr) _' s7 @& K/ C0 y' }
- JSR Music_Info_Display
5 A j+ H! a: K - RTS+ c$ ^) l0 u7 n: W: Q2 O: F
- ; F- K/ Q1 l: e7 U4 G" l- [! Q* W& P0 o
- ;----------------------------------------------------------------------; v6 ^/ X7 x+ g9 k
- ;音乐播放处理& A0 C6 v: X: h- \- p
- Music_Play_Process8 U$ t- U: k- @8 V" a
- JSR Music_Play_Addr: s. |# o, n0 ~0 f( T! N6 {; ?1 d' s
- RTS% Q1 o7 t6 q& u: E
- 2 |% @ K' I! m3 f3 D
- ;----------------------------------------------------------------------2 \9 D# n% o" o
- ;音乐播放处理( K i: F& g( ?1 }1 c& W
- Music_Clear_Process# B, [& {# M; E
- .IF Music_Clear_Addr
. C! l) C. Z2 J+ c( ], z) Y; Y$ [ - JSR Music_Clear_Addr* X0 i; C& u4 [; A7 m
- RTS# G- C) k& V( ]' W1 X# K: N$ @
- .ELSE
/ y, Z: p. _/ A - LDA #$1F5 }0 o- }: P+ V! y9 B9 j
- STA $4015: p) F1 m7 `9 o) K* a
- LDA #$00
m9 V! L0 R& k; l - STA $40109 M5 Z/ {# R9 X; `* Q
- LDX #$00) W: E; e0 V3 r) u9 J# ?, n
- LDA #$00
! d6 x7 |- S/ _2 j - . k- Y9 c) @; u- O& m: e% W! B" ?
- .Music_Clear_Zreo_Page_0: b3 {& @- T# S
- STA $00,X
/ e/ f9 R/ ]7 g" ] I5 G - INX
8 D! b# V' V. ~( Z - CPX #Use_Zero_Page_Begin
1 }1 X& O: }/ s; I+ U! J( n - BCC .Music_Clear_Zreo_Page_0
# o$ t8 }7 _, w2 v- X -
1 N* K& f4 V. p& k# p2 I - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size, Q$ j5 X0 t# ]( a
- .Music_Clear_Zreo_Page_1# x/ Q: [4 y, [3 K
- STA $00,X
6 |( w7 |: u7 l K - INX
; L3 f1 j7 I, k( A - BNE .Music_Clear_Zreo_Page_1! g8 ~ c5 S1 [6 C- S* ^
-
( V0 W7 a' W) P3 B/ _ - Music_Clear_Process_1, S5 _. r7 O$ U* }% V
- STA $0600,X
! J% m* \5 i$ U; @& _$ G9 R - STA $0700,X
9 g3 L4 A& V- `) h - INX. f& ?# ^2 m! y" X. v' `
- BNE Music_Clear_Process_11 Y8 g; Z: I6 k) f
- LDA #$10- Y' g! |1 g5 T' h, ?
- STA $4000
% U5 t+ \' K, D2 J- ~2 ~, V - STA $4004
: M( |, n$ T% g/ N* U: _ - STA $400C/ k I$ o" r* q$ a+ E
- LDA #$00
4 ~' M2 a& u4 ~, h - STA $4008
) V! K v. A1 b; ` - LDA #$0F; H0 I7 k0 H C9 J, o+ l
- STA $4015" j8 M% S3 M5 @6 ?6 b3 z/ C
- .ENDIF" y: s5 I! |1 _" ]
-
9 w8 }- B6 J# s" Q4 ]2 ^+ R, O - RTS: D7 u+ m$ Y' g+ W( |
- 6 I, c, Y; Z! L7 F/ ^
- ;======================================================================
4 B1 c) O* C( ]: g - ;重启处理
3 Z7 p' g- ~: J6 K - Reset_Program3 Z9 N+ W0 W$ x& Y, v0 U% M2 Q
- SEI6 ^3 ]8 T) F, E! S
- CLD
0 U/ Q5 b( ^+ c& P6 X E' ^, l, Z - LDA #$00
8 N, f7 y0 K* x - STA PPU_CTRL
" O4 E0 y; a1 Q3 C1 D) P: \ - STA PPU_MASK
0 m8 C, Z. T8 v; `. x A - STA JOY2_FRAME0 @+ {# j3 x7 p1 p! ?! O
- STA APU_STATUS
: x0 g2 i8 N7 U$ n% u -
% ]$ a0 D5 u$ m5 [ - ;等待屏幕准备完毕6 f5 c; x8 e* d( g4 ~/ ^; N
- LDX #$02
" p& q" s0 v) d9 x8 g1 C4 a - .Wait_For_Screen_Ready
2 v' ?. b: W0 ? - LDA PPU_STATUS
J k' H4 M) U6 [' ^ - BPL .Wait_For_Screen_Ready
, u" w; L* c' p - DEX
$ x9 K0 I# X9 b) {# `8 A7 ~ - BNE .Wait_For_Screen_Ready
/ J; g' z- L3 h! A8 ] - . r$ P" O5 V! t3 A6 Q
- ;清空调色板# A) z# y4 Q7 r( K! i) Y
- Palette_Clear
4 ~' n3 E! N2 q6 U8 k - LDA #$3F4 D! F: A* y7 _
- STA PPU_ADDRESS7 ]+ C7 p$ s2 C
- LDA #$005 V' z6 c5 N: e/ F
- STA PPU_ADDRESS
- |& Z% e6 Z% D$ m* w4 \ - LDX #$206 Z3 X. }. L. z4 r- D& q
- LDA #$0F
' H" _* f* B" y - .Write_Data& r( l! J- M$ X* A
- STA PPU_DATA& T1 j; q7 W' [4 C% L# R8 f) W
- DEX
8 U; L Z' w2 C( m& k2 Z1 P' ~ - BNE .Write_Data) B# I1 _3 W5 d
4 z& O0 ^5 z1 ?2 ]% H- ;清除声音 $4000-40139 b+ [2 J, [% O0 s4 b0 _; n3 C
- LDY #$14
; E3 g, `$ m- I( i Y% o - LDX #$00$ G( A4 G) R9 C6 u( @
- .Sound_Clear2 F! [- I: G- E
- STA $4000,X
1 w. P# y* e. Y$ C - INX1 V& U: x/ r& v5 x5 t7 [9 O+ a, o
- DEY( u) \0 f: s# T- S
- BNE .Sound_Clear1 H4 h6 O: O2 |7 ~' g
- 3 z; }9 Y6 v9 ^" w7 `* @# U
- ;清除 RAM $0000-07FF, S1 \6 x- Y+ Z3 k0 F
- LDA #$00
& i6 z7 O/ a( U, @# y, a6 L - STA $00
+ z3 d0 `5 E9 M' e" d: e( N! ] - STA $01' D* g% E, c2 W b7 S+ i, \1 `
- TAY( b6 x* Z% P7 H; w" I8 q3 H" [" N4 C+ x
- LDX #$08/ ^1 H/ f2 a/ I Q3 e; [8 r/ m
- .Memory_Clear
. z: M! [, W5 X* ?1 t5 U+ p" r$ T7 ? - STA [$00],Y3 f% `2 Z2 X6 r& I9 U/ ^/ P
- INY
4 o8 J' u5 o- I0 p, N - BNE .Memory_Clear
0 E) T! F2 f- f - INC $01, a; b+ F m, u: ]2 H7 p
- DEX* ]1 t2 e6 J' ?# p7 m1 Z
- BNE .Memory_Clear
- R" _9 W) t5 f6 x8 S: p -
6 u/ f# e* F- O0 |' r* h# o0 a - ;精灵缓冲初始化
2 s4 P9 ]# n' m, ~) p& J - LDX #$00
6 l4 N5 X* W1 H l) t$ e: o. q - LDA #$F8- R3 \" p+ Y' ~- R2 u
- .OAM_Clear) I6 \ Y% I! z: Q$ Z' k V
- STA OAM_DMA_Buffer,X9 L5 i/ H& m* ^; I9 |2 r
- INX M: P: ?0 @0 e
- BNE .OAM_Clear
}- n8 d* W. G' Z2 K8 T - 9 F9 B. n( ^/ g! j7 K5 ~
- ;栈指针初始化
) l# \/ k5 a1 a4 G& j: k* A - LDX #$FF
1 o7 l9 S" L' Z% r - TXS4 [0 e, V1 J3 V5 Q( q
- 9 f) m3 X% c% P( H3 u J+ D. k, b
- JSR Nametable_Clear;命名表清空
% B8 M1 B& d3 p: U - JSR Palette_Init;初始化调色板缓冲, Z) A% c9 B" L8 u) h/ S# w( b; ^
- JSR Static_Text_Init;初始化静态文本
6 \/ s. e- w: a7 W* ~$ c7 R -
; k; \$ U: a& V" E - LDA #MUSIC_ITEM_TOTAL - 1$ s/ v: g% ~1 R( n& h/ k
- STA FC_Music_Max_Index. V" T* l+ ^$ u+ K3 ^! n
-
! @0 y; R7 g a$ |. r' q! {- c1 [+ ` - LDA #$1F; G# s% ^2 \% `: q4 }$ r" x9 {8 g
- STA APU_STATUS+ T# O/ p. Z6 e3 l# o
- LDA #MUSIC_BGM - 1; O8 ?2 R3 B- Q. i. @1 g
- STA FC_Music_Index
, Q6 b |$ J, H' T - JSR Music_Init_Process;音乐播放. ~4 k- v' ]6 ^, C1 U- @- F2 N
-
3 z; X3 C7 h! C/ e i - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
, f) r# y8 j8 h* G - LDA #$1E
% t; R8 V" R g( O" | - STA FC_PPU_Mask_Buf0 ~+ ?9 o! I/ }, x
- : D* ^: `2 u3 ?# Z
- ;启用NMI处理8 ^; s! L- A9 u1 w& v
- LDA #$80
4 U1 x# i) I; [% D; Y - STA PPU_CTRL- @& x7 a3 z" e) D5 H
- ) A: [8 a/ r- _ a
- ;程序循环, 剩余工作交给 NMI 中断处理
4 I% a9 {7 L: p- R0 p3 l - .Loop S8 R9 m2 u' {: H3 |( {
- JMP .Loop
. V+ G8 @" _" N! x4 y, ?$ M - 2 @7 b4 R9 [/ e/ Y0 a3 {; H, u, I
- ;======================================================================; g L3 n7 |' ]" ^
- ;不可屏蔽中断处理
# U# e. M) m* [! I - Nmi_Program+ y0 Q: l% n0 w" i
- PHA
6 A& s# U! E6 y - TXA
* L* R! Q+ G7 q1 b - PHA L" n+ \$ X: M$ g# v+ E& O
- TYA
& l* l( V$ @3 M: P6 B; E) P; Y - PHA3 p1 V+ _8 ~! u8 B
-
3 n X& N M! N% L$ j, p9 ^3 `8 A - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
2 i3 V2 K3 M1 L p2 N7 N& I - 9 \3 ?3 V; C/ [ `
- JSR FC_PPU_Procrss;PPU处理
( L5 d$ |3 W/ {. `- |9 C - & `$ e' T* m, f3 { A3 K% e
- ;精灵内存更新! u7 N* y ` Q
- LDA #$00& }8 _" ]) k4 Y# N* @
- STA PPU_OAM_ADDR$ }- d$ i6 i9 l' w7 f7 ~
- LDA #OAM_DMA_Buffer / $0100
) U( V: x; m+ S+ z( b3 Z - STA OAM_DMA
, u, I4 {; @# t0 g8 ]$ H0 ?1 u -
1 o- l1 e( b; H& m' i - JSR FC_Gamepad_Process;手柄输入处理
) j% B7 \, D2 Y- o5 i4 c - JSR Music_Select_Process;音乐选曲处理; U0 R2 |; t& ~% X) F+ n3 c( U
- JSR Music_Play_Process;音乐播放处理4 ?. G" x* W8 \+ [( @9 O
-
7 C- H; X# Y/ M' {, w# Q6 _ - PLA% u- R. z" O& K+ n+ {
- TAY
( V% p2 u& k; ^6 p- M: j - PLA7 X. s% y; @: u/ ?# E
- TAX- Y2 K) H/ n1 b& c9 j
- PLA
l1 k, T, ~) V. ?
: J+ r" x4 _, `" ^- RTI
7 y1 ^+ S/ T3 L2 m1 G, W3 Z
' N4 z( M/ d; @0 s* C+ Y- ;======================================================================9 L- A/ t) {; b$ P4 P
- ;请求中断处理
7 p, O7 M$ u/ I: f) W/ o. C: E9 G- L - Irq_Program" {4 g. S$ y$ C$ \1 g4 G1 E
- RTI
5 z4 ^4 V0 S: F: U% A s - * N# t( I2 |& [5 V
- ;======================================================================- K3 J$ l- F+ S1 @
- ;中断向量表7 w- `. c2 _, X# P/ c
- .ORG $FFFA
7 T9 { K1 r' f( a8 _ - .DW Nmi_Program ;NMI触发时执行
; d5 h2 [$ D) l% M8 K# j; h - .DW Reset_Program ;载入ROM时最先执行1 ]0 }& W, \/ }6 t
- .DW Irq_Program ;IRQ触发时执行
6 ^: @! Y+ J1 [, C. [; n! F
复制代码
z; T! v4 [5 F% s+ _- c$ d |- G# L, t2 x$ p9 X! ~
, a. [5 n! E/ E; w$ Bhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|