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