|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
L6 I; u2 `: E% K 7 |4 x# j9 p( P
以下是主框架代码:: R0 ^' k$ M+ w7 q
- ;======================================================================
! E6 X& j/ }9 N - ;文件头! l8 |" f9 d' H! C2 m# _4 U& v
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量3 c( d0 j" A* d, ^& W
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量; o' c% e) P$ w7 g4 ? j
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" I U- Q# i- c3 f - ;======================================================================
9 {& t/ V. u' X6 v) K - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
6 j5 Y& v, ?% d' A% r5 n* c0 T+ J - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
( B; ]$ [8 U, t. p( {' h - ;======================================================================3 C& i6 ?) |4 p3 k: ~7 g
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; N: U# ~" w' e( d! r - RESET_ADDR = $E000 ;主程序起始地址
5 W% l7 {. E L0 R' J$ N0 X - ;======================================================================/ R; M; N3 h. \7 D7 ^3 Z# E) d
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB' e; R }1 t8 T$ G! V6 V( n
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( ~; N. G3 I- e3 W/ G0 I
- .INESMAP 4 ;Mapper号 (0-4095)" m# I& k: p X3 _" X
- .INESSUBMAP 0 ;子Mapper号 (0-15) E) H, P# u4 |5 V8 s# f, X
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
+ q6 U3 |/ w% o# V' ^7 C6 W! M- c, I - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
) C+ A# F$ J; q7 H. j - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)1 v1 L; q5 G n8 U9 t9 @. v
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
! ^" u' k5 d2 D - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)5 H1 d6 Z6 Q, m3 E5 a: X
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)- e% w: q( f* S5 g' w9 u2 r
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)1 F. L& C9 A& U3 u% a3 k
- ;======================================================================1 a+ `+ q: H/ h+ {6 L& N$ m7 V _
- .INCLUDE "fc_demo_config.asm" ;全局配置$ u& X* @/ {+ o: i3 s) _
- .INCLUDE "fc_demo_constant.asm" ;NES常量# [4 J) [: }1 g0 l8 W- G
- ;======================================================================: d- g) c' k+ z( ^' Z1 k$ K$ l
- ;音乐配置, A( I. p$ s4 m* Z* Q# g
- .IF 0 = MUSIC_THEME
0 F# H' D: ]# B9 H" O - .INCLUDE "data/music/Gremlin 2/config.asm"' y" k/ P) b" \: f
- .ENDIF$ R. L7 D; u; P# Z D7 H
- % \" X; [0 Z) V4 R1 N" x6 ~+ X0 I
- .IF 1 = MUSIC_THEME
& Y. V5 m% Z. s) f- d6 h - .INCLUDE "data/music/Raf World/config.asm") M1 O2 i i6 P0 F3 L4 m- J2 l
- .ENDIF
) U: m* @) t; t% E -
/ z+ b3 k; e' M - .IF 2 = MUSIC_THEME $ Z7 V- o% f9 J& T9 f6 H
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
, a U1 v$ @- ?1 P6 } - .ENDIF) y) L( Q+ ~. T+ z) B4 I; L
; w% K3 `, b; }( ~: _/ i- ;======================================================================! i0 t! ?) _ ^* h
- ;引用CHR图像数据" L" q1 I8 R3 o8 R1 A% E9 K3 t# q
- .BANK NES_16KB_PRG_SIZE * 2
0 ]: U- h1 i5 h2 Q# f% s, e2 A. T - .ORG $0000
# n* {3 L6 B1 _/ B, s4 T% l! j& h) _ O' U - .INCBIN "data/bkg.chr"
' W( W) q; m, I2 l$ c/ y - .INCBIN "data/sp.chr"
; k( h& L( q4 a: R2 M! h -
: u+ W* [# s4 g1 M0 I, Q1 k - ;======================================================================2 M3 ^* a( Z3 O2 r L
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank3 p) B! D: v n; U0 k( l
- .ORG RESET_ADDR
0 I% H5 M9 g0 e7 X2 n( C - ;======================================================================
: e; M# |+ y& u' o$ j1 a: b. J+ j# X - ;引用其他源文件8 }' Z/ t2 D; o6 b& c
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
; R# }) F. p& | - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理) w% V! }* _9 ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理) U- L G' M- t7 T8 Y
- ;======================================================================
% G2 Z- x6 D* Z; [! Y# U5 R
& A8 S! n+ P8 E+ _; R; f- ;======================================================================2 B% n8 w3 W- L2 i- J/ B
- ;等待VBlank到来9 U+ I% Z7 O1 s( k
- Wait_For_VBlank# _& O$ @7 l( Z8 [. D4 U& K
- LDA PPU_STATUS
" V1 ?/ \, i; P - BPL Wait_For_VBlank
) }* j) J. v8 C- {$ z - RTS
3 b5 j# w4 G( p4 P - ( d4 m0 A# f Q+ r5 N
- ;======================================================================( f; b: a% i" M: v- C# \3 [
- ;调色板初始化
( L h d" P/ e0 `3 g - Palette_Init
) n, n+ x# ]9 f5 L - LDA #$3F
: {. k" p* _8 N' ~- S3 a& d4 [' N4 I - STA PPU_ADDRESS
0 T+ C- Q' u/ V- q' A5 E }2 X - LDA #$00" E# v& t# m1 z8 x3 Q
- STA PPU_ADDRESS, `$ R5 N4 A9 x
- LDX #$00, m5 y8 M% o. Z3 U
- LDY #$20
, Y/ h! S+ e \) G, N - .Write_Data
; q# j. `0 g& T9 l+ \% H( x3 n - LDA Palette_Data,X
! [9 i5 u; R; ?" q9 I D* t - STA FC_PPU_Pal_Addr,X
O+ V# }) Y4 [0 ~& g4 H - INX: V, j: G) t9 g1 Q( B' m# f0 e- x5 k
- DEY
5 m4 I C' _1 ~ - BNE .Write_Data9 Y) \: Q" I t3 O
- .End3 g% `9 x1 L7 A+ v
- RTS
- ~; C; v7 _8 m - ( A0 u, v( x% Q' o8 z/ O
- ;----------------------------------------
' \5 y9 z$ [! S* ^# H; z' b - ;调色板数据
! u# M; m/ G4 f4 E q* _ \1 V - Palette_Data" j3 H9 b- F4 m2 b" a) ^8 W
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B0 W! h Q1 Z n0 l& q: F
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22" ]6 `1 [. A% ~7 W
-
: a8 b0 M- h& L% X. l( W1 D - ;======================================================================. E/ t+ l0 }2 p$ Q+ J0 k8 w g
- ;命名表清空# w0 b. r0 M6 Z7 M
- Nametable_Clear
% K- R T5 T! c: I6 c - LDA #$20! h* L" o: y* C, _! x
- STA PPU_ADDRESS0 [! x) l" y0 E
- LDA #$00
; G0 d" ~% a( C" `* a' r - STA PPU_ADDRESS' d- ^; h5 k; l" s) A( f
- LDA #$00
, ~$ l/ R! ~! {+ ` - LDX #$00
) T/ y1 b' o. E! J' P: m - LDY #$084 C& r, g6 _5 C' G0 o- [
- .Write_Data
9 w+ {. O4 ]8 W P' W - STA PPU_DATA7 y& @6 j8 S" a& _" D
- INX
# X' m. k( u+ N( a- G - BNE .Write_Data
+ {3 r8 ?% E# ]- A; V/ ~7 B - DEY: b/ b" `3 [+ Z; U D/ O
- BNE .Write_Data7 ^! W* u# y/ L3 x- c% R
- .End3 n" X8 Q1 R. P8 d2 Y7 v
- RTS
" x' F" m" }5 r* E: S - & |; W. O. b9 I( i
- ;======================================================================
% }8 w( z; e& D q - ;音乐曲目切换
3 q5 H# P8 f- G( O' Z - Music_Select_Process
* }9 C. ~! ?' E3 c- O0 P - + D3 j8 |9 l/ I- I0 [/ A; { \
- .Pre_Music;上一曲: d' o, U& x! N3 Z' x( G8 s
- LDA FC_Gamepad_Once
" o6 w9 P0 k" {" R - CMP #JOY_KEY_LEFT; I$ H/ \" a! O% F
- BNE .Next_Music
7 ~& A; M0 r7 N3 ^+ u, j$ J - JSR Music_Play_Pre8 Z; \/ }4 e+ a4 [, J( R2 A7 J
- .Next_Music;下一曲* \ C7 o1 [. S- y
- LDA FC_Gamepad_Once s- @" ~- y/ q& U1 i$ y
- CMP #JOY_KEY_RIGHT4 V1 W3 W. y4 `
- BNE .Next_10_Music
7 Q2 E( k' M1 w) e$ C - JSR Music_Play_Next
1 D( o( ^) l3 T% Q3 {$ c - .Next_10_Music;上10曲( f' v" J. L7 a4 L1 |3 t; q0 ?0 ~
- LDA FC_Gamepad_Once
# }' u" ^4 b7 f - CMP #JOY_KEY_UP
' Y$ H' G6 E5 c. p5 F/ Y" \. y9 d - BNE .Pre_10_Music. `3 O7 |1 H \' _/ ?6 ^
- JSR Music_Play_Next_10+ v/ F6 U4 e) T/ } N3 ~6 q
- .Pre_10_Music;下10曲# s) a" H6 j; N& f) t
- LDA FC_Gamepad_Once: ~; u- a) o) U$ {* Z
- CMP #JOY_KEY_DOWN5 e- D- _3 I' M9 B" n' g
- BNE .Reset
( S: Y: o- \9 f" l$ @+ C& s7 ~ - JSR Music_Play_Pre_10
) i# @1 T% q. b, n8 u) j - .Reset;重播当前曲目
8 ^5 _3 V8 y( x& c' z" t - LDA FC_Gamepad_Once
X! k& |" ` H! |$ v - CMP #JOY_KEY_START
: Z: A- A! F/ ^( p - BNE .End
" x% `! U+ t1 {) O* j - LDA FC_Music_Index) K. ~. M$ X ]. {! Z
- JSR Music_Init_Process7 [/ V4 t. a4 ?
- .End6 v# H. D7 ~; s, s; y
- RTS
: m9 u/ U" r! z6 D
: F* q5 H6 B; w9 o1 K: C, `8 ?- ;----------------------------------------------------------------------# d, m$ d0 T; \" u9 m" ?
- ;播放上一曲
7 D" _" a8 i7 G$ z+ X$ B - Music_Play_Pre
3 Q2 m$ z- S/ |/ L - LDA FC_Music_Index/ w& b1 A2 g! Q1 l) X
- BEQ .End( |; k5 z, ~6 X6 v2 v
- DEC FC_Music_Index
5 W7 ~# G/ ^% `6 t5 b - LDA FC_Music_Index
5 }1 U- L; m [$ P& f - JSR Music_Init_Process
9 y6 ?4 n3 i* H3 Z; H; W' P# Z( j% k - .End
1 ]* Y1 b6 \2 t3 P2 i7 r4 _ - RTS
$ L/ r( b) Y' }" S3 n" j - ;----------------------------------------------------------------------
7 o; F9 V1 d: P - ;播放下一曲
& c1 R! R$ v4 m$ ]7 j - Music_Play_Next
) ^0 H2 D: @! T! b - LDA FC_Music_Index
: y4 ?- T' @0 B1 C% R e - CMP FC_Music_Max_Index
. x. c* t* T: {, q* e - BCS .End
0 F1 _& p& c: \ y! ? - INC FC_Music_Index
& w9 d1 U- a6 b- o& N8 C - LDA FC_Music_Index
6 s, Y& R2 L& e- e. w3 J - JSR Music_Init_Process
* s# D5 o+ [2 `: p9 g) s$ W- y - .End- m8 e5 t1 v6 ~4 M# F* ?* b
- RTS
. D1 K5 e% h' v2 D
9 G4 @7 D K2 C: F$ g* g1 x- ;----------------------------------------------------------------------/ G4 [; ?' H* Y: k! l
- ;播放上10曲
0 A2 Y7 k, C# F+ i( Y6 o - Music_Play_Pre_10. J& ?- V P: I7 l
- LDA FC_Music_Index
- {# G5 c8 K0 W5 M4 O( d - BEQ .End
3 ^% _' X6 L6 b/ \, E* ~ - SEC
+ J' j# _1 g2 X - SBC #10
( \8 L; R' W1 i - BCS .Pre_10* X) ] d9 ~, `; k
- LDA #$00# X0 S* G! b+ F' C& J
- .Pre_10) i' f- g: p2 e
- STA FC_Music_Index
7 A ?0 j' y8 n) n# d! z: \" g - JSR Music_Init_Process
# y$ W' B4 B+ P% ?* R7 X( W5 p - .End
+ g# r6 x4 l& U& q+ k" G - RTS% \0 \4 Z% v5 J9 `, j
- ;----------------------------------------------------------------------1 A2 T& q: P8 I) o4 _4 n( c
- ;播放下10曲
2 y! K7 `: n+ r# y2 @5 L9 L - Music_Play_Next_10
4 d5 r, F* ~" a/ M {- s - LDA FC_Music_Index) a+ t# A8 g4 @/ K& t2 y: c
- CMP FC_Music_Max_Index
+ K0 R0 t. x! T - BCS .End
( G k1 O- I* n ^# k- a J$ i - CLC
/ |5 B. D2 ^6 ~ v z/ ]* H - ADC #10
. ^8 T3 ^& B' \- ~" G - CMP FC_Music_Max_Index; a$ }; {! h5 q1 m7 J0 {; P
- BCC .Next_10$ o2 r' F0 I7 b1 o& z; K% ^# \
- LDA FC_Music_Max_Index
. h5 {* U& P) V k2 B" ` - .Next_10
1 _/ y8 I" d4 a4 ]1 { - STA FC_Music_Index) r/ W, t' m" X V# _- q
- JSR Music_Init_Process4 `; {9 w3 w4 P% q% W+ ^
- .End
+ M% l- d+ x N% \: p0 q - RTS1 m$ V/ j1 p% S: X; W
- 3 S' e" U; l* j, U5 w) l
- ;----------------------------------------------------------------------: O. Y# d% w. k# p) a, J" ^
- ;8位十六进制转3位十进制制
s v' O5 C8 |/ F - Hex8ToDec
# x; E- W0 u+ @8 Q4 Q - STA FC_Dec_Data_14 ^% b" g# V, B) n
- LDA #$00" Z, v# _/ e0 C }3 q- f, x
- STA FC_Dec_Data_100* o% }9 u. f, R7 }" f
- STA FC_Dec_Data_10
1 {# ^. x$ H3 M- w+ l" r+ a+ N: u - LDA FC_Dec_Data_1
- B, O' I; l6 x ^% [7 E - .Convert_100
j0 p o! c7 _8 {( Q4 n - CMP #100
% h2 J% h/ r2 i% S$ Y0 {) G! h - BCC .Convert_108 w: h6 o* v4 J0 d7 H1 E( j$ \2 p$ g
- SEC6 Y9 i) q9 b: q+ ` ]# r
- SBC #100
( S L ?$ y( B& a/ R( O - INC FC_Dec_Data_1000 S( m0 i1 Z: r$ L8 d
- BNE .Convert_100
% p/ h& ~& r+ L) y - .Convert_10% |/ B7 g3 R" c+ u
- CMP #10
" H* _2 F4 ~6 y) M# m - BCC .End
- a1 W, _, ~2 O9 H3 j - SEC$ x- `0 d5 Y! S1 f. v- i
- SBC #105 F1 j+ ~3 Z, w( |/ z. A7 \
- INC FC_Dec_Data_10
" q# |& b' }, o# I! o d - BNE .Convert_10
/ c5 M/ y5 A4 V# v5 R - .End
; `1 k3 Z7 n) U( d3 K; ~4 M - STA FC_Dec_Data_1
$ V$ [* U, A) c - RTS( q7 K$ S! y% }" |4 L! i6 F
# s5 z0 \& H, H* R) A3 s, }- ;----------------------------------------------------------------------6 E% ~. @; C. d; O6 S5 J/ J
- ;显示曲目信息; Q6 u5 T& ~0 h# s
- Music_Info_Display
' I( d( D1 m# Q2 I1 u5 P- L' x - LDX FC_PPU_Buf_Count
& w) K2 K# z4 _" d' j( C! [% _ - LDA #PPU_WRITE_MODE_CNT_LINE
v5 ~+ V; {$ W% k - STA Use_PPU_Buffer,X
# j9 ~! d$ A3 r - INX5 n( a% r. ?5 ^1 q% L* p
-
/ Q. c. F: X+ E F - LDA #>MUSIC_INFO_POS
, b0 H4 t: Y$ q: s - STA Use_PPU_Buffer,X7 P, {7 i6 k D3 f$ x9 V
- INX
4 e( L- `; b/ V0 h -
% X! j( a! A' s: ? - ;居中$ @4 d% Z- ^' X5 \3 j1 I
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 e! e) y6 o0 Z) s
- STA Use_PPU_Buffer,X
+ q- h$ u& }+ d% Q; K( h' f4 F: ? - INX, Y2 i+ C3 U( I$ q* J$ p
-
$ B6 g8 e: [9 | - LDA #$05
! \1 [. P. _5 u( E6 W( W - STA Use_PPU_Buffer,X! [, ]) E/ ?$ x
- INX
# O; E9 U9 n8 }0 u! `9 k - 4 E4 C: s; z" z) l0 `
- LDA FC_Music_Index; q, B- a. `* z% B, q
- CLC
& w: K! J6 g# S" E - ADC #$01* R' G+ P& s" Q1 |+ a0 K
- JSR Hex8ToDec
p0 p9 G7 p6 Y3 D$ a) g9 j$ b" h: z -
. }; y) l6 k1 }5 X: D - LDA FC_Dec_Data_10* J4 G, [/ G6 p* ~' U4 A+ y
- CLC
* w L) ^2 p, P1 y$ W - ADC #'0'
! y0 }7 X' x6 g) [2 W/ | - STA Use_PPU_Buffer,X) W0 O% A0 X9 o8 Q
- INX9 N+ Y( e2 Z7 Y5 L
-
2 u3 n7 @ W. ^/ S8 o8 N! | - LDA FC_Dec_Data_1
$ ^! l5 O: r" } m - CLC$ f) Z! N1 \0 e( V
- ADC #'0'4 ?, m6 {1 S% m$ |$ _" H
- STA Use_PPU_Buffer,X
; w' D1 c) f2 j$ |' @5 f$ g - INX
" i0 b4 q. Z8 _$ _ -
& u8 D4 C* U# n8 } v$ a) C - LDA #'/'
- u- F# f3 P8 P( Z8 B: H - STA Use_PPU_Buffer,X
- [, y' B5 ` p4 C - INX
! R9 }! H' Q. d - 2 J/ k+ j4 t/ e N# [/ J' s4 N1 d9 O
- LDA FC_Music_Max_Index
3 b4 c) P: m+ p - CLC
! O |$ I! ~0 r4 y$ [' n4 u - ADC #$01$ w2 I* x/ P& B. T1 s
- JSR Hex8ToDec
; a6 ^3 J( ^/ c' ]6 R% J - & A* |: {( q2 G5 [: B0 O
- LDA FC_Dec_Data_10
' L" {* p' V& e) X4 j7 I4 t5 U - CLC: s# Q+ e0 C, d) J1 T/ g
- ADC #'0'0 c1 e* A! Q9 h, M s
- STA Use_PPU_Buffer,X
8 j& _& C8 N, ~0 P& y( e; e - INX
/ c( y4 z& a* A -
5 s' ?# S- {* `5 Q& e2 [ - LDA FC_Dec_Data_15 m" B$ s' v2 f5 q4 g: M. j" R9 e5 p
- CLC4 R1 S( S3 T+ ]% [, H' r3 Q
- ADC #'0'
* t1 m- o: _: X( }3 ?. _ - STA Use_PPU_Buffer,X
' ~& e3 i( `/ ?: y( U - INX& k! H6 K; A0 O* a7 V8 Y
-
, p1 ^+ o' I1 [# F - .End) e0 E! ?! L; W( r/ q$ d
- STX FC_PPU_Buf_Count3 ?! r- a+ V6 m6 [
- RTS
: |; Z* j8 G$ j$ o - , _0 g& E4 q! A$ g
- ;----------------------------------------------------------------------
6 \$ l! G. R) P0 G - ;音乐曲目初始化处理, D6 l; I8 B; P' |+ R
- Music_Init_Process
3 b( s+ I I" O" a4 v, k - PHA( c' P/ A# ^9 n! E X
- JSR Music_Clear_Process1 }4 k1 Z. O3 z4 x& U2 h
- LDA #$1F, O% B. C ^0 x" }
- STA $4015
1 M1 G2 k( O1 _+ _7 u& Y7 c, i - PLA$ j6 `) }# w. R* l, x! I& m9 Z
- JSR Music_Init_Addr
$ m' s% _1 ~- | - JSR Music_Info_Display8 `6 s* @% O* [3 Q) b- Y9 ^
- RTS
* O% T) P* V$ K, } - 7 l0 F: }* j: D& l0 R/ P& O
- ;----------------------------------------------------------------------* `2 x. g' z+ n2 H
- ;音乐播放处理' ?4 {/ |" @. y# \, V
- Music_Play_Process
$ u- o0 b1 B: @# B0 S' l - JSR Music_Play_Addr
5 \6 K# W$ w: ?' x5 V - RTS8 l' D) t7 o2 E1 z7 y9 p/ T2 C
) N2 s- W* m, o3 C- ;----------------------------------------------------------------------3 m0 i. U; F4 p7 o% R$ R% R
- ;音乐播放处理! P2 K# q" \7 h3 ] ~/ s7 k% J
- Music_Clear_Process$ t# c2 {) Q- Q* ]) v8 u" |% }
- .IF Music_Clear_Addr
9 a, o/ M+ [3 f - JSR Music_Clear_Addr/ X7 C( d* A" J1 Q9 ]$ U
- RTS, q5 l3 l# K- `8 K2 P" {
- .ELSE& }2 ^' _' [ ]- g6 P
- LDA #$1F
0 N& J3 d: c" u5 i% j. V - STA $40156 p! R2 j/ G* w, |( v, F, |1 Z
- LDA #$00
# k& a) \( U/ s% C" P1 g% q - STA $4010
3 L+ G: P/ }- M( W1 V: }, d& ]/ e - LDX #$00
* A0 b6 `( ^4 U0 M" I- l - LDA #$00+ [! R% Q/ S( \5 x" H
- W7 u6 ?4 w- G6 t
- .Music_Clear_Zreo_Page_05 t( G0 ^) ^ f0 M
- STA $00,X
9 s% B* o. D4 u$ e% L" l6 a$ v - INX
! W/ {8 F3 O `: G4 p: e - CPX #Use_Zero_Page_Begin
- r5 o3 M$ w, Y( }( Z2 t - BCC .Music_Clear_Zreo_Page_0
1 O R" {; |9 p7 `1 T* Z$ y - 8 |/ a5 x% C# S V& e
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
1 o- V7 M! I7 M+ K( R" c0 A - .Music_Clear_Zreo_Page_1
* [9 J- @, f* x v- x - STA $00,X' @6 J3 I+ N" t# Y
- INX
b/ i* v2 `6 x) k. J& \* G/ F - BNE .Music_Clear_Zreo_Page_1
5 Z t7 A( E8 O. }- P4 ^ L% t -
# u7 K$ M. Q# z- d8 }! J - Music_Clear_Process_1
# A/ d3 ?: Z D( j4 O: M - STA $0600,X. H7 v7 ~! }" p5 F
- STA $0700,X) p# V" _8 V. u. O
- INX
4 l' D$ a' \/ o7 @" j/ M5 [ - BNE Music_Clear_Process_1
! A$ }# E8 `8 ] - LDA #$10 f+ |/ L5 W, N0 V- t8 N3 h, t
- STA $4000. |& l( ~: w% J+ O
- STA $40049 Y" x h( u, c2 ]4 K* G
- STA $400C
% m+ l2 B' D( V - LDA #$00; B2 U. |' L/ b+ B. m% v; u1 w
- STA $4008
& W6 d0 x. F; O8 l+ s3 D; I# } - LDA #$0F
Z) V/ e$ b* g& i3 ^/ L - STA $40153 o: i& `8 u! m8 m( u
- .ENDIF9 ~# L- B( _0 K) D( S! ]0 d
-
( U% i8 m$ _. P& N/ Y$ W: e3 }7 v - RTS4 o0 F* y/ y) d$ V7 c
- . Q% B5 p! ~' Y6 {; o' b; M
- ;======================================================================& f+ y6 a( {( t
- ;重启处理
! S# M# V1 m3 b, _: H' Y; p - Reset_Program% i& e0 X0 _3 e' h0 |7 }5 J
- SEI
. y9 z: q& |* g' T - CLD4 q" e4 Z7 I+ J
- LDA #$00
4 K$ v5 E9 o! q* a: K" o - STA PPU_CTRL! U3 p0 e" t- i; f! X
- STA PPU_MASK/ f8 `6 r7 l2 \$ A% \& X
- STA JOY2_FRAME+ m( L3 t) X, y
- STA APU_STATUS4 o: Q% E2 G1 j1 f8 M( f K
- + K1 L% f) Y2 d. Z# U" w; l
- ;等待屏幕准备完毕7 y0 U6 O# b$ B; C% e
- LDX #$02# |, B! y9 o) G& H9 ~9 }2 h
- .Wait_For_Screen_Ready5 {/ R+ s2 ?: E* A9 m$ d/ J" i
- LDA PPU_STATUS
) ^( \, l# b" a" ]" @ - BPL .Wait_For_Screen_Ready: B. o$ R: n9 z+ P* w. H1 ^
- DEX3 G- q6 Z% X, A7 q; t6 k7 ^4 z
- BNE .Wait_For_Screen_Ready D( ?( B* g. a7 h( J
- ) _8 j8 ~2 F) E9 d5 W1 z2 O
- ;清空调色板# [9 k- l2 [9 B3 `& X! U- Y
- Palette_Clear; U, {3 z' k: ^3 K8 S( ?6 ~ i5 _7 l
- LDA #$3F
# H$ S$ N* i3 [. B) G$ K i - STA PPU_ADDRESS3 P, P H; `, E4 q! k& {
- LDA #$00: }/ y# A' r" R2 w( u
- STA PPU_ADDRESS
& N) A. k0 h' i7 i2 I& k - LDX #$20
$ T( i3 n+ G3 B s+ z4 p. C# H - LDA #$0F- P. e( f5 `2 Q0 C' w
- .Write_Data
7 w& M0 V1 V2 [( d* r+ v1 { - STA PPU_DATA
+ r& h: J( ~- ?5 [) _ - DEX" b: y. D/ |" _" e* Q2 A; u
- BNE .Write_Data
7 u2 S8 b& T3 X3 W4 L+ T8 E - % s6 B/ ]/ S- @8 m; _0 p
- ;清除声音 $4000-4013) z& M' ^5 E! B. Y
- LDY #$14
( i) l8 S# b1 V! T { - LDX #$00, c! B7 B8 R2 M
- .Sound_Clear( J7 `. a. v$ e+ t9 O3 c
- STA $4000,X, G' j3 T: W: h
- INX
0 ?; I$ ^; Z( Y0 y1 I4 r# y. [ - DEY# t/ J& W: n9 G* t6 x
- BNE .Sound_Clear
7 T3 W d: C' B+ T$ s; Z' Q - 0 g( [! g) N4 V: I2 W
- ;清除 RAM $0000-07FF6 y+ j* u( k Q, Q% S* z
- LDA #$00
3 i7 C8 Y: P5 O: ~' g7 p - STA $00
; u* q7 b" x) X0 O" Z( r - STA $01
* ~' R" O* `* T! q" I7 r - TAY
5 m0 d! m/ J7 h. H3 x - LDX #$08
; w( y! W! Q) I- C - .Memory_Clear' r) x+ ?- n# Y/ ~! n) e
- STA [$00],Y
' v+ H$ l2 U9 h7 H9 O9 o - INY
/ U# l4 G. y! E% [$ A' c - BNE .Memory_Clear( l# H0 L3 f2 c- U" s4 Y
- INC $01
/ l" n3 b* H0 H1 D) m - DEX
) j/ P" P4 }9 G0 K - BNE .Memory_Clear+ [0 T7 z, z# c$ q9 Y
- - P8 S8 ?; J$ g
- ;精灵缓冲初始化9 d! N3 h9 f" N" p+ s* j, a
- LDX #$008 {+ M6 a w, O6 G) e
- LDA #$F8
2 p! _* h2 e" L- U. i) K7 t - .OAM_Clear* b8 z# v6 M! I& }; _8 c
- STA OAM_DMA_Buffer,X
0 I( ^0 A; f- t/ w& v. Z4 A* E - INX
- O( L* d e, B; Z) P. }5 O - BNE .OAM_Clear
3 N3 N9 {, R( j+ M8 a! t -
4 r- D t1 ^7 N* v2 j# \& ?" i' _ - ;栈指针初始化# l" E4 `) F8 G2 A
- LDX #$FF
5 [- m2 Y! Y+ p2 m1 E! V+ A - TXS
; x( d" z1 y ~0 Z+ E9 ~5 r - ' \2 Q. [4 L) @$ [' j0 r8 H8 z1 f
- JSR Nametable_Clear;命名表清空8 U3 ~: j# F, g8 V- g
- JSR Palette_Init;初始化调色板缓冲
3 A1 }4 S* v, _0 P - JSR Static_Text_Init;初始化静态文本
! a7 x* g2 e5 [; F m -
1 c, b$ U/ h+ v6 V/ t; P& n) { - LDA #MUSIC_ITEM_TOTAL - 12 S6 b5 P# p/ ?8 @$ t
- STA FC_Music_Max_Index
6 |9 x7 Z# a9 U( N$ V8 U -
" x7 s1 q8 f1 F. N- X7 @% I9 b - LDA #$1F4 C" P9 j- l$ {& f1 h) P. }
- STA APU_STATUS
3 t& I+ p P& |* B - LDA #MUSIC_BGM - 1
" {! E* u% p* V% g. T* Y) ^ - STA FC_Music_Index
6 i$ C- t) e6 c. H - JSR Music_Init_Process;音乐播放
& W7 F. T {6 i/ g9 S8 P0 w+ V - 3 J& m% A; y- O4 U3 G% E! I
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
* ]* b* `+ f x" w0 O - LDA #$1E
. d- I: T1 ~: n0 ?; b+ m - STA FC_PPU_Mask_Buf6 e- X( o: g% x: ^7 s
- : m$ a" n3 p* u3 B; T1 q
- ;启用NMI处理
+ |. }. N, _ ~3 J# Z4 r* o: I - LDA #$80
7 r! ]+ S2 m9 w' B- x1 Q# t, ^ - STA PPU_CTRL2 L' l6 G6 H% I" C6 N
- 9 H. P# ]5 ~; B- p( O6 g+ O2 [
- ;程序循环, 剩余工作交给 NMI 中断处理- C% U2 R! k5 M* Y: L$ {/ O2 d8 I! o
- .Loop: [1 L4 x5 l& W& t1 W% H
- JMP .Loop$ H8 x) z8 E3 {
5 M% R! w/ X, Y; o3 }+ _1 a- ;======================================================================
6 M) R2 f) X4 \1 Y/ t - ;不可屏蔽中断处理3 q' g3 i; T2 V+ C
- Nmi_Program
8 i/ h$ \9 _/ v" c. K, w - PHA
! P1 G6 D Q0 F8 D/ b8 i+ v - TXA1 z+ v% t/ A2 V& o; e
- PHA
1 x- Z: C$ n+ q+ S$ i - TYA5 w8 i6 i* @: q0 x
- PHA6 ]( D7 j* u. V4 n' [* {
-
+ ^5 ^+ e4 S9 Z8 ~ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位+ V9 }% u; o. h4 A
-
( W+ N3 |4 O/ ^8 s' ~ - JSR FC_PPU_Procrss;PPU处理
/ ~1 e# L) b0 ]4 p; ` -
! J* _* v& w( d) c j f. @ - ;精灵内存更新
" Z. S- Y- [& j( O7 j - LDA #$00
9 e- `5 F. a. e' A: W" s- V/ f! l - STA PPU_OAM_ADDR
7 }1 a/ C5 s8 M( ] B5 N! J - LDA #OAM_DMA_Buffer / $0100( F& M/ o6 I9 j2 M
- STA OAM_DMA
6 j+ R) v' K8 u# K -
4 S: }6 Y% d- f4 S. ^3 L, @ - JSR FC_Gamepad_Process;手柄输入处理
! ` B: o8 X% [7 i- x! s, E - JSR Music_Select_Process;音乐选曲处理/ S9 ~) {9 _4 q! |# r7 R0 i
- JSR Music_Play_Process;音乐播放处理( J& ]2 ^0 p" O5 n
- ( }9 O0 X) y. s2 F; N$ B
- PLA+ V, t% C' b, D- B% l$ {; i
- TAY
2 m* @7 Y9 I* K3 s L4 ~+ K - PLA- k# N1 ~2 }9 r, W9 k! {
- TAX
1 F2 y! a: g3 a3 T# Y - PLA" s" _& q0 X4 \( n( S8 q
& f4 l. F: d8 `& M1 ~- RTI% P4 k4 [7 }: t# N! h
4 A# m% B+ V* Z7 \ @0 [- ;======================================================================1 S1 w/ V/ X2 a( x
- ;请求中断处理
* ?7 C0 M a/ b9 y2 j& h- B, ` - Irq_Program0 C5 e0 f' U6 b, X% y' l3 m
- RTI
4 q1 m+ z) g7 y& e/ n
, u( A6 K a$ ?1 S- ;======================================================================* x# M1 N' p: \- G9 Q' O H
- ;中断向量表3 L: S" r( z- J# h: ]7 }
- .ORG $FFFA! L: u O% H4 E2 p% E- @/ x/ |) {
- .DW Nmi_Program ;NMI触发时执行
3 {& `7 Z6 L9 F - .DW Reset_Program ;载入ROM时最先执行
8 ?: x4 x6 {4 n( ~ - .DW Irq_Program ;IRQ触发时执行
% ]2 ]3 o- m( R7 J6 ^
复制代码 ! ~9 o, D8 ~% K8 W7 |* H4 V6 F* M- G
! L+ e2 T4 _! b
5 u. b/ R. w2 ^5 a, O t
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|