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