|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
' ^+ T$ g/ o! y5 [; T4 n + Q# q& V" g: F: L' g* T
以下是主框架代码:
. q9 ~9 r6 D. ^; l' `4 V8 }- ;======================================================================
& G! ] W" O" T/ O+ D - ;文件头
% d/ }5 I- G+ @& K; h( q - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! N9 P0 j7 r. s1 d - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
: m: q: ?2 g6 N% e8 k6 l5 y - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码( P+ O+ @8 A) Y6 O$ ?8 ?
- ;======================================================================
6 {: g" v B! B, b$ s% M - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
- q' l8 ^7 {" a! m! m& M0 y5 W9 ^ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1; c0 P+ y/ }8 L, w% H9 p8 T) t! P
- ;======================================================================2 p/ G$ _+ x& o: x1 [
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
4 g* f. o8 ~3 s' J - RESET_ADDR = $E000 ;主程序起始地址9 c# T1 v1 C# u3 G7 o9 w9 h
- ;======================================================================
5 c2 N+ f1 }; j p9 p8 t - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
% ?9 c0 L$ @2 ^: ]" U - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB/ D) C) I$ I* f8 s- T
- .INESMAP 4 ;Mapper号 (0-4095)8 y2 F6 Z8 V1 O
- .INESSUBMAP 0 ;子Mapper号 (0-15): @3 o1 s2 ] u; k8 c* A4 f2 u& U2 R$ i
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏). R7 w/ q8 \) x
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)8 L* ]4 r2 M) q! a9 \& C( j
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)8 S6 V' w6 |2 W6 I8 v
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
/ n2 I2 i+ u, ]7 J - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
3 {0 t, G) M. Z. A" C - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)9 p( ~& G7 {$ } _3 A5 N
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
, F! I; }7 b. N$ e, V - ;======================================================================% I, Q' z: N' V) E/ T' _5 @
- .INCLUDE "fc_demo_config.asm" ;全局配置/ p- p6 a: m+ Q0 M
- .INCLUDE "fc_demo_constant.asm" ;NES常量
% }% |& y) s+ W% [5 O - ;======================================================================
1 a- e+ d+ I) C# J8 z+ r D - ;音乐配置
1 m, v" f! c: x7 E5 D - .IF 0 = MUSIC_THEME 5 q1 }* V$ ]+ o
- .INCLUDE "data/music/Gremlin 2/config.asm"
% x" ^: D B4 l2 E% p. D, {# t - .ENDIF5 Q7 N* u% d. f4 _
- , u( Y% T4 E' k
- .IF 1 = MUSIC_THEME
' \5 C( N4 c1 p @9 @ - .INCLUDE "data/music/Raf World/config.asm"
6 J( v" Q; F( V: ]3 A - .ENDIF7 n) }/ `: R4 Y9 r7 A
- 9 P1 ^7 g" }0 d# [3 p( Z
- .IF 2 = MUSIC_THEME " }( F! F7 A& U/ H2 Z5 O- X) [6 b
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
' B+ }4 A+ E( r9 T/ V - .ENDIF
1 Z2 W& Y& V3 e
1 A9 x+ E. r# Q: n( k- ;======================================================================* G3 M# ^# P' I
- ;引用CHR图像数据
5 b& M! L, @6 s6 Y0 v - .BANK NES_16KB_PRG_SIZE * 2
+ w; S* m, `) p) B% m4 q' a - .ORG $0000
* m+ U3 u* B' h. G - .INCBIN "data/bkg.chr"7 B2 \& L5 P/ X5 {, |
- .INCBIN "data/sp.chr". B# R/ W' B; O( y6 A1 z+ Y
- 4 T* S" X( O" G* q1 ^! v
- ;======================================================================
, s5 }6 b4 I2 n: m* N8 W# B( R9 F - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank, i5 D, T8 A, U0 A' D" A8 a$ N
- .ORG RESET_ADDR
# X: V2 @* U2 L8 B - ;======================================================================
1 [- h* ~% F2 h& B5 { - ;引用其他源文件) U5 I1 O" u1 ^; @& m% M
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理* g7 a+ z& b1 ~! w
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理& v3 \3 P8 M* v, ^# s% c, @6 O+ B! h4 Q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 ]# ~& |3 O6 f - ;======================================================================
- ?/ Z2 ?8 _5 ` - " r0 x, [5 k5 b/ _1 I
- ;======================================================================% g! H, @4 l5 g* o2 R. G: l: I
- ;等待VBlank到来# Z1 V; n; O8 P- x5 r
- Wait_For_VBlank% ~! Z! W( `* ]& r9 m: D( S2 L
- LDA PPU_STATUS
, @( A: J' T2 _, i0 { - BPL Wait_For_VBlank
Y$ A* [+ I M* z" A - RTS* |- _: b( k; _. |
" d9 I; `+ j: [/ ]+ o5 F0 z1 ]# I- ;======================================================================; b F3 V- ]$ c0 y1 o
- ;调色板初始化
% ^7 K* [# _. a - Palette_Init$ B2 L% q2 m& J4 k. _) E# s0 S
- LDA #$3F1 l$ S* I4 _0 L' o4 O3 V4 P1 j
- STA PPU_ADDRESS
1 h/ F W/ ]6 V8 S" Q - LDA #$002 D- _0 H* g( k9 I
- STA PPU_ADDRESS. W, S- t2 O' Z' s4 H! M! L
- LDX #$006 Q- y. o4 F( Y
- LDY #$207 S' a1 Y, U2 k- {8 Z+ B6 g/ `) @3 |$ x7 d
- .Write_Data
) A& }3 u+ g4 o6 D; G* }5 x - LDA Palette_Data,X, v7 d& ]' q, a. I
- STA FC_PPU_Pal_Addr,X
4 `( n( C. g# b+ s) g3 M - INX
6 [5 a+ I1 S& O ^7 D - DEY
, N) s& ~, J# u) M( [4 F3 ^ s - BNE .Write_Data0 l3 }/ s5 Z6 @; \
- .End: A2 W% F: h( f; w$ p* H; D" {9 G
- RTS
) o! ]( N: C8 a+ ~
; g1 i) N4 J% `7 z F5 h- ;----------------------------------------
% q( ~- T' _! ?# L - ;调色板数据, R, e. b( M5 q: ], ]$ s
- Palette_Data
, q, M$ C& ?( z2 F# Y - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, }$ C$ R6 [4 v) t2 B
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
/ i9 U0 ?* E' o( d* n4 W - 8 w& i! k$ r* a. S2 X0 M
- ;======================================================================
: f$ o( H$ l+ k x - ;命名表清空, W, T. R3 C, ~, U" S
- Nametable_Clear" k$ E5 D o6 k1 D! e1 d* ]1 A8 i8 |& D
- LDA #$209 l( u, r! |8 l5 P4 q" E7 ]
- STA PPU_ADDRESS: R* V( P) \/ K9 K
- LDA #$00
" k2 F9 U5 Q5 ?; I - STA PPU_ADDRESS7 j' }. I! e& A/ u) [- W
- LDA #$00
0 ^# U6 B" s" V0 j - LDX #$00% f3 x. v$ R' E
- LDY #$08
! R. C* J2 ?4 M' K$ q! L - .Write_Data) h1 n+ @/ G3 A: X( {
- STA PPU_DATA6 F' |+ b- a% b& ^% ?) Q
- INX$ H0 T; U3 p8 M; R1 S
- BNE .Write_Data/ W9 l! b& \8 q2 y. t$ u1 M" M
- DEY$ f5 S6 p8 k6 c
- BNE .Write_Data4 |* L% \ x4 I2 c! w. u9 s V" j
- .End; X. ^3 t I) c! h! U$ d
- RTS
. T& k4 \& R Z' r- Z. Q - % p- X: y8 [+ _: d
- ;======================================================================
7 h& Z3 b3 y% s+ `% e* p - ;音乐曲目切换; ~8 n5 C* X! n1 _! g0 ?: H0 J" T, n* m, o
- Music_Select_Process
7 e$ g H: ]) W. L& A9 g
# j) m. s5 u7 M% @- .Pre_Music;上一曲2 M7 `5 M3 v) q& U! w
- LDA FC_Gamepad_Once @* B: c$ M# ^- v
- CMP #JOY_KEY_LEFT
" w9 w8 R% {8 ]( u# k9 Z - BNE .Next_Music
" A$ t; `& c* H" z - JSR Music_Play_Pre* {5 B# u2 P% B
- .Next_Music;下一曲
& p/ {9 s y) J5 v* g2 |# L# n - LDA FC_Gamepad_Once
9 U( X$ f! O U& U9 A9 ]# C" K; G - CMP #JOY_KEY_RIGHT' g% h7 _5 L# G7 |1 x
- BNE .Next_10_Music
7 F& \& x3 o, U3 E1 x - JSR Music_Play_Next1 g' W- L f) ~) U
- .Next_10_Music;上10曲) N9 F, e, {4 Z3 ?: Q" q; c
- LDA FC_Gamepad_Once8 G* b5 Y2 L" V& b9 S, ~$ v7 Z
- CMP #JOY_KEY_UP
" ~) i& ]( h+ i1 P - BNE .Pre_10_Music
+ D) ~4 J* F) T3 K) e+ t5 ^- F - JSR Music_Play_Next_10
( |" u9 l% L/ \7 Z( G$ \ - .Pre_10_Music;下10曲
7 @# ]3 ], \9 D; T! _6 O - LDA FC_Gamepad_Once, p9 z/ n; q, [0 \3 T* }( m
- CMP #JOY_KEY_DOWN
' N% C, }. k( {9 a5 { - BNE .Reset1 X6 B6 M0 m/ i! h" ]; Z
- JSR Music_Play_Pre_104 b/ Y% |2 _1 y) u9 {; N2 j3 ]
- .Reset;重播当前曲目
( k5 O! h: u( _ G - LDA FC_Gamepad_Once
0 Q# z8 `% O, u: ~$ [ - CMP #JOY_KEY_START: B3 W% O1 I* |$ L+ G5 w
- BNE .End
( z# f$ x. s. X! A5 I5 X/ y - LDA FC_Music_Index
/ U O4 ^: g+ ~3 {2 h& q" ] - JSR Music_Init_Process
, A) A# v3 J. E' o5 I! D3 n. Z - .End
v9 I* F. D; s- S& _ Y1 z( j8 k - RTS
% o- R" M% E% | - 0 v4 p7 J& d! [7 u7 d! ]
- ;----------------------------------------------------------------------' r& r! _( g: U9 {6 J% z
- ;播放上一曲
) D% V( q1 F' b) r9 w8 F( h' ] - Music_Play_Pre: Z4 v( n( J6 s, T1 s$ [% Y( `
- LDA FC_Music_Index% x- e( O7 |* {' k) Y9 Y% P
- BEQ .End4 h# X1 ~; ~8 C+ u% |; {
- DEC FC_Music_Index( a. y) b; D' C
- LDA FC_Music_Index$ c5 W5 O8 _; D- V+ j
- JSR Music_Init_Process
& P/ N# g/ Y& M/ B8 g* x - .End2 g! j, w1 M; R2 e
- RTS$ z+ n: `" ?1 T8 b* _
- ;----------------------------------------------------------------------' }! B) f" X6 i
- ;播放下一曲
9 y5 X1 c% |% j9 I/ F - Music_Play_Next& ?' ]1 l) q. k' m
- LDA FC_Music_Index3 i# u) m* w: `- u
- CMP FC_Music_Max_Index
- h$ _% P" t8 z- F% l& `) n. m+ j - BCS .End9 Z0 L5 r) n' D8 q$ e: V
- INC FC_Music_Index
) `4 I2 W5 l" N& K6 j0 M - LDA FC_Music_Index
9 f4 S$ P2 c- L4 k' }/ N - JSR Music_Init_Process
) ?% V6 o4 Z0 `6 Q9 \. U - .End
+ F& b' W2 S7 h x { - RTS
' ^: i, S0 _0 F" S
2 \( e9 @, W* S, Y, g) F; M- ;----------------------------------------------------------------------
3 p1 k6 G; |/ c' }3 ? e- d - ;播放上10曲% k3 p$ N/ g3 r; f/ I/ y/ O
- Music_Play_Pre_107 U# H% G d0 U# D
- LDA FC_Music_Index6 V, L: W8 |! J. Q
- BEQ .End, e' G7 \6 K+ v! K% u2 ~
- SEC: b8 u6 U; ]7 b
- SBC #102 G5 f. I) L/ N& L1 v* N
- BCS .Pre_10" I% D: a. X/ p- E7 q) h! T
- LDA #$00
5 u- L1 ~, p( R! v: E4 X - .Pre_10' }2 w/ H+ j+ _9 d: G
- STA FC_Music_Index
" a! q- A) Y7 t+ |5 T4 m - JSR Music_Init_Process" f6 Z! F4 j& u/ Y( X9 L; E
- .End' }+ G4 F5 M7 _& _9 B p6 l8 T/ \
- RTS* k1 m7 ]+ q, F! w
- ;----------------------------------------------------------------------
$ I( ^ y; i6 k( m( N% K. p4 j - ;播放下10曲/ t8 @1 e- ~+ M( [ g/ {
- Music_Play_Next_105 O4 E; V: b$ m% k
- LDA FC_Music_Index
- ?. r6 ?2 \# `* x& ] - CMP FC_Music_Max_Index' z2 S* A/ r" K% |# _. D6 A" A
- BCS .End+ U; d% m! e2 v& d
- CLC$ R. d/ n3 [' v: H( j3 x
- ADC #10
; A# l, w. K* I - CMP FC_Music_Max_Index3 I4 ~+ m" ?$ y* v& p6 g
- BCC .Next_10- j: {2 b9 C! x6 w% V
- LDA FC_Music_Max_Index
! I, M6 [( Y; \7 i - .Next_10& Y! |( G$ ~) x4 ]8 O2 q
- STA FC_Music_Index
6 Q: D1 K/ O! `! y" h; b. [. H - JSR Music_Init_Process
1 J4 S6 M# s' P3 @ - .End
6 q1 `' X- |) d& }) B" r - RTS
! p- `8 Q3 a. O! o3 N
8 c& a7 W4 i5 G2 }) e7 o5 B- ;----------------------------------------------------------------------
5 G t y: }% Y6 d6 k - ;8位十六进制转3位十进制制" N4 K' q+ E! E" q) c/ d+ {, F
- Hex8ToDec7 ~) |# q5 b* {: T3 g8 z7 r' D8 k
- STA FC_Dec_Data_1
/ `7 Y4 r i. Y/ H - LDA #$00
, B+ q+ c* w/ m+ ?2 D6 J$ u" L3 { - STA FC_Dec_Data_1007 ?$ ~1 X, k2 |# ]: L3 n# @4 c
- STA FC_Dec_Data_10: ^( {1 B& K% y% p; Q; e0 h
- LDA FC_Dec_Data_1# W& w( n; P; g8 x3 z3 F
- .Convert_100
1 t0 @0 ~% G! c6 Q$ w% S - CMP #1001 F3 w) F/ u |1 h" W
- BCC .Convert_10- h# e* B) `6 J$ d4 ?9 \
- SEC
! E& g7 p5 e! `/ D( ] - SBC #1009 }( V& H5 m( Y( F
- INC FC_Dec_Data_1002 [- i; b5 @9 y( a; R& C( E( Z
- BNE .Convert_100
2 G8 x8 ?' I7 y - .Convert_10
9 s( B/ U; d5 U& d+ S - CMP #10
% ~& o8 W: d9 w2 r - BCC .End1 X$ u6 B$ @; s3 @+ a$ H* x& n
- SEC- u. @! N; ]2 ?# q
- SBC #10
2 u) V# N* Z; }8 ~7 K! G$ f3 y5 A \" S - INC FC_Dec_Data_10 H1 y8 Q' d5 ^ W
- BNE .Convert_10 l/ u* i4 K* g4 B
- .End/ k* T8 z+ [$ u! y
- STA FC_Dec_Data_1
1 R+ X' k" D" c1 M - RTS$ o$ R6 a2 K& V8 e
- 3 J8 U7 C2 W$ Q4 P# y* Z& B% N
- ;----------------------------------------------------------------------
* g: G$ L, D# {' h0 r1 N8 z$ a1 { - ;显示曲目信息
0 e- @0 l2 z1 d- P H - Music_Info_Display
) P' P2 O8 U4 M0 p, ]% C7 N; V/ Z - LDX FC_PPU_Buf_Count- n ^: g$ u$ c6 O% c* T. M
- LDA #PPU_WRITE_MODE_CNT_LINE. R% p7 |( |6 g- L
- STA Use_PPU_Buffer,X
m V0 S, N& N* x: P. { - INX9 }0 z7 b( T l! |' R, h4 a
-
+ ~5 h7 q, ^" C - LDA #>MUSIC_INFO_POS+ Z' x& D8 i6 j' [0 i+ G
- STA Use_PPU_Buffer,X
4 `4 q. F# p" l# B2 d1 O& u. s9 [# U - INX
_2 P4 j e# e% s* V4 ?( s -
T3 ^. `3 R Y) o - ;居中
# Q7 a0 K5 p4 f, ` - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2( z/ m% D) `2 U
- STA Use_PPU_Buffer,X' A. ? |7 h: U7 f7 A. h4 H ?' w( `& X
- INX
; i9 L3 J4 o. s- d3 x! W$ B - 9 M0 q: D$ x7 }7 P6 h
- LDA #$05
' r; ^7 W) i1 Z, t; u, B# p7 i: @ - STA Use_PPU_Buffer,X- c& ?9 l, M( \- R& o0 o. {
- INX( i# j/ P, `) i# P0 D
-
% f9 l; z6 _& I - LDA FC_Music_Index
, n/ x$ ~# @3 Y1 B; y) c* J8 v% D - CLC
9 |& B( M, J& P - ADC #$01/ H2 \" i3 T4 U! i# L& }
- JSR Hex8ToDec
5 u( c! W0 A- ?" A5 e -
2 e9 Z$ `( N m. w - LDA FC_Dec_Data_100 W4 S# f, ?% l: y
- CLC b9 `) [! T- l2 f5 n
- ADC #'0'
7 O6 K/ B! o; p* s3 d - STA Use_PPU_Buffer,X
6 s& L; e+ S! T - INX* [# O z( ]$ {% P5 V. V
-
: O! ]8 X% ]9 o8 `$ t - LDA FC_Dec_Data_19 T1 H2 d, c$ k3 F+ Q: I! v/ q
- CLC8 e( s) o8 V0 o1 w! i( X
- ADC #'0'; K) R( e& U8 v+ B* K8 U2 y1 C8 |
- STA Use_PPU_Buffer,X9 C( K9 w3 Q7 p: r r0 [1 o' {
- INX
/ L: R" ^8 G8 N - - |. P8 G0 _* U% T8 O
- LDA #'/'
( K& ?2 v" j. S - STA Use_PPU_Buffer,X
; [' x* @- M$ g: I' @( Q - INX: P6 z. T7 _; T* _- {1 o, J
-
8 f0 [* L- U2 {8 X7 q" L - LDA FC_Music_Max_Index: X: U: ~5 ?) `: R; J0 [2 b1 d1 U
- CLC# P ~4 a5 B4 A5 _
- ADC #$01% x$ }5 U" U+ Y0 {# T: T; M
- JSR Hex8ToDec) u& B6 Q; J- W3 n
-
- ^9 w, {7 r% f- ?0 Q9 S - LDA FC_Dec_Data_10, J# M5 m" n' d" I
- CLC
. }) V) i' }2 L& D- g. J - ADC #'0'' M& k- O* S% j( T, z! o
- STA Use_PPU_Buffer,X
" u& Q' f3 ^4 R0 N. x- C - INX' t& S5 I* S* Q4 G& _ O8 g4 H
-
! {% _/ d8 O& d- E; p! H( t/ n% e& J - LDA FC_Dec_Data_1
8 H, `( g2 P$ ^8 n/ ^ - CLC
2 p# r8 {0 o3 o/ g D - ADC #'0'
6 e x3 W! w3 P4 a' F" T5 U - STA Use_PPU_Buffer,X
. h; ^ x/ j R - INX
" x' o, f9 N$ n, i/ f$ ~ -
/ T2 ~6 n( c$ I; ~+ A& \( p - .End
; s+ W7 t7 ]/ I6 Z: u) R - STX FC_PPU_Buf_Count
; Y$ g! r% |+ {6 U/ z6 Y - RTS" f6 J5 k7 c9 m
6 ~6 A' V9 q# m1 o- ^7 a- ;----------------------------------------------------------------------! N2 q) k$ A% E; ]: {0 |( j9 |
- ;音乐曲目初始化处理
- @$ ]# c+ e1 M+ C - Music_Init_Process
5 k2 X+ n" ]- q - PHA2 o1 P2 [9 Z7 @: M1 ]2 P
- JSR Music_Clear_Process
! x9 A" T0 B0 }8 @$ P - LDA #$1F
2 V) C, R0 ~8 `; B& t - STA $40153 g% y5 X3 O' F0 ^
- PLA; z0 Z+ t( i' ?- \6 X
- JSR Music_Init_Addr
6 Q2 ]8 w8 A ^0 Z. q, M+ o% F0 C. ]! _ - JSR Music_Info_Display: x+ j" J5 T. _1 I+ x" \
- RTS
" Z2 v! q7 _0 v7 T7 S9 f0 m; a
, ~/ o4 k( C' w7 \! ~! d5 t- ;----------------------------------------------------------------------+ z* q B0 i/ d
- ;音乐播放处理
. A9 w) m0 q+ b - Music_Play_Process
$ D. X& o% G+ a - JSR Music_Play_Addr N" j. |) U% F; ]3 k
- RTS
; c, f* Y5 V7 Q8 @, R
" R+ Z# z8 ?; [# a5 Q5 i. y- ;----------------------------------------------------------------------
: M; ]$ A* [8 i0 I# n* L - ;音乐播放处理, P5 w% e) S o, x. {
- Music_Clear_Process
5 i% F5 ^- X1 W3 m: T, @ - .IF Music_Clear_Addr
2 V9 a. c' B2 p$ K, J2 N$ h - JSR Music_Clear_Addr. o) {; h8 N c9 F
- RTS- t7 U% t. @* J0 a
- .ELSE
' Y4 N- [/ U, r2 Z2 z, f" O- v - LDA #$1F6 ^. o5 h/ }0 A$ f; Q8 ~
- STA $4015" V2 n0 D& t4 e+ h U9 h/ I
- LDA #$00/ [- m: o8 c) | C
- STA $4010! z4 ?/ G/ }9 U! X6 q* b$ p7 g
- LDX #$00
% B* T$ }+ h9 ^2 k - LDA #$00, F0 n, T+ X2 n! l' t: z+ R
-
" ^/ H2 s3 Q9 K& H" M7 O - .Music_Clear_Zreo_Page_0
. d5 D& L v0 T. F - STA $00,X2 ~2 o' Y$ t5 }
- INX, f/ e9 e7 x0 Y
- CPX #Use_Zero_Page_Begin2 W" I7 {) R* |3 t
- BCC .Music_Clear_Zreo_Page_0
' l, p% g6 U" M$ N0 n -
/ `0 `; J6 e$ m - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size7 h& S4 u" g6 z& h5 C1 p$ J
- .Music_Clear_Zreo_Page_1
' |9 ~# d- q: e5 A" o - STA $00,X
" Q* Z1 v9 ^5 W5 s% r3 d+ U6 p - INX/ J( B& d! w- r/ E
- BNE .Music_Clear_Zreo_Page_1! y/ G2 V) R. B4 a' Q4 W
- 0 H0 ^2 Z+ a9 ^$ f1 ^
- Music_Clear_Process_1
, u. E8 w9 B/ o6 q - STA $0600,X
# s& L1 m9 j6 J Y# d& B9 Z - STA $0700,X
+ N, p) d! g' X- }4 X! J+ [7 f - INX
0 m$ q M. c7 [9 ^; D0 U - BNE Music_Clear_Process_1
& M r& X* V; R/ B; `! y - LDA #$10" y c7 b5 u0 M/ E0 V' i' G7 v
- STA $40003 ], i! t' Y' h, Y4 k, g% {) n( j
- STA $4004; d4 o2 {& ^" N9 _3 \* h
- STA $400C' U2 }1 u6 Q; m/ _: s- t+ Y
- LDA #$00
+ R: U! G( k5 o9 k& W9 m/ H - STA $4008
. D4 m# t6 y1 k1 }& g - LDA #$0F
# g" e5 O( m) d Z G - STA $4015
! V* c% M8 B* A, U; _) n) j: C9 k - .ENDIF! n) e9 f' y$ {+ m/ [2 f
-
/ M' P5 E5 [2 A9 H - RTS
5 ~0 @* y# M) P: H
. \" G) S2 K+ L; T8 N% F$ T- ;======================================================================+ Z- h6 i5 | R! j6 x& S
- ;重启处理8 a% D! z8 N" W- L3 O! Y9 V
- Reset_Program
2 r4 _7 |5 S' M6 r! I6 Y - SEI
. G% g1 |, ]1 Y s A - CLD8 E- h E; f# k, N
- LDA #$005 j0 j7 K# r0 o1 j( A2 ^
- STA PPU_CTRL
7 u) f2 C7 f n+ z - STA PPU_MASK
* [. G' S! }# ]7 E+ ^* ]) D8 O - STA JOY2_FRAME7 Z- m& S7 [2 A5 S2 b
- STA APU_STATUS6 l1 m% I: O; {. i+ d
- 3 M+ @- i0 Y" K! ]5 s
- ;等待屏幕准备完毕
$ F X1 V8 n! W5 Z2 l% B+ @ - LDX #$02
, b* }+ j# U) ]- b; ~1 W2 V9 Q - .Wait_For_Screen_Ready
% T8 J. I5 y; D. _( @, q - LDA PPU_STATUS# N: l4 i7 a+ E! {! R" L
- BPL .Wait_For_Screen_Ready$ ~% k4 t- x, W4 k) @
- DEX9 ]. F% i- |* s; ?/ K
- BNE .Wait_For_Screen_Ready
% @! `: |5 S1 H7 S4 i0 r, p( z0 O6 | - 8 W2 X) {/ R* Z' @- y
- ;清空调色板8 K `# C+ B, C/ S, h
- Palette_Clear
8 y8 F/ ?6 |3 g: C! ^% n - LDA #$3F; O+ [0 ]2 q& y* @ g2 {
- STA PPU_ADDRESS' `0 Z( R/ Z' _ S% J0 d
- LDA #$00) U! s+ c- z- m/ |# P* s* h
- STA PPU_ADDRESS, b ~' r( _# N% ?6 C+ l8 l
- LDX #$20
/ m/ ~' o% @3 J5 q D - LDA #$0F" O8 e) {8 X1 e
- .Write_Data) a' y* g! n- u; q; h
- STA PPU_DATA
, w9 C0 b6 b6 S- p3 d a$ o - DEX3 B$ i: X) V! g( D5 W! q$ X
- BNE .Write_Data
, M( o& B: A" S& \
9 [' t* l- z* s: ?' A* p- ;清除声音 $4000-4013
" r4 y6 M$ C9 P - LDY #$14/ F3 |+ ^* }( ~* {( a2 E
- LDX #$00- C/ Y* F) I' `% o6 a
- .Sound_Clear- E+ Z: B3 L3 j4 t9 o+ B
- STA $4000,X
' A; e- j# |+ B5 t' ]+ {4 u7 g% V - INX9 F$ Q) @7 H8 g) V# }* P$ L+ v
- DEY1 A- y; s5 F7 }2 A% n6 J# B% j
- BNE .Sound_Clear
- r# @$ Q% C/ Z& b9 x- m -
# O6 j/ |& T/ Z) ~. S* Z - ;清除 RAM $0000-07FF
+ U6 y- Q$ t% s3 w$ D# L: L - LDA #$00
6 ^/ l0 W7 t" ~. s6 } - STA $00
3 J; t" j% _, b - STA $01
9 h2 e% \+ \) E8 r) h O+ V, T: w - TAY
3 Z) ?; w8 {2 M$ ? - LDX #$08+ z i2 x: D2 z) F" n! O
- .Memory_Clear
4 E4 c4 ^: i/ q$ F# c5 i - STA [$00],Y
+ }; b" P+ p: U5 j& z - INY/ }" [( T- p: S0 O% k
- BNE .Memory_Clear
0 c9 F5 P v5 I% G - INC $01
# C! d, s, `7 U$ }, U7 {6 F - DEX
( L0 e( E/ J3 z7 O; r3 d7 x. f6 ?' Z - BNE .Memory_Clear8 ]# ^4 \5 T1 S2 `
-
( a$ z1 q" R1 }' | - ;精灵缓冲初始化
. i$ y- N; B4 N* y' J( @9 t - LDX #$00
2 p: x( f8 p2 B, J6 X& F8 }' p% t6 l - LDA #$F8
. r; s" M+ {: @+ M - .OAM_Clear8 j# z) \2 w: | u$ ]
- STA OAM_DMA_Buffer,X
) q: @, r# m0 A6 }% |0 O - INX: I4 I1 ?7 J- I) \; _- U
- BNE .OAM_Clear
8 X2 f/ V2 P' _4 D3 c! E - K) T: S. i$ f, \3 y! f
- ;栈指针初始化
& ]! y: U1 D+ v - LDX #$FF
- [. a* m/ D( M/ e: o/ V6 _ - TXS& ~ \, u% @1 @8 v( V
- 6 c3 }; q k1 r0 ?2 g0 r& d
- JSR Nametable_Clear;命名表清空
7 u/ [( S2 l& ~- D - JSR Palette_Init;初始化调色板缓冲
* Y( R! B, r5 G3 d& x# L - JSR Static_Text_Init;初始化静态文本& q* X. i' b9 H% \$ z& b
- + G+ z- w" e( c/ A. z! A$ |
- LDA #MUSIC_ITEM_TOTAL - 1
! Q! d: I: u3 A1 y& z - STA FC_Music_Max_Index
/ P) q4 Q! m$ B* d -
* a. o: Q. c% g# v - LDA #$1F
$ _2 T2 ~* n7 `0 y - STA APU_STATUS. `& w) R2 z# Y9 h7 n, k
- LDA #MUSIC_BGM - 1
6 m6 E; w) X7 }! U% p# X - STA FC_Music_Index9 l: a( k3 C5 y% Z
- JSR Music_Init_Process;音乐播放
' z2 S% T* J4 C# m. R7 P7 N: l - : [0 U+ U5 Q# y+ J
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
5 I5 l( t! e4 r7 P' {4 M p4 ` - LDA #$1E; S+ M- f5 x% S1 F* L
- STA FC_PPU_Mask_Buf
5 n' h8 W5 s" u0 s" t -
6 ~6 t, d! A; _5 C) _. a - ;启用NMI处理
. f( A4 c! u! I/ ~+ z, T# h) E - LDA #$80
6 @- Z4 H5 z' E1 E - STA PPU_CTRL
' A7 ?# ]; e8 _, K4 C) { - & a) A- ]7 N9 U1 ^- J, F1 Y
- ;程序循环, 剩余工作交给 NMI 中断处理
$ g6 O0 F& \8 [/ [! }0 a - .Loop9 j# T) I# k# F. y; D
- JMP .Loop
& u$ ^3 Q: H7 M u; \8 P$ @
% j- a( H) l$ E4 P' _- {/ n( k/ R- ;======================================================================
/ T% }; W2 ^7 S, @ - ;不可屏蔽中断处理
" [0 ~+ k5 B# i, |( w - Nmi_Program
$ n l9 e' g) T! ~( N i - PHA
5 c3 L; c1 a( O& R, A2 Y+ } - TXA
4 O4 F% ~( B, b7 D) n+ L - PHA
* f3 ?' |: t! B: x - TYA- `7 k8 O9 Q0 H+ ?- U3 i
- PHA. k) J4 n9 F7 t4 A1 [1 `$ T
-
" ?( s, q$ E9 V - LDA PPU_STATUS;读取使得 PPU状态寄存器复位% g# ^# r0 X- H: D1 t" @# S
-
# L+ A/ w; e0 I( R( k" R9 B - JSR FC_PPU_Procrss;PPU处理+ }4 r8 T" U- O- L
-
: J2 A/ z. O/ E9 G$ q: |. u: B - ;精灵内存更新
/ Q D# R: ~+ W* r9 ~2 D1 b - LDA #$001 W! E4 K3 W2 g5 J
- STA PPU_OAM_ADDR+ F/ q( S" Q( }3 B
- LDA #OAM_DMA_Buffer / $0100) _" N8 X: n+ L; X* z: R2 j
- STA OAM_DMA! C6 N0 M4 J# P& J1 d, k
-
3 A ~. |. g {1 Q7 \5 e- Q - JSR FC_Gamepad_Process;手柄输入处理# E+ o3 a. W" }- U8 c8 b
- JSR Music_Select_Process;音乐选曲处理8 ]2 u1 I, }+ O( K" k# Z. E
- JSR Music_Play_Process;音乐播放处理
' ]3 y/ Z# S2 \" v3 `6 n4 U+ _ -
, e5 Y D8 k% |, R, b' Q2 d - PLA
6 p: P7 W7 L; Y5 e/ { - TAY
; z2 R! y9 S9 D - PLA( Q0 V9 V3 \1 F" W
- TAX
& U/ j2 \% m. o3 m1 n# L - PLA
+ I5 P& R+ v# d( b" {
6 @4 t3 `; [5 d0 ? _- [- RTI
z$ `! P/ b4 s( H" G$ C$ Z1 A' m' S - 1 C' O$ J: H) ^: r/ ?' {2 [
- ;======================================================================
0 k6 t! o3 m- U8 \& K. b8 y - ;请求中断处理
~- T$ ]5 _* d- w5 g& d - Irq_Program0 n( Y- E/ ?( e( k4 @; i1 [& g
- RTI8 n3 Q5 o* T% X8 Z
- ) e! W2 w9 l. K6 o! c9 J" \
- ;======================================================================3 g; u; e9 ~% v+ n
- ;中断向量表
4 C3 R) \. j' U: L/ m, } - .ORG $FFFA
/ e% y3 A: X- N" ^; Y* P2 s - .DW Nmi_Program ;NMI触发时执行, s- z9 M V. i
- .DW Reset_Program ;载入ROM时最先执行8 Y3 t% F3 C! _, U, c4 N, G# e
- .DW Irq_Program ;IRQ触发时执行
0 Y% C7 q. f- h
复制代码
; x" D+ H, S5 F$ {0 T+ g
- j" t G1 Y7 ?" r- t% `* T' _* B# x8 Z# b7 T2 o# }
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|