|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下/ I7 q4 M# T5 K' A; q( I$ ]

* J- i+ d8 }9 ]- h. X% a以下是主框架代码:
2 s% l3 Z) d, S6 U- o. C- ;======================================================================
% F/ l, l! M w: [$ n7 Q, Q& C, Y - ;文件头
4 O; Z& a: p# e# h" L - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
* t* B7 L1 `+ L# K* W* l5 P - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
7 R6 m% ] o( Y8 Z! X+ x - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
( W' M2 q4 V# A4 R9 S$ p - ;======================================================================
/ v. U' b) r3 J- B7 k' i - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
2 b3 c8 |" w8 |7 s: \+ _ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" m- j5 P l# F9 k - ;======================================================================( a4 G& ^5 v8 k0 F. Z# O
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 10 K7 n k# a9 S' z8 S
- RESET_ADDR = $E000 ;主程序起始地址
7 e' l2 b: t! M' C4 ~1 Q - ;======================================================================
3 B' U* }) {7 [4 {0 q; O+ {2 C' h' b - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
/ H( n3 X, @/ I8 ^2 U; r9 m - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
& V; I4 a' s7 f9 ]7 Z5 ] - .INESMAP 4 ;Mapper号 (0-4095)% x: @2 P0 g, @, Z2 P8 F
- .INESSUBMAP 0 ;子Mapper号 (0-15)
, z0 x" g$ E# C: p - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)9 `7 b6 f" o) n
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
3 P7 `9 x$ i+ A2 ^# y1 J - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
3 ^& R- t# e: ^+ k9 x3 Z - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
# r4 D5 f! f; u, p# |7 M - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); X2 C/ c2 F& K
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数) J2 l( q* `5 p0 R
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
9 } v) Z1 M1 b% ?) u - ;======================================================================: M" q; r! c6 l. h \/ y( k
- .INCLUDE "fc_demo_config.asm" ;全局配置
7 Z* p4 w# u9 Y( k* v - .INCLUDE "fc_demo_constant.asm" ;NES常量
1 N' m& @# W* A5 Q3 s5 v% x - ;======================================================================" _# p% o7 |1 ~/ w# ]3 _, |0 s
- ;音乐配置
, G+ f J2 W1 X. Q- o. C- D# F3 _; } - .IF 0 = MUSIC_THEME
6 E# A: V9 K1 s3 P3 b. M% [ - .INCLUDE "data/music/Gremlin 2/config.asm"- L& p: q' |: ^0 y1 D) t
- .ENDIF
$ Y$ s: s, L& i% j# ?! {1 a - ; Q$ z. Y/ l u& N( Y/ ^! B
- .IF 1 = MUSIC_THEME
; |0 w# x( J" o$ }, { - .INCLUDE "data/music/Raf World/config.asm"
2 y8 G( }' k" i5 @. n& U* @1 ` - .ENDIF- m" Q7 F( F5 T* `+ K4 x
-
2 U m9 u1 `. k( Y8 E7 i - .IF 2 = MUSIC_THEME
/ b( @, Q+ A/ E( E- L V& c - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! W1 ~6 S( U3 N1 r) U% G9 @" C& j# W - .ENDIF6 V* h3 I$ Q/ v% y8 j" o
' g+ P; h, G& k- ;======================================================================. @# g& a0 W% l; R& E
- ;引用CHR图像数据
% ] V5 P- O8 V' x/ F! `5 A. a - .BANK NES_16KB_PRG_SIZE * 28 N7 c& c" J$ E+ o
- .ORG $00001 [3 o8 r7 a( I. m
- .INCBIN "data/bkg.chr"+ B p! ^ t0 ~5 R
- .INCBIN "data/sp.chr"
; F) @: e7 H9 c) { - 9 B7 Z3 x6 C9 \" x
- ;======================================================================0 }# ]) ^# c! J. W. k/ d: o
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
9 k4 y2 s# m* w/ ^/ |. @- `4 ~; D - .ORG RESET_ADDR) _/ o) {, N4 n2 G- \# M
- ;======================================================================3 @8 C S& \% O; S' V7 l
- ;引用其他源文件
; p9 }) x$ z& r! L8 S4 U - .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ b, l; ? e: r) s8 K
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 k( `& k; B+ D6 U6 P$ R1 w - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理' }+ u9 x- Y$ s# q
- ;======================================================================% u1 r' q5 m3 B6 D. E: ~
3 ^6 ]5 h/ s2 c4 K4 f/ r$ X- ;======================================================================
+ `# H" q9 x T- Y$ p7 @, m7 y" L - ;等待VBlank到来3 T9 C* ~- j, M: [0 n+ @
- Wait_For_VBlank
. _; b F5 m1 ?9 R. a. P4 d - LDA PPU_STATUS
3 T! w r' F! W, d/ i8 I2 E - BPL Wait_For_VBlank
% c. ^: Q) q$ s1 N' n/ Y - RTS
7 Q) B! _0 Z( n1 b" V4 R! J8 A3 {1 ]3 C5 m - ' L* D/ _" F4 t2 D& A7 D
- ;======================================================================* w' A* H8 c3 C( w q
- ;调色板初始化6 z p6 B4 D* T- w, p
- Palette_Init
4 E$ k( ^& X% i% e2 E y - LDA #$3F
, k1 ~8 Z1 w& M - STA PPU_ADDRESS
# j5 C. ~% F3 ]/ g" T( X/ R* l: c - LDA #$003 `" J; G( d0 Y4 f* t
- STA PPU_ADDRESS7 f# R1 M- m) J ], p: r! ?3 |
- LDX #$00
9 [: _( u, X. R7 p( C6 L) M - LDY #$20
( p4 `) P+ h' B6 } T - .Write_Data
& B* p) o+ ]! O0 i4 L - LDA Palette_Data,X
0 E H6 y) h9 X- U0 D) w - STA FC_PPU_Pal_Addr,X+ w# R# l2 d/ {! y
- INX* a, \! [* w$ E; l0 H0 z2 y5 Z% }
- DEY& |" V, e; x! k7 j$ U
- BNE .Write_Data
' r) B5 F* Y, H% V# j9 q' t$ [ - .End& J4 O, Y L; L9 u
- RTS0 z& i( l& u0 w# {, w1 ?! @
- . @, V! q. {% s
- ;----------------------------------------, {! v, R; r& n& ]" V. L1 T
- ;调色板数据; d7 n3 @# }9 b2 o6 s
- Palette_Data$ r1 G$ l k O. P5 ?
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B" v7 X3 r4 G2 H. J# @+ N0 q
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
% s% a% K0 L2 u8 [' V8 I - - _! H7 f5 m W4 |: z, n* T2 [) @
- ;======================================================================
6 }! \7 ?( L% r1 U) U4 M& ^ - ;命名表清空0 u" v F/ _1 x5 E2 g; C
- Nametable_Clear4 G( u6 c$ p' n7 }5 i5 m" H
- LDA #$20# g* L. H6 y7 X1 t9 W2 P- g0 F. Q
- STA PPU_ADDRESS
- }3 j+ ?2 O1 F: |5 ?6 V5 X2 ? - LDA #$00
A% y# P# q, z. j7 U3 u - STA PPU_ADDRESS* D7 p5 F g2 M1 |/ O3 A
- LDA #$00$ `# ^. n$ k n- G' @
- LDX #$00& I. t4 a+ w: l4 U
- LDY #$08
. \' C% q3 b( O7 L - .Write_Data
. R+ a0 M$ f. E$ `: M, h - STA PPU_DATA
2 Q% s) o) x V6 m, Q" B6 ] - INX. U6 c; \! c5 h- X
- BNE .Write_Data I9 W* I. H0 Z# o' \* o
- DEY' I' Z! e) J; y4 j: Y' l
- BNE .Write_Data
4 A- |4 U8 Z! Y2 l$ @8 {1 Q" K9 l - .End
. @/ N, m y9 m - RTS
( p- U) z: J8 h7 K - " n# k) Q+ B, ~6 f
- ;======================================================================
+ n2 X. s1 M/ K( M0 I: W8 c: w. O - ;音乐曲目切换
0 ^% {) }3 e3 U4 @/ f! e/ N. `3 l4 z - Music_Select_Process5 B% m# l2 c! w0 V
- 9 t2 k/ P& v# Y. R
- .Pre_Music;上一曲
1 y& W$ O% \6 g7 J8 e+ T7 J - LDA FC_Gamepad_Once
3 Z* U) q: V( x5 [; T, t - CMP #JOY_KEY_LEFT
7 T- B7 r: d2 \4 {$ S& [2 D* W: ` - BNE .Next_Music& T6 O0 P) G) _
- JSR Music_Play_Pre
- i2 X6 K7 }; K9 p* j8 N - .Next_Music;下一曲
$ e4 d. F8 p1 [" X6 A - LDA FC_Gamepad_Once
1 R4 r, W$ n1 R0 |/ K - CMP #JOY_KEY_RIGHT, c5 f$ d0 _9 s6 g( K+ s
- BNE .Next_10_Music
8 v. d3 \2 V8 {) H+ j8 g - JSR Music_Play_Next6 U" R; ~! e$ X4 `- [( I% y
- .Next_10_Music;上10曲2 r" z( I* Y" L$ p
- LDA FC_Gamepad_Once2 n" ]1 v; ?# l. r
- CMP #JOY_KEY_UP9 ~$ V* Q$ Z* e: [- ~. {( [
- BNE .Pre_10_Music5 L2 M6 K! u9 W* h' T2 r
- JSR Music_Play_Next_107 O* c+ G0 ?% i1 N* z
- .Pre_10_Music;下10曲. v9 H) C% h) Y# E) @/ {
- LDA FC_Gamepad_Once
" S, m9 e1 y( ~: I7 Q$ @* ], I' _7 i. i: b - CMP #JOY_KEY_DOWN
6 C& ?. d( g/ i8 v$ s4 L8 @) m - BNE .Reset j/ {! H( J2 E( V! V- E
- JSR Music_Play_Pre_10, n$ `- V& o' J8 v
- .Reset;重播当前曲目7 P3 b+ S4 U" F
- LDA FC_Gamepad_Once: g& Y8 C& Q/ ^& Q
- CMP #JOY_KEY_START
4 o- P# M( V1 D8 _4 H" O# r, r - BNE .End* j8 t+ c( ~( }/ i
- LDA FC_Music_Index
0 K3 s1 i5 i* Q% r1 m, j8 V6 k2 f - JSR Music_Init_Process# `% e% z: g8 N8 u/ ?6 s
- .End
* x' m6 R3 V& l, O2 @ - RTS
6 p& N8 y a" e. O* h
. {# C. z; F& l; [' G* j- Z; M- ;----------------------------------------------------------------------% b# w4 b0 K; d4 @) W& J5 p# M
- ;播放上一曲) U: i4 M1 l1 n; B" R- `# k, l
- Music_Play_Pre O9 Z( c( o. z; a! J& |& o
- LDA FC_Music_Index1 z# a' n- u8 o, L7 ~ O
- BEQ .End
* }& |) v5 a+ S Q% h7 @ - DEC FC_Music_Index
8 t4 E' P( a8 D6 x. I& M - LDA FC_Music_Index
" T. a' c0 z1 |; F+ p - JSR Music_Init_Process: T+ P% D4 a1 c6 \0 A0 o" s& J
- .End$ Z9 E* U' ?' B% ?9 M2 l$ A
- RTS
/ |% f1 |8 d7 v2 P k3 k - ;----------------------------------------------------------------------
& l o; _& G9 k `1 z - ;播放下一曲) |) P, `3 A. @4 q4 i+ ?
- Music_Play_Next2 J2 g7 P/ {6 I/ W, a/ H
- LDA FC_Music_Index
9 U$ ?2 {& ^- @6 j - CMP FC_Music_Max_Index
$ P0 w r2 W8 @* I' V - BCS .End
R1 s! k, H# u8 W5 [( ~ - INC FC_Music_Index+ Q! D, ~- j* C6 s* o3 d$ h
- LDA FC_Music_Index
& ~( N: _" ]8 o" [ - JSR Music_Init_Process
% r! E9 k: d3 s! v4 x - .End
) ?/ ^+ v6 P' U - RTS, w7 p4 E% W" y/ a/ Z/ ?8 L: x1 ?
% c# s! W7 z/ d q, U4 ]- ;----------------------------------------------------------------------& `( W& B7 U X w @/ b: q! c
- ;播放上10曲' M& Y& W! _& [+ T
- Music_Play_Pre_10
- c r3 k. b! h& A/ T - LDA FC_Music_Index8 c. T! @5 x6 M0 f9 t
- BEQ .End, r& _* ^ G2 W$ z- \8 v
- SEC
. w4 A- B* g& y8 Z, ]* m9 `/ D - SBC #10
$ L3 Y! }! u! a: E4 U - BCS .Pre_108 O4 b8 c5 r% Z
- LDA #$00# |: ~4 k8 ~ F; {4 n
- .Pre_10; z7 k( q' ], f+ i! Z+ o2 `0 D
- STA FC_Music_Index
1 `. K, u9 Z6 n- R Q - JSR Music_Init_Process" H% f2 H+ }8 V0 A
- .End0 W6 S, Y5 B' g* p; @: e" f0 T
- RTS3 c9 A; w) ?& i. O5 G. `' t$ `, d. ~
- ;----------------------------------------------------------------------
# Q- a) Z# S7 f( h0 w6 z9 F - ;播放下10曲) g3 v( q3 \% d! d# G
- Music_Play_Next_10
4 F) U. {) O$ J( n) e# `" ]' g - LDA FC_Music_Index. u& Y: L: U6 D$ G8 t8 h* U2 z, b
- CMP FC_Music_Max_Index3 R. W/ u1 f9 L0 L; _2 |
- BCS .End
9 A: A% M5 X* U3 W - CLC
! I- R' y2 X e( Y! @ - ADC #10
' a b6 W, ^, P! q - CMP FC_Music_Max_Index
, ^4 Q, m9 K) d: w+ Z - BCC .Next_10
9 P' J8 W2 ^% T, I2 i( Q) r - LDA FC_Music_Max_Index) K4 ]1 s6 w; Y9 r Y
- .Next_10, F0 e. ]1 Z0 M! V$ G+ F
- STA FC_Music_Index
% W5 }! v- V- R2 k8 D `0 N/ M& C# n - JSR Music_Init_Process
! v0 C/ g8 `3 E6 X) A - .End
5 u. s0 D% z, L. Z8 B - RTS# Q" {4 }+ W6 D5 r- ?: s% W$ z
' J8 I# ?9 ]% F3 f1 }- ;----------------------------------------------------------------------
# S/ E/ k. d: @ K% G: m - ;8位十六进制转3位十进制制
& @; }! n+ F4 D- [5 o - Hex8ToDec/ u. T( P+ ?" }1 s
- STA FC_Dec_Data_1
3 [6 ^( E K6 r, e - LDA #$009 [8 ?3 U: R) Y$ [& @
- STA FC_Dec_Data_100) I8 F* g3 v, g! V* J
- STA FC_Dec_Data_10) d- e; }! D+ m# j$ g, y
- LDA FC_Dec_Data_1
' F: i+ n9 g5 y4 b1 b, X - .Convert_100& ]0 D& `+ ^ p+ o" |& [
- CMP #100: J1 @" @1 S& V- |) M+ D$ y- y
- BCC .Convert_10
" w6 x, p6 j8 K/ r' e8 S2 _ - SEC5 v1 L3 o' q* t+ G' A
- SBC #100+ [+ G$ b) ]2 g+ y! S6 C
- INC FC_Dec_Data_100
1 d- R! e/ Y- g7 u; f - BNE .Convert_100
0 p1 Q" z6 c- h/ ^$ b' }2 G! N - .Convert_10
) w E& L4 k* k6 K) J. B - CMP #10
4 T! l- a; @7 ` - BCC .End* y9 g' C3 v0 i$ W- v7 O, C7 w
- SEC
2 Y4 u. K0 y9 e: Q" E - SBC #10( J1 A4 }9 B3 N
- INC FC_Dec_Data_102 b' e, [+ T: N \
- BNE .Convert_10
% _- E7 Z2 j+ N% r' p& t - .End" R7 }5 d0 s5 s- D' \3 j# `
- STA FC_Dec_Data_1! c: S/ @2 \0 Z6 K: H( W
- RTS
$ W7 [ h4 P/ d/ p' z$ A
% o, ~# n8 p; _5 C5 ^( }' @5 b- ;----------------------------------------------------------------------. Q: ] e7 r. C8 B8 t& w
- ;显示曲目信息& O% F, P7 G' e; L% D4 P" T
- Music_Info_Display
Q; V6 T- m2 q( @4 z! Y' W: t - LDX FC_PPU_Buf_Count
; B& f9 Q' ~! e8 _3 |- c9 F; E - LDA #PPU_WRITE_MODE_CNT_LINE) s |* n: O6 \- r* c" v
- STA Use_PPU_Buffer,X
9 W0 J' B' ]0 K! J" v+ k - INX
9 o7 O; N# l) A -
0 L3 u( P4 f! p: |9 p _ }. p$ [ - LDA #>MUSIC_INFO_POS
Q$ t6 Q3 _8 ~4 K( T3 B - STA Use_PPU_Buffer,X, \$ c# H: R+ j( w: }) z
- INX7 w6 E1 C2 b0 e% ?4 }: D1 a3 m1 t' o! C+ K
-
3 R7 L- b) V0 s5 j4 O+ ^ - ;居中
+ j+ D, M. P1 F. b l - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 n9 e$ B$ o3 }
- STA Use_PPU_Buffer,X* X0 a5 N: B9 K b1 Y
- INX! q; q$ `3 r( U: L
- 3 B' F1 p. ?7 m2 M' h" L5 C9 h6 o) b
- LDA #$053 {( l" h! J7 {5 M$ K5 x* B
- STA Use_PPU_Buffer,X
9 ~! e2 q6 S, g T% U; O- k8 B# }* [ - INX5 q6 `8 M- Z& s4 c- Q9 H. k
-
9 v: U: }3 q1 @; Y9 O: j1 W - LDA FC_Music_Index- S2 t5 I5 _2 |. y
- CLC" I& g2 p8 W2 C; }' i+ t
- ADC #$01
$ S, a" {5 ~/ b! L9 w - JSR Hex8ToDec
8 F' b6 H0 E9 B- K - 6 A6 C! }# i' b
- LDA FC_Dec_Data_10
" g2 C: @3 j: M# T( d4 }$ S4 q - CLC, {( J) V$ ?2 Q, I% J8 I
- ADC #'0'5 H: K- \" b8 k$ E
- STA Use_PPU_Buffer,X5 S4 v3 {* `; i0 Q
- INX5 `9 H$ n6 p X
- . J& U! I( k/ J! M! N1 C* s
- LDA FC_Dec_Data_1; M! b9 ~1 n2 Y5 P
- CLC' f5 E) v9 W- E( i/ ^9 [
- ADC #'0'5 W5 A3 `8 }. ?7 y o# A
- STA Use_PPU_Buffer,X6 }# i/ A( n9 L( h! S
- INX3 Z! L4 v8 n8 [6 e+ w4 p) |/ n: P
- 4 x0 }" g! F: u% s# [2 d' Z
- LDA #'/'
, C! s3 U2 i+ b9 e& N2 p - STA Use_PPU_Buffer,X9 M7 A% A/ r- }7 z* \
- INX
0 a8 z0 |. V z3 Y! v! H - 7 u3 M6 {+ g1 B9 ^5 r
- LDA FC_Music_Max_Index
3 h9 a$ q9 \. m3 U2 d, n( ? - CLC
( f, Z: X6 n1 p - ADC #$017 k4 C1 l# w& Y$ }9 J& i% z; r6 M
- JSR Hex8ToDec
+ Y; O2 L" E3 f. ]9 T; u -
0 q& X0 D% X/ D; y - LDA FC_Dec_Data_10! X* ` |7 |3 ^
- CLC
, G+ ?9 i) d8 L5 W! Z - ADC #'0'; I3 V6 \- k- ^% i3 Z% ?
- STA Use_PPU_Buffer,X$ U ` B0 |. |: q5 [
- INX
% c! c# [: P; g - 0 i7 E4 U) {8 r- h- X( Z
- LDA FC_Dec_Data_1' {% ^. s2 E; G, x- y0 v( w8 ^
- CLC
4 Z2 D- X ^0 S - ADC #'0'
1 b8 r/ y4 v7 @* K& X - STA Use_PPU_Buffer,X5 u; s9 e( e0 j
- INX
# B; f5 k x) X& D, ?' e+ H5 Q -
3 \2 I9 l2 o4 K; |6 X - .End5 D( o+ U, E$ v0 t+ O6 L) g
- STX FC_PPU_Buf_Count2 L7 s! U3 l& o3 {% ^: z! U
- RTS3 Z( ? I' h3 V0 E, Z
2 k1 [7 k* w" F; h- ;----------------------------------------------------------------------
6 f( b, Q+ A8 }( \1 z. M, O - ;音乐曲目初始化处理% i6 n+ a g0 T: G
- Music_Init_Process4 W# ?6 U9 j6 _/ s; g
- PHA
6 ^/ M; |6 i, z( V0 @7 c - JSR Music_Clear_Process
1 Y9 U& T# G& ^) q9 M1 v - LDA #$1F
z% K; x9 q0 f9 x0 f' l - STA $4015
X4 `1 [. W. t8 f6 l- M8 A - PLA
) Y, _# H8 D! C$ a8 o - JSR Music_Init_Addr5 l0 H/ s' E% ~& {# E3 S$ u @
- JSR Music_Info_Display
b# G* q: j. w0 k7 C - RTS9 U+ \1 f% M( L" x
+ s! U9 Y- r# w7 M" }% K* g% {9 Y- ;----------------------------------------------------------------------
) J* {* t1 ^0 l! R! Y3 f - ;音乐播放处理
, z* n$ ]5 k; v - Music_Play_Process
* u6 p; t1 E3 W3 P) e. { - JSR Music_Play_Addr' q! |7 }# ]) }
- RTS- J+ S; o; c, {$ z% F) f. H
- u* y% G* T# {9 m1 I+ i, x- ;----------------------------------------------------------------------5 T1 d) D/ `3 B9 ~3 m1 z2 _: y2 k' @
- ;音乐播放处理
- S) }8 o+ q( I$ z! R7 O+ ^ - Music_Clear_Process
/ A3 q2 r$ l2 U; @; c x - .IF Music_Clear_Addr3 J% m* Y! W' ~( F
- JSR Music_Clear_Addr
6 B! Q+ ]" g8 O. X3 K - RTS
9 {4 R6 ]0 L o3 c, X% ^ - .ELSE4 F. k. l: f7 ^2 B& r
- LDA #$1F
: m6 m, q, k* |! T( X - STA $4015
J# ] C1 w3 E1 d, o" Z - LDA #$00
. q) ^7 o4 }4 N+ Z3 s - STA $40101 ?4 f: E5 e% ~ S
- LDX #$00
# b. [. a5 H7 G7 J9 m! K. E/ e. s - LDA #$00# |. `% R) c4 C% q4 a, Y4 s
-
1 G9 T; D& l6 l7 x - .Music_Clear_Zreo_Page_0
$ ^3 x/ o2 P# h2 I3 t& m - STA $00,X4 _7 [9 {: ?: t' g ]/ }
- INX
" u5 ~+ N- p' U8 W - CPX #Use_Zero_Page_Begin. S- ~8 x" p0 T
- BCC .Music_Clear_Zreo_Page_0
$ [2 a- y k" W) l -
+ f+ S+ o, X$ G7 x7 r0 }* y - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
( E/ m; r J5 ]* N$ j/ _ - .Music_Clear_Zreo_Page_1
7 P9 j! R. d' F8 E: B - STA $00,X
) j: Y: i+ E1 I1 h2 M - INX
0 Z' k5 P$ m2 a- n6 n9 \) v0 s - BNE .Music_Clear_Zreo_Page_1
6 a, |& D; N' Y* ]$ d7 c& t' @+ j - + u* u4 d; }+ o9 H9 d5 e
- Music_Clear_Process_16 Q) _3 Y( c0 @1 y
- STA $0600,X
^7 i8 V# @4 f5 X; A, | - STA $0700,X; v C0 ?, N9 q y1 V
- INX$ e9 m) ]! b, v
- BNE Music_Clear_Process_17 ?7 z/ N: y- Z" t
- LDA #$10
2 u) q- r# J% e% _2 B6 M - STA $40005 n+ @, r8 v* M& z! d9 i
- STA $4004
+ ~) t8 _. m2 k4 E$ c/ }5 ` - STA $400C
4 J2 o8 g7 Z+ ?% p - LDA #$00
- D0 \$ \8 a# |# A- a+ ] - STA $4008
0 `* l; g( E& `# l0 G/ \* w - LDA #$0F
4 B, Z9 l0 n0 S* A6 K6 S5 t5 A - STA $4015. L/ U" J1 \: [. y4 l# a
- .ENDIF
, P7 ?8 @ V) g0 V! L - ; o% ^- t5 \) v& @# y( L3 _5 N
- RTS
1 M% l1 f/ @9 X - 3 G3 N5 R6 S0 C* N: i1 x
- ;======================================================================
; B" k7 a3 z; Q1 u - ;重启处理' p2 d7 l9 _9 i. B9 @" q( u/ W
- Reset_Program
; ~5 S; M5 f4 L$ ` - SEI
2 b, i, Q: i3 C i: I& o5 M; l - CLD& B3 r# d' Y! l! i8 e: ?
- LDA #$00
- ~- U1 K7 T% {. l - STA PPU_CTRL/ }1 x8 b# x7 e. K0 Q h2 ~" a+ h
- STA PPU_MASK2 `7 J) {( f* a! h
- STA JOY2_FRAME
2 O2 p0 {6 k8 i) J - STA APU_STATUS6 Z1 v4 u5 J$ m
- * j. V5 O0 k! ^7 |0 {
- ;等待屏幕准备完毕4 o" H0 g+ m4 W9 s7 q+ K. X
- LDX #$02
# t# N" Q. U8 Y2 y Q% v - .Wait_For_Screen_Ready6 O2 ~+ L ^/ Q* i
- LDA PPU_STATUS6 Z# z! f3 N4 t/ o0 f
- BPL .Wait_For_Screen_Ready# A7 ?! d' o& t+ z9 U# w
- DEX8 j$ n8 w! j1 f+ {) ]5 R
- BNE .Wait_For_Screen_Ready
: E3 t/ s# z2 M/ G) L& Y: \ - 3 o8 s/ H! v3 Q2 {
- ;清空调色板/ C) i" n+ M) V# @! a
- Palette_Clear
, [3 a& M: z, c$ J' k7 T* R6 l - LDA #$3F
" t- W/ H; ^- W8 p2 ~5 F; ~4 ~ - STA PPU_ADDRESS& _/ ^" f4 a2 Z
- LDA #$00; y8 L: K) t, s. u
- STA PPU_ADDRESS
5 \& w* [& x$ ] j6 S! \; v( K: |2 { - LDX #$20
?- E8 e& G# o - LDA #$0F
4 F$ @6 _( S; t - .Write_Data. M u7 {" f' P* X+ a
- STA PPU_DATA5 |* F9 I& I5 A# B, D
- DEX
$ X: Z0 W* u4 J - BNE .Write_Data5 i9 c2 P2 G1 L; Z+ m4 D) U
- ; {; X) U0 ]6 K! F6 v
- ;清除声音 $4000-4013
5 k" x& n5 M4 q/ g0 u1 E - LDY #$14
6 J( L& n; A8 P) t9 A3 M: G) V - LDX #$00
6 O0 g; \/ l4 a1 w# a6 n - .Sound_Clear( Q( ^$ K o& f, ?
- STA $4000,X
6 v/ |* r# W( `6 d( B2 ^2 G" V+ h - INX8 i! x6 }" |! l
- DEY
" a, z, b7 z. v5 E - BNE .Sound_Clear# |- o4 z8 h" g, z3 ^* T
- ; ?* o* N) Q9 J9 a$ V
- ;清除 RAM $0000-07FF$ e3 \- x- h/ K" t- C
- LDA #$00+ [! g$ ^ u- D' `' T6 @
- STA $008 E' }' ^1 ?2 H7 j' M% N K
- STA $01& t3 j, ^1 t- [7 Q) O. ^' L2 O
- TAY
y% H# p0 v5 d! `/ w - LDX #$08
# v5 }0 ^3 x6 P4 H$ Q - .Memory_Clear
. g# Z( }2 K4 i& Z _ - STA [$00],Y
6 F4 ]2 Z X( @* G - INY5 s q: }/ `2 c
- BNE .Memory_Clear
1 v: J" W+ O L; h& x6 s% N - INC $01
. ~, w; |9 V( f0 G. [" j - DEX
8 t& p* U( K, L' g/ ]& g - BNE .Memory_Clear
: J4 ?: i8 ?& U+ A; c4 k -
; e, Q: U1 Q! k% [* |) P - ;精灵缓冲初始化
; R1 o2 e' D( q6 v! i - LDX #$00
' E5 d4 q" t1 [, g; v - LDA #$F8" K$ @/ V }; w! X
- .OAM_Clear
) [: F: U3 I7 j2 g - STA OAM_DMA_Buffer,X
& {9 J3 I" W5 P5 R5 q6 D# @+ u+ M - INX
; @, M" n/ Y6 z! X0 u - BNE .OAM_Clear7 M9 u% G0 ?: _- [9 H6 y& a( N
-
7 `8 O) r; q, [3 u# J( A - ;栈指针初始化6 u4 c$ j' \/ n
- LDX #$FF
: M8 n$ r# s4 \ - TXS3 P& D4 U0 e9 L% g, l0 A' s
- 2 W h% x5 o5 n0 N
- JSR Nametable_Clear;命名表清空5 K3 f+ P$ }) V2 V6 o) ^
- JSR Palette_Init;初始化调色板缓冲: _" v! Y: o7 O
- JSR Static_Text_Init;初始化静态文本, M; g% f3 ^3 I2 R* u3 a
- - M: W: M3 o( \6 S
- LDA #MUSIC_ITEM_TOTAL - 13 W. L$ P6 L5 K! W; ^' S3 @
- STA FC_Music_Max_Index x6 ]+ {5 ^0 u0 K( P: s
- \: g# d9 y: j; `0 |* N& J
- LDA #$1F
# f( f, j3 U5 T# J- O! b: i* W - STA APU_STATUS7 J- }% A' G: k: F/ y6 ]1 p
- LDA #MUSIC_BGM - 1# W& m2 F* t" l+ z5 V6 ^- X
- STA FC_Music_Index
5 D+ W& ?. |* ]* q - JSR Music_Init_Process;音乐播放
/ [, c! u: A5 P0 l, d -
8 R1 h8 [* E/ {* n; ~ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
* G# E2 I! P6 t- q# b/ [- l& s - LDA #$1E) p3 D! _1 b2 ?4 J6 v- S8 G
- STA FC_PPU_Mask_Buf" `, l& z: j: Y m$ g
- + c2 g6 v1 q0 _. P
- ;启用NMI处理7 v% g6 T5 q" y: { b/ Z5 w! F
- LDA #$80. b1 P5 ^ q3 K: I$ c5 u
- STA PPU_CTRL
- q3 f) m$ H6 ]( C. G5 d/ q7 Y - N h, K+ |+ E
- ;程序循环, 剩余工作交给 NMI 中断处理4 q8 o# v( }# U2 |( p/ M
- .Loop" P. v/ R+ z& r s- Q
- JMP .Loop" ^; k0 y- \$ M1 {; u: N# E" M
6 p: q5 ?! k m8 A; R2 q- ;======================================================================7 t: n" @" z% c( \) m( ^
- ;不可屏蔽中断处理
. F/ I/ Z) c8 Q - Nmi_Program7 I! N6 ]( r; V- X+ l
- PHA
; ?7 V; H* l H7 ` - TXA' G4 ~( J% q2 K h
- PHA1 X1 j2 C; h9 K( e6 \3 J8 O' W
- TYA
% \0 a8 e3 M1 E% V7 i6 D; d$ A - PHA4 H# F; X4 a) G# q# M5 W0 c' T3 l
- # v) M3 Q& U, y6 x. h& J
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位% d3 G' x. H H ~, i" ?; |
-
' p5 O O3 ] a) R2 i% j - JSR FC_PPU_Procrss;PPU处理5 |: B+ l) |! E' n
- & P4 i& W- {0 `: \) V" o
- ;精灵内存更新0 ]9 N" M( |) c& @5 `5 B% Y4 d+ y
- LDA #$00, Z5 X d& u- _
- STA PPU_OAM_ADDR
2 ?/ n2 J& S! V% \5 { - LDA #OAM_DMA_Buffer / $0100* [# b0 B1 F! @( G
- STA OAM_DMA
/ Y7 |( I8 g5 D% U% R/ r -
3 q# N* M ~' {" f3 ?& O& f; d5 c1 d - JSR FC_Gamepad_Process;手柄输入处理 i( Q; A0 b6 t" R! b8 |
- JSR Music_Select_Process;音乐选曲处理3 ?0 T. [/ r6 U* d# O
- JSR Music_Play_Process;音乐播放处理: i& I1 \' X$ {$ _8 _/ N
- 6 u# N/ C! U; K7 D& C& m
- PLA" t, x( w5 }' c. Q1 ~7 u Q
- TAY
$ u/ }% _* @6 z( m" P - PLA" { d4 o. _6 M- D5 V8 [
- TAX. F& S; N% V/ n' d# d, e& Y. C4 k
- PLA
: T# G" U! r5 w6 t! N - $ r2 }, {. U0 M% U; I% Q1 o/ s
- RTI
* q* h: P0 T8 n; t) }
K" _$ I( _% Q/ s1 q; K- ;======================================================================* n. R7 B1 Z0 f' S% o
- ;请求中断处理
5 f* R0 K% B# T/ [ - Irq_Program
* U, Q: o5 @& O, j2 _' E* G - RTI" A( I- [ t. E, `
- N) P( C* q1 y& c( Y- ;======================================================================
7 C! L5 d, [8 ^6 W' {9 y D - ;中断向量表
2 n3 W8 W$ I8 I9 Q, F0 R8 h, U - .ORG $FFFA6 Z) }& F% i- \' P
- .DW Nmi_Program ;NMI触发时执行
1 e$ i9 i! H) f9 X4 g4 [ - .DW Reset_Program ;载入ROM时最先执行( w" [. s6 h# b' |
- .DW Irq_Program ;IRQ触发时执行 ]) X" r9 N* d3 U; X( Z) b
复制代码 7 J& N5 Y8 b- I7 [) X8 a5 R# A
2 u( s, ~5 f. k& s3 t
+ _- _: O: r2 X+ B$ k- fhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|