|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下; \5 V4 T7 X3 I! o% G7 w

9 J6 {9 M) G) D6 B1 w+ W' ^! u以下是主框架代码:; d* E! a" h1 V( p
- ;======================================================================
J, y6 \1 u+ p" n" M3 R% f! p | - ;文件头
( w) Q9 Y" C& J. M% Y - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量0 V1 [! e: D5 o
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量+ i. E; c$ b. R; }$ s
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码& U% z2 j( y7 E8 V
- ;======================================================================) Z. S m& P, a, J, F5 ~( d
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2& `# U9 H7 F+ C0 ]& q
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1# w( V: N' A$ w, m+ b/ P
- ;======================================================================
1 F; b' R; A2 [2 z) B, u; n - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1" y3 T! E- ? l; j+ S
- RESET_ADDR = $E000 ;主程序起始地址
6 p$ f/ B3 {9 G( ]0 \8 s - ;======================================================================4 D1 d* \% b9 L5 x5 a( w
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB& Y" s/ T& W. P
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
# @% k! v4 {8 E6 N& L* r/ v - .INESMAP 4 ;Mapper号 (0-4095)
2 N- M1 Q7 m6 k) \- K5 K3 P - .INESSUBMAP 0 ;子Mapper号 (0-15)
$ L# h3 G: c& I9 P& Q4 i- d c - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)3 O2 \. I4 M1 ~
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)( w' m1 ]6 Y& t- ^- C
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
) e. _* X- [) n! A - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 Y7 ]5 m8 v8 n* X
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 v$ S: R/ Q% { }4 e- ~9 ]$ t' k
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
5 g' P& @* x1 g& Q5 R( v - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)6 E4 u2 n9 p2 ]
- ;======================================================================3 R: K7 O+ u6 n( a* `
- .INCLUDE "fc_demo_config.asm" ;全局配置
# }: \7 x w& Y! B3 K - .INCLUDE "fc_demo_constant.asm" ;NES常量
1 Q1 i0 K3 w4 f, l- n8 @ - ;======================================================================) x2 E$ Z2 O* ~
- ;音乐配置" b, ?) z: a( S
- .IF 0 = MUSIC_THEME 4 m8 \/ n. F; I8 e' W
- .INCLUDE "data/music/Gremlin 2/config.asm"+ v2 Y& @ F0 B: I8 v% n% {# F
- .ENDIF
. P$ Z3 @' `, A3 | - 5 |; ]7 l; V1 X9 S5 Q' n
- .IF 1 = MUSIC_THEME
) Y- A0 B3 L w4 b% p/ j; E2 e - .INCLUDE "data/music/Raf World/config.asm"0 I" [2 r* s' _: ]! ?3 n
- .ENDIF
1 V9 N& U- z! w. z& ^ -
/ o1 X: `: O* Z$ L( U - .IF 2 = MUSIC_THEME 3 d! J# ]& F" C: P$ ^. q2 _
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
5 m- ^% S+ s- Z% j( } - .ENDIF
* ^9 ^2 Z# p3 p - 5 Z) ?3 A1 [8 ^+ I" Z, O
- ;======================================================================. Q, y8 d5 r+ N1 Q# _2 w! C
- ;引用CHR图像数据
" F$ |% f9 i2 R$ \% N - .BANK NES_16KB_PRG_SIZE * 2
7 _; ?8 [0 x3 A7 Q, |" J( q - .ORG $00004 j! t& g9 E( }$ E2 n8 ?
- .INCBIN "data/bkg.chr"
6 f0 V, C* P# S% H/ N) I" u- ? - .INCBIN "data/sp.chr", [" {) H1 c1 z
-
8 v: R$ o2 ^3 ^: M - ;======================================================================
* ?# b9 i4 Y* b! H5 f - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank/ v) I; G8 t$ ^4 l% C0 D) I4 x" z6 P
- .ORG RESET_ADDR
7 H- i4 O: V$ K7 G6 Q% i4 P( U - ;======================================================================
! {( b* g! ^! U7 @$ c - ;引用其他源文件+ i0 N0 _" B! b, }
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
6 |$ `4 ]* l! I7 J1 y - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ T7 m' [6 Z7 _% s
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理! @5 P9 u9 A Y* u* Y U
- ;======================================================================
6 ~7 Z: B1 `9 X3 d' M' I
. B3 N( E4 h, x1 K4 a! E5 X) j7 H- ;======================================================================% X4 E7 w b4 Q# [$ e! o1 U- }
- ;等待VBlank到来
1 g# Y2 r3 |+ t2 F( G - Wait_For_VBlank
- s, \$ d5 ^" ]1 ]9 {! [ - LDA PPU_STATUS
) ?# p5 a; ]3 ^ - BPL Wait_For_VBlank
- w( g- q5 u5 q4 W# Z0 S. E# l, R$ s - RTS
L1 q& z. V! b5 E) n - / n! r1 }! \ y0 ~6 a
- ;======================================================================
( A! Q: R# G: p2 p' p - ;调色板初始化8 s5 ?: c# i# F& s8 B$ w; p
- Palette_Init) {' I8 V: Y; ?# p4 n/ p
- LDA #$3F( M! w/ ?/ b! F$ K: E
- STA PPU_ADDRESS
: c9 Q: F( U+ {$ Y/ C4 y0 i - LDA #$00
8 S7 V' \, [. ~- A3 q* j - STA PPU_ADDRESS
" G9 V, e; T8 Z( {, d - LDX #$00
& s0 N! Z, y5 k2 b - LDY #$200 E1 M4 B' a$ Z2 H$ G2 C7 y
- .Write_Data
& J# u( \8 |9 C% p - LDA Palette_Data,X, {$ Z6 \* _4 Z0 B; v4 w l
- STA FC_PPU_Pal_Addr,X! \( R# a; `% V8 C+ h
- INX
3 A8 j1 h& Z4 t( W - DEY8 W r7 a& _/ I" S9 E/ h) b- y
- BNE .Write_Data4 Y. ~- D. P: t, @6 s, N, ~
- .End+ K. `' N" \1 h
- RTS
% y. z, }% p7 S/ H1 T
3 @3 S+ J3 e# a2 V# L( ?7 k- ;----------------------------------------
" L$ H2 x" ]& g1 Q" N, I - ;调色板数据$ \5 j' j1 u5 Y/ Z+ {
- Palette_Data# s8 G) ~& D# \' u# M2 ?9 u
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, n1 J/ t( k2 t2 |# l* V1 \0 Z
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22. P' \/ }# Q$ [+ d, J1 n
-
* `4 w/ \$ j/ J - ;======================================================================
, Q: |) F' W+ I7 H8 c+ E - ;命名表清空9 ^4 y% z7 u: |' L% ]3 X% Y
- Nametable_Clear
1 J5 K( x6 F, `- [ - LDA #$20
+ T/ K0 h9 y0 R. j - STA PPU_ADDRESS
. E" Z8 @0 y# a; E - LDA #$00
! I$ u' C2 g; h& R - STA PPU_ADDRESS' p7 ^) s5 N4 Y
- LDA #$00
0 J! ]9 Z8 s7 O+ }3 _* J$ ^ - LDX #$00
) p( Q5 a% e* ?! h s) Q - LDY #$08
0 r- ]. E, _; C, O2 i - .Write_Data
+ O3 a1 ?5 ?& y - STA PPU_DATA
' M* O. B D8 J1 k/ p - INX
/ b4 |8 Z/ R4 Z, e% A( o9 ] - BNE .Write_Data
& b8 h1 n7 J Q _' ^( D. i - DEY7 N6 q4 F3 B% M3 E$ E
- BNE .Write_Data* q! H6 R' W" E" u$ D
- .End
* F# ~; D, c9 ~ V/ f - RTS
4 v% z4 |/ i' q/ b/ W2 ^
) Q# L6 R; h8 k9 s5 K1 B! \- ;======================================================================: f, y0 d5 v% s! ^& A" h
- ;音乐曲目切换$ S5 r- k2 M& D* t( E
- Music_Select_Process
* {: Q. i5 t" T5 k% i
{1 Q0 S2 S+ O+ Z- .Pre_Music;上一曲
, H/ ?) t+ a% U/ `% g# { - LDA FC_Gamepad_Once7 w9 q' S# \& u
- CMP #JOY_KEY_LEFT
# g {5 ?3 s# M8 P# N - BNE .Next_Music
/ l* n3 e4 `0 Q, j; G( E, B - JSR Music_Play_Pre
4 z7 C. @6 D1 Y! e5 B2 D - .Next_Music;下一曲/ b2 Q" p" q& T4 F8 K
- LDA FC_Gamepad_Once
$ O) V- t- v, _+ {. ^6 Z* o - CMP #JOY_KEY_RIGHT
% ]/ K4 m6 |7 l7 I$ E; V3 F V) b - BNE .Next_10_Music
+ T# `- l4 T. I0 Y6 p8 o- b1 p - JSR Music_Play_Next! D" G1 s5 G* x X
- .Next_10_Music;上10曲; r# z+ Y I5 x1 I9 c M
- LDA FC_Gamepad_Once
$ V: T2 N! B# y8 s% n - CMP #JOY_KEY_UP& M9 [ Z R; c% ]/ r$ {
- BNE .Pre_10_Music
/ \! {, r; f! z; k, P% p0 S2 w - JSR Music_Play_Next_10
, m e% S- s8 c/ h& Q' O - .Pre_10_Music;下10曲
: V( {7 c! p" |) W+ b# z% j - LDA FC_Gamepad_Once; w. d) E% U# G7 l3 E
- CMP #JOY_KEY_DOWN" @+ x7 G3 L4 c) [% P
- BNE .Reset& z1 k: i: y9 p( F5 Z8 H9 y
- JSR Music_Play_Pre_10
. ~% ]! `3 k4 s% u d, E" x - .Reset;重播当前曲目
& j" D' @" J: b7 M m - LDA FC_Gamepad_Once9 ^ U- |5 X( ]
- CMP #JOY_KEY_START% X0 D4 ?+ j3 ?* Z b6 p
- BNE .End
! x- v ?, M6 S6 v- S$ P* J - LDA FC_Music_Index
* W0 `4 Y( ]2 P7 Z8 F& {% | - JSR Music_Init_Process
' a! I6 v! C) e1 w1 G - .End! r: z0 K) B/ J- J/ _
- RTS+ s+ Q o* d: a8 [" R
5 d4 D+ @/ m" O# _) ?- ;----------------------------------------------------------------------
4 E; O3 W) L3 q2 |9 N - ;播放上一曲: A# a. k+ _* K3 |7 P! z' e% h
- Music_Play_Pre2 V+ O1 e" N8 B
- LDA FC_Music_Index7 u+ W% l4 q0 _- G* k3 k
- BEQ .End
+ q0 U5 P' G4 M" c: v+ } - DEC FC_Music_Index
_8 @. [% F( r/ c' m - LDA FC_Music_Index
- w; \: B: a. P x' S - JSR Music_Init_Process+ [) g: C1 f a0 a; _5 G
- .End
3 E8 H" C. `. T8 b- d - RTS4 h6 D( L6 e2 S( H: @& {( K
- ;----------------------------------------------------------------------9 Z( m. ~1 D3 c7 n- b
- ;播放下一曲
$ ^# V/ ^! c( r7 X! U. }/ [ - Music_Play_Next& j Z3 W' i; u) T2 f' G. I2 `: N) e
- LDA FC_Music_Index4 [' l: W2 s( y) B) C
- CMP FC_Music_Max_Index8 l9 Y# T- y0 W0 V' K2 z, j3 j
- BCS .End
" B( I/ t- v5 j2 `' }* ~% A) m - INC FC_Music_Index
/ u }4 J! d6 }0 ~4 w6 I' q! V - LDA FC_Music_Index/ b1 L* x( A& A' j% p
- JSR Music_Init_Process
A2 D; _1 p, o/ s6 R; n a - .End' o' T2 I! n# ` F# v
- RTS
' e1 h7 ^9 R g
) g$ A. b+ T* k/ P( c, k- ;----------------------------------------------------------------------. N' J) H2 K% m& w
- ;播放上10曲
% ]$ q8 U* @- A' P ]1 c - Music_Play_Pre_10
J( W" A% j- H2 v f - LDA FC_Music_Index$ D. q& U# {! \+ k/ T
- BEQ .End: {4 T: |/ ] ?: R) H. @
- SEC
* Z' J' W& C( O* T% a1 F - SBC #10, z' }# ?% |1 f1 B, ]; V
- BCS .Pre_10
% g/ G) R4 l9 V3 | - LDA #$000 F- } ]. d; k* B$ u5 q
- .Pre_10
% C2 Y# T- o9 T8 p6 s4 a2 L, b; u! Z - STA FC_Music_Index
( S. |4 G! v. R+ K& k* H - JSR Music_Init_Process1 Y" M" ~" o/ u! i
- .End
+ S1 A+ |& l& J& ~ - RTS% Z( V3 G ^ [! x
- ;----------------------------------------------------------------------
. \3 {& b/ K" I, |# x - ;播放下10曲/ ]& \3 m& J4 p2 C6 V5 j8 U3 ?
- Music_Play_Next_10
9 T6 K$ y5 r. O) y: |# g% ? - LDA FC_Music_Index
7 h0 h6 o8 ^! V - CMP FC_Music_Max_Index
2 x! o) h( y; ~8 d4 J/ E - BCS .End
3 e: b/ e5 v6 u - CLC
( T7 R) Y- Q0 ] - ADC #105 T) W. p- s, Q* Z& U& S3 b
- CMP FC_Music_Max_Index
+ I( ~" l1 a ] - BCC .Next_10( E8 G5 D- b/ f$ g
- LDA FC_Music_Max_Index
0 C) b3 S- c2 ] g2 w E* k7 @ - .Next_100 A e/ @" N* `; _
- STA FC_Music_Index8 A( E' i* r2 s
- JSR Music_Init_Process
+ W( c9 v; y' I3 h1 `& B; z - .End% Q9 d$ ^3 j g; A' l b
- RTS9 y1 h; e3 ~9 V; m; Q" o
- 6 R7 q4 \- B7 |: N- _* |
- ;----------------------------------------------------------------------
; g( Q9 Y* ?9 ~8 X5 ` - ;8位十六进制转3位十进制制
2 F6 X( ]# |; \/ H - Hex8ToDec% ^- M( R0 d$ A/ |: F# {0 H- \/ @% S
- STA FC_Dec_Data_14 a) C5 [. U4 ^5 N7 w6 @' ?
- LDA #$003 `8 C( R. Z" V9 U; @$ A
- STA FC_Dec_Data_100
* ?- S9 K3 i# e+ ?+ a1 W - STA FC_Dec_Data_108 K& c8 F0 l/ f
- LDA FC_Dec_Data_1$ v- u. f; y( x& R
- .Convert_100, ?% N6 P# x) W/ Z! e
- CMP #100
- c8 L t, M! A$ F$ K - BCC .Convert_10
3 K* E2 @. [) z8 E9 u& ?' n1 ~4 V - SEC4 n1 F* H$ s# Z/ e4 m6 K& o: n) E
- SBC #100
' P1 p1 d* e9 c# l. R' T3 D2 ] - INC FC_Dec_Data_100- [: N/ @0 x5 W9 v3 R
- BNE .Convert_1006 f) {7 [9 G" [$ Y
- .Convert_107 j4 u7 z" X. c- v: B
- CMP #10- A9 u- e5 M" r$ \, r" y \! q
- BCC .End& O$ H+ E, @# a* [1 |% i
- SEC
' J: S! B: S9 E& l7 H/ X [! u - SBC #10
4 F1 [( k( \% v2 _3 j0 p* W" [ - INC FC_Dec_Data_10
\8 z9 d1 E, [ Y% A7 E A - BNE .Convert_10
4 g( ]+ _5 b6 ~% t" c- Z - .End
, j7 B, ^ l' s y* w K5 P - STA FC_Dec_Data_1
% \: u) w, R# K& g& N - RTS
7 G4 b) {0 w" k4 }; C0 t - - S1 R `$ e/ h, s) @; w7 R# v# d) K
- ;----------------------------------------------------------------------/ U8 @5 N1 `3 Z( d& ?% m
- ;显示曲目信息8 m& l$ U: A: J0 b. @( h( E
- Music_Info_Display6 z: z; g. G: L$ T2 B5 _
- LDX FC_PPU_Buf_Count: e3 p' V: |) r- i
- LDA #PPU_WRITE_MODE_CNT_LINE
3 |$ n. @ G6 d$ E( `/ ]& F - STA Use_PPU_Buffer,X
5 f7 s' \$ `% W; y k a$ x - INX! P; X9 e( Q+ T. v# t4 w, d
- 0 x% y0 n; I9 O
- LDA #>MUSIC_INFO_POS, o- Y, J: D3 N P, p
- STA Use_PPU_Buffer,X) Z) i. y3 x; J
- INX7 @" q9 c) l5 p6 }3 d
-
m6 Q) s) F9 Q - ;居中" F9 {6 q* ?# Q v) ?, k' Q/ X3 u
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2, |) N* X3 `' r
- STA Use_PPU_Buffer,X
- B5 w! h8 w: R/ f3 N: s5 W. ?" F - INX
" W; F" \; g: h; i* r& n9 T6 K -
! x& F) Y- s `2 _& [. ?; ] - LDA #$05( t+ Q% a# M0 l3 s, U9 J2 V, ~4 w7 f
- STA Use_PPU_Buffer,X
, u9 G- C! J: b; m$ h9 f6 Z9 F7 H) S2 W - INX
; ~( b1 E4 O# O# D - # q i+ J: E8 V7 i; G- A
- LDA FC_Music_Index
% q# t/ D" q; H0 t - CLC% |3 [: c" V) o" C2 n
- ADC #$019 ~% H( X' l: m8 Z' z
- JSR Hex8ToDec
2 G/ C2 `5 \- j -
+ v7 F$ ]" B6 Z - LDA FC_Dec_Data_10
9 Q( u1 T* Y" ?% c0 [ - CLC
' _% _' |5 N- O, y* d - ADC #'0', b# P. }, d7 b8 h9 L6 l- K* q' \
- STA Use_PPU_Buffer,X( _0 X) L8 y1 F7 c; \4 ]8 u. ]
- INX* i( f. ` r: D' j( j0 M
-
9 _, X. e. {. A! o7 v% \+ M& E2 _. K - LDA FC_Dec_Data_1/ c4 B6 x7 W/ R+ {
- CLC& A5 h* B# g0 v+ _* G6 M
- ADC #'0'3 O0 p8 O3 L# ^% F) y
- STA Use_PPU_Buffer,X- Y u9 Q9 _& P' B9 Z6 c
- INX& [7 a4 a. ?8 x- I: c( I! I1 g8 ~
-
' a' o, F- E2 }4 M- E# E0 f* m - LDA #'/'/ t% F: J( m i
- STA Use_PPU_Buffer,X; v4 g7 `# W" L& @/ `# X3 n
- INX
4 U' D) E+ l# | -
' d c% E) A8 f - LDA FC_Music_Max_Index" E8 U2 \4 _4 e
- CLC6 O/ b" P s+ ?! ^
- ADC #$011 c- _0 S! H: ]& x& u
- JSR Hex8ToDec7 h+ H1 [* t( C" I% J7 _; J
-
3 W4 c3 i, R0 P' g9 K3 _ - LDA FC_Dec_Data_10( w) J0 o8 M1 R( p
- CLC: k+ p4 I- g* f, v
- ADC #'0'3 K* p# i: R$ [1 o# M$ t# x0 m0 t0 c
- STA Use_PPU_Buffer,X
7 Z" g* F6 E7 E# X& X1 Z - INX
: `4 W' q4 I4 p; k4 Z6 K -
7 l0 }) n; o; ?8 k1 p! K9 u - LDA FC_Dec_Data_1
+ Q9 ]# d! A# s6 s3 a0 S; h/ o* _' i0 b - CLC0 \, V0 b) Z; W9 {# j& Y
- ADC #'0'4 m/ G4 X G7 a+ N7 H
- STA Use_PPU_Buffer,X- l4 ? P Q3 V
- INX; J) R. a+ L+ O' w" g4 j3 H
-
, A3 E" F2 L5 I0 Q9 _8 q; W - .End
$ _; o/ [# X* S, w7 B: F - STX FC_PPU_Buf_Count
5 M- |) d7 x8 y* l - RTS
; U/ d! S& e. d. D
! R4 N0 L, I/ S! C4 ^- g/ U8 b V- ;----------------------------------------------------------------------
0 X% @' ~9 f/ [* I2 s - ;音乐曲目初始化处理. l0 Q4 q/ p5 Z3 d- p+ g1 ^
- Music_Init_Process# x; V$ `5 g1 g* L
- PHA
( A. R! a5 @$ `" f - JSR Music_Clear_Process( K# D: @- q% R5 r
- LDA #$1F4 u6 @' o4 i, ^
- STA $4015
6 }) V Q' }. f' Z - PLA
G/ ~, Z6 }0 V8 y5 K/ r/ J2 ]* n - JSR Music_Init_Addr
4 G" P% G5 W1 W! u% V4 V# Z7 d - JSR Music_Info_Display
) |& O0 n" ?# h5 u - RTS8 ]- ~( ]; \- W; R* q
- + B8 N( |9 z* V3 t `* q* v+ E
- ;----------------------------------------------------------------------' Y- @. N2 |8 `" `
- ;音乐播放处理3 A* F0 L0 I/ a2 `" Y4 B M
- Music_Play_Process' o1 s+ E& d5 y
- JSR Music_Play_Addr% w2 ^; L4 e; I! M( u
- RTS
) ^' G( U# v$ Y- X0 q& h; V - " K0 w6 h; L8 a, G' z7 \) r
- ;----------------------------------------------------------------------
3 w6 e8 U2 ?! y - ;音乐播放处理
& j i: T. X9 _! X c5 v - Music_Clear_Process
; d) Z, R2 X2 o; [. P2 `! b- g8 ] - .IF Music_Clear_Addr! v j$ x- |+ v4 _- Z1 l/ S
- JSR Music_Clear_Addr6 \1 A9 o# d% {5 J9 I+ k
- RTS
; B( H& z" V4 H6 p) m/ y& k5 Q* d - .ELSE# J. p% o7 e: m2 f& O( @/ t
- LDA #$1F
9 e/ J8 V8 m7 [+ ?4 K - STA $4015- w5 l! b' D( D" U
- LDA #$005 F* E& c- G r* y9 g+ i
- STA $4010
7 d+ h3 ] _ j4 s( ] - LDX #$001 i7 G$ E$ m6 {4 n5 R3 R
- LDA #$00
6 v9 V8 f* B. ~- Z3 Y -
/ D; C' M) D* ? - .Music_Clear_Zreo_Page_0. I4 O& \% z! B6 z
- STA $00,X
0 J/ a$ W+ `1 U) G( m - INX2 _+ T3 ]( o5 I$ I, r. f; G
- CPX #Use_Zero_Page_Begin- L7 ]5 o9 P- m1 }
- BCC .Music_Clear_Zreo_Page_0! j" Q, N/ y8 I! E& _- m$ ?
-
% `0 j( j% U/ [9 l; r3 v1 U - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size% X5 I+ B- v% K% c/ D* e
- .Music_Clear_Zreo_Page_1
! ^9 `8 I4 H1 c, t s - STA $00,X
9 h; c: l$ }6 N8 r& P4 G; @ - INX
9 _1 [' Z* F- `, }4 Q - BNE .Music_Clear_Zreo_Page_1
1 d' J# o1 h0 P7 @2 z -
! ^, z1 T' J: J6 o% E G - Music_Clear_Process_1- |" E( q1 j$ G1 {
- STA $0600,X k% I; w6 V+ z
- STA $0700,X: \1 z; F: u) s0 x' O+ \/ Q' p3 g
- INX4 B3 P* g$ Q" K* T- d; w
- BNE Music_Clear_Process_18 s- T' p5 w5 }
- LDA #$10
1 J! B6 o3 M5 c; X' M1 ^1 K% n/ D - STA $4000/ }' S( `; K( i$ B2 I: y
- STA $4004
( L0 `' d, E9 d" b8 z - STA $400C8 L1 }+ y. [9 j8 i% t9 r
- LDA #$00, X) D/ [& B' k7 y s" f
- STA $4008
" x( `& J9 g8 h" k6 d4 \' U - LDA #$0F
4 G. y1 G6 d' g8 w1 c- ^ - STA $4015
, r' j/ U) Q' _2 e, |" u' X0 h - .ENDIF
* Z# ~, D8 V- u* X4 i" ~- A - / Y' K# r; A' {' { |5 l4 A
- RTS
; L0 [( k6 A3 r - 2 f3 D8 G5 ~) T, @
- ;======================================================================
4 f/ d/ p$ W/ p2 P - ;重启处理
# Z) N8 w1 r5 S - Reset_Program
1 H) W: l8 W$ {8 |2 G0 j" t" k - SEI: u+ i; Z9 B- U) u
- CLD g0 H& \+ F& U$ V) z
- LDA #$00
- r; L; a0 {$ [6 C - STA PPU_CTRL
: ~2 U/ a8 a" q" A - STA PPU_MASK2 s( ?1 B$ J3 m$ T. P I+ B
- STA JOY2_FRAME
$ e) e5 S. z; m - STA APU_STATUS
c' S8 r! w6 \, K f3 G/ W - 5 ?7 i+ R5 j! f- A j4 |6 q$ ~
- ;等待屏幕准备完毕
4 z8 V- v7 |) A! F0 G1 C: I - LDX #$02
z5 [: `$ C+ ]1 o" Q: U1 f - .Wait_For_Screen_Ready
' _8 }6 q4 L% a. P3 j, C$ [8 F e - LDA PPU_STATUS
2 m9 q+ E; R8 m# ^/ P - BPL .Wait_For_Screen_Ready
7 I" I- t' J& [! w4 m - DEX4 c; y( \" E3 s7 m
- BNE .Wait_For_Screen_Ready6 u' {2 u4 k T q# O4 k
- . K# u& n+ p, r: I2 {) v4 Y0 _
- ;清空调色板& ~: m* {* ~# _) m! V( e
- Palette_Clear
8 H2 v4 S& j7 q, L) d: B2 z" w - LDA #$3F
/ Z# z6 `' ^4 w2 r# X - STA PPU_ADDRESS
4 h0 g/ @1 n, Q t& h- | - LDA #$00- ]: S( }# z" k |+ J: t1 n& U7 n
- STA PPU_ADDRESS) K! z8 V. Z3 P7 q. h% c7 b$ M
- LDX #$20
3 `# j) _; S6 L5 [ - LDA #$0F
2 F) c/ M/ A( W0 _1 V/ t - .Write_Data& r! I2 ~$ Y2 C+ }" N
- STA PPU_DATA
4 Z1 h+ M4 d1 G0 U - DEX& \4 |+ ]5 [" A( }8 h% E
- BNE .Write_Data4 b! E5 n6 s5 w1 l, c$ g
- 9 K( a+ m* R& U3 ~6 f- R
- ;清除声音 $4000-4013" f) P. U/ ~% U% t/ m' C& s8 y
- LDY #$14
% {2 v* n$ U, y- {) L5 Z) }" \ - LDX #$00
4 ?% n& z' V6 l1 j4 M5 W \1 ^* o) Q - .Sound_Clear
4 ]" y1 c+ j3 t1 [2 k - STA $4000,X
, S# F: x$ O" D/ V3 V) g( }, J - INX
/ H/ E+ x8 Y6 r5 g2 O( _, z - DEY
8 i; \( R: X# X# D& k - BNE .Sound_Clear
* j& t; u. P' U8 C8 n4 N4 n P -
5 ]* C; g7 c# O, T - ;清除 RAM $0000-07FF
9 f, | v# c: I2 h! C/ Q - LDA #$00
% J& j5 {9 g: a: m - STA $00, T+ N2 o9 ~# o+ K! d
- STA $01
0 {+ @- F) _" A" A3 A0 x# l - TAY
4 q1 M6 B- [7 t& c- ]; ~7 B1 ? - LDX #$08
4 e* q4 [0 a* P. G! d3 A6 v7 X - .Memory_Clear
$ Q- I+ p9 V B( |0 U) C - STA [$00],Y
- f% ?8 H, m0 g" Q0 P0 } - INY$ w* p* N0 E$ L8 X# d7 {
- BNE .Memory_Clear/ A4 t4 n+ V) }; x
- INC $01
: }$ y( d% N$ ~" { - DEX7 D1 l3 I9 ?, w! G9 C9 F' I: C4 Q
- BNE .Memory_Clear" t4 s' k h, S: w. y
- + f) g6 l4 M3 x4 f
- ;精灵缓冲初始化3 ~2 `. {, E% S
- LDX #$00
- N3 y% g! ]- y* u9 ?& ]2 {' R; E/ i - LDA #$F82 ~' ^ S. |1 l. }* q
- .OAM_Clear: f% s9 ^! G9 w- p
- STA OAM_DMA_Buffer,X
3 b# {" {/ I/ L4 r6 l4 t: W1 D - INX1 b/ d% H. I' ]
- BNE .OAM_Clear
. Z, h1 O5 ]$ C: |/ S -
( I+ e1 V3 T! o, Q$ x - ;栈指针初始化
. T* F) a& X1 }4 p2 X- ^; q( J - LDX #$FF
, v' N( r7 x# o" T; f* O - TXS
) z# j8 N5 T# B8 i - % [4 [& v* V6 l7 z2 Q" Q' V
- JSR Nametable_Clear;命名表清空
4 A4 V- T3 E4 I+ u6 D - JSR Palette_Init;初始化调色板缓冲
0 Z& L% V3 F$ B2 z - JSR Static_Text_Init;初始化静态文本0 o. J; w' |3 P m
-
# d8 o* s" d3 |! Y1 X9 I4 w - LDA #MUSIC_ITEM_TOTAL - 1
7 p& F I5 |5 V$ z. {9 x, u2 x9 W j - STA FC_Music_Max_Index$ J* N3 d! `3 s9 q i1 ~, F
-
. b9 D* N! A' h5 z6 c& B- a! H - LDA #$1F2 t+ ]2 h4 b. M- ^, o8 e
- STA APU_STATUS
; Q m% }! I1 w6 h# n1 m - LDA #MUSIC_BGM - 1( s. P; \+ ?+ x
- STA FC_Music_Index
5 T7 _: m& @: {1 F( H - JSR Music_Init_Process;音乐播放/ q0 h( O4 } R, n+ r0 C8 n' |
-
2 X" V: q! V6 z - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
3 N" r% Y" C9 Y( i. t y - LDA #$1E
* \" t2 m4 n8 _' M - STA FC_PPU_Mask_Buf" h5 ^' _, F' z7 n* }2 M
- * C9 i& j7 B3 [. k% j: G( G& ~2 ]# `
- ;启用NMI处理+ t7 c4 y) G- }- n
- LDA #$80' m( G& w3 r, b) I# c8 v& Q
- STA PPU_CTRL! @8 @) r! T) h% [
-
; c) k, S& m! s3 i+ ~# r7 s. `- R - ;程序循环, 剩余工作交给 NMI 中断处理
8 {" F, W0 v- @7 d) C - .Loop
5 j& X4 D: o M( @5 K8 M/ ? - JMP .Loop
, [: t) H6 f/ N" N1 ~ - ) w4 n, [- e9 k+ _
- ;======================================================================
& M) j: ^9 t. q - ;不可屏蔽中断处理; _% @ K( o! d. g/ U
- Nmi_Program) c7 n3 |, i( _/ R8 m
- PHA% [2 U: E) B) p, X: i- y Z0 N
- TXA& c8 x1 G6 w- c) V8 l
- PHA
" x8 C: m8 J0 O3 A! ] - TYA) `- ^3 b+ g, l3 d
- PHA* Q3 r- c5 s. j
-
* C: o$ U: x$ x; J8 z - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
- R4 Z# e0 S: K5 ]4 K. { - 6 A* b6 |1 Q6 u3 L8 P1 Z9 g
- JSR FC_PPU_Procrss;PPU处理' m/ N8 z* F' e- o! x u
-
: O3 i9 o N* V$ V - ;精灵内存更新
3 x$ c: Q9 h; Y. `: C9 Q - LDA #$00" Z' _9 m& I" \8 q8 c! f# n
- STA PPU_OAM_ADDR
* t \" \0 u, i4 L& w- z - LDA #OAM_DMA_Buffer / $0100& p1 _) G6 `7 @7 O
- STA OAM_DMA
( e& v. V- H, m) J - + o" y0 }, ]8 I# b) y
- JSR FC_Gamepad_Process;手柄输入处理
, q5 t, s9 X. {) T/ ^! U7 a( K - JSR Music_Select_Process;音乐选曲处理% C$ U. k: ]$ {7 I( o3 q% m
- JSR Music_Play_Process;音乐播放处理0 Z* p4 g% I2 u3 Q% v9 D
-
0 G0 Y+ K, K2 V s8 ?7 e - PLA
: s5 H6 m) {2 ~4 l) Q+ A1 @5 b - TAY; x. Z9 f. F, | g" o& N2 K6 N5 J; l
- PLA( d2 M- [+ [. t/ h
- TAX
" ~( k( k& o& u; E: p - PLA
& h/ t7 I" b7 k. _
- N0 _$ Y; U: r% i/ e) R- RTI2 E# p2 H }) D; Q
- # _, J1 c) p- l/ o6 i) U
- ;======================================================================
2 N8 c: C4 e1 f* @) A - ;请求中断处理
5 Z3 S& i% J: P% r1 ^7 P9 w - Irq_Program# E2 l! B: q! ^; V+ @: u E: p& |
- RTI
% I+ M& |! f# o! P& D, v# j7 X
6 C" R" t0 B; |/ q4 F: ?3 n2 j* Z. c- ;======================================================================8 s, N7 [4 B0 c" Q5 z9 v
- ;中断向量表$ B" s( O# i4 e, t
- .ORG $FFFA
) o' V& `" i6 O6 D: R; k - .DW Nmi_Program ;NMI触发时执行
/ o: d! ^% y" W* |" B$ y, i - .DW Reset_Program ;载入ROM时最先执行
3 w0 j# E1 ^7 y# g* i" Y - .DW Irq_Program ;IRQ触发时执行/ e" P: j: b. y% K3 N+ t, c
复制代码
" i1 c* h; t% d6 u t5 ^/ U; P( K6 Y# p0 |" ]; z9 S& O
+ U& @- p8 U A( ]9 Lhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|