|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下/ A9 p6 Q2 ~9 Y$ }) C7 W
3 }) O: w$ A8 @
以下是主框架代码:
1 b& w* j) Q: X- ;======================================================================
; k: S1 c( g5 S# h" ~' q. t* [$ t - ;文件头3 t. i. H! @! `) r- U
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量+ @6 G+ }) [5 g0 }. L: m
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量) v7 s4 S3 P6 q+ q+ h
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
8 l( v& w( U( W% n" I- |- v - ;======================================================================
6 l% {& G7 g* C: O - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* K' W U; G! p0 \2 f7 R
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
6 F8 E( w( W1 z2 ~ - ;======================================================================
* \- ^9 Y F; Y8 b - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1) w/ ~1 m. }5 A4 L$ Q
- RESET_ADDR = $E000 ;主程序起始地址) n# o! K) j: H* r; i5 _' Z
- ;======================================================================
9 i0 S) X0 U& A- i& [# f - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
) [ E/ Y4 r0 ?$ t - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB5 m$ V/ |7 G9 a- k1 W0 [. ?
- .INESMAP 4 ;Mapper号 (0-4095)
F( P7 V8 W, P - .INESSUBMAP 0 ;子Mapper号 (0-15): f2 Y; m; m& k- Q) K! [) X
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)0 D2 n9 p- f9 d4 v2 U( ^
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在) j& Z: n" ~( H! v- x
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
7 u+ r- ` o$ ^' x. \5 W, s - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) i2 |' o, u( M, ~- |. Z
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' l9 w8 S# H# B. J. v
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
3 R' E7 N0 r) N! k8 k. d+ D1 y' u - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)3 y6 x4 K! g+ T4 L) \+ h+ T
- ;======================================================================; Y% ~: S* Z0 X/ A9 e0 o! D
- .INCLUDE "fc_demo_config.asm" ;全局配置
) l: X% M5 ?, D/ d) S - .INCLUDE "fc_demo_constant.asm" ;NES常量
& y1 w4 R- Z0 B% w5 G% H* t, u t3 V - ;======================================================================) `. s0 @2 k7 e: h+ O2 R: `
- ;音乐配置0 }' ~7 M2 E: B9 z" b
- .IF 0 = MUSIC_THEME + r1 L! B5 }6 m8 p# Z$ A9 y
- .INCLUDE "data/music/Gremlin 2/config.asm"2 I; f; S- I4 u8 Z& {) \" i' M
- .ENDIF
* r7 `0 T# y3 `: [! x. p - 8 o2 {% A) }9 V6 `# Z9 r/ j
- .IF 1 = MUSIC_THEME. z6 c7 m2 m. q7 V
- .INCLUDE "data/music/Raf World/config.asm"
6 E3 Q9 n% {6 R9 r' O - .ENDIF
8 s5 U: B: T1 `9 Q - 6 e9 d# ?/ e# W7 w2 C2 g
- .IF 2 = MUSIC_THEME
" h0 p v4 \2 i9 H& Y+ I1 u - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
1 d: V9 U2 X! s; q" Z - .ENDIF8 {& Z; I" o# ]9 I( J7 E0 ^
- 5 z+ b7 q4 c& o
- ;======================================================================
* u6 P9 @! O, Q$ W - ;引用CHR图像数据' J q9 k L6 l2 ?# q# Q. C" Z2 N; @0 B
- .BANK NES_16KB_PRG_SIZE * 2+ q* T v5 S1 l A' \) A- H# X, c- P
- .ORG $0000
* W3 M3 V0 s9 {" `( K Y/ X - .INCBIN "data/bkg.chr"
! l1 z3 E" O& ?& e, B - .INCBIN "data/sp.chr"! L" A2 V' m A V" U- V/ l8 P
- ) v4 _0 F. e( H W( M
- ;======================================================================3 g6 N% `3 z) T9 R" z( t
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank8 g1 [: k% M6 r6 r* t
- .ORG RESET_ADDR: v; n9 [0 _( M" j' z3 l
- ;======================================================================& f5 ]2 F3 g I' t/ ^+ w+ }% _4 Q
- ;引用其他源文件
" Z y0 c* ]7 m2 s" m9 q0 N, @- } - .INCLUDE "fc_demo_ppu.asm" ;PPU处理- z( ^' L1 C% K
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理/ ]" L1 D4 _8 s1 L
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
& B' y& F0 j" ` - ;======================================================================
. s) u% E1 X1 {- _# |; g6 O# k" c
2 ^6 x! W( _' d- U; s5 {- ;======================================================================
7 ~( ], _# q% E: B* ?$ o* m - ;等待VBlank到来
3 t% q/ X# `6 o _ - Wait_For_VBlank
; p! b' Y$ u2 N* q2 w/ B! w1 B - LDA PPU_STATUS. X( S8 g7 h/ L; J5 n! q* b
- BPL Wait_For_VBlank
0 e( q+ y! l7 n7 J9 v% T5 H, O - RTS# X% m K; D( f, n& Z" V
$ m' W9 m+ y9 F5 [4 d' r- ;======================================================================/ w# e9 D7 x2 a5 x
- ;调色板初始化' ^6 ~. w) p6 g- t$ q3 s' I
- Palette_Init
% {6 k# P# r+ u - LDA #$3F6 F% {* K7 m" S3 ^. }& v( X2 F
- STA PPU_ADDRESS
% j; T' j+ p3 N - LDA #$00 n; p3 E( V, ^2 s8 u% U
- STA PPU_ADDRESS: I' C4 z& B! ]! d0 [
- LDX #$00
, Q% @) q6 X- z# Q9 ~. v/ u* Y$ @ - LDY #$20
) J6 k# f8 ?, w2 ?+ D7 B ?1 N - .Write_Data7 `8 T2 q4 n: G: ^# ?8 j5 z
- LDA Palette_Data,X
2 q6 j) d* F: [4 ?4 O8 e2 l - STA FC_PPU_Pal_Addr,X
& M# d# m) a8 E! q7 m) s, C - INX3 M$ J- P0 A( N) Z- _3 i( I" U
- DEY
& M# Q9 E. E; O$ f# n - BNE .Write_Data
) R8 l* N* a ]# ^ - .End* I' S2 ] Q7 s; g) }$ j. \
- RTS
" l6 b9 A3 I7 c - . w) ^9 E& K" N( p
- ;----------------------------------------
+ J6 v* ?/ a' J( {1 U - ;调色板数据
9 j/ l; P7 T% {5 J9 o- D - Palette_Data
1 x8 P: N- x7 j; L- B- U - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B+ T# u/ G4 Q3 ^; n7 s1 r' R8 \/ H
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
! r7 ^9 ] s, T3 j/ A, x F) f -
9 a N& J' g& V- n5 D$ V# s - ;======================================================================
) c. ~$ i: s5 R F - ;命名表清空3 {# z: K" K6 k9 V' t' A* X# v0 J
- Nametable_Clear
4 J$ l9 Q% {: \5 C$ i - LDA #$20; c) d# A' c8 g% G9 T7 h# z+ y
- STA PPU_ADDRESS
- f9 k) K- E0 y2 ^ - LDA #$00
/ d( {% B, \6 z9 f# E5 G) Q# ?/ f - STA PPU_ADDRESS+ ?+ q& G) T7 ?+ q- b) z; ]
- LDA #$00. b$ ]* k+ E2 m" `
- LDX #$004 F( e. @+ k+ C4 u& s. _$ ^
- LDY #$087 G' c9 \0 F7 ~2 a0 }# y" b
- .Write_Data
! {, b1 ^* t" J, u - STA PPU_DATA3 ^0 B$ K& s0 {2 }; V" B
- INX
5 k( g1 M2 @8 ^1 o4 s( P/ S - BNE .Write_Data
+ w4 w* s |3 v% O6 i5 |* j - DEY
' O2 ]5 s \$ l+ m5 m, E4 J5 ` - BNE .Write_Data2 k/ N/ g: b$ b- ?% B* }
- .End
/ E1 ~. Z5 c& p) u* X5 v6 p0 O - RTS/ o1 W, h) b, e6 [+ g8 h# _
- ) S7 F" o i5 ^3 h2 C
- ;======================================================================# Z7 G3 h7 v- Z$ P0 U, x9 T" B4 v
- ;音乐曲目切换3 T9 E- s) k0 _
- Music_Select_Process
/ [8 W$ z3 [" K9 |
' M/ c" s; V# \1 v7 `+ h- .Pre_Music;上一曲6 ~1 E8 T; {4 j5 k
- LDA FC_Gamepad_Once
7 W7 ?- f6 I$ S. W# h - CMP #JOY_KEY_LEFT
. h% T/ p) g/ [/ D1 A; r \ - BNE .Next_Music7 H; E/ ?! M$ p, [# P1 R
- JSR Music_Play_Pre- o2 V. M) f! a* H3 S! u
- .Next_Music;下一曲
, J) Y5 v& C5 i& H6 V) A' D - LDA FC_Gamepad_Once
A# j" y' s5 |% t3 ~+ a6 W# h - CMP #JOY_KEY_RIGHT2 \' v H5 y* r/ ~) |- n3 [
- BNE .Next_10_Music. U* j& Q$ ]+ d; m
- JSR Music_Play_Next
$ c7 p O; W7 l! k% O. W - .Next_10_Music;上10曲6 h: ^: {& ^* p$ w! I
- LDA FC_Gamepad_Once
/ G1 ]: k( Q/ k. c3 m - CMP #JOY_KEY_UP! i4 Y1 X4 l% l! V
- BNE .Pre_10_Music
& h! c) T) M" C9 T; G5 K$ d T - JSR Music_Play_Next_10
( J5 t* X) f+ O, S7 X - .Pre_10_Music;下10曲5 X9 N U6 w1 g p: c* v! F
- LDA FC_Gamepad_Once
+ x1 \& K) |2 d5 f - CMP #JOY_KEY_DOWN
& S" S: X& |( J. x1 Y. B+ \. \9 s9 O - BNE .Reset5 j6 h7 P! }) l
- JSR Music_Play_Pre_10
# w0 u0 t ]" `6 ?, p+ Q: _ - .Reset;重播当前曲目& p3 T6 |5 D5 ^- L8 I4 {( A$ w
- LDA FC_Gamepad_Once
3 M! M) z3 n+ f6 _ - CMP #JOY_KEY_START1 `( v2 H& B4 {8 y( H, E
- BNE .End- T" G j- x. ]+ ^0 t/ g$ z% I
- LDA FC_Music_Index% Z: J5 |1 i0 H) s/ N. k; S
- JSR Music_Init_Process' D; K2 k; N9 A
- .End+ H9 B7 }" a5 d
- RTS& Q: H2 `9 d+ J2 i1 Y
- * T: l( d- |8 T0 t
- ;----------------------------------------------------------------------
$ x+ P% g) o! n' E$ h - ;播放上一曲
4 X) S+ B: s/ s7 ~6 P0 [ - Music_Play_Pre
4 l+ c: w$ e3 P* p0 J - LDA FC_Music_Index
% C% n, Y6 j7 l8 v$ W1 e2 n - BEQ .End! L9 F6 w2 s( N
- DEC FC_Music_Index! E! }1 w# Z4 A$ D/ ]$ E
- LDA FC_Music_Index7 c8 M& @/ P2 }+ N7 W0 y$ d
- JSR Music_Init_Process
# X4 Y3 V* }' J+ R0 l2 S7 b - .End
) l) y9 |. e2 k1 z1 n- \9 d - RTS
2 c, ?& l+ m& ^0 Z0 ] - ;----------------------------------------------------------------------# }( _* d6 K% d$ o
- ;播放下一曲
+ E; Y" `5 j3 d - Music_Play_Next: @- T8 R9 y# V* \$ V
- LDA FC_Music_Index
5 ?( w1 L8 r- n' r3 P - CMP FC_Music_Max_Index
# [+ q: s, w/ V* G z - BCS .End5 Z' i: ^8 A4 T. T' j
- INC FC_Music_Index: z8 v3 @$ t3 _+ u
- LDA FC_Music_Index# M( L3 r& S7 u2 E' f8 b
- JSR Music_Init_Process
X# Z: [6 X6 t) K4 R5 e5 F - .End, s% \* K* T' `9 ?% I! E- P
- RTS
& z2 f3 n# I2 I
/ K/ [* w1 W) Q- ;----------------------------------------------------------------------
# E" b. g' i' _4 S3 X5 G - ;播放上10曲
. l: {' s& g& A; v, H1 E. a - Music_Play_Pre_107 G* m( @8 R3 {2 g, d! c! a( s" j
- LDA FC_Music_Index G9 C8 |+ L* C
- BEQ .End
5 {! A0 I/ U1 R - SEC
. f' B: i' W/ G9 t; t5 b+ G - SBC #10
. H. }2 Z5 G3 N8 s - BCS .Pre_10* G$ t7 m8 E. U7 n6 D
- LDA #$000 C4 e% F7 q$ Z( h
- .Pre_10
5 `; {7 J* ~+ y$ ]( l - STA FC_Music_Index
9 \. Y& z( A) D C# ?+ K0 s% | - JSR Music_Init_Process
) U2 e, |5 f# O7 P0 j# q - .End
! S/ d; {/ l1 L/ D, l8 X+ Q1 b - RTS8 q4 `, ^4 Q! y* U/ ?9 I1 O8 F+ u
- ;----------------------------------------------------------------------
& }3 J! M# R8 n u - ;播放下10曲
: v$ e3 J% T- ]9 ?: e! N4 d - Music_Play_Next_10% u9 I9 W) e' Q! ]- _. u
- LDA FC_Music_Index1 E' ]6 ?! F; g$ r: s+ i
- CMP FC_Music_Max_Index9 X+ d& j2 B: k+ u9 c# {, D
- BCS .End9 h' E* M$ U1 w$ I8 `" ?$ k; ?
- CLC( y" C' z0 S: ~5 W2 j5 s
- ADC #10
8 P. b: E+ B% X2 E - CMP FC_Music_Max_Index1 z( w0 u3 K6 v* E7 o0 Y: [
- BCC .Next_10! Y( q6 H+ z( V( {- G" E; T- L
- LDA FC_Music_Max_Index
! C3 b: n# ]+ v, s - .Next_10$ k8 i& j' v9 P8 f
- STA FC_Music_Index; e6 q: G3 r, `: ~
- JSR Music_Init_Process z: w5 \6 D. f T' A
- .End
% j2 p* ~/ x; r- Q8 A4 T - RTS/ o5 E2 r, X/ K( V( R! d$ A
: R0 @/ R. _( \; v1 w1 _1 b' L% w- ;----------------------------------------------------------------------
+ g" i `0 m# \# B7 d - ;8位十六进制转3位十进制制
3 y! d( P8 ?% K6 s - Hex8ToDec( g. U: ^# p3 @/ V) H
- STA FC_Dec_Data_16 K* u h8 ]+ |, h6 F8 K* M
- LDA #$00, o4 b/ H- `2 e# o7 i8 ~
- STA FC_Dec_Data_1007 y9 g! {. L9 i; r% L, A
- STA FC_Dec_Data_10) {1 u6 Z* V, y4 ?- G# i
- LDA FC_Dec_Data_1
4 B0 r: ^& Y- B$ V7 u- n5 Z - .Convert_100# @* L1 K' d( g7 ?+ F
- CMP #100
& J' }: f- l d8 l, ~) P - BCC .Convert_10) P4 `. ~/ y& H. K- U% X! U: K
- SEC
1 c% t% E k% @' r: U$ C. _ - SBC #100' N/ n/ u+ V8 j% a W
- INC FC_Dec_Data_1000 ^, a# C* M- J1 T* m3 h
- BNE .Convert_100% d& Z* O' a+ m& `
- .Convert_10
) { [; c0 D! n$ q2 M: H/ p3 X - CMP #103 ^, n4 C! u0 P$ t" {2 Z
- BCC .End$ G v h0 `1 x$ ?
- SEC
- t- D; {" y7 D) \$ ^7 x - SBC #105 }8 q# K3 B& s4 y: h f) _
- INC FC_Dec_Data_10
8 a# z. k+ {3 r ~! O! v9 [3 S0 Y - BNE .Convert_10. y+ n5 ?8 c- i3 d, i
- .End9 h+ }) t9 G) o: f" T1 U/ i$ s
- STA FC_Dec_Data_1
$ S) O2 ^& u# @6 q, C - RTS1 r5 @5 [* e+ s1 P
- 4 E/ o- p" c5 K0 t4 Z) Y) G8 \
- ;----------------------------------------------------------------------9 X( Y# I5 J; g0 @) x1 W$ z9 R G6 ^
- ;显示曲目信息
! @, m8 X3 ^2 ?/ y! i' | - Music_Info_Display
4 p* {# E" Z. Y1 ?$ F6 a% W - LDX FC_PPU_Buf_Count
7 Y" A, b$ o0 A. D* K - LDA #PPU_WRITE_MODE_CNT_LINE8 N6 b! e5 ?+ l# ~5 K
- STA Use_PPU_Buffer,X' H! l. E5 v# {
- INX6 i# W8 u4 ?6 X2 ]
- 9 z, T( {, @' D2 J
- LDA #>MUSIC_INFO_POS y! v. F: R/ r$ n" h9 _
- STA Use_PPU_Buffer,X$ U) X: u+ v1 \. P8 _6 K
- INX
! t& o* ]+ j* k | - ! P4 q9 m1 A& M$ o$ o8 {6 x
- ;居中3 I4 U" c- T9 W E1 e
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
" |" D+ k/ \& B* S- [5 Z4 z7 x8 H - STA Use_PPU_Buffer,X. ^* r' W) ]$ t9 | ~- }
- INX7 R, u" ]* B) t- Z9 S/ k
-
- V3 T. K8 E: X' ^! B E. M - LDA #$05* k( C" S. h0 P8 X! H& @
- STA Use_PPU_Buffer,X
. I& s/ r. Z/ D) G' e - INX* @. ]5 r& k# b
- - _7 T/ Y% r0 U# F) Z \
- LDA FC_Music_Index
7 U- l7 T5 z5 Z% w - CLC
4 x! A* g: b5 T - ADC #$018 _- [2 p' H4 n0 n0 F
- JSR Hex8ToDec
& G' v7 G" [, P" V# S - a2 X. Q' \# g2 P$ V
- LDA FC_Dec_Data_10
5 y, j F: O4 k4 q: z$ g; B - CLC
; D7 d; \. U4 Z - ADC #'0'/ A( \, j9 k/ {) Z2 F' z1 K
- STA Use_PPU_Buffer,X( C) C0 K4 ]( h9 W$ H8 j! z& e, N
- INX
" Y Q y% V9 R; q1 `! N - # `2 {/ H0 G$ {4 u% |! E1 {; `- ?9 u" P
- LDA FC_Dec_Data_1+ D6 F# G/ O+ B# d
- CLC
) w" }: A7 d9 l3 S; ]( X - ADC #'0'
$ i/ b' I) a# N# F# F3 e T - STA Use_PPU_Buffer,X5 a4 a. N1 i% E8 J# F& ~
- INX s: F: C( M @/ `
- / H- B: s7 m& P3 F( _2 e
- LDA #'/'
# @8 e; ~4 f+ R2 e( ~3 K4 [ - STA Use_PPU_Buffer,X8 K" G% f- z' }! j1 y+ `
- INX$ s+ r V( @) S3 j
-
9 P/ `4 r- q' ^/ H- q - LDA FC_Music_Max_Index
: n. l/ N7 X5 J, \ - CLC
; T3 J' T! \4 j! {+ d2 C$ M9 F, u - ADC #$01* c2 T4 B& m5 h0 {
- JSR Hex8ToDec, ~; F0 R! @. K
-
: ]. E3 x8 z. u i - LDA FC_Dec_Data_10
6 R" q: W; G3 l! Y - CLC7 m, p6 @) W! [0 K. C
- ADC #'0'9 `0 q6 Y$ P8 R1 `
- STA Use_PPU_Buffer,X
( |/ O( J1 I8 c, N. F. p" P - INX
" Q+ P4 D9 w+ ^0 X -
6 e; {. G* k# E' l% h$ _3 I - LDA FC_Dec_Data_1; Z8 k' O3 |' W$ U+ o7 \/ N
- CLC
: E$ n& b6 R! @ - ADC #'0'
4 G, \, L3 a/ E& }; O8 o* \& b z8 t - STA Use_PPU_Buffer,X% t3 z. V# ]& X8 p3 v
- INX- S( z& G7 [ F7 p3 J: n" j5 C! B
-
+ ~% a) y" c* x# S' k - .End
3 d; ~: z& z3 y& w# [ - STX FC_PPU_Buf_Count3 n0 ?1 f. b! [) `7 C1 [; G6 }
- RTS
8 b9 L: V3 k$ g2 Z3 } - - [* v) |0 S: O8 e$ a
- ;----------------------------------------------------------------------
& n" P& N- R4 ~' { - ;音乐曲目初始化处理
; T' Y" d( ` k - Music_Init_Process% o# r, q: z0 \5 X4 a
- PHA
" v. _ c8 j6 o9 z, c - JSR Music_Clear_Process
- Z" w6 q8 O: }0 R- f - LDA #$1F
7 [- R2 k7 a e+ e9 U* I& L - STA $40159 D7 u+ V# W4 e; g2 `
- PLA5 k( q4 S9 { w- A! F; _' C, y
- JSR Music_Init_Addr, Q, @. A$ x' l) N. l
- JSR Music_Info_Display& p, c+ }, h5 w/ }+ A
- RTS
& h( W1 `- D) r; W - ) W9 W% i7 ?; l( L* H2 N b
- ;----------------------------------------------------------------------
$ X$ a1 H( u2 e: B, V7 k; P/ P - ;音乐播放处理" N4 V4 O! D" W& w! C
- Music_Play_Process+ R1 Q- u5 k0 U& g
- JSR Music_Play_Addr
@" [7 }/ c4 V* I2 o - RTS
1 \8 E' S' r2 x8 u o4 G
5 o7 J2 W8 _% Y# C( q5 a- ;----------------------------------------------------------------------6 m0 R* `. S) y( l* @
- ;音乐播放处理
4 F( J9 H1 A; v0 O" h7 r0 x - Music_Clear_Process" Y5 C: |7 p8 s, x/ V- u
- .IF Music_Clear_Addr
+ H: G3 z$ z" D% V - JSR Music_Clear_Addr) Q3 o1 q5 t; }' ^5 o& @: X
- RTS$ I/ E4 Q7 i* A* e* ?
- .ELSE, X/ \0 e, `- F2 N! |/ D& B
- LDA #$1F
* O& u$ Y4 @+ S* _( ?; \# ^ - STA $40156 P7 \# G' `' a8 X4 Y. B/ G; Q+ [
- LDA #$00( S& b2 }7 _% A: g/ z5 J
- STA $4010 r- K h- @+ [3 v; q1 f
- LDX #$007 {: X: k6 [; o
- LDA #$00. Z( L) N z ~; }' ?
- * x7 F) }/ |) W% S6 q5 E
- .Music_Clear_Zreo_Page_0( {6 B2 i, X6 h
- STA $00,X
5 u+ u- ~7 w+ t8 g - INX" l0 T( Q% F! ^$ S/ E
- CPX #Use_Zero_Page_Begin
% E( Q( ~( w9 [+ [ - BCC .Music_Clear_Zreo_Page_0
# s: P% T' {. D( N: X$ p - & U1 Q8 A6 r& z: _- h4 g# n9 }
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- v2 u4 s2 f- ?. Z* v3 K
- .Music_Clear_Zreo_Page_1
3 r4 ^" k4 S1 @/ a( ?2 ~! K# w - STA $00,X
/ Q. B R6 v! b; z/ m6 M" | - INX1 g! p4 p5 }) t7 f3 C A* V* K
- BNE .Music_Clear_Zreo_Page_1
8 {, h& m$ A8 q0 _, ~7 u -
x0 A4 k8 }" Z+ L/ ` - Music_Clear_Process_1" Q1 n; Q o/ B# ^) w8 _
- STA $0600,X
/ Q( o5 E9 H6 e* S* Q - STA $0700,X
( t- m j" D* _. C* b) V9 n - INX( K& C+ p8 l+ X) V4 u; |
- BNE Music_Clear_Process_1
) u( x4 J9 B# r* W* T. M0 U - LDA #$10 Y6 V1 g7 }- C) w% R
- STA $4000# I0 R4 d! I, D+ Y
- STA $4004
C! v% v% C0 p8 R; a - STA $400C
3 E9 q+ ^5 ^" `4 h' u6 D - LDA #$00
. u( |) r6 Y) m0 l; t* e9 e - STA $4008
. O$ W+ H9 S. Y8 d% A- }7 g- ~ - LDA #$0F3 [1 M; y( K, @' |! a0 K
- STA $4015
5 J! c& G' n" d - .ENDIF
6 x3 z1 d% ?+ C) C ]6 Y' `. } -
5 y: X, s3 ?# `- M+ u0 y - RTS% \: E3 s r5 g5 w- |4 a$ z. p
8 _+ D0 `9 L @1 G0 R- ?1 U- ;======================================================================. r6 z0 ?: y( J) V& X# s4 L
- ;重启处理9 Z2 ^) W% O- R
- Reset_Program! W3 Y: C8 N- U- T
- SEI# y: @9 X4 l7 C4 X
- CLD
" m$ ?1 c& @# p1 n0 J+ F - LDA #$00
$ N* T. F: ~6 a! ?5 A - STA PPU_CTRL: c5 i$ E% @; y
- STA PPU_MASK
S4 T2 Q5 A5 `' p% \' ~ V. p - STA JOY2_FRAME/ J# O/ Z; [- H+ ~. q- _. J6 F$ ~2 Z$ \
- STA APU_STATUS
# s' T- \. G( r( Q. f -
9 D% z6 K5 q( J8 e6 j - ;等待屏幕准备完毕7 u) L9 N; }$ p3 ^5 e6 Y
- LDX #$02
3 ~! g! z3 ?) N; g) g - .Wait_For_Screen_Ready
/ T# Y, B9 S* B8 ^ - LDA PPU_STATUS2 d/ {" Q3 G! B, j% h- {6 }
- BPL .Wait_For_Screen_Ready
4 s+ e8 p" X! Z9 S5 I - DEX) t, U: b( h& v( ^4 L7 A/ ~, ~
- BNE .Wait_For_Screen_Ready
- i- F( |1 m# T2 d -
5 q+ Z }% |( I$ {5 `; z9 y$ S - ;清空调色板6 E- K! x/ ? M) v H* W
- Palette_Clear
+ m' I& D7 A# v - LDA #$3F$ ~5 K& C$ T- B) _# i; u' s
- STA PPU_ADDRESS# C* u' \# k& a( R
- LDA #$00
N0 H; a/ ]& w& t( g9 a - STA PPU_ADDRESS- P: n( K1 S, H& C5 S0 j2 j* v/ P
- LDX #$20; \( o* D/ ?# Q
- LDA #$0F
1 r8 ^( A0 j, Z; v$ q# }5 K - .Write_Data! W" Y8 v G7 u M( t$ d
- STA PPU_DATA
$ [' J) R) X6 ]* v4 j r - DEX6 G* R0 ]3 z' y' g( y6 _- R* |+ Z" S
- BNE .Write_Data
8 D3 x: t$ ]* m- E. f7 P - . v! }: M& I; U y1 h
- ;清除声音 $4000-4013
& L" \$ O+ ?* O. ?1 B' H, Y - LDY #$143 m, U, f/ ~/ i1 E
- LDX #$004 y! T! v9 N5 E& i5 }
- .Sound_Clear
3 G7 A4 i. T+ h& y - STA $4000,X
, }. [3 B y1 a0 q0 G2 w9 r$ A" f - INX3 @; E, C' j7 V
- DEY
2 M$ k6 u$ ? t - BNE .Sound_Clear4 |9 Y+ H* I! e! o
-
* J p( h8 {7 e- } - ;清除 RAM $0000-07FF
3 T3 _8 y! l/ l( T: q* ^& C - LDA #$00- W( B, Y8 Y) q- ]$ ?! M
- STA $00! y) S& t* u+ s% |4 g% W
- STA $01
# h0 ?; s6 A8 ]; q7 x0 Y - TAY7 {9 V$ q2 u: Y0 T* @
- LDX #$08
0 L9 N, _! H% z K1 X: H - .Memory_Clear
) [9 |! Z: b1 ^) ?* e - STA [$00],Y
1 _! ?! s0 w# {! O5 ^ - INY
8 V5 L) [- |2 t! D5 m - BNE .Memory_Clear
- h/ t4 a/ f( ~! n5 T - INC $01
9 m. `9 L6 [0 X, p! C* d! u" L( G - DEX
2 v- q" G. D. S - BNE .Memory_Clear6 x0 c. x6 H- r3 n5 }
- 1 |% T1 M3 A: S% E6 _, E
- ;精灵缓冲初始化$ ~6 V1 e) C1 g8 `0 j! F
- LDX #$00
7 B: I7 S) G/ Z/ q# X: I& c- t - LDA #$F8
w! n' z& c2 t! r% ]/ B1 s - .OAM_Clear
8 ~* I2 |, w/ F6 }8 i - STA OAM_DMA_Buffer,X
6 G% d1 g+ v6 {9 E - INX
6 U! j1 D' |1 c - BNE .OAM_Clear
1 N. b4 v7 J! a - , i' a' L) S# Y7 `9 d9 H) B) Y! o9 G
- ;栈指针初始化
* `6 M1 F4 d! m2 ~4 c - LDX #$FF
2 s! c2 X8 m8 V$ O) J3 Q3 T3 ] - TXS- k7 i3 M9 ~! Q" K+ i
- : q% H" ], Z( B
- JSR Nametable_Clear;命名表清空
0 J$ E7 `7 T' s5 O - JSR Palette_Init;初始化调色板缓冲
) |: c/ o% t. {! B' Z. Y - JSR Static_Text_Init;初始化静态文本8 g! I3 U# @5 e* G- ^. w e
-
) D4 @+ b0 ~0 u z2 p! u - LDA #MUSIC_ITEM_TOTAL - 1
3 k. x$ s7 o, ^0 w' s0 S X - STA FC_Music_Max_Index
2 Z- j3 ^: A1 N5 l -
, S# n8 u h U - LDA #$1F
' c% ?4 E: `$ G$ z$ D+ R D* M - STA APU_STATUS# Z2 h# v( u6 I3 Y' g
- LDA #MUSIC_BGM - 1
- o2 N* Z" _- \ - STA FC_Music_Index( L% E8 G( ^% I5 ~' t
- JSR Music_Init_Process;音乐播放
* k/ |4 r. [4 V/ y2 k! M - . F% o, K+ E4 } k
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
: |) D! G0 f$ ~) _& R - LDA #$1E
. F* X n6 `0 j* Y" [7 x; r/ @ - STA FC_PPU_Mask_Buf
6 I; @! E6 Q9 c( }5 Y8 Q- ` - 4 j' N! D. x) N( H! s9 H
- ;启用NMI处理( R$ G1 C+ r( X" h/ x
- LDA #$80% L. C/ |# A7 P9 m1 m6 s% H
- STA PPU_CTRL
5 h& F. x% G; t; I- o) g! K - 2 O0 y: l. R% k
- ;程序循环, 剩余工作交给 NMI 中断处理
$ U6 ^2 j' a# L7 A - .Loop
4 k5 f: ^! v/ `" y+ J( O* F - JMP .Loop+ q6 i/ }2 M$ S1 T8 e0 M! f& e
N& u, T: L2 p- ;======================================================================7 x9 x4 u% B3 I* h, q
- ;不可屏蔽中断处理# X: a1 N+ U# A" s9 x
- Nmi_Program
# _& I9 Z6 X1 g% T - PHA
; q6 s- E% n" o8 m - TXA
, I' Z7 S2 o+ j: A5 ^ - PHA
6 I( X; R0 ]$ e q8 ^ M" @ - TYA- Z m( ]4 W( N/ o @9 \
- PHA; j2 V4 [9 r& T! e: i$ w' u% @
-
9 T7 X; i3 H4 K& M& L" R - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
& P! @ \& `0 w9 J! E* z - 0 {* h |9 h4 Y ~6 y6 f
- JSR FC_PPU_Procrss;PPU处理
# |* o9 Y) k2 U1 g+ W' a - 1 c+ H1 f5 K2 C* I. s/ B
- ;精灵内存更新; g/ j; Q' b, N' N
- LDA #$00- E2 g) W: G% }! c, `
- STA PPU_OAM_ADDR& m- e& o% }# X! ]
- LDA #OAM_DMA_Buffer / $01004 P% X. c% b: l6 K8 |( _$ }. v+ i
- STA OAM_DMA
* M" d4 P8 \5 p! l - / _& G ?; T! s1 v/ p0 A1 V0 N
- JSR FC_Gamepad_Process;手柄输入处理
( T9 Q- C; g7 f! f5 |8 [ O/ E - JSR Music_Select_Process;音乐选曲处理
Q2 ^9 {0 {! d - JSR Music_Play_Process;音乐播放处理
; u" O; y1 T: g3 _$ ] - & t+ r, C% p4 G3 f+ Q! X* S+ P- f
- PLA
" p- k! r9 a& r+ d8 | - TAY
2 q" F% V* E- t8 P% ~: ^ - PLA
7 c. \6 S# h2 e$ x: x$ Z - TAX
3 m: \% T* A. T& f - PLA( {, I% V# ]" G4 q
- 3 x9 j2 \( Q4 f1 H2 ^
- RTI$ _0 _' @$ D( Y" E& F2 I- p. z4 c6 l1 {
- : ~; V6 [9 q2 [1 o$ _1 x- q
- ;======================================================================
* o( c2 A8 H+ Z) i* M2 f. C - ;请求中断处理) Z: A$ g8 {% z+ O
- Irq_Program. X: ~. t) f8 n) g
- RTI8 z/ D, ` s$ i$ g1 ^
- 8 i3 K4 |1 K; ~/ n. A
- ;======================================================================
3 z+ Y3 S- p$ l1 Y$ C2 S - ;中断向量表( Y2 `, f. V3 R! y4 g2 r
- .ORG $FFFA; z; m9 z4 ~7 w/ I' V: ]6 R. M
- .DW Nmi_Program ;NMI触发时执行+ m' U& |7 n5 r7 h! k
- .DW Reset_Program ;载入ROM时最先执行
9 A# |- f, y/ _$ a1 v5 X - .DW Irq_Program ;IRQ触发时执行. i0 B7 |8 R- g4 @9 T0 R: g' H$ U
复制代码
( f6 a* S* Q3 S, u! Z) B3 Z* @: W- ~+ g- \
: x7 L3 I/ [7 ]8 chttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|