|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
# j* Z n& L: V5 E
! x1 I, W9 X9 Y2 y' e8 A+ [以下是主框架代码:$ V! q% s3 `4 C8 `3 i O. V
- ;======================================================================9 R0 |' n0 C; b# X
- ;文件头
% k, g( I' D% J3 Z7 s - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 U8 e& ~! ~, C5 I6 B. [. H
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量* k6 }- ~" R4 f8 f6 b, y5 G3 n
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
' @; c5 j" }+ q) a/ t6 _ - ;======================================================================" g1 G1 x- w5 r" b/ h5 w( f
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
% {4 b9 v2 }1 ~( c8 v- f7 K - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1# M6 j0 k* p9 v9 b
- ;======================================================================8 ]6 z% H) V- I$ i8 a
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1' J4 O& m' b$ p7 E
- RESET_ADDR = $E000 ;主程序起始地址
Q, k/ q, } }- {7 y - ;======================================================================6 W6 [9 L* @* u
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
8 y# c/ j# e' N2 j - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB$ `, ^$ Z" F# O) R- Z% V: ?
- .INESMAP 4 ;Mapper号 (0-4095)
' w* p% {5 c2 O, @7 F: H# ^' I - .INESSUBMAP 0 ;子Mapper号 (0-15)
: ~! J4 d8 b2 N B. j2 T. d - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)( A# O$ }7 M6 v6 D* X" y, x
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在) ^8 v7 C" U0 x; e8 N8 P' l0 r9 x
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
6 \ Y, c* w+ N - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( v. {1 X- \2 P' r
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)5 b2 {! w+ T0 |: p8 |6 ?' c
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
: U3 a' X+ H. c3 k5 e6 n - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)5 t1 i! A) C- Y9 s" a" ?# I3 `' D! a
- ;======================================================================
$ H+ ?2 j1 P) z5 V: M3 \ - .INCLUDE "fc_demo_config.asm" ;全局配置
- a5 o! n' v, H& W. ^ - .INCLUDE "fc_demo_constant.asm" ;NES常量3 z4 k) L9 ~* a- d
- ;======================================================================
6 L! h5 u8 s+ M - ;音乐配置
: q- h$ ]7 @2 Z. h$ T - .IF 0 = MUSIC_THEME
* k& i% s2 S S - .INCLUDE "data/music/Gremlin 2/config.asm"
; G! b. c4 t7 T, B3 \ - .ENDIF
8 n2 Z- E4 P& N4 Y - , E( m- f/ l' i4 L+ Z5 T w
- .IF 1 = MUSIC_THEME. U+ T4 ^9 ^ Q' [& W1 @
- .INCLUDE "data/music/Raf World/config.asm"
! M ]- `! U/ d$ H4 \ - .ENDIF
) a& G1 ~2 G5 N( D1 K - ) l2 z; U% r! ~7 ]7 H, s8 \
- .IF 2 = MUSIC_THEME ) I2 } l- }# @7 |- D
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"# i$ J* j2 J7 l7 A: I+ P
- .ENDIF8 Z) {: }5 P, [+ `) N3 u8 I
- 9 s* ~( e- O# D
- ;======================================================================
1 r9 K1 g/ h: Y - ;引用CHR图像数据( m1 w+ t4 u x
- .BANK NES_16KB_PRG_SIZE * 26 q7 l1 \* c; [& V/ t. L3 D
- .ORG $0000* i0 B/ u; o$ C# F& ~8 J7 b y
- .INCBIN "data/bkg.chr"
1 R& o* u, {* k+ r! } - .INCBIN "data/sp.chr"
; {; |2 d) \. Q2 P+ U6 R \ -
) z* |4 C6 i' @$ z: ?- m/ a - ;======================================================================5 \( |4 P) y6 R% r. Q3 e
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank+ m2 y8 N- A9 ^. ?' C$ }6 S
- .ORG RESET_ADDR
/ n' @& r8 l$ D3 s - ;======================================================================, r$ V, o9 s7 K% w; N
- ;引用其他源文件& e9 h* ~2 _. s7 N2 I
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
5 U6 N ~9 D9 q2 [ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
0 P: [7 Y. D6 a4 H! F V - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理! Q% [$ Z2 ~: a" m! n% F' |$ M
- ;======================================================================
$ x( d- H. C9 S' d
8 r4 m! l8 S7 H, A' B! U- ;======================================================================( w% m% L4 \- J# z% z
- ;等待VBlank到来, U' R$ C: X0 n, [/ q' y
- Wait_For_VBlank0 v& `5 U1 Q" q. V
- LDA PPU_STATUS
7 }! `- W: E8 ]$ u7 N - BPL Wait_For_VBlank
* Z0 c- q! O( k - RTS
! o/ u$ [- b( k( x: t
/ c/ d2 X0 ?7 [ V5 T5 K/ V6 [" t- f8 y- ;======================================================================& d6 G6 a, }, k1 }9 A; g; s
- ;调色板初始化
3 k; x) Z# M& d0 X# A! _) x - Palette_Init
4 i8 e4 v8 q/ A) F5 {2 o - LDA #$3F. w+ o( X+ Z% A* M
- STA PPU_ADDRESS& f: k) s, n ~
- LDA #$00& j( u5 p" ]/ M/ a
- STA PPU_ADDRESS
! R; q4 t& i0 k/ ^4 v0 _ - LDX #$000 _ m( j$ `$ L" A4 P* O$ T
- LDY #$200 y( B) n; R6 f' U. O
- .Write_Data
; {. y$ F( d0 a% j$ }( I1 @: e - LDA Palette_Data,X; g8 p4 ~ D+ v+ k# y# s
- STA FC_PPU_Pal_Addr,X
7 O. q* n$ n- S p& X - INX
7 B. {6 A/ z1 A( z$ M0 K: ~ - DEY
' R. ^; Y8 Y* p - BNE .Write_Data
- X/ ~5 e8 `6 @) M - .End+ _: `; H3 ^5 s! m0 z8 y
- RTS
. B( h0 I9 m! ^/ w! Y! d8 @' L4 e/ U
$ \, v: }6 Z2 |$ f+ Y, c3 b- ;----------------------------------------" t( W/ R3 G0 h+ s- v
- ;调色板数据
8 N1 |' S, a8 `% ] n9 H/ p& L - Palette_Data
! g% N9 i, \% i: C% b - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B' g1 n' V2 @$ c! b- X
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
( a; i" e" c1 d' p& { - : `) ~5 }: e! Z* I2 x1 @
- ;======================================================================# I; E+ c8 ?" f# D1 | u
- ;命名表清空
1 a: D( Y m# a+ a - Nametable_Clear* M4 i( N$ w: S) R' V
- LDA #$20( P2 ~4 X7 J6 q/ {
- STA PPU_ADDRESS
$ O' U+ L g4 ]0 j$ B* ^" G - LDA #$00- [0 h; U: z6 w9 w; N6 {; Y8 h, G
- STA PPU_ADDRESS
, p+ W0 x, \- W4 Y - LDA #$00& l% K/ v( @0 `! f
- LDX #$00
& N2 ?" i E. {6 B i! C6 h - LDY #$08# P0 {4 ?6 ^0 `1 P6 S5 U1 x2 E
- .Write_Data+ r$ c+ h+ Q. i7 ^5 q6 R+ }' P
- STA PPU_DATA
) g2 l% y9 u) q; }9 r( g, `2 t - INX
" J2 c! j" a" _1 q# g - BNE .Write_Data
- O$ M$ G3 H1 i. z5 s2 d - DEY! `$ `. O7 r3 a) H+ ?- K
- BNE .Write_Data* f5 Q5 h. r& k/ R
- .End) i) y, f2 k5 P: ?
- RTS
4 g( e# n, C# [; A
T# r& N# g6 k5 S9 Z5 B% Q- w- ;======================================================================
1 b6 S! P& d: P3 m& }3 Y# L - ;音乐曲目切换
- G( j( D" c1 K U8 S9 G - Music_Select_Process& h8 N8 O( G. M: F4 p, a, A K4 j! U
: W# J- {8 ~1 a- .Pre_Music;上一曲
8 ^( m( m5 y" k. ^ - LDA FC_Gamepad_Once
( `8 o" }% s8 d { - CMP #JOY_KEY_LEFT
9 x$ |; ]% p) d( V% l% q - BNE .Next_Music- o& m/ [" b2 x' ] M5 Y
- JSR Music_Play_Pre
$ I' F+ @( z( h u$ m0 u* Z - .Next_Music;下一曲' @$ J h O- R: R d `
- LDA FC_Gamepad_Once- F: N/ x0 d8 C1 C. r1 U
- CMP #JOY_KEY_RIGHT! f$ s$ c2 o: H f2 H2 ?
- BNE .Next_10_Music- ~. t' l( k0 E' }* U
- JSR Music_Play_Next; I5 U7 B2 c1 ]/ o; P% y4 [# L
- .Next_10_Music;上10曲
; u. Q8 t4 K4 @ - LDA FC_Gamepad_Once
' n# Y7 J" m z( H6 `" }; G" w - CMP #JOY_KEY_UP6 v. b$ Q5 E/ O! k8 _
- BNE .Pre_10_Music( G5 m5 }, I! s- }- e: N( g7 W
- JSR Music_Play_Next_103 l) I& k$ g; x9 I; l2 q6 \( r7 T
- .Pre_10_Music;下10曲* k, O S4 v( a* [8 Z
- LDA FC_Gamepad_Once
, W# u2 c( z$ W! N6 D - CMP #JOY_KEY_DOWN5 y5 E: Q. L2 X" V7 H: r
- BNE .Reset
/ _" ?- `' U) m; [5 S1 P8 N, }3 m - JSR Music_Play_Pre_10; I( l8 o, s( Z* U8 T- P0 p | |0 t
- .Reset;重播当前曲目
3 d" A$ G$ i( `7 n' `2 n" | m - LDA FC_Gamepad_Once
3 w6 H1 K# l% a: K; P# @ - CMP #JOY_KEY_START
* K& Q8 Q W% V% _7 C$ Q+ G" X - BNE .End
* H5 F5 e! G" @0 f+ o - LDA FC_Music_Index$ o5 J0 `1 N# h# _! x- H# S
- JSR Music_Init_Process+ M1 o5 k" u1 S9 i/ ]
- .End
% z3 ~7 \! m! N3 B$ |& r - RTS/ I7 }6 e, ?. ]5 ^, P( Y% O- M
- % D" _; s. {5 F( B6 o3 t
- ;----------------------------------------------------------------------" G/ W" h3 ~7 U* [' A& ]
- ;播放上一曲
5 b7 m6 F C' g0 P. R - Music_Play_Pre
( \/ w) }) C* @: m4 V- l1 L - LDA FC_Music_Index
' i5 v9 ]6 i1 ~3 o) P+ G - BEQ .End
& ?' H7 [- l! [1 o$ I! e - DEC FC_Music_Index/ I- }0 C: ^7 r9 q' I
- LDA FC_Music_Index8 |& E6 V3 p5 \$ e
- JSR Music_Init_Process m$ b( y) T2 Y3 f! K
- .End. b9 M. a. C0 e! r
- RTS
, ]! Z; P7 ^/ p+ }0 e; p - ;----------------------------------------------------------------------
! T* f* B& [2 o) D; N* | - ;播放下一曲 _$ i/ I! _' e3 m
- Music_Play_Next
4 E: G& ]+ Q u; b$ M' O. T - LDA FC_Music_Index
8 p, v* O. e7 W' O - CMP FC_Music_Max_Index
7 Z* c1 P ^! p# [2 O0 J% I - BCS .End5 P/ J: A" I/ [+ W A3 S
- INC FC_Music_Index
& Z* o( R& p% @ - LDA FC_Music_Index
$ `- Y6 F# n# x - JSR Music_Init_Process
" _8 q* [8 S6 Q7 @ - .End! b# Y# j0 H; q7 f
- RTS) N" o( o' {/ i5 [1 p
' c& ~, l+ P: p9 b9 l) X- ;---------------------------------------------------------------------- u- x$ P3 {* _" F! [8 Z; o$ [2 g
- ;播放上10曲
8 J* E% {1 z4 l; z1 [& s& M& ?- B L$ E - Music_Play_Pre_10
- T4 @7 v" [% w7 C1 r0 x3 [5 s9 ~5 H - LDA FC_Music_Index. C: b( X/ s0 Y& m" y- E
- BEQ .End) X2 V# g$ P$ t, Y* v
- SEC- O' @- ?& E% c7 V" x
- SBC #104 z0 T. U5 N! ]
- BCS .Pre_10* B9 q1 W [% J, V! u
- LDA #$00
- q+ m7 Z& Q- i* s5 U - .Pre_10
, v: G" G* O2 y, F/ W - STA FC_Music_Index# T* K6 N, \! @4 W" p
- JSR Music_Init_Process9 s% [! y. n& J: m! {3 n
- .End5 N5 }) o% s2 Q' y; l6 `( c* a$ j
- RTS, v8 R, w/ i6 V& k4 c' i: e
- ;----------------------------------------------------------------------
7 r( U* f) l7 z/ o: ^ - ;播放下10曲
( W, o o A2 v4 E) t, e6 O! Y - Music_Play_Next_100 _$ @" ^) [9 j+ { n! y
- LDA FC_Music_Index3 w# j6 M* g1 S8 {- E0 h- ]* H
- CMP FC_Music_Max_Index
8 f( Q" H6 @9 j - BCS .End
, t# Y) ^+ q# M- S4 G - CLC
* U) _5 U5 G( d, m$ p' o - ADC #109 e$ v8 K j, B1 p! ~
- CMP FC_Music_Max_Index
0 q0 q( I8 p( s6 P. x - BCC .Next_105 H- Q8 c9 I5 a" h" a( P$ ]
- LDA FC_Music_Max_Index
! P9 l, ~( b% n/ s3 Y, C5 ~ - .Next_105 V" C8 c* I5 P4 u! E! t
- STA FC_Music_Index7 U* s) B2 T9 k+ u4 C
- JSR Music_Init_Process
. c6 O! D! ]( H% Z! b - .End
9 n8 O# _ C& R( m+ M! S! t9 J - RTS
8 U* Z+ D- h; a! t5 F
' n* H/ H6 `0 J# `6 h5 {- X( E ^ r- ;----------------------------------------------------------------------0 O5 e: X2 n( u. I" u! v) c
- ;8位十六进制转3位十进制制5 j0 j# E* g K9 D7 M
- Hex8ToDec
$ y7 X) M' N4 G2 b( E# \ - STA FC_Dec_Data_1! ~* \1 ~' M: _3 }$ g" W
- LDA #$00; S4 h$ `: |& C9 C! z. y' h! h/ h( g
- STA FC_Dec_Data_100
7 W7 g. d+ Y- y5 f- P - STA FC_Dec_Data_10
+ A8 o$ K# |0 V; \ - LDA FC_Dec_Data_12 K# j# ~- |/ R f
- .Convert_100
$ x" D& d" }& u9 B, s$ D: _ - CMP #1001 ^/ `: z+ H" p. p3 X
- BCC .Convert_10; M( r0 r0 V; Q: |, h8 u
- SEC
$ c* L4 S; S; c7 } - SBC #1009 i: y. n. _7 O3 M
- INC FC_Dec_Data_100 l8 T# S& D1 x* S h6 E9 E% U* F
- BNE .Convert_100
0 T5 w) o3 W4 x$ D `2 V3 o - .Convert_10
% {) H9 e7 O b6 \4 @5 ^9 B - CMP #10
, g: t3 q2 p0 [; p - BCC .End
# x0 b, V6 z) l% ?0 I& A - SEC
) U0 O) ]3 {2 C; p( t - SBC #10/ X8 z6 K8 D. R( k$ f' f+ M/ ~
- INC FC_Dec_Data_10
, \' u5 _8 F) @ - BNE .Convert_10$ j$ O7 a; `! d+ }' y) ]
- .End
7 f- {, F! A/ ~ M7 J3 T Q - STA FC_Dec_Data_15 _( s6 b4 S$ y, m' d9 Y
- RTS+ L3 Q+ ]+ T- S7 l
- ) d( f. x- I2 v& O: |' q/ F+ v
- ;----------------------------------------------------------------------
) }6 ?/ o; }8 B* K4 {7 v, v" G - ;显示曲目信息
- ~# v) i4 A3 o( c# ], U - Music_Info_Display0 G! _. o6 L' C/ w) d& {
- LDX FC_PPU_Buf_Count' | {4 |* b6 ^; W+ ?; k
- LDA #PPU_WRITE_MODE_CNT_LINE a3 ]" |, ^3 _1 U, s8 u* _! E2 ]3 A8 y
- STA Use_PPU_Buffer,X
& t: m1 D& c6 j# y - INX% \& F8 L, ?# Y% [
- - ^/ E# `7 ^0 H' p- V
- LDA #>MUSIC_INFO_POS9 O4 ~! ]" @& w! \) B& \& R7 y
- STA Use_PPU_Buffer,X
/ \! u$ ` b& P: M8 q+ R0 ^( ~ - INX6 @) ?% p! x3 ?: C Z. u! V
-
: i% V3 F# E$ N" Q - ;居中7 [6 y! K$ M4 ]7 c- b% r
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
2 u3 r0 E0 \ @2 P7 k- e) `4 l - STA Use_PPU_Buffer,X1 W4 p/ N) P1 Z* G, V9 p
- INX1 Y1 @6 W. v/ ]% S, h$ ?
- 4 F2 t4 Q8 I- V# v7 b
- LDA #$05$ H# b# g+ _, v, c5 [
- STA Use_PPU_Buffer,X+ z0 H# g& k0 x% H
- INX
7 Z0 x, A7 `7 I. a - - b& _: }- r3 I$ D: I- S5 |
- LDA FC_Music_Index- p7 h2 e6 H( w: v
- CLC
& P0 ^) M8 S" e0 u - ADC #$01: q1 I3 J5 `) q$ s$ B5 z" { e
- JSR Hex8ToDec. l; X# Y* i a2 B8 ~2 ^. {
-
- ?7 ?. Q/ _% w9 N - LDA FC_Dec_Data_10 X5 |( U# ]: H, D/ `& _
- CLC
$ g" C0 s4 g- p5 p - ADC #'0'2 v' Y: t: z: L' M8 ~ j% D# {
- STA Use_PPU_Buffer,X6 X' u2 y. ~: g
- INX7 \6 n a3 W/ F$ _
-
8 m. _5 K! Y1 d4 ` - LDA FC_Dec_Data_1% ]. C8 m8 p: o9 h; U
- CLC
" A8 S* R' v8 r4 Z( n; z - ADC #'0'- m* G7 O/ A) n3 k* i6 D" X
- STA Use_PPU_Buffer,X1 l. W ]1 c1 k0 }. x3 ^* S+ A
- INX# m& B4 i/ W! Z: j( H
-
e( j6 D$ V! z) [9 r - LDA #'/' b) d2 i' g6 _
- STA Use_PPU_Buffer,X
# E. P0 P8 S' Y0 x3 q! W- w - INX
) h) _+ U |* p% W Z1 a* i - / l1 v4 ]( ~* ^4 k% c: g
- LDA FC_Music_Max_Index
3 ~/ `1 B6 C7 J - CLC1 |# s" |. Z5 W/ Y* }. a
- ADC #$010 H6 O0 X2 l3 q4 d
- JSR Hex8ToDec
+ J0 D* ~3 I x% S# V -
/ n: K+ w0 M$ T' {( n$ h- K - LDA FC_Dec_Data_10
7 m# y" y1 j( R+ _- f - CLC
. q0 |! u5 c+ m8 m - ADC #'0'
& W$ |- Q$ n Q% ^7 B- I - STA Use_PPU_Buffer,X
) X7 O. D1 h [ - INX
' S( k8 D% B$ v4 \( _7 X - % [7 F7 U# Z9 Y: a" c) w' m
- LDA FC_Dec_Data_14 x) y7 g+ Q2 ]9 X. w
- CLC& m& M5 R/ N6 q! i/ d
- ADC #'0'
1 f! e; r( w6 ]8 M8 k - STA Use_PPU_Buffer,X" _/ N" z& j1 i/ r) Y; w5 q4 M
- INX
- f9 [& S7 }& N! J -
7 m/ d3 s$ C: [$ K1 N- `$ p7 V% y3 _ - .End k6 r- A" H2 K0 Z% F
- STX FC_PPU_Buf_Count
7 i+ M( u" H# ~& R# N; v/ ], B - RTS. U0 P8 c! ] ~5 f5 F
- 3 W M" B# P, n \# e, p/ N
- ;----------------------------------------------------------------------
1 k v/ L( M% J4 `1 I7 o3 _ - ;音乐曲目初始化处理+ d# k! e. q2 y7 p% r9 f
- Music_Init_Process* }# K5 Y" P, O! L% W
- PHA Q# f" p' C b3 ^4 _ R# ^" A7 B9 q
- JSR Music_Clear_Process
1 B! _! c' U6 `% u0 t# D4 v) c - LDA #$1F
& u7 m7 Y" I3 o% D9 D - STA $4015
9 ~, B8 b6 X& M# b - PLA! d6 v% N* x1 ]4 m* T. W0 V0 `
- JSR Music_Init_Addr
! e2 G0 E7 A, L& [# H - JSR Music_Info_Display
" W6 [* p7 ~4 r( O: f, d1 _- J - RTS
2 w' j) d, j5 t9 L - U- H. I4 l# e4 s! T
- ;----------------------------------------------------------------------1 @0 Q8 m; F, |9 O. }* A. k
- ;音乐播放处理
: h5 v* G \, g - Music_Play_Process: t* R: m7 B! u; Z
- JSR Music_Play_Addr
' e6 M7 F+ Y# G& j+ c( K - RTS. W: w) i. |5 }! c& X% [( O
, c( O7 c+ T$ r7 p8 B$ y0 V- ;----------------------------------------------------------------------7 J+ _) X3 [6 m* ^) H
- ;音乐播放处理
3 f ?, I: ^" y - Music_Clear_Process9 C' B" X" M1 e( b
- .IF Music_Clear_Addr
! ?5 Y& B& ^" s4 p - JSR Music_Clear_Addr) [# ]$ {; f( @7 I8 e
- RTS
" ]$ m! P8 K0 k1 b" w3 P( e - .ELSE1 x' \8 }2 `5 Z& H4 Y
- LDA #$1F, Q9 R+ v# U( P) I( a' Q. {
- STA $40150 j$ t4 k4 x W7 _$ L7 }* U
- LDA #$00+ G, V! ~% w: I
- STA $4010 y& j" S! c- q5 j% c
- LDX #$008 C4 J6 \' C$ R* F
- LDA #$00; w' {& ^" M% {7 x; I& G" ~7 `
-
) E9 c/ u/ b- R4 w" a - .Music_Clear_Zreo_Page_0
+ q4 E; u1 E! [* N0 l! f) F' V5 N - STA $00,X
' K! P/ m0 q0 m7 t2 i$ \ - INX1 J2 s+ A/ M0 {
- CPX #Use_Zero_Page_Begin0 G2 B1 k' L' T4 q3 J
- BCC .Music_Clear_Zreo_Page_0
% r& a- l; L% o* K -
2 `0 v+ \+ R+ T0 y1 B. p - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
; ` P% H: z' _0 w0 B - .Music_Clear_Zreo_Page_1
# \6 |6 X' B# t) m. Z$ P; ~$ K$ Z - STA $00,X% H$ A" E2 [; @9 _; ]
- INX
2 ^- e( H3 b6 g - BNE .Music_Clear_Zreo_Page_1
! i' I8 j8 z$ G" |. ? - ) \ u: f$ n7 Q
- Music_Clear_Process_1
7 b ^- _; r7 n( E4 u: d - STA $0600,X
# p G: l. l3 ]+ Z7 }9 K# V - STA $0700,X
7 B) v6 I9 x4 |9 h) E+ R - INX% @- L) y% m0 g3 S
- BNE Music_Clear_Process_1* S5 B* C# I. h2 U
- LDA #$105 {3 n6 h0 \% U
- STA $4000
8 n) C. W, j, r' N - STA $4004
8 G. q. h1 r4 j0 x3 C; { - STA $400C
& y5 x) o! B$ X; I - LDA #$00
" \% s# L! U- i - STA $4008 I" P" A% G4 R8 z
- LDA #$0F
1 A" R& P- X) U A+ f* j6 }, B6 A - STA $40159 q8 d3 d9 @$ Q
- .ENDIF
2 v5 a( @+ S0 }; T - 6 X# [+ ~2 I( o7 X1 o
- RTS
- B$ Z6 ] }0 K - 6 E- d3 Y- d8 A/ ~2 B
- ;======================================================================$ m9 m) |" \# X9 V0 G
- ;重启处理* s# |8 ~, Y j W) D3 n. P
- Reset_Program
/ v# V4 [. Y/ U% `* E - SEI( |, E, [: @* H
- CLD
& c$ \6 R2 b6 h1 ~6 d z- r - LDA #$00
1 |( T& S. W; T) T8 a' g3 X. b$ B - STA PPU_CTRL
$ a* j6 g% {1 D/ p - STA PPU_MASK
7 ?+ [8 \& f: C- [ ~ - STA JOY2_FRAME( z2 D* u( }, M) f$ s
- STA APU_STATUS; l+ {5 e8 s8 @7 Y
- 7 B5 Y X( a! N# Q2 E s
- ;等待屏幕准备完毕
( v7 @, b4 p: V# r/ i! ~ - LDX #$02! U" N3 A& h2 u; b( d
- .Wait_For_Screen_Ready
j9 V: Z) |0 d# \ H; i - LDA PPU_STATUS
7 l* o9 m2 ^& c4 A1 w0 h- p1 u% H - BPL .Wait_For_Screen_Ready0 e* M8 |+ [ Y y- a$ ^9 l1 j
- DEX
& p# l+ L1 ]5 H - BNE .Wait_For_Screen_Ready: Z( U' _- r& t+ S
- ; D4 l+ _ m) p3 H, U6 n
- ;清空调色板1 f1 d, C ?. w# h* Q' f
- Palette_Clear0 D3 h3 W- N* `. K& {" i
- LDA #$3F5 J& W2 s9 Y- y% D o) K
- STA PPU_ADDRESS' U+ j/ s4 t1 x4 R8 q* w- q+ R3 @
- LDA #$00
: \- P. \- A2 b l2 W8 D - STA PPU_ADDRESS
$ T# P* B" |4 F3 q - LDX #$20( ^: S n, _+ B$ |
- LDA #$0F2 `' c4 I3 H- W1 {- Z7 s0 D) u: m
- .Write_Data. o! @0 S" }4 H$ G, l9 C- C
- STA PPU_DATA+ K6 U* g; w2 A! H
- DEX
) k1 _. F( z2 _, D - BNE .Write_Data
2 Y$ I9 e4 q' i/ _2 `) K" X9 Y - " \; N, [! M1 r' k' `& r$ E0 i7 @
- ;清除声音 $4000-4013/ S+ Y: S t7 A+ l) b T5 x
- LDY #$14, a5 Y8 f- Z; T
- LDX #$00' {7 W* V0 c+ i% p
- .Sound_Clear
0 a+ ~7 j" G6 y) t" R; D% t+ B' F - STA $4000,X
4 _& G# X! J$ m9 a - INX1 F1 e1 ~( f, _. i
- DEY9 G, \, I/ `9 X% q. E u
- BNE .Sound_Clear
' F7 |4 O! N) {5 ?# K4 i6 U -
/ K) [$ {8 d. N, Y- B: F. N - ;清除 RAM $0000-07FF9 Z& n* z% _1 q% i* C
- LDA #$002 `) a* u9 j" G- U2 o
- STA $00
9 \6 D4 F* a' C3 W( q$ t - STA $01/ ~& w. O; \/ t' W
- TAY
% p, k# J1 l Q J" b9 U - LDX #$08
& K4 n$ K2 |- n) g - .Memory_Clear
* D" f; p2 s$ C% i( h - STA [$00],Y4 u, G: @5 f+ s. a9 E4 L9 X8 [
- INY' ]/ S% q" L' C) P
- BNE .Memory_Clear
5 u' ]( z6 ]4 l5 O) O - INC $01: b- {2 Z9 {/ h( s
- DEX
2 D) `* Y' I& n# C( O! F - BNE .Memory_Clear; s6 j$ S, H4 r' e. s
-
! f; m/ d. N' I. c( n" O2 h - ;精灵缓冲初始化
/ B4 @) M0 O G A: S% Z' m( J - LDX #$00- d; l. D( O! R6 I: h* r
- LDA #$F8) @$ s! h8 f8 L+ _2 S3 |5 w' }
- .OAM_Clear! M' F/ C/ U( J! [" D
- STA OAM_DMA_Buffer,X
2 T! X% p. c$ ?$ L- g# P - INX
8 ?; l5 v1 A0 y5 c5 p7 Z+ u% P - BNE .OAM_Clear2 H' z/ Z2 U8 s% v6 h3 ~; U6 |
- 2 `" ^6 X$ F4 E! p6 Y& B
- ;栈指针初始化; u1 ^" J/ |8 w H8 c' b _
- LDX #$FF
$ S b* P4 N6 Y" j, r - TXS, A9 Z- T$ n: ~, M% H- i3 X4 f
-
# f3 K' ^" n" L$ C7 B5 k2 M - JSR Nametable_Clear;命名表清空
% {+ F+ c4 `1 N6 g& ]/ \1 ]4 \ - JSR Palette_Init;初始化调色板缓冲' \. R. ]5 I9 v, a- D. F
- JSR Static_Text_Init;初始化静态文本
1 A2 G2 L- L0 T( z+ T: G - 6 F3 U% l# b2 V
- LDA #MUSIC_ITEM_TOTAL - 1; E& s3 i4 `/ E+ e" U5 m
- STA FC_Music_Max_Index
; W) b! S8 A* m2 R7 \" y - 9 i* d3 J& j# p+ l& n
- LDA #$1F2 B, Y3 v8 d0 E+ W' G. Q) T( j
- STA APU_STATUS' Y, ~! h6 }/ u) U' } ~
- LDA #MUSIC_BGM - 1( [2 J/ [0 ^( S2 k$ q, J1 V1 }
- STA FC_Music_Index
7 m* v3 L6 d3 l - JSR Music_Init_Process;音乐播放
" R" \4 }* m! e+ ` - $ W" B0 z8 `, T% v9 C1 ?
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)) \* o7 ?5 P9 T4 N$ k. Q& W
- LDA #$1E' C, s% d/ W1 N/ s, i3 p+ _. o
- STA FC_PPU_Mask_Buf
* `, D/ @% K6 i% q2 k9 s9 }0 e+ \ -
# j* i' I# ?4 c" a- r* E - ;启用NMI处理' y' h! ?: H- N! v
- LDA #$80
8 ~' g5 t( \5 z - STA PPU_CTRL
7 @7 w9 {# |# O/ G. C$ e - % {: F7 h6 y0 J/ J% _0 K: _
- ;程序循环, 剩余工作交给 NMI 中断处理
0 T& Q' _$ S, O - .Loop
) ]3 Q( E0 T8 @: k4 F* [) H a - JMP .Loop
9 k/ [! x! Z" w# ]
! x; l: J h$ l- l$ v- ;======================================================================
' Z J4 ?8 N4 s7 _! c# _7 ] - ;不可屏蔽中断处理
; @5 K' j9 O( n# a5 z8 F - Nmi_Program" g/ {) N; V; W& t! \ n* V
- PHA8 Q! e/ ~5 k3 D6 ~3 r. M( R( [
- TXA3 O6 o f" M4 i w- D
- PHA& h3 K+ @2 D D" A1 e
- TYA9 D. Z- s7 E5 Z9 F& _
- PHA
- }! Y$ C5 N+ k5 @& E/ F7 I2 Z - 0 U, x/ b3 ]$ @/ b
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位1 t; _' I$ @9 p g! T C1 |
- V) o( v$ {, y2 |5 z
- JSR FC_PPU_Procrss;PPU处理! S/ Y8 E5 D/ j6 T5 [- |' z, m
-
6 Y. `; n r2 V$ \5 ?6 O1 X$ i - ;精灵内存更新0 I5 U- F, ?6 K" {# K
- LDA #$00: ?' b; v2 i& b+ i0 L
- STA PPU_OAM_ADDR7 m8 N# z5 D5 ]& j( q8 {
- LDA #OAM_DMA_Buffer / $0100
8 j6 O# F/ _3 y - STA OAM_DMA' c+ l9 L" \4 d4 [8 T3 ^5 `: ^0 h ~: {
- 1 b+ p. g' L9 _% i+ h
- JSR FC_Gamepad_Process;手柄输入处理. B) F2 K4 z/ W- U4 g
- JSR Music_Select_Process;音乐选曲处理
9 S7 |, z, C: l4 ]; E - JSR Music_Play_Process;音乐播放处理
. o9 n$ \* g0 J0 F8 r - 8 G( g/ r* u& W, G% A& r
- PLA
5 W3 v& J; X4 V. l9 Z - TAY, E! W! G7 O+ r q5 a+ r: X
- PLA
2 H- z8 M) _+ w, a) K - TAX: w% q1 i- L2 A; O9 o; _
- PLA2 p4 E" [7 V0 P3 ~7 h$ a& ?: `
V9 v( |3 R3 S: ?- a9 ^- RTI
" H' X$ C; q* ]! n: t - 5 Q6 N/ x7 f: i1 Y' v% h% P
- ;======================================================================! R3 l, j" a! q- A
- ;请求中断处理
9 @! u# R9 I+ j- l/ n9 C7 P - Irq_Program2 y" R0 B" N" m+ ^2 ?- z
- RTI4 ?# ?$ R9 Z. U$ t6 n7 g. B
- . r V+ H6 ^: h: ~2 d- U) K. p; x+ i
- ;======================================================================4 ?- v Z( ^2 j# L- t/ b: _4 L
- ;中断向量表, K+ P0 I3 J7 \% Q) \+ T$ d( t
- .ORG $FFFA* T2 ]! ]+ {4 g5 r, y$ t2 L A
- .DW Nmi_Program ;NMI触发时执行
3 F2 o% I6 R' }# x5 J - .DW Reset_Program ;载入ROM时最先执行, Q" \, {' q% S
- .DW Irq_Program ;IRQ触发时执行
# s/ C7 a0 ]# z( j7 \ g5 I0 V+ t
复制代码
( t s5 z' W9 j; o* g7 G
) c& ]; @6 v4 \& h7 h8 v j& d Y- W7 A' l& x
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|