|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下0 x% Z% ~5 |# A7 D5 z
* ^+ h" a0 B% h& l: p
以下是主框架代码:, b6 a( Z9 Q0 B, ?( n! }
- ;======================================================================
2 q+ I" M( o6 a x& F2 j - ;文件头
( o3 \* I% ?; s, L, Z$ @5 ~ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; P7 R9 E, o! b+ V3 |7 Y
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
; W5 b2 D* U/ Q3 @: H: G - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
; h3 K. \. t: D3 q% g+ v/ n# q - ;======================================================================/ O/ v- f+ X$ E4 M
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
6 N) h( p8 y9 f0 _ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
# U7 O: F3 Z2 Z - ;======================================================================
7 H d, n3 e3 @7 C: A - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
8 F7 s: _3 s8 F4 ~& U6 R - RESET_ADDR = $E000 ;主程序起始地址
0 m B- |& {/ c6 | - ;======================================================================
7 Z) ?5 i! D) _6 k/ u, E2 [( Z+ C - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! y3 L' V' B8 ?/ ? f - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
- `6 C% P4 W* ?8 }) b2 {# w6 F - .INESMAP 4 ;Mapper号 (0-4095)
4 I# @, x) y7 W5 x7 a, N7 d - .INESSUBMAP 0 ;子Mapper号 (0-15)3 U" Q( w; P/ ^+ R' a b
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏) e& W- Q/ v7 z* i
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)6 t# d/ e, A% i/ ?1 B3 [
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
! E7 g y1 F5 s - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)- Z- ~1 ?; ]" Q4 N% I/ R7 d
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)/ B/ u8 Z/ v2 h: t6 c5 l
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)9 c# U; a; H! X- j$ \2 K
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
7 R! }) y8 l( R2 Y - ;======================================================================6 l7 k m6 n) e
- .INCLUDE "fc_demo_config.asm" ;全局配置+ {/ x4 f6 J( b4 w/ [
- .INCLUDE "fc_demo_constant.asm" ;NES常量
8 A1 v7 M5 D9 g0 H/ \' l5 C - ;======================================================================' O; n% x$ N7 O# f, b$ B5 n- @( X
- ;音乐配置
V& l P) z% @ w8 n - .IF 0 = MUSIC_THEME
$ n& ~( p6 K0 X* x1 b - .INCLUDE "data/music/Gremlin 2/config.asm"
1 m* e% j& t+ ] - .ENDIF
/ X' U# ^/ Y6 V& S; { - # W" Q2 r8 z" v7 _) @
- .IF 1 = MUSIC_THEME: z/ m% q; V7 c- | B
- .INCLUDE "data/music/Raf World/config.asm"
" {+ X. f, H1 [8 q8 K& b. d, \* f0 ~ - .ENDIF
6 ?. d6 D% \, G4 L -
! Z# g5 T! U) q - .IF 2 = MUSIC_THEME 6 p: c4 c9 k5 q7 ^& N
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
4 }2 G0 F* U6 z" ]! Z8 n - .ENDIF
( U- u# s8 J5 ]! ~
# e/ {. ~( u! i9 G: a; R- ;======================================================================
8 S; S2 B1 s& R) d2 L1 ]3 c - ;引用CHR图像数据
+ N* s- t* \( C9 H' x# J+ I - .BANK NES_16KB_PRG_SIZE * 2
* d+ g" l% X1 M8 d) q/ b - .ORG $0000
7 A8 e- `9 U1 m8 N/ b - .INCBIN "data/bkg.chr"
" J5 L5 U- f5 P. k$ S - .INCBIN "data/sp.chr"( E* d7 [" w5 b) u l3 k# O
- ! I* L6 @+ t( C5 j- F5 s
- ;======================================================================, |" s9 N0 u, \7 u) y' o
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank6 A, Z ?" p" l! N
- .ORG RESET_ADDR6 M* u3 U2 F4 l6 _( }7 z4 J' S
- ;======================================================================
/ c4 y3 u# o1 A# T. ?+ H7 k1 a- `+ {. B - ;引用其他源文件
4 i9 a2 m" }* A - .INCLUDE "fc_demo_ppu.asm" ;PPU处理. q# `4 e( O6 _. T8 m- t8 C
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
& v/ I2 M6 @$ K* J4 A8 s! n5 @$ ]2 ]7 w7 ~ - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理! l5 ]& y3 t- U
- ;======================================================================/ r. _0 g( h- v7 U& h& g; M
- 9 D7 n+ \/ y# e
- ;======================================================================9 _7 L" b; E7 b# D$ H
- ;等待VBlank到来
! G) f7 L, P$ O" V - Wait_For_VBlank" Q% b$ `8 R9 y; @) x0 L5 F$ s1 Q
- LDA PPU_STATUS
" }) y; X0 O$ w+ x - BPL Wait_For_VBlank
! Q7 j( z4 q6 M- j# J - RTS2 i7 |' @) k% m9 m
- 3 f) \$ L$ L" O% w) |6 r% Z) ]
- ;======================================================================
) W' i5 m" R4 M, @9 w# r! y) ~ - ;调色板初始化
9 n; i0 z5 X$ O" d2 u9 w! X9 _ L - Palette_Init
1 M5 ~ k2 ~9 Q" h! H$ y - LDA #$3F* l$ {' b! B# G2 f5 p, C
- STA PPU_ADDRESS0 U( D/ H4 J* N' z% e m% _/ |
- LDA #$00
* }; z7 z; ]3 p# G: y3 Y - STA PPU_ADDRESS4 T8 A& b/ T/ k1 x! W
- LDX #$00
4 t, [' y0 d4 r5 R - LDY #$20: ^0 h6 n, o+ b
- .Write_Data, |0 z- [/ M5 o6 t( M! c$ a
- LDA Palette_Data,X
" a m& N2 t* l! f, x2 b$ N - STA FC_PPU_Pal_Addr,X
1 R4 M: Y B9 A8 b0 P/ Z - INX
. t+ R) {. e: X& K& ?' E- D5 a - DEY0 @1 x+ `2 @5 t) y+ m- q+ U
- BNE .Write_Data0 m0 T; I4 X1 v3 {3 ?& V# t
- .End
8 m. V* }3 X6 j/ N/ | - RTS" O1 K2 u- Z. B
" s7 ?" w7 K0 v5 S6 z* X a- ;----------------------------------------
1 X7 y: P$ c# F( Y5 }6 f& o - ;调色板数据
# F- F; ] x& h. N. h5 N9 Y - Palette_Data
3 G |; |/ W: r, @; V3 x4 Q9 a - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
5 d0 g* |. y- O5 ?2 R( u - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ U7 K& G% Y1 ^% j$ E
-
3 k4 j( u2 M6 R9 V - ;======================================================================4 f- g" e% f6 w1 V! a
- ;命名表清空$ R( X) s" U$ J D# J& H! z
- Nametable_Clear
) q. n% n1 }5 O6 |! q [ - LDA #$20
* h: y5 Z0 W. B) ?3 l+ z; j - STA PPU_ADDRESS
( A( Q* N& }$ F* d - LDA #$00* v& x G. F V
- STA PPU_ADDRESS: H2 O6 a0 `/ Y7 ]2 @3 T3 N
- LDA #$00
2 L' Y8 {. w, Q0 e. d - LDX #$00% o* S+ K" I3 ]* u" J
- LDY #$08
5 B) ]% h, |) o6 K% l - .Write_Data0 o3 m6 c. q; D9 U) T
- STA PPU_DATA
9 t' q$ \" ~8 m8 y$ t. w - INX
" g/ x" w9 C8 D" q1 `7 b- x) `. x: X6 ? - BNE .Write_Data
" A9 J8 v `1 e' e0 B u - DEY
; L# D8 @" Q1 ? e1 A7 Y5 q3 Y( e - BNE .Write_Data
, ]; e# q0 U( g& D9 d, o! }3 W, w3 B - .End
) e0 t& k4 W. a, Q - RTS
6 E9 O [; a# W% e
) Q5 R% ?& o }5 A) J! p- ;======================================================================
6 i1 _4 ?! _/ \! B6 } - ;音乐曲目切换% S+ v/ X( @" O. c; }3 |& }% D
- Music_Select_Process' V, ~, [0 d8 A7 }. t, P) E
- , q9 D8 F; W9 {+ G
- .Pre_Music;上一曲' S, _ Z1 L: j- j0 y# w% N
- LDA FC_Gamepad_Once4 w$ ?5 I$ k, o7 ]1 a3 f6 ]8 d6 c
- CMP #JOY_KEY_LEFT5 l6 Z3 I0 [/ p5 Z s" H
- BNE .Next_Music+ J3 ] M6 }0 h K. q
- JSR Music_Play_Pre/ R8 s! x" a2 D3 i8 Z5 j8 S
- .Next_Music;下一曲& {7 P6 ?* `/ _; k5 |" f# j' x
- LDA FC_Gamepad_Once
( w% \ O1 o' h- [6 u, d: u: E - CMP #JOY_KEY_RIGHT: o' ~8 ^* `4 d% e, d R0 a* l
- BNE .Next_10_Music
. j* C, u2 a( G - JSR Music_Play_Next, W9 e* P/ E$ Z) V/ B8 M5 ]
- .Next_10_Music;上10曲+ ?& Y# ?7 ?7 c3 }- i
- LDA FC_Gamepad_Once3 ?5 E- W) ~; P/ R. y; L
- CMP #JOY_KEY_UP# m* A" X$ ^2 e s
- BNE .Pre_10_Music" k; v/ a" s0 r! E- t1 m$ Y
- JSR Music_Play_Next_10
, e8 h3 d& |0 f - .Pre_10_Music;下10曲
7 R3 c# X; @9 Y" G& H. c - LDA FC_Gamepad_Once
4 K; W% l' I/ { - CMP #JOY_KEY_DOWN
1 }! x7 c7 h; D+ s2 a - BNE .Reset
9 s, m7 \2 y0 Q% h- D3 }/ B# B. Z - JSR Music_Play_Pre_10& T; C1 i; U, @ e& [5 W
- .Reset;重播当前曲目
8 v. T* o6 Y* r1 i0 }. C2 ^3 c - LDA FC_Gamepad_Once
( T E; O+ T) O. e - CMP #JOY_KEY_START7 k. K9 \2 \8 h' g0 W- `
- BNE .End
! G" F6 R4 c: E8 r7 o1 |0 R+ `& M - LDA FC_Music_Index6 f; [, U' e" ?! c5 I+ u" ]3 d
- JSR Music_Init_Process
% q ^. k- G5 } - .End
T. P w0 D# @, L - RTS1 {8 B4 u4 T9 z# z) S! m$ n( C. P
- & P# l7 T. E9 X: g. s) J
- ;----------------------------------------------------------------------
c9 J, V9 {3 o5 O- V - ;播放上一曲
5 Y6 b. }, _% U8 _5 o) i2 z - Music_Play_Pre- D/ o( R% ~: z8 t
- LDA FC_Music_Index
$ ]2 Q" l3 {% e% [6 g2 `) S - BEQ .End8 n2 t* b/ b) w" Q6 w
- DEC FC_Music_Index: X' ^0 s2 Q! Y. q `
- LDA FC_Music_Index0 R/ w% e$ u6 Q g0 P8 D- U: `
- JSR Music_Init_Process: w5 u+ P+ `1 P1 x
- .End. F$ M, v6 b. p1 n& I
- RTS
$ s9 }. r- s; O) x+ F - ;----------------------------------------------------------------------
& H- l- F2 u' Y3 }' ] - ;播放下一曲
0 A( U+ ~8 X( c4 d - Music_Play_Next
; D- w! X1 g0 ^: y- d) a, {9 y - LDA FC_Music_Index
# S# x* |8 g$ n3 c - CMP FC_Music_Max_Index
9 M$ T. }! k: ` c' m O1 | - BCS .End
. C2 N X* ^+ | e* y5 S - INC FC_Music_Index
. d C3 @: h m7 K! }' V I* d - LDA FC_Music_Index
- s1 ?! B) Y. Z( W* M - JSR Music_Init_Process. \+ P: J1 J/ o6 V& Q
- .End
+ \, Y3 G/ O0 T - RTS+ N# N9 {8 r6 o8 \. A2 M0 e1 `
- 9 k9 K9 G5 L" e+ f ?5 k x
- ;----------------------------------------------------------------------1 ?& c6 j9 k" S
- ;播放上10曲2 M$ u, o2 L% W4 z& x: ?
- Music_Play_Pre_10
# g1 j! B0 d2 U - LDA FC_Music_Index
$ B* @# ]* C& W2 @5 w9 G' B - BEQ .End
+ x0 A( `; e, [; k - SEC
( b0 W1 Z$ v; G# L2 A - SBC #10
# O% t6 V8 r, `2 J9 n& x - BCS .Pre_10
& }! G1 z! |" m0 _) M* X - LDA #$00/ b+ b R( @1 r- M. r" e2 [
- .Pre_10( c" w6 F. w9 F" e3 R
- STA FC_Music_Index
9 [8 X' M! _6 {8 L- R2 | - JSR Music_Init_Process* |4 r+ L/ h0 u; t/ r: e- k
- .End
+ D( @) t# L$ m* G9 G/ | - RTS
% Q; r+ Q& a: h0 s - ;----------------------------------------------------------------------
4 a5 h3 A. I: w! P- W+ q - ;播放下10曲
9 h6 r( y) I9 Y, A% c. b+ o - Music_Play_Next_10
7 ~0 n* {2 g2 Y& T$ k: H" K, f+ T" w - LDA FC_Music_Index
" g* a/ ?/ U2 k; | - CMP FC_Music_Max_Index1 Z5 D- i7 j, H4 e9 K- X
- BCS .End0 \. D7 `8 L3 A/ |7 p4 o4 c9 i& t1 w
- CLC5 v2 X6 u. c) l2 O
- ADC #10
* T5 r1 r" E- h0 Q& D. t7 u - CMP FC_Music_Max_Index) Z" L" q" d* I1 O2 |2 Y
- BCC .Next_10
8 \' Z1 @1 t' i( Z& R% n/ |3 v - LDA FC_Music_Max_Index( w# k. f' N" Y& |5 l# i) h
- .Next_104 `2 T2 C% v$ ~
- STA FC_Music_Index
- l7 C( _7 A. e4 Z" i) ^ - JSR Music_Init_Process
$ E/ I, \+ N) I8 C v9 I4 ~ - .End1 |; }% T2 L% V7 z. _0 K( \
- RTS
' D4 V- _1 O( z8 `2 x3 y - 2 g! ^6 \# n8 |* l8 c3 W
- ;----------------------------------------------------------------------/ k: {4 T, d; a& D
- ;8位十六进制转3位十进制制
# p6 E* ?/ O; L3 x7 {1 f( I - Hex8ToDec8 a0 U( q$ j8 n5 h
- STA FC_Dec_Data_12 h* I j" g2 W# h2 ^$ J
- LDA #$00
- L% I; y- N! \ - STA FC_Dec_Data_100
$ u: L: c* P. y; M - STA FC_Dec_Data_10
* B4 }; i2 J! K* f - LDA FC_Dec_Data_1 n7 ^6 L3 `4 _/ Y
- .Convert_100
) d# w. o0 g. y) H | - CMP #100
7 p8 J: M/ [* ] - BCC .Convert_10! [6 j3 |$ E& P0 ]! p3 p9 q
- SEC5 h& b! N2 A* T8 a% T9 d
- SBC #100$ _" [% q$ p5 z4 I2 k: w
- INC FC_Dec_Data_100
5 h- y2 y( {$ `+ R5 a - BNE .Convert_1007 Q. t- h9 Y! X6 b
- .Convert_10
( y+ b1 s v! P# C z; ?( { - CMP #10
3 t# T' W- J. ^$ U) | - BCC .End
, } Z! L# C4 H8 k9 X, F; r: ~6 ` - SEC
" E9 W3 p O9 u7 t/ D - SBC #100 P: ~( s3 d3 j
- INC FC_Dec_Data_10( s% L; K& Z! @% @( M6 A
- BNE .Convert_10 H. d" Z7 z! L! `
- .End5 D. S. d1 i6 r7 v& w- ]- F
- STA FC_Dec_Data_1
6 s* Z$ M" K+ P% y5 p& Z% l, D - RTS+ w0 r! X" X, i! j3 A3 R
3 h+ u7 ^7 C- y- u( P Z# }- ;----------------------------------------------------------------------( c4 x8 j4 p& F1 J- Z+ ?6 o
- ;显示曲目信息6 Z- o: n3 u# O H8 u8 t
- Music_Info_Display
* X8 T* B. U6 x2 B* _ - LDX FC_PPU_Buf_Count
/ h* t* K; {0 N5 | - LDA #PPU_WRITE_MODE_CNT_LINE
0 I! h' p: q! \1 N: S+ l+ E) x - STA Use_PPU_Buffer,X+ L6 W& ~/ t5 U; l! ?
- INX9 J) @' {, a% ?/ h9 y# p* U
- 2 L( c' Z, d* t! w
- LDA #>MUSIC_INFO_POS
& [4 ? q6 K% G+ w# b3 {/ Z; k. d9 | - STA Use_PPU_Buffer,X
$ ~- m. R; O- F9 I - INX, E: y" @1 @" P) j/ Y. p
- ! z* ^- r' {2 c2 s( k
- ;居中" M( d( `3 ]5 [( Y7 [' F
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/24 d, k5 a; _" ], j
- STA Use_PPU_Buffer,X
& c& e1 ?! p K, _. S) b - INX0 y' N1 f' c: c& W+ s
-
/ t& z+ m4 f; } - LDA #$05
; ]. S$ s5 a8 M3 L4 H# g: a' n - STA Use_PPU_Buffer,X) i0 s7 o) [6 z8 {
- INX2 v, Z& C% B/ u! Z( {1 m3 l$ R
-
5 }" l; V3 f% I1 \4 x' g - LDA FC_Music_Index2 |( u8 J: Y2 |1 V L
- CLC i9 j+ p0 \# N2 `& A! @6 V0 \
- ADC #$01' K E1 |3 I8 d! x9 r
- JSR Hex8ToDec- V: i5 y7 y4 `& `
-
3 [4 s& Q; J, R* E; g* a' x5 x - LDA FC_Dec_Data_108 M- V( g# V6 h% k! v
- CLC
& }9 l1 m$ K0 i4 L+ h - ADC #'0', v& l9 Q! t9 w* C4 D* L* y4 Y2 e
- STA Use_PPU_Buffer,X/ _4 A- a0 A# I: W
- INX3 t! P9 k y# s) O2 r
-
+ E& F0 e0 N2 l" r" L# r9 m( C - LDA FC_Dec_Data_1. G j8 m" e0 ?9 h
- CLC
) j5 ^2 J/ ~9 l; X' s. i - ADC #'0'
A- o0 a E4 f6 k( X9 B- G" S' q - STA Use_PPU_Buffer,X& l" t9 K5 `1 |4 h: d) M& l, D
- INX
_ s5 N# [ C+ `( H$ x -
- h& O# [2 D8 Z3 |+ r6 ` - LDA #'/'
) \$ v0 V6 n! j% f! ~: Q - STA Use_PPU_Buffer,X% n$ |# j, ` W0 ^6 b0 ]' g9 _
- INX
) [6 m* w( H2 L% G! V$ `9 m -
* s$ c m: @- A! J - LDA FC_Music_Max_Index% j: |% a6 N- g: {, S3 {
- CLC2 v- F0 Q( x0 h% i
- ADC #$01, K' e: a( V# E6 B: N
- JSR Hex8ToDec
( r1 ?/ v- X5 |7 W, h$ m -
/ I" F9 J; V% V8 G0 _& r: ]7 q4 s2 W - LDA FC_Dec_Data_10" ?9 ~7 x8 y+ t2 b1 W
- CLC' @( `1 i4 ]) E9 |
- ADC #'0', s; q/ a$ M! D$ c6 S
- STA Use_PPU_Buffer,X. x% ~; u% w3 @, U
- INX5 I4 V$ U7 {* ~7 N& ^# e6 P
- 7 ~8 M* K/ t# W7 x" T" b$ u; k+ } \
- LDA FC_Dec_Data_1
B& ^4 ^3 Y6 J5 X$ s0 ]" B. U - CLC% ^( v6 Z+ M- O& M) A) y6 U
- ADC #'0'# Y& E& N/ j2 q) c: z7 E. w5 Z
- STA Use_PPU_Buffer,X. j. k ~% `- f5 f
- INX
3 j1 W9 Q$ i c5 N -
; I$ Q* C3 v: P - .End# x' a$ B$ q" Y2 S! i0 i1 F6 M6 A8 [. c) b
- STX FC_PPU_Buf_Count
]9 N$ V+ g; i9 H8 N. L: l2 n - RTS
5 v, K! q2 A6 V- s - 7 D* Z; h- o: M) z1 I+ S; B
- ;----------------------------------------------------------------------
0 V+ |$ q: O8 v" ~' R O' Z - ;音乐曲目初始化处理
/ S6 e$ n& ?, d' z - Music_Init_Process
& q: j/ B% R" U7 R N! M - PHA/ O2 d- \+ l# C7 N, H* K
- JSR Music_Clear_Process# B" B: D7 @. k" @- G* y
- LDA #$1F
; Z9 g, m$ V; P* `2 b - STA $4015
% G4 v' _! _ i& u3 d; _ - PLA
9 Z1 F9 ~4 @5 ]7 L+ T" K9 Y - JSR Music_Init_Addr- ?' e O0 h0 [& N' ]3 T# U! F5 M$ ~
- JSR Music_Info_Display
0 M! f1 f9 T: ^ - RTS$ R9 [! B( |1 c+ w
- + W5 ~4 T8 }" `9 E& Z; N8 [0 v9 `
- ;----------------------------------------------------------------------6 k- r0 \" Q- L/ K/ N. q7 Q
- ;音乐播放处理$ q g2 q/ \# ]7 r; p$ P
- Music_Play_Process7 Q. N: _" z' u4 q) U
- JSR Music_Play_Addr, W8 W6 |/ g) q! s* J9 W' M
- RTS G+ m& r6 J( }6 j
Z" ~& _" ~: Z6 V- ;----------------------------------------------------------------------
) c8 K d3 c8 M) g5 ~ - ;音乐播放处理& A$ M+ Q D$ l8 m8 k
- Music_Clear_Process, M, J' ?6 p1 ]) X
- .IF Music_Clear_Addr
$ Z, X: C" A2 v6 I - JSR Music_Clear_Addr
/ ?8 {' \3 h/ Q, c6 a1 y, ? - RTS
3 E' m2 H( b2 o6 R/ v7 B. k. N - .ELSE
% ^" u: X- c$ z - LDA #$1F7 p+ l7 P5 X& U; i" d9 N
- STA $40150 u5 q7 d/ w* B! g& `5 Y E' P
- LDA #$003 _3 d( |! L( ^: d" M( ?
- STA $4010
8 t. C( I; l2 z$ \' w - LDX #$00
8 _$ a* a$ _ F4 \3 b8 y! a - LDA #$00
+ O$ G D3 s4 H* b - 2 v& W, ?8 a2 Y, t' U" e
- .Music_Clear_Zreo_Page_0
$ G6 w0 p7 m4 j4 R, D1 a - STA $00,X
& B0 n$ v4 Y; m - INX
7 f. I, c8 K: \* w- m1 t - CPX #Use_Zero_Page_Begin
T* n; z8 q% W! J - BCC .Music_Clear_Zreo_Page_0
K: E+ M4 x, y4 Q: f( x7 V+ j% A1 V -
9 N" l; w! P$ \* ~1 ~' m# n - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
, k ]/ ]% G1 k. q" O; s" T) ` - .Music_Clear_Zreo_Page_1
$ E$ P" J, o1 c; N8 B - STA $00,X& j5 t* n, e9 C
- INX9 H6 K: x* e) A/ C7 `
- BNE .Music_Clear_Zreo_Page_1
* C1 F2 Y5 b2 V" t; R" O -
8 V! Z* D$ y( s) k- W6 ~' q - Music_Clear_Process_1: h' [ ]) N; Q' S3 q$ G- N
- STA $0600,X
+ p0 i' Q* d3 }: y, V - STA $0700,X, {; [/ y6 \8 m' w9 q
- INX
+ {3 ?8 w& n1 z% X' P# d2 a) S - BNE Music_Clear_Process_1. Y! u& z7 D% x3 ]/ u5 f. i
- LDA #$103 V3 H* J# K) L
- STA $4000
8 N% h6 U$ S5 _1 Y5 F. ^2 t - STA $4004) a' b* @# W- ?; I7 Y) F+ P
- STA $400C
. i0 D; f* u. J$ O$ H- d - LDA #$00+ I j& D; @% n' b! H2 s+ P$ l
- STA $4008
" Z$ ?8 L ?4 J8 M# x& ]% ` - LDA #$0F
/ k4 ^& b3 v2 r* f7 }: H - STA $4015: E) I* c0 g- D+ t& A
- .ENDIF
) O8 h4 g- F8 m# l5 j - 9 Z! Y/ G) d( g5 J% w% p
- RTS
' K' P9 K9 ]* h2 m
* D3 f7 H1 f! B& `; Z8 x- ;======================================================================1 m! H5 x' ?: }# @
- ;重启处理1 o: H( C, |* u; ?) b% V
- Reset_Program
& w$ @. g4 E9 i5 |1 ? - SEI3 x- r! _9 z* `! s; _) M5 u
- CLD& L! Z' \4 i1 T+ d& d9 a( L
- LDA #$00
, H2 m1 c. l% b1 ^ - STA PPU_CTRL) Q1 _; O3 F$ M! P! S* a* C2 U
- STA PPU_MASK5 G* z v4 R$ ^+ _) V
- STA JOY2_FRAME
! c3 H" g T$ l2 n3 L( X1 [& Z& D - STA APU_STATUS
7 N0 i' ?: a! M- l% }& @- [ -
0 t6 H7 K1 Q4 r4 \4 r3 [( o- U - ;等待屏幕准备完毕- z9 J* k3 x# `4 f
- LDX #$02
. c5 x% T+ m3 P* ]! g; k: [) ^ - .Wait_For_Screen_Ready
% v+ p; A' }( ]+ X! m# [5 Y9 F9 k( a - LDA PPU_STATUS
* v9 M) _$ `; _' X: L - BPL .Wait_For_Screen_Ready6 d2 I l4 d9 G. D1 \% L
- DEX; m9 Y- g* i! X) A6 T( n1 I4 l
- BNE .Wait_For_Screen_Ready( ~" r, f: k; G! _
- 8 C4 n( T: a' Z/ ^: h: r- \
- ;清空调色板
. j2 }4 R! A! z4 j& r - Palette_Clear* }' L Y' l* j3 _) h
- LDA #$3F7 }: y2 r8 o# ~# @
- STA PPU_ADDRESS& J$ i" V" e$ u( m
- LDA #$00- Z/ Y5 |5 X" r% a" h4 ^& y+ J
- STA PPU_ADDRESS
d; `* u* L r" Z9 U# z - LDX #$20
4 D5 m! I; j' [, u3 t- d: {. O: o0 { - LDA #$0F( x2 y4 W n- Y+ x3 I9 P
- .Write_Data
+ r; m) s. z9 ]" t+ Y2 \ - STA PPU_DATA
# f: y+ O, o& a& Q3 V! ?9 d - DEX
; P( i1 K5 n/ t - BNE .Write_Data3 q* X: s, s" y" C
7 J- Z( m% ]* @2 b5 M- ;清除声音 $4000-4013
2 ]3 ^. F: O5 i R5 |( Z - LDY #$14
8 ~. ^7 g( `, q' n - LDX #$00
9 }" ]. `) z% ]) t4 d9 w X" I& i - .Sound_Clear
" ~* S( U4 N5 E2 B l - STA $4000,X# X$ N: ]( Y/ u
- INX3 n( p y9 u1 ?6 t6 i/ i5 C' v
- DEY! E: Q7 y/ B2 A( {; ?' R) X
- BNE .Sound_Clear
' H" R$ U7 A. s9 b& f6 b -
5 h: L0 O$ I6 I( p% f9 M - ;清除 RAM $0000-07FF
9 K4 y* K- r" @. z" S - LDA #$00
0 U/ N; Y, |" j6 F9 ^1 } - STA $00
7 z# `+ ?# q7 N! w% b) Z1 c2 c - STA $01
9 @& U) p, u2 ]/ ^ - TAY
z8 g3 l2 M& t: H - LDX #$08
# Z1 n& r, i1 W: g" W - .Memory_Clear3 j: y7 E8 i5 F
- STA [$00],Y
6 B3 }6 `( Y* h4 ^6 n2 y - INY- ]/ N# a) s6 ~+ e6 A+ W2 B
- BNE .Memory_Clear
# Y Q6 o9 N' z$ ^8 m - INC $01
B* z+ J ^* Q - DEX/ O1 g& P4 W/ [2 I4 l2 T9 n( _
- BNE .Memory_Clear; K; J+ U% C7 w8 _5 j
- 7 j$ [6 x0 L3 W' E- U( f
- ;精灵缓冲初始化% g6 Y4 W' R, o: u8 l' ~
- LDX #$00* H$ d+ ^; S& O' U- F/ X+ K/ p
- LDA #$F8" N" y& ]! R( m
- .OAM_Clear
4 e. r. B+ p- z* C: S5 L% j3 E% J - STA OAM_DMA_Buffer,X
# ]7 q) p# P5 @3 n" g - INX
% g8 ^* n' b9 P - BNE .OAM_Clear
0 F+ `0 w! r' e! W# Z - L2 P. e a! s
- ;栈指针初始化
# _2 |+ d8 d. t+ ` - LDX #$FF
1 t s. V' a! ]( ]1 D - TXS
r3 p/ @2 b7 ]& ? - r/ g; k* W5 S: G8 y
- JSR Nametable_Clear;命名表清空
0 u. Q, s1 a( v2 `# k% d - JSR Palette_Init;初始化调色板缓冲
/ a, T3 K& c0 d% V0 K1 G - JSR Static_Text_Init;初始化静态文本
& c/ s) e7 J& ^* h0 I" C -
( P0 [* q! `# O, w7 Q - LDA #MUSIC_ITEM_TOTAL - 1
$ b1 j+ r/ w; W3 K; Y - STA FC_Music_Max_Index) x. p$ {7 }1 x! H1 Q9 V/ a
-
3 [% ^0 q. M/ X }6 h8 l - LDA #$1F
1 y: Q2 a9 p# a% k - STA APU_STATUS
$ s) ~5 ^/ }' e8 Q - LDA #MUSIC_BGM - 1- l6 o, D6 i7 r" j3 L
- STA FC_Music_Index
+ M+ ^; b, j! j - JSR Music_Init_Process;音乐播放
5 K. G/ ]% t/ H. P -
O- i5 X) `1 y - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
' R5 X- @0 a1 v( U+ X: W - LDA #$1E+ U+ o4 V; b( ?0 N; U7 p
- STA FC_PPU_Mask_Buf
r4 E Q, x. u; u$ S -
# ]& s) E: E; g7 O4 G9 C - ;启用NMI处理
/ Q4 N: O6 g' w- k1 J, E I! A - LDA #$80
+ U- d' E$ _: D - STA PPU_CTRL
3 V8 d4 [' z# x& d3 j4 _ -
0 k! L! O" }1 S2 X7 a - ;程序循环, 剩余工作交给 NMI 中断处理7 I% l: V& Y; ]/ ^. T
- .Loop
, k1 m- M3 t- L- }" L5 ~( } - JMP .Loop& j" t6 i% o) Z1 b
8 a2 e7 [" W7 z5 x- ;======================================================================
' ~8 W: @# e) S# q3 B( N- s - ;不可屏蔽中断处理
7 Z/ x F. l3 y: U$ u - Nmi_Program1 k: j* R5 e8 T' K# w" p
- PHA
2 o* _' ^0 d ? - TXA4 Q+ l4 n! i8 u* o/ b! D3 ^# L r1 o
- PHA, U; @9 f. W; F! O9 ^; W
- TYA
# G% K' {- |: h' r3 y* [ - PHA' ~! w: @/ K w' n g1 @" U
-
% f; ]+ `) `; Z' B+ q# u y% E5 @ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
6 F) ?8 c, O8 j0 m- r& H - 3 t- C- J2 n1 R o5 v& c7 E. A
- JSR FC_PPU_Procrss;PPU处理
" g# S: Q0 k$ ?" z - ; ]/ x% }9 t) s
- ;精灵内存更新
! X: X5 k7 @. V; N9 h - LDA #$00
6 _4 O0 ~, F: e1 h0 ~3 N! ^6 P- l - STA PPU_OAM_ADDR- G& O$ M$ _1 v, v4 K7 p' B, v
- LDA #OAM_DMA_Buffer / $0100! _" [: v6 x: J$ d0 E/ U
- STA OAM_DMA
% i* ]0 G; c" l" D1 p- B -
- m3 d2 m$ O% l/ I& i - JSR FC_Gamepad_Process;手柄输入处理7 w2 @+ h8 _; D" H+ ?& U) B
- JSR Music_Select_Process;音乐选曲处理; [! O; [; p( t: O6 o" Z' D, t
- JSR Music_Play_Process;音乐播放处理+ o: ^4 ]' |9 G Y
- ' n( {+ m2 m6 \% ~" w+ H: n
- PLA3 u; ^2 h/ h& m: z& q \
- TAY
! R6 {6 n3 D. [* {8 E5 R/ Z+ P - PLA
% Y. O' I% S0 F. w! O- X/ t - TAX
% k7 Z' i* r5 b- c2 _- x - PLA
- N* F) T) ~. D. ?6 m- z! U* |2 ? K3 X - 0 E2 C6 T" @3 {6 q
- RTI$ `1 U8 c3 ]6 Y
- 2 n5 B/ M/ Q8 V; x: F3 S
- ;======================================================================
F$ V" S8 m/ z% @( a - ;请求中断处理3 L; y7 q6 q: ?% _7 [
- Irq_Program% J) }% q- X, A( `6 Y# a
- RTI
: e" n' n1 Y5 ^ \% T0 G6 ^ - 6 i1 _" p! D, w- b3 W
- ;======================================================================
# m" D" ]6 {! P$ P: w* P - ;中断向量表1 E# J7 h* x) G- x/ I
- .ORG $FFFA8 G* v' z1 ], a* s/ l$ ]; |" W' c
- .DW Nmi_Program ;NMI触发时执行3 a* z4 Q( B! S5 c) b6 R( g) F
- .DW Reset_Program ;载入ROM时最先执行
! o2 M8 @9 m& F: \ - .DW Irq_Program ;IRQ触发时执行
: K) |- a0 e; q$ t4 j+ Y
复制代码 ! g$ g& K* Q! H! J6 p G
5 ~- i& j) Z/ D' `$ H$ _* e
' X2 d9 z, J/ i* |https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|