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