|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下' a! A# S$ P4 J+ p2 Y' d& ?7 z

3 @. k7 G+ E7 A3 ?7 i1 M以下是主框架代码:
, H, v% t7 I v4 L& U- ;======================================================================3 w% ?( L4 i3 v+ B
- ;文件头
7 l! T) ~. B( t$ }7 Z; f3 O - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量0 g; s3 r7 P' y0 G
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量. o7 k8 t" _7 R. d% \4 @
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
- B! D [! M5 z( t+ O7 ?0 R/ E - ;======================================================================. E8 a+ s9 c! f- D1 k e' b
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 23 u5 G, y0 C+ g, ~9 f
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1, y/ W$ |( O5 J9 m, Q) J
- ;======================================================================! \+ R) K. g$ h
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
# u+ ~% m9 W: U2 ] - RESET_ADDR = $E000 ;主程序起始地址 q' a" N) r$ c* F
- ;======================================================================
- M8 o3 l1 w; k9 g5 B - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ b/ B7 O" L8 ]! a. h+ f! f
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB- p5 T0 c5 p* D$ _' S
- .INESMAP 4 ;Mapper号 (0-4095)
8 N v* C7 H$ ~& q3 G% ^7 y, T - .INESSUBMAP 0 ;子Mapper号 (0-15): x$ B# f1 q9 l6 L
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
2 u5 V8 a- a: Q6 S0 ^9 F - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
& Q+ { {0 R4 p" J+ Z. S; I5 D6 D - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数) L: E/ w u+ Z2 G% Z# a) L, E
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)) g: y( C2 G6 [# y
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数). ]" G. G! M* \) |, O' R0 ~
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
" J% \- b' ^" }% f. B - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
$ N% G3 D9 R/ ?' F - ;======================================================================
/ ~! F$ e6 ~8 k; J - .INCLUDE "fc_demo_config.asm" ;全局配置
2 q8 P5 @$ Q. x! d+ \. e* p - .INCLUDE "fc_demo_constant.asm" ;NES常量- ^% K( |; n N) }- ~
- ;======================================================================, S" d% O# A" Y u' P# v: B
- ;音乐配置
2 x7 [: t5 ]- E$ |. m6 F( N- U - .IF 0 = MUSIC_THEME 9 p' N0 i& W" |# T- m6 }
- .INCLUDE "data/music/Gremlin 2/config.asm"3 @2 b7 e* ]9 Z+ B8 O, R
- .ENDIF: M4 O+ v4 e; [9 o/ ~
-
6 s" D' b) m0 k* [: o9 M( M' m) [" d - .IF 1 = MUSIC_THEME+ |" q3 I& W* a$ I+ U2 q
- .INCLUDE "data/music/Raf World/config.asm"; c- a4 [0 t. L+ {0 U! d
- .ENDIF4 n& o6 M/ o4 G5 o1 M9 ^0 c4 ^
-
4 y& H8 N9 w! d- T5 a" W4 u7 k$ K - .IF 2 = MUSIC_THEME
9 V9 a! h: _ t5 O - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"; Z$ s0 _* o5 d
- .ENDIF
3 m/ P: Z5 u4 _7 _2 v h - . r( a5 o2 ?' V4 r
- ;======================================================================
0 i0 j. v8 E& {% Y% g - ;引用CHR图像数据8 b% y/ V q0 B: x; y$ l: S
- .BANK NES_16KB_PRG_SIZE * 2* S( Y1 b+ S; l7 T
- .ORG $00008 g) |5 K: N1 }- D' D
- .INCBIN "data/bkg.chr"& a2 z( z9 H: s8 I" B" _
- .INCBIN "data/sp.chr"
1 @ H& s& F2 [6 H3 @" D -
9 Q1 C- y% d7 s0 f8 {* W - ;======================================================================3 B# E7 c5 h. j3 H; o- l+ y
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
2 ]- d% M1 X0 Q# ]% z# R9 N6 S - .ORG RESET_ADDR* U k" \, V6 G( e
- ;======================================================================
D; A1 _* j7 i; o8 n/ w - ;引用其他源文件' {4 e& l" |0 Y% ]$ [* Z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
# x, R% S4 b B/ T4 E; a3 p - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
) {' V4 C8 {3 z9 ?- B& ~* Z( k - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理, _3 Q( {# f; e$ z% B7 |
- ;======================================================================$ Y9 v: R& v0 u" {' w% b! [6 e
- & u2 K! o2 K. _( S1 u
- ;======================================================================
5 q& U0 ^+ ^3 Y/ d& \ - ;等待VBlank到来
% `: l4 f/ m8 t) b: { - Wait_For_VBlank
; r' n! T Q+ p* F7 `% m - LDA PPU_STATUS
6 N& S- v( B8 ^8 `/ v+ ^, K1 p6 ^ - BPL Wait_For_VBlank
* p4 i" O U& E8 w Z% } - RTS0 [+ K. P; w: G% w
- 7 U; A& z* B1 p# v! n
- ;======================================================================
O' W, t M' s5 s - ;调色板初始化$ E3 N* D) b9 R
- Palette_Init
3 ~- B2 P. ]5 j* n; H - LDA #$3F
$ X! ]0 u3 t+ i2 ?, w - STA PPU_ADDRESS4 R2 w- B. E; _' j% s
- LDA #$00, c( D8 [* e7 q' C6 v& U' o
- STA PPU_ADDRESS. s; ^+ F5 e# |! w/ d
- LDX #$00
8 k% d' Q( F S7 K0 K: k. @! b - LDY #$201 t4 k, j3 _- {8 X; O
- .Write_Data: o. E; c6 c9 j9 t
- LDA Palette_Data,X; n; }+ }3 M3 I: @: O# c- K" j. b
- STA FC_PPU_Pal_Addr,X
/ h9 p- f+ k. ]! J5 u. N/ `4 w' ] - INX
* B+ v b q* M7 L - DEY& m' c# t6 d# `" B1 ^: r: s
- BNE .Write_Data4 u2 v+ p2 v( H( m# y* `3 l( p0 J
- .End0 n- B5 Z/ U L8 F* Y0 d1 E3 i
- RTS
* W5 |5 _% x$ c k% } - 0 _: ~* [$ V9 j @! I9 w
- ;---------------------------------------- C. g$ b, \+ i2 k' z, p- s) v
- ;调色板数据( j6 V& t" ~2 }/ ~" f7 j, U4 G
- Palette_Data: |. y1 Z0 N/ B) ~; K
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 e3 _ {" k- [: I+ w - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; m- ~- m {9 I, s2 I( ~
-
: r0 y% ~0 o( ?# O3 [* [ - ;======================================================================- r, \! b* P/ f5 g5 B: X" `! X
- ;命名表清空
$ V, p5 J3 v3 {/ J8 _ - Nametable_Clear
0 X- f1 A/ S5 m3 [: s8 l5 c - LDA #$20: ~ ?& a O* o: b
- STA PPU_ADDRESS
( {8 F: u1 X4 p - LDA #$009 P8 W: p* v- z) K" R
- STA PPU_ADDRESS
7 \" k' e* O' z, [, T4 o - LDA #$00, X4 ]' y( {$ T1 Y G6 e- s8 q+ b; t
- LDX #$00
# N' j1 I9 I! X7 A* ` - LDY #$08
4 m2 k/ D6 |" X# N/ A - .Write_Data/ _- O7 P0 U$ G. s4 D( [& q0 l
- STA PPU_DATA4 _1 D# t% W$ U
- INX* T8 C- s' w% s9 M5 s+ C& j2 Z
- BNE .Write_Data
6 `" m! a4 L$ O) | - DEY
; i: |: n+ B* i1 O - BNE .Write_Data
, v) c5 a2 w" D" s6 l/ q" d% o# J; Q - .End0 M4 R3 S7 W, k7 B3 U/ p j' X
- RTS
: A: ^: d' }* i; t4 F
* ^' g3 e3 r% G. e9 V- ;======================================================================
0 f2 g+ Z1 x3 N/ Q) p - ;音乐曲目切换# x) s7 {( X1 }
- Music_Select_Process
|" @% K5 b5 y; g q: _ - ' y' V$ o h" }
- .Pre_Music;上一曲
; Z1 t+ c \3 y, U - LDA FC_Gamepad_Once, H! x" T8 y8 C; M/ C
- CMP #JOY_KEY_LEFT' e1 q4 M* s1 K# m" Y1 d- S
- BNE .Next_Music
6 @7 w3 M% z' g0 }" a) `1 v1 v3 m - JSR Music_Play_Pre
0 \, X. ~8 P( V+ {1 l6 g - .Next_Music;下一曲
5 P: I$ X/ |5 h8 _# W, T7 c7 M9 \ - LDA FC_Gamepad_Once
N1 u5 u6 v2 c - CMP #JOY_KEY_RIGHT4 n1 r5 k5 |3 z
- BNE .Next_10_Music& | ~( W& z6 a! i3 L
- JSR Music_Play_Next
( f4 M+ [+ v3 g0 e4 ~0 b - .Next_10_Music;上10曲1 L9 }. g7 \* v
- LDA FC_Gamepad_Once
+ N- J6 d- x8 m) J$ X& X$ H - CMP #JOY_KEY_UP
( w$ I9 f% J. g; h0 | - BNE .Pre_10_Music
2 V/ F8 ]; F ]+ s% r- C% S* f$ ] - JSR Music_Play_Next_10
Q* E# C9 D- N% w8 I - .Pre_10_Music;下10曲
3 b- l+ ~6 \* T# a" s5 T( c - LDA FC_Gamepad_Once
! g6 N' O; |6 |" A8 V9 k- J - CMP #JOY_KEY_DOWN! [: |- v( R. [$ I
- BNE .Reset
" a; ]2 u3 L; n - JSR Music_Play_Pre_10/ J8 u% _, ~1 G9 j7 g" H
- .Reset;重播当前曲目
X/ m7 }! m( e - LDA FC_Gamepad_Once6 I1 R3 O6 C2 \$ y
- CMP #JOY_KEY_START- |5 F5 O( B9 s" x" @
- BNE .End4 u0 l ]; z+ S; T* S& v" }" ^1 [
- LDA FC_Music_Index$ r& ^ u8 c1 n) i" n
- JSR Music_Init_Process
! P' D9 J. c* N* d - .End
6 K$ B1 X, l `2 r - RTS5 s( ^! D: j1 ?, Q
* z2 T. f% q* R0 g- ;----------------------------------------------------------------------2 _$ a) \ a& ]! A( [
- ;播放上一曲
! P- @4 D* @. O4 z+ I H+ o+ U8 S - Music_Play_Pre
! m0 O5 O) A6 \, b3 ^ - LDA FC_Music_Index" e/ l- _" r- d8 H' N
- BEQ .End
- }3 m$ y' ] R3 l0 [4 _ - DEC FC_Music_Index% a! J, S# G) Z& n, V7 G6 y- }; P3 R$ N
- LDA FC_Music_Index
( {# D, \# i# S+ q, j5 s - JSR Music_Init_Process
8 E( C% h/ \; X; c3 R9 s' M5 [9 V; J - .End8 }: y$ v- R& n! _3 U
- RTS
7 ]6 ?! v% ]& _! V! D - ;----------------------------------------------------------------------
; ?- L( w* t$ y - ;播放下一曲
6 y Z% d7 z0 K, e4 z$ ?# j7 w7 L# N - Music_Play_Next2 ?/ `% y4 d+ S& a/ G
- LDA FC_Music_Index! H& w! I1 l1 ~' w
- CMP FC_Music_Max_Index7 _6 m' ]9 \5 `5 c
- BCS .End7 j% G4 d; T! U$ c$ c* H
- INC FC_Music_Index, j) w6 a: {% a/ [/ h5 l2 e
- LDA FC_Music_Index' v3 ]4 R- k+ L% J! N: h! W! j8 f
- JSR Music_Init_Process8 w: q# W2 P" ^9 H8 y" }6 G; s! z" w
- .End' p4 g( F+ ^2 u8 j1 y
- RTS
. L/ R" k, p4 d. p6 E
0 ^3 `8 `$ h% e/ |( X) V7 K, C" ?- ;----------------------------------------------------------------------* H9 |4 W3 Y% n* t: b4 a* C. b. `
- ;播放上10曲5 L3 b0 ]+ o M1 B" b7 d6 i
- Music_Play_Pre_10; g2 R" J1 G' L
- LDA FC_Music_Index
+ Y2 r4 Y5 v% m" x) U - BEQ .End! f& b1 w! R0 s$ b* b3 v6 E
- SEC
& J( y7 ~5 a6 r' ~3 d8 O" _ - SBC #101 g! h5 X! k" X" T' ?5 X) d* R
- BCS .Pre_10
/ Q8 s% C& G' J8 ]( C& g9 @ @ - LDA #$00/ f; Q! ^' p' k* L S" T8 I
- .Pre_10
+ i6 G- S9 f3 a' j- ]+ x2 G7 \ - STA FC_Music_Index1 @& j; F) S3 |* O
- JSR Music_Init_Process* \0 ?3 d# v) a6 J7 `1 a
- .End
9 d! q5 Y) o$ M" J' ?& k% A- h - RTS( N: Q# v6 H/ i* w* ^
- ;----------------------------------------------------------------------
! I& a. U J' v3 C. z& W" n! U4 ~! r. C - ;播放下10曲
" V' }; T5 Z3 X; T- z& A7 N - Music_Play_Next_10
- S9 O# @- u- S$ N - LDA FC_Music_Index |6 p) P( W9 a6 _" E
- CMP FC_Music_Max_Index3 N) ]0 W$ j( T9 _, E' r
- BCS .End
$ ~& t1 j7 Y. q% c* @! B: f# D - CLC4 p7 G9 f3 u6 c- [
- ADC #10
! `+ N; D- t4 z' B) g - CMP FC_Music_Max_Index! ]3 J: d4 @: \! [6 K/ P9 [) [
- BCC .Next_10
8 S! h1 n' c& A$ k( Z W$ `0 [ - LDA FC_Music_Max_Index
* Q- L( f8 Y* T& i+ }/ Q% t. e - .Next_10
5 o4 G9 o& `* b5 i$ n" N - STA FC_Music_Index
3 K4 C0 A5 V5 {' o" C - JSR Music_Init_Process
) d$ y3 P3 H3 ` - .End* e& ]) H3 ] u
- RTS+ W. E- r3 q$ s* d$ K) g! f
* e( B2 p& a. ~6 C. }6 [% p- ;----------------------------------------------------------------------
! I4 o6 J2 ?# Z - ;8位十六进制转3位十进制制
" c$ S7 q" l2 i( t: j& | - Hex8ToDec* B' H% w8 S! ~" N$ S- G Q
- STA FC_Dec_Data_1" W* z; c4 F# C/ P* d* d/ h& p3 M
- LDA #$00# C6 L) [* I0 K" s$ [: V
- STA FC_Dec_Data_1002 A1 O7 h% c* v' q
- STA FC_Dec_Data_100 i4 t1 l! i( w8 a- A0 Y
- LDA FC_Dec_Data_1
~1 W! Z1 B8 |. z! ?) ~ - .Convert_1003 y+ ~: q* B ^
- CMP #100
5 A9 s; F6 l8 m& y - BCC .Convert_10' [# a+ f7 V, D& G N- l# \7 [' Y$ _
- SEC
2 L7 m4 Z. y9 ]! f0 i7 f/ p8 K" @ - SBC #1009 _& K' f5 T' R. a4 d3 [) ]
- INC FC_Dec_Data_100
) S% P: z2 I' p: Q - BNE .Convert_100
3 O( G# Y) b9 } - .Convert_10
" g$ p9 a4 L" E2 O. ]+ B3 Q+ P6 ] - CMP #10$ W! j$ i# r) Y4 L2 E% d8 }
- BCC .End) d7 u, H1 n% Z \- C% S, v7 U+ ^2 ? D9 `
- SEC+ w; s+ R0 @) \7 c I! G! {/ s
- SBC #10+ I. ~: M7 L) f( z, n* X
- INC FC_Dec_Data_10
6 f, B! y4 N {# s( f j, l - BNE .Convert_10
7 V: d! F. e) @8 t - .End
* ^8 n7 o' H5 N. T - STA FC_Dec_Data_1) E* E, _! L# I, }& [
- RTS
; A; h6 L& g# h
7 x4 u- I. M# D8 a f, v) g t- ;----------------------------------------------------------------------6 g2 V0 C5 M6 j2 G
- ;显示曲目信息
1 ]* N4 I5 H- {8 l+ x$ w - Music_Info_Display
5 G' { w: D4 W. G5 I3 k7 p - LDX FC_PPU_Buf_Count2 N E, K7 q4 i$ k# I9 I0 ^
- LDA #PPU_WRITE_MODE_CNT_LINE0 E8 s- ~6 _* o6 @
- STA Use_PPU_Buffer,X
5 u- M4 r9 \- o1 Z# c - INX/ _( L( O' u; }9 q
- & [1 y. s( l; O1 d' Y. c
- LDA #>MUSIC_INFO_POS N, D3 c [! L) M1 |) Z
- STA Use_PPU_Buffer,X
' v% ^8 }8 P( s6 ~6 x2 v - INX
- \: Y1 R: J# h6 h' Y -
" P: l" F8 Z) A* \1 x - ;居中
* C9 F8 H( X* z* H8 T - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' a2 C- t! h1 y" A; i i/ @) @8 T
- STA Use_PPU_Buffer,X, W3 R( v3 k9 k+ i7 J6 Q4 K' k: }
- INX
6 C& X6 y2 ]' U8 s }& ? - & n6 T9 F! t$ r* n7 c
- LDA #$054 l! V/ S$ Q! Z+ U9 S' z* X3 Z
- STA Use_PPU_Buffer,X! O- c9 p7 o( ?8 B2 ]( K1 }8 G
- INX0 |% @$ s# E( m
- 7 Z( v( c5 ]8 Z6 \
- LDA FC_Music_Index3 `; d6 G& g; M7 k
- CLC9 H8 @7 \) h" b
- ADC #$018 h. {. y/ A4 U8 r! I
- JSR Hex8ToDec! Q t, r2 |7 [2 ]& i
- 8 B. i' s0 B9 j; U# b
- LDA FC_Dec_Data_100 T) }/ w2 y( _# @
- CLC
: o+ ~9 T$ a/ R - ADC #'0'; L9 Q$ a# R$ N/ X2 d) |* q" f4 }
- STA Use_PPU_Buffer,X
( J4 A6 v1 g3 z% W( I) x2 y! a - INX
* S$ ^ Y2 W4 ]/ O, v/ _ -
, d) R6 D4 l3 Y" t# t; z - LDA FC_Dec_Data_15 d* v+ ^3 s. J- A
- CLC
6 V8 y' o, l9 Q5 k0 V6 a - ADC #'0'( s. t' g) T. K; A
- STA Use_PPU_Buffer,X, j* Y1 r; i& L4 t, f
- INX% X& Y% U$ E$ z/ ?: e* w8 A
-
! m% F5 } K# P% X3 b* O6 `9 Q: d - LDA #'/', F- {2 T! w _
- STA Use_PPU_Buffer,X
" g" ?, x; m9 X - INX6 y& N+ X1 s7 ] t9 L7 P' d9 ?4 I
- 0 o( r/ S6 b9 N: ?4 W, n9 ^, p5 ~' y9 Q
- LDA FC_Music_Max_Index
, E% G* o" K2 N3 K `6 c - CLC
5 u# k/ b" \: f; V8 G3 z+ @) p* I6 Y/ w - ADC #$015 P1 q A0 ^8 N# A! c1 f0 u8 Y( Y
- JSR Hex8ToDec5 R$ x! X% u" a$ u% `2 l
- 3 y" r9 T) `; }+ `( K5 l) l
- LDA FC_Dec_Data_10+ o: b2 }. k+ I- g
- CLC% W+ B$ T2 {6 V% C9 [& V
- ADC #'0'2 N6 Z6 O5 \- T F- c0 s
- STA Use_PPU_Buffer,X
r: {. f( E- l4 ~- _ - INX
' O" B3 |- }( i - . g9 V, E, Q6 ]0 k! x4 p
- LDA FC_Dec_Data_1
, \; n' P0 ]) ?1 O; K9 A - CLC
# q$ \0 S( f: Y) B8 ~ - ADC #'0'9 E/ D% C! ?9 p
- STA Use_PPU_Buffer,X
]0 i- s0 x2 x5 c; ~( [ - INX
# r: K o& Z8 }/ z S9 N7 R G - $ @7 C) [. h% a. o
- .End. }' W/ U) ?$ d$ ~! g
- STX FC_PPU_Buf_Count% @. r7 V" R' |1 }* l9 ^
- RTS
- K, c( N2 r5 Z! X! C3 j
6 z, H7 K0 j' \! G; v- ;----------------------------------------------------------------------+ f6 Z) Z8 H- O# h5 m
- ;音乐曲目初始化处理& m- Z$ B2 p- L' _1 ]3 A$ l8 d
- Music_Init_Process2 ]1 q6 `# Y' J7 N
- PHA
7 `" B' j4 }, Y6 y- T - JSR Music_Clear_Process
& p/ G" g' _% ?! x1 y/ \ - LDA #$1F- P" u# `& A& Z; M, [4 {
- STA $4015
8 E$ K* W6 G8 Q7 F" U8 x4 _ - PLA4 I$ n% ^/ ^$ ~7 W7 o6 t0 e
- JSR Music_Init_Addr7 ~1 U* R% Z7 M0 H. z$ t
- JSR Music_Info_Display6 E, _! D) P; X! A) ]
- RTS
0 o5 S8 y% o s/ G4 Q0 B! ?2 B( G1 Z
^% G6 F2 w$ ?- ;----------------------------------------------------------------------' E$ p: |9 u" U1 x2 M9 C! Z- f
- ;音乐播放处理9 `/ m: @, K7 }
- Music_Play_Process7 ?, Q; O6 w/ j% U( J6 x5 Y. u
- JSR Music_Play_Addr
/ f: z- G& B5 i. ` B% `& t - RTS1 D8 {8 Y- u3 i2 z q5 l
- % \! I0 Q7 N2 |/ z" O! L
- ;----------------------------------------------------------------------8 Z6 B& l5 L7 Z$ @3 k% ]
- ;音乐播放处理
. t4 g: u9 l- o0 b - Music_Clear_Process
8 {+ C( p9 r7 ?: |3 Y1 m2 V% b - .IF Music_Clear_Addr
G4 } B- j* `, T9 A2 z - JSR Music_Clear_Addr
! _7 h8 x( B# _2 k* l8 N - RTS( n9 M( {( L! d7 @) m3 P* G( s
- .ELSE Y; w; ~8 \3 f) p) h) I
- LDA #$1F, h" V6 ?; f# g- a1 ~" s
- STA $40154 V: P, U& o0 c w( L
- LDA #$00
* ` F* S, O* B$ G - STA $4010
# Y* e1 L8 B, y( u - LDX #$00+ j" |, m* D E5 s
- LDA #$00& V. d) z4 I/ ~) p: q6 s: d5 G! O
- $ L1 g) n" Y9 O6 l1 r: a
- .Music_Clear_Zreo_Page_0
( Q2 V; E1 V; A8 c3 h& \" j+ b - STA $00,X
0 y2 |& M. U/ r. g1 `4 j( P - INX2 D3 y, q7 L0 q
- CPX #Use_Zero_Page_Begin
1 F$ _# u. g) V - BCC .Music_Clear_Zreo_Page_0; C/ l8 U* w+ g7 i. |
-
; Q0 ^- L) v% N+ L5 h- [ - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
/ Y( f' N0 H( z$ | - .Music_Clear_Zreo_Page_1
6 U9 H; W# a* h5 }( @ - STA $00,X3 \3 P; L" g6 f
- INX
8 v9 h) I2 c" E1 J4 F7 k+ U - BNE .Music_Clear_Zreo_Page_1- S) |1 e( [7 v5 n! A; r
- * a: [# A% X$ h) h) o5 e; l7 U% G
- Music_Clear_Process_1
- e3 u/ w. `& y4 Q) p - STA $0600,X/ K( K- Z3 t7 B) M4 v0 l% {
- STA $0700,X
4 n0 z; g T: P6 a - INX
3 N9 b! v6 p- X - BNE Music_Clear_Process_1
6 N D- c. P+ Y' a4 T( T - LDA #$10# t3 v8 W, o4 V. G
- STA $4000/ h% }7 f' E( R5 p4 I2 g" j
- STA $40047 G3 [$ E y! J7 N C1 ?( H/ h
- STA $400C
7 I, W" P( D# x; k. F# R& m - LDA #$006 _1 F# X# P5 P u7 y' R
- STA $4008" ^( f% e, U+ l7 [4 \: r
- LDA #$0F
2 a- B2 {) y/ p& S- l% B - STA $4015$ h1 P7 q* W- ^5 k6 R7 s
- .ENDIF6 ~2 `; s L5 z
- : _1 s( X8 s$ Y8 T- r/ i# y+ V
- RTS( I+ r0 ~7 F" z9 h8 V
- @; @( @- ^' U% B- ?% X0 J. D6 i4 e( a5 w
- ;======================================================================
3 ^5 _( O, D7 L3 K* G - ;重启处理
4 \* H6 j- J; c - Reset_Program) A7 L& J' V( k- h% W, `- s1 {
- SEI
6 v4 ]5 I2 T9 ~" u6 D) I2 X5 v - CLD1 A" |, G- s) g" D/ H; }+ D' z- ?
- LDA #$00
9 J1 W' k5 v2 ?& g: t6 ]+ _8 e' } - STA PPU_CTRL# J. [, m! ~- e7 @& ~8 Q) E
- STA PPU_MASK
6 G0 V( n+ t; {& {+ e$ ~3 B# p( J - STA JOY2_FRAME3 B- x- y, ?8 R S% r1 j
- STA APU_STATUS2 I# {- a. s# g/ M; d! Z2 W& m
-
$ G& @1 R+ Z" d% A( Q( _* ^ - ;等待屏幕准备完毕% j2 n+ h. [* v& E9 l
- LDX #$02
! W3 A* z, w1 T4 \+ L* z$ Q3 s - .Wait_For_Screen_Ready: v! G7 r" o8 i. `' c, V# d/ |! r
- LDA PPU_STATUS
3 j W7 m$ z) N ?8 g2 ~- t - BPL .Wait_For_Screen_Ready
) v$ {# p3 i) k5 y: v% A - DEX) T# |2 T& z: y( z. ], y) }
- BNE .Wait_For_Screen_Ready
2 W1 V0 V. `) n3 N) ^& I - 5 H9 y1 H* _+ O
- ;清空调色板
1 ?+ i1 D9 d% \( U" ] V9 g - Palette_Clear
( ~% j, ?- H7 d3 k# ` - LDA #$3F
# f- x4 V ?9 g& V5 r3 e - STA PPU_ADDRESS- P" c; `4 K4 ^5 P" i2 Q
- LDA #$00
/ D" |& s' e9 f: t - STA PPU_ADDRESS5 d: L9 k T/ I; r
- LDX #$20
$ N, |+ e5 x+ H A- G% K: m+ [ - LDA #$0F
U0 A1 i+ m* v' ] - .Write_Data0 z7 U' A! v, S. o1 l/ m
- STA PPU_DATA, u' W' X: I; h) D; U! F
- DEX1 U% S2 P: S m0 ]) N" j
- BNE .Write_Data" y8 R& A1 g! I( w! q5 h8 I0 k, t
- 2 q% v/ S% E+ u8 R8 l
- ;清除声音 $4000-4013
5 M2 g. z# G( p" Z. I4 j - LDY #$14$ K' z( n3 ?0 ]9 y* Z- |+ `
- LDX #$00- Y7 W8 D) N. a) s; x6 j0 E# F
- .Sound_Clear
1 K+ b8 q7 X- _, h& j - STA $4000,X$ c: {: J8 |" r# M+ a6 F2 T3 | \
- INX7 A2 [) @$ R1 `1 t- C2 E
- DEY
1 g% g+ z0 {0 f9 `0 G/ u - BNE .Sound_Clear
( V l; W* ^4 m, h- S - : w- b4 N6 `7 w. z3 f1 l# \
- ;清除 RAM $0000-07FF. y+ J& O7 @4 Q/ R0 f- E+ ]
- LDA #$003 K! U* }1 e& m2 n
- STA $00
8 _5 Y/ `+ N, x0 I9 o7 x( M - STA $015 \1 C- A! G$ d% W7 v
- TAY+ q$ Q6 i- o. p0 P5 U
- LDX #$08, J h1 w& G' \/ T
- .Memory_Clear
: x" L, c3 I$ Z: _ - STA [$00],Y, g& P; a4 y/ w5 h1 z; C% K
- INY0 }; ^$ O2 |: X1 w
- BNE .Memory_Clear* H. g. M2 M0 {% F
- INC $01
! V6 o$ x0 @0 l4 ~1 d" d$ | - DEX0 n) P' w- ^+ Q1 e
- BNE .Memory_Clear; E! L" a- J( i* W+ t, f
-
6 w! x2 C- [) H" ^0 g. R+ A8 W0 T - ;精灵缓冲初始化
! ^6 p8 x( a2 n/ c/ J2 [ - LDX #$009 n5 [" \9 o- j8 ]# r+ _
- LDA #$F87 H5 C0 h* Q4 y* Y% L
- .OAM_Clear) ?$ p0 A" V; h0 h
- STA OAM_DMA_Buffer,X. F& d( W2 v# f2 f: {0 H
- INX% Z( v5 t, u7 @
- BNE .OAM_Clear
; P3 c0 X6 y3 i- k: S7 ~+ M - 2 q1 j+ \! e4 l. T! n
- ;栈指针初始化( J0 B* v1 M7 x1 e1 C
- LDX #$FF
% J" C! q; [1 b0 e& W! t - TXS
1 ~! b1 R* y( V9 b4 M - : |/ @4 q, y6 L
- JSR Nametable_Clear;命名表清空7 l( T% v0 X$ s, G# z) W' X
- JSR Palette_Init;初始化调色板缓冲3 L: E% e" o% K4 F. P: i, ^" `
- JSR Static_Text_Init;初始化静态文本
$ ~/ W( r& j4 F) ]7 s - 1 {; `4 k" `2 m5 x& r0 X
- LDA #MUSIC_ITEM_TOTAL - 1
% h' b5 |+ H; C9 z. e# f# E - STA FC_Music_Max_Index
. b* j0 x, |% p* C5 X; T4 h& F -
$ T* q6 r; t7 c' H2 \1 u - LDA #$1F
0 G6 k; I% M8 ^; r8 t! X ~ - STA APU_STATUS+ t6 y& J! }; }& Y: N0 J
- LDA #MUSIC_BGM - 1
5 ~8 s6 j" T9 P1 U9 k# m - STA FC_Music_Index
$ w% @, K+ f5 |7 ^3 o$ i8 w' v( h - JSR Music_Init_Process;音乐播放, p* j0 H3 E! p; N8 ?* a
-
2 A/ P6 H: X5 J, A: a+ }4 ^ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
! @1 G0 _1 f3 e4 b0 Y - LDA #$1E- e4 l0 l1 k V: X1 r7 s4 p
- STA FC_PPU_Mask_Buf
9 w# o# }4 T4 B; l- h - 2 Y, ^' N0 C6 Y. Z/ ~* J
- ;启用NMI处理5 H9 z& u- _2 s0 a) P1 g
- LDA #$80' k- R) q/ ^2 o9 L4 n) s$ B" r
- STA PPU_CTRL" @" _7 ]0 \) E: r' t8 l4 F
- 3 _% r) W2 X( h: O6 e8 R* Y
- ;程序循环, 剩余工作交给 NMI 中断处理5 _1 P5 a/ o0 B' M( g. @1 r
- .Loop
2 G8 Z$ J6 [0 b - JMP .Loop
; U# f2 k+ J) O4 e9 N4 y - 1 U: F$ O+ s! s% B( C h3 l
- ;======================================================================0 K$ v9 _. A- }/ ~
- ;不可屏蔽中断处理% _8 f6 |5 f- b* H J
- Nmi_Program
& }0 r T s0 K( C - PHA
! \9 ]6 o; U6 Q* r, ?1 ` - TXA
! H8 ]% ~( t# f: c! ` - PHA
" @, S# a8 W' n- M5 }0 M9 H - TYA7 m1 ?- ?/ g/ g/ Y6 Q: v% _0 Z
- PHA
2 ^7 m% B/ l" X/ L0 c& ^ -
- Y/ A( |. X' z6 I) y - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
9 X1 C& {( M. E4 r/ m8 E - ! H# n, i( D9 W$ H: x- g
- JSR FC_PPU_Procrss;PPU处理9 j- l( V& ~* j& A# t1 q
-
& T+ ]3 ]9 g6 i* @ - ;精灵内存更新
9 T' L# W' u: S: | - LDA #$00) k+ ?( a4 F! X+ r
- STA PPU_OAM_ADDR
8 `. l0 L) x# n - LDA #OAM_DMA_Buffer / $0100
* Q4 r6 q1 A8 o/ E- p - STA OAM_DMA
t, p [8 t- [& d2 | - # @# w: H, e" A0 [5 G+ Q
- JSR FC_Gamepad_Process;手柄输入处理. G# o9 Q& {- N, X4 k2 ^4 ~
- JSR Music_Select_Process;音乐选曲处理
d1 W1 A; `6 y4 s7 ^5 d( D - JSR Music_Play_Process;音乐播放处理( H, s# X d8 |. H+ \( ~
-
' D) |( u9 e( Z" g. Y' E5 l3 F - PLA+ g8 n; e; m2 c3 P
- TAY
& b% w4 ]: z; v, | y! k; ` - PLA
4 S, g7 v# W5 F' x1 c2 P* a. R - TAX
8 g- E% s% i* Y- `& m - PLA
& o( ^, g* m1 p, D3 M* f7 Y2 ~ - 1 g8 B5 b- ]% u9 X) F5 d$ t5 r
- RTI
# ^- x! I$ t! d: U$ w
( L: B z1 E1 T- ;======================================================================
/ K! s0 {- k9 `( O - ;请求中断处理3 P. ?; C& v8 ?# m3 }; P
- Irq_Program
/ ?$ V9 ?( v! j t& v - RTI
- r f7 I2 r9 @6 r5 q/ m0 X - : H" B4 O/ x* L
- ;======================================================================
# Z, f0 j! \: t! I8 t - ;中断向量表
0 l* V$ y3 F, `; X* I - .ORG $FFFA
# n! u8 D. U6 Q6 z - .DW Nmi_Program ;NMI触发时执行# j1 s+ d/ |' ]: X1 R6 R
- .DW Reset_Program ;载入ROM时最先执行
1 ~9 \; N( r8 i4 U0 _& C7 _ - .DW Irq_Program ;IRQ触发时执行
, E ?$ h, B- f9 o$ V2 u* F8 _: E
复制代码
. ~. A9 `% G5 T5 y" v' T* U
# V1 Q! S, W5 I% d/ |( m8 @' I$ v6 x4 E7 `! [ b$ m: {8 a& T
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|