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