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