|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下/ i5 l i1 [, g% }# a7 W
0 w5 ~- G0 r' w) F" v
以下是主框架代码:, A" E( V8 F/ Z7 @4 q2 g6 ?
- ;======================================================================
# e6 M. {; i3 Y: r - ;文件头
; X4 W1 V' Z- q6 [- N* R - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量5 W$ v. g( w# m Z( X
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量0 Z) j, g6 _3 C& o. ~" [6 ~
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
: h+ w8 F7 }/ m: E& z9 j$ W - ;======================================================================
1 n, Z/ k) z( f$ o7 K& K$ J( ? - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- t/ N) g: G+ f0 S+ |
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ M) X3 p4 i# h: p - ;======================================================================
7 i; X/ | V) W0 e+ g( b - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1( R3 O9 ~ v' X
- RESET_ADDR = $E000 ;主程序起始地址9 c2 n0 e! @$ i
- ;======================================================================
# l0 F3 f0 b2 ^7 O* k, z7 X7 G - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB4 V. f/ p+ [# j! K
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
5 d! w3 R& ]- \4 Z' y - .INESMAP 4 ;Mapper号 (0-4095)
2 ~& L) u. u0 R( B' l) D% }) U - .INESSUBMAP 0 ;子Mapper号 (0-15)- x+ [& g2 q& h2 R' i3 \' S5 M0 s
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
; r2 r& P7 { g7 \! z1 m3 X - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. @9 d0 z4 Z8 \. T - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)- D: E6 p- T8 S3 y
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)) A1 ^! U" t4 p5 n+ }0 T2 {- t
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
$ O7 v1 f, {: |3 C) T e5 Q+ a! M2 e - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
" q5 U; Q) i8 i7 y4 R% W" |; ] - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
0 @/ ~- D! q6 D1 I8 e2 c7 V - ;======================================================================
0 [: P) d+ }$ K - .INCLUDE "fc_demo_config.asm" ;全局配置" p+ t4 V; E- r3 ^) z8 h- A
- .INCLUDE "fc_demo_constant.asm" ;NES常量0 ? l w" V# z4 H6 C
- ;======================================================================
4 `6 h- P" o# E - ;音乐配置
$ [& G0 P2 N* m$ i7 V! B - .IF 0 = MUSIC_THEME 3 B* p, }# b. b* f3 q8 Y( |
- .INCLUDE "data/music/Gremlin 2/config.asm"
i/ D6 T# [0 b - .ENDIF
. X9 q$ D4 B0 l, y - 1 l, ?, n b: u' |" g5 h. D
- .IF 1 = MUSIC_THEME
& S5 I& A% h; G6 W& Z9 T - .INCLUDE "data/music/Raf World/config.asm"7 u; a' p: a) T* c1 L6 o
- .ENDIF1 I; C) V6 X8 q
-
2 [6 P: e, a' Y% N" r$ a - .IF 2 = MUSIC_THEME ! f- _9 ? W; y. ]
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"" Y8 C1 ?$ ~7 l5 A
- .ENDIF
6 {2 s# @6 K. U. Z& t( F% i
" J" Z+ c' F0 ~) o" l' S( C' [1 C. K- ;======================================================================
/ C! c4 i$ l+ L0 \# W - ;引用CHR图像数据; `; x- Q: @# s
- .BANK NES_16KB_PRG_SIZE * 2
+ w. Y- q8 T9 k' h# b - .ORG $0000
: w" Q# ~6 Y1 f6 E4 _ - .INCBIN "data/bkg.chr"
8 |, T+ _5 B. v: @ - .INCBIN "data/sp.chr"
8 J: ~ v" L1 ^( V - # {7 S; Z3 R0 g0 u
- ;======================================================================% _6 n* p. l# |* d' Q" q y5 J
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
6 o0 i7 l: {0 g" p - .ORG RESET_ADDR
q1 q5 S2 M% }# A( k1 L& G! H - ;======================================================================
/ I1 ]0 i% B1 w8 p8 N/ Y - ;引用其他源文件
( S4 [+ C2 C8 ^ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理1 F7 D V. |0 B7 d
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
1 W" z! q9 I- g/ h - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 ?) i, z- W! F9 n8 k. c - ;======================================================================
/ X( E6 V: b/ ?6 F" p* ^5 x1 Y. r8 x( c
0 K7 d* m9 h. U- ;======================================================================5 ]1 f7 ^, M4 x7 L$ T" F+ T
- ;等待VBlank到来
t2 m8 K; n- t9 ~ - Wait_For_VBlank
& K1 H% p9 f0 w; m* P$ Z* c - LDA PPU_STATUS
: X7 C3 r5 z0 R+ y - BPL Wait_For_VBlank4 ^" @9 W! |+ b6 K8 H6 e
- RTS
3 J& V" L- E7 W- }; Z* ?" x4 S - 4 |! c z' g- b$ @/ e5 R
- ;======================================================================
1 T5 j) M7 _2 j, J# e - ;调色板初始化3 f) C% I) A' E
- Palette_Init
# q8 b2 C. J. A* E - LDA #$3F
3 c" H5 o7 f5 t2 |( v - STA PPU_ADDRESS
2 [8 O* _, l) F0 d, _* D9 U - LDA #$00& R# _/ d$ u9 A3 p. s j5 \* D: v
- STA PPU_ADDRESS8 W$ v7 v7 ]; @8 P7 v6 X
- LDX #$00" S9 v( Z8 y# y5 v# w: f
- LDY #$20' U" T/ V0 l4 L1 L- D7 I" M) X: H
- .Write_Data( p2 R5 y0 l" A) x5 G+ q
- LDA Palette_Data,X
, D2 f& F( H4 c% x. y - STA FC_PPU_Pal_Addr,X# b* W3 @8 ^; n# E
- INX! G8 v9 _ Z9 O
- DEY$ L% C# _ l" l# H! z
- BNE .Write_Data# v. ?6 j3 t- A# c7 ? i
- .End* U4 n w+ W! I& h/ Q
- RTS
( ]# K+ Q8 o4 B; T# ?4 U3 m: { - 2 F& m" r4 }; S0 l- D) T( ]5 H, K, Y
- ;----------------------------------------
: I0 F' i. X* Z x6 O! d( x. [ y - ;调色板数据$ T! q, d& \! C% q
- Palette_Data# a: ` \7 A( U
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
9 R' ?# x5 D- Y9 o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
5 a% i1 X, o5 {* ?2 V - 0 ~+ a- i/ [' \2 a% z9 q
- ;======================================================================9 j5 ~7 Y$ p! o
- ;命名表清空! x! b' z+ [1 e7 e: @! x
- Nametable_Clear! L/ E" a$ m& v9 X: D
- LDA #$209 m: o! ^5 f( M$ d6 N0 O' Y
- STA PPU_ADDRESS
2 c1 l0 u; ^# D2 c' T: e - LDA #$00
5 A5 ^! W3 n8 I" L2 O - STA PPU_ADDRESS
! `" j& U% n, x/ K6 n - LDA #$008 s- ~% q4 e7 u' Q6 h! c
- LDX #$00$ U5 _. N. ^* f% ]( f2 Q9 H4 C
- LDY #$08
9 R" V# }2 P# x - .Write_Data8 I* Q- l: I0 d, o; d
- STA PPU_DATA
3 `/ S8 o! O- b - INX" F0 I9 Z# [8 A- n5 l
- BNE .Write_Data
, v2 Z" h+ h: H0 D: o" A - DEY) s) t% l A7 E/ N7 H% b. d; R
- BNE .Write_Data
6 T% i; ~* m s. A; i# P - .End* e0 H) y& w4 E3 N) c
- RTS( b9 [& R; r; G# o9 \* u
- 1 b: p! l* w" G* g( M+ ?
- ;======================================================================
! a+ e) J4 u4 x+ l3 J' I* T - ;音乐曲目切换9 V9 d0 p- _6 O
- Music_Select_Process! ]- @, O2 @ q
7 Z& y0 {5 ]# U6 d) g7 F$ E- .Pre_Music;上一曲
% o) ]# D: Y+ K2 R% a - LDA FC_Gamepad_Once
, r( F& W! D9 @% @ - CMP #JOY_KEY_LEFT
, e3 N# | H5 u+ { C) T6 @, H - BNE .Next_Music
: i: |1 K9 ~& R S, r/ i - JSR Music_Play_Pre
* K; F1 Y0 a9 i: W3 s - .Next_Music;下一曲9 v6 W0 I0 [$ l6 @; J
- LDA FC_Gamepad_Once. e& D1 r. J( o) v# I0 n" n2 p; ]
- CMP #JOY_KEY_RIGHT# s0 T% X2 c8 o7 c
- BNE .Next_10_Music
8 q- B4 a" z& h - JSR Music_Play_Next
4 `. N; u2 ?) ]3 a; z - .Next_10_Music;上10曲6 E5 I; V3 x4 E( \! w
- LDA FC_Gamepad_Once
/ s7 ~& C$ A/ D; t - CMP #JOY_KEY_UP) g# X, j, a8 K O5 Y1 Z
- BNE .Pre_10_Music/ Q" J' h' j" ^5 d$ Z* D. J
- JSR Music_Play_Next_10
5 h2 \$ N# t$ e7 U) y - .Pre_10_Music;下10曲
7 W7 V; w' }6 O3 P; o4 l# ] - LDA FC_Gamepad_Once* p2 d7 Z, d) o) j- B% C
- CMP #JOY_KEY_DOWN
! y6 k+ V8 a! P% ?, X - BNE .Reset& `- V% S( f: R- l
- JSR Music_Play_Pre_10
$ Z! X: ^" U- b! ? - .Reset;重播当前曲目
o& n9 P9 v+ X2 ?: ~" e2 g& M - LDA FC_Gamepad_Once7 D$ p( ?' d. V) _) s
- CMP #JOY_KEY_START
) A3 i4 K" |% V - BNE .End5 j! {# N0 h. A* D9 P
- LDA FC_Music_Index( w' {4 i" B$ G2 l
- JSR Music_Init_Process
% u6 V- B. M/ P" k: ~/ T& D- M/ g - .End
; {- M! k; p4 M+ y1 `: ` - RTS8 C6 ]9 p+ q% n3 a% T$ U
- # U& o# B2 r1 s( s; c. F5 F' d
- ;----------------------------------------------------------------------& t, f4 ` s3 H1 A
- ;播放上一曲* k1 n( |& b, u; R! y6 l
- Music_Play_Pre3 c) C+ @, |+ m/ I4 Y# k0 ~; I6 S
- LDA FC_Music_Index
+ B# e: S3 _2 Q1 [# S - BEQ .End7 E( E4 g) H0 ?- J+ g( E
- DEC FC_Music_Index: [& ^" d" t ~; f0 ^6 H
- LDA FC_Music_Index
@# |/ Z/ {0 Q; k - JSR Music_Init_Process5 E3 U/ u+ l* }8 i9 Z+ Y
- .End' I; U, A# c* H+ q
- RTS
+ k1 u6 L5 L) `1 N/ r - ;----------------------------------------------------------------------
6 l3 z/ U+ z$ T2 P - ;播放下一曲
: f, Y$ i2 A/ x+ H- b - Music_Play_Next
8 A4 Y3 C% p1 y g0 D$ e - LDA FC_Music_Index8 G) v Q5 _. P
- CMP FC_Music_Max_Index* v9 j+ k8 \. a5 R/ _ Y) @
- BCS .End
- g+ ]: `2 A0 {; B3 ? - INC FC_Music_Index" T: U4 S1 N, n0 |6 k* w
- LDA FC_Music_Index7 w' P5 w4 s! M3 p' x6 {
- JSR Music_Init_Process, T3 I. Y3 }& k3 o& B1 y
- .End$ W, K4 G% O( o" \* U; ?& }$ ]) \2 N
- RTS# c0 R2 m% [6 M0 H, L
4 s+ J, M# n5 l1 A$ f& W. \- ;----------------------------------------------------------------------2 I0 h% W. t% X! P1 s2 G
- ;播放上10曲, a7 Q& O7 u3 S7 f2 J
- Music_Play_Pre_10: J3 G) L1 `/ L9 i5 n3 x
- LDA FC_Music_Index% z$ A7 r& k' d- D2 U8 a
- BEQ .End
/ s1 n! k9 A9 u: d5 s - SEC
~% {4 c: Q8 u4 s+ ^- M - SBC #10- k6 ~9 P9 |2 a
- BCS .Pre_103 `, W9 _. ~) W0 B
- LDA #$00
4 i* K7 ]' M6 x# j, @/ l - .Pre_10+ E/ g* i! @$ p7 r9 O
- STA FC_Music_Index2 w- |* j) w5 j9 c
- JSR Music_Init_Process
: j% F! H* w9 S - .End6 E4 }! J2 i# R t6 s! }
- RTS: D8 {2 f7 \ V! I# h: D
- ;----------------------------------------------------------------------
& `) V: |9 d+ b+ w - ;播放下10曲
6 r6 z7 K3 f; ~% U6 v - Music_Play_Next_10
4 Q/ K: \( G: q& Z1 G7 P - LDA FC_Music_Index$ d: e' E- `, u7 B; w
- CMP FC_Music_Max_Index( j& O/ H3 u- u3 C- T
- BCS .End- h1 m8 [7 q$ o4 R
- CLC
% M6 ~8 }7 l* f. q0 j8 ?. {6 i - ADC #10
4 `( C3 e. ]$ }" d! r - CMP FC_Music_Max_Index* Q; \6 D/ [# ]2 f. P
- BCC .Next_104 o; F' a7 P7 [) w
- LDA FC_Music_Max_Index
' G) q( h3 o- ^9 f" Z; d4 N - .Next_107 p6 D Y3 R* ?5 }! b
- STA FC_Music_Index8 `% x+ ^% F. ?! U4 S
- JSR Music_Init_Process
& W! V3 o. K5 a( ^$ I/ e - .End6 W" e* Q4 d; l( @ B
- RTS
! Y( w' Y3 c3 i4 R! A - ! v5 b6 |5 m$ ? D0 u7 m. F; x. ~
- ;----------------------------------------------------------------------5 g- M4 }$ [ s8 w2 l2 ?
- ;8位十六进制转3位十进制制+ K# B+ n( O$ O+ X! J
- Hex8ToDec
" e9 U" W ^) |/ I* F - STA FC_Dec_Data_1- i; w7 ]0 ?* e, r6 n2 W* J a
- LDA #$00
( p+ e5 q* h1 |. a6 O- d - STA FC_Dec_Data_1005 o; ?, B5 a8 _
- STA FC_Dec_Data_10
, U1 q) F0 I& @6 u# a - LDA FC_Dec_Data_1, n: d% C6 d$ r6 T' a
- .Convert_100
; w# K: I) X; X - CMP #100 @. p# O! X6 q% t" t4 Z' z
- BCC .Convert_10: Y% D: W4 Y0 B$ y7 `: z) |' @$ ]
- SEC% ^* n/ [9 R3 a$ o
- SBC #100- ^: a, ~) C- T8 o- n. s
- INC FC_Dec_Data_100- P/ J, \" M! d Y
- BNE .Convert_100
+ Y8 p3 O# |' i - .Convert_10
/ m: D2 y3 J0 B, h6 b, Y2 \) ^ - CMP #10
& n1 z; I3 r9 k- G - BCC .End
$ ]1 ^ P8 O d) Y- Y. N& b: c - SEC" Z6 q( |8 X" q
- SBC #10
! B' u4 S# y$ [" x; c2 ], O - INC FC_Dec_Data_10$ X) J. k4 h0 J/ f- v; A' f E
- BNE .Convert_10
' Y9 t4 }: i+ `. @7 I1 O) E - .End
! d* [% A; N: T8 S6 B8 z/ D - STA FC_Dec_Data_1
1 K* Z+ f* I" k' ~2 T - RTS8 U) q8 }, m) o9 w* J( x7 [+ b
# [ b' @6 J* J. N9 i/ |- ;----------------------------------------------------------------------, T4 i% f" e! w. Y+ J0 N
- ;显示曲目信息" R O* O% V! I- u5 ^
- Music_Info_Display5 ?, v. ?: B* g) p
- LDX FC_PPU_Buf_Count: L3 S; Q% h: g* _3 o
- LDA #PPU_WRITE_MODE_CNT_LINE
. w3 O* a1 D, M C - STA Use_PPU_Buffer,X7 j, I0 X% w5 w% l# D5 [" H; C
- INX1 F' t' X2 @( m. ^, k
-
/ [/ Y2 o! s$ t! n, C" m9 Y4 R - LDA #>MUSIC_INFO_POS2 Y! v4 ]6 L# f, ]
- STA Use_PPU_Buffer,X& L2 }* o- h. `% J; U" y! @. f# B
- INX% S! B& \2 n. x/ R2 i* C8 m' H2 {
- L6 P h' o$ N( e& ^ D
- ;居中
% m2 I$ ~5 S7 }. M$ v - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
! j" B; I2 P0 F) N - STA Use_PPU_Buffer,X; E+ C' G |" n% a) t
- INX2 d6 V+ Y3 Q/ Z9 p& T3 Q
-
+ U1 y' O. ?4 q# X* R6 m9 s* ~( `+ i - LDA #$05
$ `1 v: G: u( q& {6 u - STA Use_PPU_Buffer,X
* ^( U" \: z! n1 b" O$ i! Q* A$ x - INX
a7 Q+ _- G @1 z5 F+ I, U - 6 h1 Z) Q/ s! D
- LDA FC_Music_Index, X/ A& U) P( j u
- CLC6 s) p" l+ Y: O$ J$ ?+ ^8 V
- ADC #$01
: K+ I, f% Y: z: _, o! _% d( Y - JSR Hex8ToDec
9 L: C6 j) v) N1 ~5 x -
$ @) n) h/ i, \1 R5 U - LDA FC_Dec_Data_10
- Q P: N& P8 s5 F - CLC
0 G% Y- d1 z7 y6 h* ?( o Y$ S: { - ADC #'0'8 } ^7 f5 `4 z F. x
- STA Use_PPU_Buffer,X
4 C0 \/ G- `2 s: | - INX
: ^3 N3 A5 s& d. _* ~. P - # X u" u( j6 |3 s
- LDA FC_Dec_Data_1
& B2 _" K# o! M: c - CLC. V1 U* A* U/ _% y9 ^( B
- ADC #'0'. o) J7 I" `1 X; y) p
- STA Use_PPU_Buffer,X
7 k8 W0 o; G: W. d! x$ y - INX7 ~: x1 s" f7 x$ ]( F2 Z% Z
-
( F4 O& X2 \, d0 f1 F1 }, v - LDA #'/'
* v% U. U, }4 D- F9 \, r+ e' G. t - STA Use_PPU_Buffer,X; c0 ^3 q U; U
- INX
5 W I* a. o+ P) h - ! q- q, h0 m# t7 D. p! {
- LDA FC_Music_Max_Index+ O# `/ P7 _4 B V0 Y* f
- CLC
4 ~! @# v% o% ?9 b' u8 Z - ADC #$01* r& [4 Y6 p9 S% S* z0 q4 J0 `
- JSR Hex8ToDec7 n! x3 E) H/ i5 g3 P {; P
-
+ B6 Z" N! F# Y8 ~ - LDA FC_Dec_Data_106 \. S/ c* r# X' D
- CLC
0 g4 v5 `# n0 f" f" e8 }( u - ADC #'0'" g8 v: [+ G1 e; v6 L
- STA Use_PPU_Buffer,X
6 a' J8 H4 F% I+ \ - INX4 x0 u/ {4 [. L+ l: [
- ' ]; h; c. w6 a# W: k& V( U# w
- LDA FC_Dec_Data_1" }# r I |5 S/ N- H! w9 A
- CLC+ t" c: Q3 N5 e( u! d9 E3 r! l
- ADC #'0'
6 V. I4 h/ D7 b4 [, b- F - STA Use_PPU_Buffer,X7 ~5 z& a3 d* J" S9 P6 ]* s2 n
- INX
/ ?' ]0 n) Y) Q+ g1 b# M; [ - $ O* M) y. ]6 _( Z* x0 o
- .End0 K/ d! B3 r# G: `9 R) C% T$ \
- STX FC_PPU_Buf_Count: C. {/ Z p5 l8 ]3 C
- RTS# ?# | |1 X% G8 A2 f8 e
! c) j/ x5 e' {( W4 y- ;----------------------------------------------------------------------
3 Z9 G( W9 B; F - ;音乐曲目初始化处理6 Q3 \* {% d7 x2 P$ O0 U
- Music_Init_Process
& u9 t7 X3 b) A& f/ z - PHA
4 F. i* |" ~- U* T) ?; ? P+ h: w+ V - JSR Music_Clear_Process
0 A2 |5 |- {2 F - LDA #$1F; r3 m* R& t; a
- STA $40150 _3 z% a5 K. V- d0 d
- PLA: q7 `8 A5 n( p
- JSR Music_Init_Addr
! h) c4 I- H+ }) {/ U1 B( k+ s; s; h - JSR Music_Info_Display
- I# k% ^% V# C$ N8 Y - RTS
8 F. G* n1 i$ ^& U/ { - ; y9 Z' t! }3 I# a" z
- ;----------------------------------------------------------------------
' c. E' i+ `; B% {# z - ;音乐播放处理* L% P$ j9 b' c. }" L) [
- Music_Play_Process; S( m- v/ N2 L4 ?
- JSR Music_Play_Addr
; f- v2 r& ^' p2 r G - RTS# A/ N) ~% d! @1 m* d4 g
- 4 Z/ B' k1 X/ V& ?( \
- ;----------------------------------------------------------------------" H0 t6 e' n, D6 U! m& u5 ?
- ;音乐播放处理
& O" Y7 @# Z C z$ U - Music_Clear_Process
! x+ C/ ~+ u: d - .IF Music_Clear_Addr2 T# R) l/ o; c4 F2 F4 g
- JSR Music_Clear_Addr+ T4 s( A* E( z+ a1 U
- RTS- D! F. e$ S% Z' T
- .ELSE
; L- z/ ~. Z) V( M! t7 ] - LDA #$1F
$ S+ a. j& x7 |% Q: g7 W! Y1 J8 | - STA $4015
+ [9 J8 |0 W& m# k - LDA #$00
* n6 L/ [( T/ n# u; W - STA $40109 ^, P5 v M* v; X
- LDX #$00
0 j+ I: j- ^" I/ K5 z - LDA #$00+ f" i; t2 t- ]1 w/ t
- $ k# u7 b" @# @' |* I0 @
- .Music_Clear_Zreo_Page_0
3 v% l( g; Q6 Q - STA $00,X
" F' ~1 _( x& S; Y- s - INX
. E1 T: `* v6 W6 Z9 } - CPX #Use_Zero_Page_Begin
& v1 n1 t! Z* n; I: U9 ? - BCC .Music_Clear_Zreo_Page_0
4 }6 q" ]) D- C5 \ -
. l* m8 |. z3 U! O: O/ x - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
6 n0 W! a8 @: a, W# u+ I3 f- L - .Music_Clear_Zreo_Page_1
) `# u8 J* _! R# X# M& \0 Z& [+ K8 o - STA $00,X( I: K% V; s2 m% W- z
- INX" h' B/ j4 w# x: i4 s
- BNE .Music_Clear_Zreo_Page_1$ Z8 W0 X0 q7 }5 V% U2 a
- ! O. ^- c3 f6 w6 h0 u- m
- Music_Clear_Process_1. v- p( i, L! l' Z8 m
- STA $0600,X1 E3 I7 ?& k2 ~( d1 K+ \$ q6 ?
- STA $0700,X
( h. F; G. |- O; R; e - INX" _0 ]4 S3 J$ \2 Q: J8 B/ u
- BNE Music_Clear_Process_1% F) {7 s8 n# q' o: \% Y; l
- LDA #$10
* ^& ` W! ]' D9 x" q3 c0 m7 [ - STA $4000' @% d' `: A: L0 M7 ~$ |* E3 d
- STA $4004
9 Q- Z: m+ x5 ?1 W1 }& ~0 X - STA $400C3 E$ y( i. h# b" y: G
- LDA #$004 K o6 C9 X3 i4 y# O2 q
- STA $4008
' u# q. q# O7 c - LDA #$0F$ g3 p7 m/ i9 A8 s$ E* H% v
- STA $4015
6 w1 [* B+ U# g; z ~1 C/ w - .ENDIF
. y+ D+ b% M! r( [5 Y - 8 P9 X" D: ` L7 `% S
- RTS h" y* t% x- o) i1 ~$ b! j
6 g! W f) c |- Q/ u7 Q8 S- ;======================================================================
a, Q4 l# X5 C8 S - ;重启处理! `' Z5 K6 f/ P- n' [
- Reset_Program
) w- f. s. t1 ~. p2 D' G2 M - SEI& @0 F5 `1 @) m& x# [" n
- CLD
% d2 v. l. ]- X0 e \ - LDA #$00
: ]2 e1 c- Z6 b - STA PPU_CTRL
/ b, a% a. ~) j5 M. k - STA PPU_MASK
. C5 H$ {( p+ R) L+ _ - STA JOY2_FRAME
. n2 m( C& D" s; V! m% d - STA APU_STATUS# H2 i8 {, E. G W- L8 m/ R
- / L) r {6 |& {) c$ T' h% ?
- ;等待屏幕准备完毕) s' T8 Y$ Q( c6 K8 G/ \- _
- LDX #$02
& m2 ]+ Y1 g: B; m6 S) B - .Wait_For_Screen_Ready
% Y$ W1 B7 W8 P/ {# P- K) X' Z - LDA PPU_STATUS
; v( E. V& ]2 X% Q - BPL .Wait_For_Screen_Ready
* i5 A- L1 H0 m+ J - DEX" t/ x, L6 t3 I1 z8 n
- BNE .Wait_For_Screen_Ready
) _ v- m! O) ]8 y3 ^ -
3 o8 s7 ]3 ]& Z* R - ;清空调色板* O/ F b: S4 Z& p, \, Y
- Palette_Clear R" u ~! O) @6 V* I
- LDA #$3F( w& p4 r$ e& ^( N; Z
- STA PPU_ADDRESS1 O0 x) R" W- W% @; x( n, f
- LDA #$009 [5 J9 l! v a
- STA PPU_ADDRESS
. c+ R" _- `) G. u# e - LDX #$20
+ R3 x# p) w7 J! H+ n/ C - LDA #$0F
x8 w! L- M" _* o- g4 a - .Write_Data
3 `1 m/ f( R) m: d# Q V5 e# }6 Y - STA PPU_DATA
" S* J8 H5 O8 w! y( v - DEX
6 l) E) r( {2 A2 b6 _& s - BNE .Write_Data
. I8 Y' U. f1 P2 F
; j* X3 d: O4 n$ z* ^( i- ;清除声音 $4000-4013
1 U j; N; l& e: @5 M! W - LDY #$14
! T( v* {" Q) k$ b5 `& y - LDX #$008 H. w P1 P3 F2 S2 ^* N& n
- .Sound_Clear
# N- d7 H; ~" ?& S6 V - STA $4000,X
8 G( b9 C7 k4 i, E- M) r. i - INX+ |' r6 B6 l' F, Y" z" l/ U, ?
- DEY
/ ^6 ]. [6 }2 d5 p4 n" t+ I - BNE .Sound_Clear
0 {7 p) i9 P# N% J: q - ' w( b% P$ C5 [- J$ ^3 x- o' I4 i
- ;清除 RAM $0000-07FF C% r8 n3 g: Z7 j6 u( b5 x
- LDA #$00
' \' m. w/ @" j' B" c/ V' L - STA $00
: e/ y8 g% e2 \; j% F- P - STA $01( t3 U; k2 E0 k: @! a9 u! q
- TAY
) Z, U7 G# p! W* l9 z- G7 c, Q - LDX #$084 A7 v+ ^2 E' ?# T1 |7 ?% M
- .Memory_Clear4 o) ^5 N4 ]* D; n: g
- STA [$00],Y
( ^- G- O1 U; w/ m - INY6 B4 y5 Q( x9 u6 w3 T2 D
- BNE .Memory_Clear
. ~) d- c8 v* u) i+ B - INC $01
0 Z/ s& b4 a6 Z( V; k - DEX. ]: g% t8 ]& h% i% S7 j7 j6 x
- BNE .Memory_Clear: d2 Z# x+ E+ }5 o4 [/ ]' t7 y
- 9 T/ d# w, `: @: W( Z1 u# b
- ;精灵缓冲初始化; T) u- y% g0 z! a E5 c% I$ E
- LDX #$00
5 s/ c/ C \1 Z" \( B+ ~- d - LDA #$F8
' w1 }$ f M1 F+ \, E* ? - .OAM_Clear/ p" v- I. ~" @: o3 q
- STA OAM_DMA_Buffer,X; P5 @6 R6 C6 S, [: w) H" U5 h
- INX5 e. T. ]2 Z5 s. c0 C- Y+ z
- BNE .OAM_Clear
+ Z) m, T& r. { x# X -
4 q$ x" e' Y+ f' y- z- k5 W; n - ;栈指针初始化 X* k& k1 ~; [+ H* `' w. M
- LDX #$FF
2 w+ T1 \9 M$ c - TXS" |) P8 k0 F* N: `8 O7 Y
- * E! M$ ~& p o1 v3 K- O
- JSR Nametable_Clear;命名表清空
) n n( I; r5 v" p4 x - JSR Palette_Init;初始化调色板缓冲
; ^% u6 h5 m$ c! u1 o6 }( y - JSR Static_Text_Init;初始化静态文本. w3 I1 n7 q. x; Y$ Q
- * B! G1 |$ p% z
- LDA #MUSIC_ITEM_TOTAL - 1+ E* a# D: p- H
- STA FC_Music_Max_Index
: ~4 G4 P3 V+ L: [7 _) a- ^ - $ j" X8 b' {/ ^% G* A1 m
- LDA #$1F. @2 y+ B0 n' @- i" U; R% M9 ]
- STA APU_STATUS
! g! g: I5 g' k3 f% \3 l - LDA #MUSIC_BGM - 1
' `) ?# h7 n7 ^" p8 @( F7 j - STA FC_Music_Index
# M+ T$ X3 [8 ]6 `" _ - JSR Music_Init_Process;音乐播放% \1 N$ q( |. l; o$ T" k
- 4 K7 J% e8 J, |% v9 y9 D$ C# e
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态) T5 h9 ] w: C3 ~' l! B
- LDA #$1E( x% t; d% z6 f6 ?" M0 P: T
- STA FC_PPU_Mask_Buf9 X$ I$ e8 E T8 q: z+ s& a) d/ G
- , C" w5 e, t0 t) D' H' v, x) E
- ;启用NMI处理; K N7 x. ?4 N" j8 J! v& p
- LDA #$80
# c. \7 K. m1 f" [2 ]/ Q# D - STA PPU_CTRL8 [4 r% I" x4 \8 \: y
- * U/ w. V9 v2 e' |+ C
- ;程序循环, 剩余工作交给 NMI 中断处理5 J# t7 O3 G- I' d/ U* g
- .Loop
. b8 N6 U) {) ^( d+ {6 z2 n - JMP .Loop
^8 {. v# ?+ r' d4 Q - 0 [# y! ~0 u5 n2 l* F& g
- ;======================================================================
G- B2 p& b* u- @# j% f& _% ]1 _; \, u5 W - ;不可屏蔽中断处理8 l9 d2 h! T* Q$ ?" v
- Nmi_Program' [/ L1 _3 @% k3 e$ \1 Y+ H
- PHA
2 s5 U$ W' n/ r8 g, ^6 X - TXA
" ^9 z! T. U6 O) \, [ - PHA
) Z& r. ^$ Q: _4 _, V - TYA. Q* |4 V: K e
- PHA
& _1 X, `3 \8 y6 l! j, i4 p# H# R$ ] - 6 n v; _7 Q5 @* K. t/ t
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位$ D0 m" F7 r E L( r3 n6 D0 k- o
-
8 I8 _8 ^: r; j! Y0 k - JSR FC_PPU_Procrss;PPU处理; b9 F. S( V5 n3 o1 _: H% O
-
. z4 ^( J, i0 _9 o& a( T$ L" U - ;精灵内存更新
2 S5 Z$ Y( q# a/ s- a& L - LDA #$00
' S) s1 V+ f" L9 d# y) [0 g - STA PPU_OAM_ADDR2 ]0 v6 I' ]1 o' i6 Q1 m3 g0 o
- LDA #OAM_DMA_Buffer / $0100
+ q, e# |4 ~. w0 e3 B/ o - STA OAM_DMA
/ D3 E/ o; Y8 g5 {, W& V; f, |, U s( Q - n/ ?3 y4 s9 J9 l: g
- JSR FC_Gamepad_Process;手柄输入处理& u* F! |9 j% H" A: X# e3 k* ^5 L
- JSR Music_Select_Process;音乐选曲处理
/ Y9 W4 Y1 A( p1 o7 G% E - JSR Music_Play_Process;音乐播放处理
% g" {. u" J7 J" { - : e5 G! u9 Q* K( W! L
- PLA
1 M; X' x5 w: ]. d* a) J - TAY, y- ~- B3 y f( u
- PLA
0 O N" N) T; T0 u0 T - TAX
8 B! n! L: z: n' f+ \! E - PLA
8 d2 Q: C; ~" q7 V) J6 e$ m - ; \+ [0 E+ ?* M2 X3 x% O
- RTI
" i8 b0 F: A( K& W - % d0 |" X! t! R; I3 [
- ;======================================================================
/ M( t9 q/ T+ N8 F9 }& e - ;请求中断处理
4 h! y$ v+ y5 X# S - Irq_Program
9 \! b& y! D8 r, h, j( K - RTI1 ?4 w x% ?0 S8 G8 K% E
" |3 n" }2 p4 Z3 y+ U( L2 ^- ;======================================================================) T% I0 Y9 O N/ P
- ;中断向量表* K3 G: m1 ^6 z# S1 K8 F. u
- .ORG $FFFA6 ?9 ~0 m, T9 [% Q' ?. ^ m
- .DW Nmi_Program ;NMI触发时执行
' {8 y6 c0 U5 d - .DW Reset_Program ;载入ROM时最先执行' s+ F7 ^# F: u2 c
- .DW Irq_Program ;IRQ触发时执行
: I+ y3 H. n/ ]3 q5 R
复制代码 4 [' b: G2 X& h3 \! O( v8 c
4 u/ q! J9 I6 P
) O+ t, v& `) K# xhttps://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|