|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
0 Q+ Y# I9 `+ N2 ]. Z # ]* n5 f* @% X4 x( ^
以下是主框架代码:" ~# ]' S/ T3 X+ P' c$ v5 A2 s
- ;======================================================================6 J: n3 ^4 A; }% Z! B5 i8 k: P
- ;文件头9 j* t% E) A) }8 r4 m
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) S' `; \* g1 }2 w# p r! v - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
& Y7 |3 Y2 S; M6 [, l! U7 k/ x - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码2 h% N+ c% n& r I. W t2 [
- ;======================================================================. ?! z: K, B: i' K* ?$ Y4 H7 v
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 21 c o4 n' F# M+ X
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
6 q( R0 C4 ?, d) p2 h - ;======================================================================+ O% x1 P; K0 h4 u
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
1 Y0 D; |( x3 S4 j' p - RESET_ADDR = $E000 ;主程序起始地址
6 X/ o! T0 C8 a9 i - ;======================================================================$ r/ Q% R# ^6 J# Y k8 I# g
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; V% P/ F H5 V5 e7 R2 w
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB- r2 ]* C6 y' m8 C
- .INESMAP 4 ;Mapper号 (0-4095)" U4 B+ \* g. K, d) G1 o* ?0 i
- .INESSUBMAP 0 ;子Mapper号 (0-15)
5 A5 y0 O" K2 X$ l# X8 F. N - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)1 C" U4 `! z2 W, \ z: [* | p
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
/ n# U- k- l& J) `0 E& d. j5 ~ - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): G9 P& y) l& U
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)0 H9 ~+ M& ~' P5 d, _+ I9 k& O6 z
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)# a+ ^" o- v/ W) G$ Q" y3 b
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
& c' z1 [/ ]3 x* [8 ]- u - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 A1 h$ G+ w$ j% W& T. I; U4 \" B
- ;======================================================================
; d! ?' j2 O2 g' k1 w( L; b. C - .INCLUDE "fc_demo_config.asm" ;全局配置; g% I; s; e; z* M
- .INCLUDE "fc_demo_constant.asm" ;NES常量( G1 M! r8 T2 T8 V
- ;======================================================================7 z7 ]) f& n. F; l) K# \
- ;音乐配置
: d& Y- Z+ A! I& d2 h - .IF 0 = MUSIC_THEME 6 I5 I' ^$ t& y" x* r6 ]
- .INCLUDE "data/music/Gremlin 2/config.asm"
$ W9 K# r# c* [4 U( W$ ]) \& b* T - .ENDIF
7 n" B" z7 k4 A: b - 5 y z7 ^. L7 V
- .IF 1 = MUSIC_THEME
6 j d- y1 q* |& M - .INCLUDE "data/music/Raf World/config.asm". f. G d$ r" X; U* v) T( c( G
- .ENDIF. {) v) `8 I8 D! y% V* C
-
7 C; ]0 `/ a0 f/ ~: m$ h# |# R - .IF 2 = MUSIC_THEME 3 X/ C/ E6 b1 p- d( \, c+ p
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"- `/ a7 v( c2 Z3 K
- .ENDIF
2 H9 C. Q* K+ W9 T
8 ?7 {& _- z1 I& Y1 }, R- ;======================================================================; E8 z3 t6 U2 Z: ]6 c7 V
- ;引用CHR图像数据0 ^6 S: _) y5 o$ B. t( K: ^
- .BANK NES_16KB_PRG_SIZE * 27 U+ E8 z) L; F) g8 ?9 K( C2 V
- .ORG $0000' l6 @2 R) B! @
- .INCBIN "data/bkg.chr"" L! h9 h7 m$ R, [8 g' _
- .INCBIN "data/sp.chr"9 e7 ?( i, @4 X' E% m4 [, g% Y
- 5 n; i! t X+ x: \1 i) \# g9 s
- ;======================================================================
3 p# H4 C6 [! ?0 o$ L* g/ c( I7 K - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank# }; B. J0 J. J- n& g4 _% i& ], N( h6 q
- .ORG RESET_ADDR7 H: M( V j. ~) ^
- ;======================================================================
7 Q/ U. ^0 [, p% a/ H/ p g - ;引用其他源文件
4 p9 d- H' u& o9 E0 l - .INCLUDE "fc_demo_ppu.asm" ;PPU处理5 X/ D$ F( C$ Q8 i G6 C0 Y
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理7 ?" @* [1 z% P+ d6 }* i. h* I2 o
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理0 G: K5 f/ {$ o. k- O; Y' @* F3 B
- ;======================================================================. x% {8 q9 @& D. G" v( r1 k
* Z( D2 O4 K1 W h! s) @3 C- ;======================================================================
+ Z+ N; e. V" @. r+ J8 L; C - ;等待VBlank到来
2 G# Q$ S6 `0 j& `9 W3 G - Wait_For_VBlank b9 x- I- a1 R% O
- LDA PPU_STATUS5 c# S' N8 j9 ^5 O
- BPL Wait_For_VBlank# E- b. z& i' A2 A8 e
- RTS5 w# c4 m# t# E5 J5 v
- % G/ }& Z1 r; n/ B
- ;======================================================================3 a; x$ Q+ m& L+ k. t
- ;调色板初始化3 Y+ ~2 v- ?& e7 K
- Palette_Init8 ^ e" r1 w% ]% Q2 t! I, F( j% g
- LDA #$3F
! L7 m B2 f0 S% | - STA PPU_ADDRESS9 D3 H& j4 Y& d. e8 C8 T+ v2 X( h! Z
- LDA #$00- V, ~/ G0 c( x3 a p) \0 ?2 h
- STA PPU_ADDRESS( [3 Z* ?0 S# ?. b6 d
- LDX #$007 k5 L: ]' w6 l/ U
- LDY #$20
- i6 N& F# m2 y& T" s - .Write_Data
+ S) c2 B% L5 `( V; j$ m - LDA Palette_Data,X
0 G7 O1 a4 F! {+ v0 b - STA FC_PPU_Pal_Addr,X
* d7 H) j6 J/ V7 q$ I1 y - INX
$ X0 W' Q: W9 i8 @3 |7 i - DEY, A3 P4 @& l+ t7 r' a) H) `# O$ G
- BNE .Write_Data
: t% Y$ T3 Y- n# `2 m; J6 D - .End( m; |; p* y! P6 \! B6 g; O
- RTS
; ^# W1 L, l0 Y2 }: l: f0 W
$ q- F3 k% c' ~! c- ;----------------------------------------' c$ e9 \* p9 G ]9 e0 l; N
- ;调色板数据. J; R0 y g0 h; B+ `
- Palette_Data' e( L' h* ?, O4 ]* [
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& `% M$ J) d" A8 ^7 Y
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ @5 F f( D) `! |. t2 v
-
* ]. }) \- n% ^- h& u( U- u6 N - ;======================================================================
* u/ X( T9 _9 M8 ` - ;命名表清空
5 o! t0 L# b/ M1 J h - Nametable_Clear
% O# o% f5 r: L - LDA #$20! \! u4 m9 y; b0 u
- STA PPU_ADDRESS# n3 @, I. D9 {) P3 z) Y( ` e
- LDA #$00+ `( A1 }/ V5 r, a
- STA PPU_ADDRESS
( F1 I' E5 v" P+ W7 ] - LDA #$005 _+ B7 g5 B: M9 v' B3 N
- LDX #$00
: M+ U' e0 ~+ R6 p* |- e1 e - LDY #$08
9 f9 q. e2 e5 v. |) s: K - .Write_Data
* F4 L; u7 V' n2 H" C' a - STA PPU_DATA
. F* ]* A% y7 H" L - INX
; `( O* V5 N, H$ N; L - BNE .Write_Data$ \# K# ]* L7 p+ s" M& N: Q
- DEY
, Z3 d, o9 V4 |; z9 R - BNE .Write_Data J0 t9 Q: Q5 F5 I) O. h; K
- .End
7 S W% c9 C. |8 M5 P' A3 Z/ k - RTS
0 `; @+ G& {' A5 N% e0 A
6 B2 l$ q$ V. x- ;======================================================================
' v" N1 B/ D. C' U6 Q4 R- P( k+ B - ;音乐曲目切换* F# \, p1 S4 z) _$ p8 Q
- Music_Select_Process
5 C0 J( Z; M; [# S
?) D( A) O |( D2 i' K- .Pre_Music;上一曲* F; |, c2 t0 U; C) d& O, L
- LDA FC_Gamepad_Once
, x' u% q8 [. ^& } - CMP #JOY_KEY_LEFT# v5 B9 r. B l4 O1 a
- BNE .Next_Music6 d% `' v( M4 a& y, Z& n, D
- JSR Music_Play_Pre# g! H" }8 x$ s1 G
- .Next_Music;下一曲
7 {7 ?- p# r, i - LDA FC_Gamepad_Once
/ o0 B( j G( m1 k- ?* G8 _1 y - CMP #JOY_KEY_RIGHT+ Y9 s! v0 r% T
- BNE .Next_10_Music$ C+ g6 r0 B7 u% j \
- JSR Music_Play_Next$ |2 \) [# C# R
- .Next_10_Music;上10曲+ }8 ^4 Z0 T8 b0 s4 O; V# v$ H
- LDA FC_Gamepad_Once9 ? ]% d3 U! l
- CMP #JOY_KEY_UP2 Y) s- |, C& A" U3 | ~
- BNE .Pre_10_Music- M7 s5 U0 x/ P$ O
- JSR Music_Play_Next_10
/ m* E7 F6 Q U6 @. ~# T - .Pre_10_Music;下10曲
0 W' c7 v/ a1 I/ Y9 M - LDA FC_Gamepad_Once
6 {1 W: |" N6 \0 T - CMP #JOY_KEY_DOWN4 c' J# }% g0 X8 f! x7 }
- BNE .Reset
+ ]# }* |4 |# A) [. O) p1 i - JSR Music_Play_Pre_10
! I0 \( D2 d: T- A, T - .Reset;重播当前曲目
/ e) _# {5 r$ K( M - LDA FC_Gamepad_Once
A& O: G. v/ Z - CMP #JOY_KEY_START; U: H; J- {* P
- BNE .End
' {5 m2 g' a7 G& i6 S+ [ - LDA FC_Music_Index
: P; m" A0 n2 ~. A: \ - JSR Music_Init_Process0 P; c m y. E& |$ s
- .End+ Y4 r. h9 k$ G/ h$ M
- RTS/ }7 Y# T3 D2 z9 G& g
- & _7 x" B( z+ l4 J/ o! B5 D
- ;----------------------------------------------------------------------( w7 c7 g* o( x; n- t
- ;播放上一曲
3 c& k5 E' K, m, x, O( H - Music_Play_Pre4 [, a3 j/ w$ ~4 C5 n( r
- LDA FC_Music_Index
, n( [8 ~; e0 x* t6 | - BEQ .End6 y0 y. [' Y; b8 S# u- A7 i9 b) s3 H
- DEC FC_Music_Index( [' n$ c5 J4 G
- LDA FC_Music_Index
2 h4 R8 Z. y% m - JSR Music_Init_Process
! S+ j' d8 I4 `3 y - .End8 f8 y) o% _! X% e# t1 W
- RTS
9 a6 c2 ~7 B, o9 }( x& v# J - ;----------------------------------------------------------------------
; H, P4 s9 W( u/ y3 O - ;播放下一曲
2 E J& v3 \$ E+ O6 w - Music_Play_Next
s* \) o: U1 U7 o& d$ h& C - LDA FC_Music_Index6 V% u9 B+ |1 |' R. k6 L k* b
- CMP FC_Music_Max_Index
, f% v! u7 g b2 c& f7 O, d, B - BCS .End% J. ^2 p. |0 S1 W) n. ~3 M
- INC FC_Music_Index
5 R9 x4 F- C% N2 {, n9 {8 p' `. } ^ - LDA FC_Music_Index6 b i H; n; [+ t1 q. S
- JSR Music_Init_Process
2 }. V: `0 S6 w - .End4 N& A) ~5 k, U6 f
- RTS4 \' D2 Z& m$ h5 x: a7 `7 }
* T# d8 n* r. f: @5 \- ;----------------------------------------------------------------------
" F" z1 U2 ]" I+ J1 r; Z - ;播放上10曲
; A3 [; E0 S7 C, _! v - Music_Play_Pre_10
* ~" k3 o" [; q, M: o - LDA FC_Music_Index
4 Z h# s: [6 _/ e4 x - BEQ .End
- D7 E" [: I; h/ V1 W* R - SEC
3 U8 O3 [0 m! F" l4 A - SBC #10
% A% }" s' f/ S+ ], g - BCS .Pre_10- P h% {8 {. h1 K5 M, ^& n& m
- LDA #$002 D+ i9 L* r, {' t
- .Pre_102 i b7 i& w' {4 R3 S2 M
- STA FC_Music_Index
5 e; w# [8 p9 n/ Z+ B - JSR Music_Init_Process& R5 ^+ j" S- q: c
- .End8 j* R- h0 i1 }- s- i
- RTS
' O2 P' e2 u6 `! W. B1 L9 E - ;----------------------------------------------------------------------
}9 X) |3 O2 k6 W/ { - ;播放下10曲
1 V( [5 O$ q2 h% S - Music_Play_Next_10
, O6 n, S5 k8 h. U - LDA FC_Music_Index
6 I! J) Q% q0 M - CMP FC_Music_Max_Index
& F1 ^" q% @/ [% H9 H - BCS .End6 s% @7 T$ w- r: g% {+ O2 J
- CLC
$ f |4 m7 v; W/ S - ADC #106 j& v6 n. J3 A' E% A2 X \9 w
- CMP FC_Music_Max_Index) v4 @) _# {# h' _* V
- BCC .Next_105 |# z$ U7 B3 ?
- LDA FC_Music_Max_Index! K1 I4 ^, j" b( N3 S M& L7 G: c
- .Next_10
" d/ U8 z0 @9 u - STA FC_Music_Index
! s4 ]7 y: n7 r. R* x - JSR Music_Init_Process
6 E3 \! n. f0 c8 M) h. \. d* K - .End( { q8 z$ ~( W# R9 ~
- RTS4 z. z4 k( g8 }4 _( m T) D! e
- - K- W- L7 {& M
- ;----------------------------------------------------------------------
, l! ]1 S- f. J- `- K* G2 t" E) b - ;8位十六进制转3位十进制制
, @% Q, T0 g7 {! Z2 j - Hex8ToDec
7 e/ ~* H1 A( O/ t1 t - STA FC_Dec_Data_1
' x" f' D6 w5 N' l3 {+ P4 Y - LDA #$00$ c; @5 K! L5 E9 F+ U3 n
- STA FC_Dec_Data_100, g+ K3 F$ N& _5 P* @+ v
- STA FC_Dec_Data_10
2 J+ K! s: I& x# ]; z - LDA FC_Dec_Data_1* f7 R7 R$ ?. O1 T9 |9 P) G
- .Convert_100% r, n6 X* L. m2 H
- CMP #1009 F) I8 i1 e9 g8 o& W+ k) Q9 }4 {3 e
- BCC .Convert_10
* ]0 t1 b: T: ?! Y - SEC7 C8 T; @0 z! ~5 p
- SBC #100
- |5 t0 s/ @: U& { c6 N8 u - INC FC_Dec_Data_100" K" r) D+ B4 R- }
- BNE .Convert_100
- i6 R7 V' |( n4 Y. ^( i$ d# ] - .Convert_10
; }# c+ F' { B2 s3 p/ P4 {/ b- N/ K - CMP #10) D' I+ k5 N! i" i/ p: q
- BCC .End1 y: \) y! G2 |2 b1 F
- SEC" C3 J2 Y; Q' p' V
- SBC #10
0 }3 a- Q! w6 B" q" [5 t - INC FC_Dec_Data_10
( w6 {; n8 V G/ Q, w - BNE .Convert_10
, P( m5 G* ]; e! p - .End& z/ a6 q7 X5 ?1 y; ^
- STA FC_Dec_Data_1- x# p4 ]5 H& f7 k& l2 R% A3 m
- RTS% }' u5 R( Q" j
+ D' V6 ^) Z. n3 g* ^6 _- ;----------------------------------------------------------------------5 S/ A" h5 Y( _. l) f, C
- ;显示曲目信息
7 Q( n+ _0 ]& }; w8 Q - Music_Info_Display
- \8 l3 X/ g1 b( S, [: Q- u - LDX FC_PPU_Buf_Count
7 ^. K7 f) k9 h9 E* o3 f) M. o0 q3 \. N - LDA #PPU_WRITE_MODE_CNT_LINE- q: N, b- t8 Z9 s
- STA Use_PPU_Buffer,X" g) S# |, T X5 [) o( l P
- INX
/ I) A }4 ]' j - 3 t# P3 a% z+ u
- LDA #>MUSIC_INFO_POS: L' `5 A; |, d0 p" I
- STA Use_PPU_Buffer,X0 U4 D+ C! U! A8 L% ~. P
- INX/ ~4 @& I, D' n# Q% f- J3 ^6 ?
- 9 q/ `' t" Y4 d# l! D
- ;居中
- q* g" G- P6 S) h - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
2 _1 P1 I: m& Y& P! N - STA Use_PPU_Buffer,X
& E" \- R/ N7 o$ n ` - INX4 ^' o* l; m& y- j) a% v1 q* T
-
0 {) u0 D- d. n4 u - LDA #$05
4 G* P) r% ]0 s6 u7 L i - STA Use_PPU_Buffer,X/ }/ P. k, M9 V5 L; Q4 \% U0 }: e
- INX; o9 K3 D9 [8 p& r F: H
-
/ A$ K$ b- g/ m& x9 \2 t - LDA FC_Music_Index
9 `& R! O0 u% y4 Q" f$ _ - CLC. l9 j. K/ e1 A9 S- u6 ~+ P
- ADC #$01
: Q" m) b7 p/ _! W' I5 y h e1 n - JSR Hex8ToDec: k5 ^* x0 R4 ?
- S- }) {. ?4 b9 o% s1 E
- LDA FC_Dec_Data_10
1 d% s5 r6 u2 ^7 @2 b. [( H - CLC
+ l* B6 v N1 H3 A# m1 |8 [ - ADC #'0'3 |0 t" f- _8 @* o4 m+ o
- STA Use_PPU_Buffer,X: |8 c2 ~; G) I- @
- INX6 I: e* ?8 c$ g8 A5 X1 F
- * h- \% s" K9 `5 t4 P
- LDA FC_Dec_Data_1, U1 K2 Q9 C3 o% P: @
- CLC- j9 q6 |, g/ x; ]3 D; A- `% q
- ADC #'0'
5 u k" W; a- R. H$ q& h! Z8 L - STA Use_PPU_Buffer,X
' j# x4 | ?1 L: `* Y' o - INX
' H2 g; Z) | B& J" M' u, D7 t - ) c) T2 T7 L6 o- g& p/ L
- LDA #'/'# H6 M+ C2 K( m! X8 c
- STA Use_PPU_Buffer,X
/ j; H9 f2 [( ^" T: k - INX4 F! \1 _3 y% T, I- ^
- ( M+ f" ~+ N4 s% `+ t, J( @0 y) G
- LDA FC_Music_Max_Index; x: d# w1 _; Z7 ^6 Q. H/ X* H
- CLC' b! N6 L6 j% |8 v2 o; L3 e
- ADC #$01
" m3 l) d1 j5 v0 ? J6 g - JSR Hex8ToDec, k1 U* Q& c! v
- 3 h* i) {8 e4 ~
- LDA FC_Dec_Data_104 K6 K1 _6 G( I' n2 q+ D- @( A
- CLC
3 z* c R% @1 S. G3 ?. j5 v$ p - ADC #'0'' v0 c* g. y) @
- STA Use_PPU_Buffer,X
2 K8 L/ e" Y5 G% b - INX @0 R5 Z' f4 |
- ) X: ~, F! y& L5 u/ V+ D& @
- LDA FC_Dec_Data_1
, `+ J+ k% s5 `, K+ s0 q - CLC% d) M$ L: r- A5 h* _" J
- ADC #'0'
/ v- d3 }+ F6 O0 ` - STA Use_PPU_Buffer,X
* `7 O) r6 h \# g - INX
% g+ Y$ S8 T: _1 H- L* Z% W. V -
7 g+ ?) P) |& s, @: Z; _ - .End
* C6 R; n5 K8 r! E3 W0 n8 L - STX FC_PPU_Buf_Count
: {5 a) J4 S5 `& n2 y. m, o$ ]! T* w - RTS3 z" m( Y+ X+ H- ~, L6 a4 v) B
- 0 c7 U$ H2 u; s r) E# j* @
- ;----------------------------------------------------------------------! w/ D2 x) |: O8 }% n
- ;音乐曲目初始化处理
2 k" P# H. @ ~2 I - Music_Init_Process: j7 `. [/ j% p5 g* m$ z9 m8 @
- PHA F& f0 t! e; i
- JSR Music_Clear_Process
( J- X' A$ o+ W; ~: a3 s - LDA #$1F
1 ` D6 l# E) O* q) t$ I6 E6 q Z - STA $4015/ x/ |9 H8 e& X9 g( t
- PLA
- {5 Q) ~# K2 m9 ^7 P - JSR Music_Init_Addr
8 l; D4 u- b/ r. { i) x2 T - JSR Music_Info_Display! f% Q* }: b) w7 x1 l! `9 m
- RTS
* C4 N' h4 _9 {5 n8 d7 c - , h; q4 k/ c" q
- ;----------------------------------------------------------------------
9 t; p- T( T5 L7 S$ L - ;音乐播放处理
( J) Z* ~6 E1 d5 c - Music_Play_Process
+ Z1 B( O) X e5 ^0 b' q - JSR Music_Play_Addr; i/ b c7 I1 i# I V
- RTS
( [3 n! U# a8 ?
7 x. O: B$ H( s# `4 g% x3 ?- ;----------------------------------------------------------------------- g1 V9 J( [2 g% B: Y
- ;音乐播放处理
1 Z8 `8 ~ F5 ?" ~ - Music_Clear_Process
/ x' X9 Z: c: ]+ C( }. f - .IF Music_Clear_Addr
4 _: x, K, G" S( T1 ~ - JSR Music_Clear_Addr
! ] z/ s5 s% G8 X - RTS- a( u/ V8 Q- d; c5 Z
- .ELSE/ l! ]: z3 U( y
- LDA #$1F
4 S" `# ^0 d/ K! g0 c - STA $4015$ i5 X R: I5 `: O! V- i$ t
- LDA #$00
9 @7 m: s; c9 \! K - STA $40108 q0 t& z( d1 x4 n' Y
- LDX #$001 r$ F: T; y9 {
- LDA #$00* a" b6 T. O5 i3 ^% u, ~9 u
- , J! \- [# R& _3 S3 u
- .Music_Clear_Zreo_Page_0
1 f3 w; w$ y; r2 H* ^+ k L- @) D - STA $00,X
' X; ] ]# m/ |0 B - INX
" ?3 ?1 x1 K/ y - CPX #Use_Zero_Page_Begin
; M! G: s6 |& ^9 N( l - BCC .Music_Clear_Zreo_Page_0! k- q* t/ P# v. K. C
-
0 m9 Q+ b$ r3 T - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size- a( S) z( c6 e) v! c
- .Music_Clear_Zreo_Page_1
, l% P& g' P/ S" q8 ]6 K4 w - STA $00,X! \% F7 g' R/ L G; f6 u$ O- |
- INX& P5 {5 `7 m- e8 ` u3 A" n
- BNE .Music_Clear_Zreo_Page_1! `6 A. x4 b" _
-
h6 P; v; G7 z3 O: k. i# f! L - Music_Clear_Process_1
& B) |. q- g* R' L/ | - STA $0600,X
& B. r# D3 C' y- } - STA $0700,X
7 ` W+ _9 {$ g! j - INX
6 ^8 ^9 @8 b, ^6 @+ ]8 { - BNE Music_Clear_Process_13 ^/ e: Y' o- e& i+ J2 y/ _
- LDA #$106 w; f8 w3 [ m: D* W8 \
- STA $4000( n9 Y# R7 l; L: V# A% [& p$ T
- STA $4004
3 g- \8 d i8 S# p: \/ _ - STA $400C
# }% V" L* y- I% x - LDA #$00
4 s4 s0 S% o" Y$ w% d) k" [ - STA $4008* ^; X& r- b/ ^
- LDA #$0F
. b$ o9 |5 ?6 n `' J - STA $4015
/ Q. @ e3 S$ o4 i - .ENDIF6 X! W3 g" Y6 H0 X- e3 N, W, ]
- 6 Z, d! P G% k
- RTS$ I- c" g8 Y; `+ n$ k
" ^5 T# J" e6 `, R- ;======================================================================1 L* g5 i; L, J4 Z, R
- ;重启处理9 T3 R! r: T- J8 Z- D
- Reset_Program
& W3 d, w d/ E+ h# \ - SEI/ q# \8 Y7 G/ v% F, e" ^5 A
- CLD) C" _" D, y3 ]* A
- LDA #$00) L% `; y" l. ?! y
- STA PPU_CTRL
" N$ g5 [8 d1 ?( ? x+ E" ^) C+ X - STA PPU_MASK
, |8 n/ f0 \1 o' @ - STA JOY2_FRAME" F9 @2 Q. {8 a! I$ t6 C! A. L
- STA APU_STATUS
K0 K6 y+ s3 p6 p; s" y -
4 a9 i' X1 B& f5 l9 W6 ]! ~: `, [ - ;等待屏幕准备完毕4 c. Q9 _# i$ z6 z/ C0 W! y( k
- LDX #$02
$ F3 W( N+ v3 _3 g - .Wait_For_Screen_Ready
3 q. G$ l/ o% e# v/ _ - LDA PPU_STATUS7 w8 Y; p- m* R' x; z2 [
- BPL .Wait_For_Screen_Ready
' _$ a8 ~3 d3 {1 H: { - DEX1 S( I* `, Q R7 J n
- BNE .Wait_For_Screen_Ready7 S1 ?- P6 m* z: ]; H
-
1 y4 Q- O5 n# y6 Q! w - ;清空调色板
( i3 G, k$ f) C6 h* `, | - Palette_Clear0 {; q$ E3 y# G
- LDA #$3F6 t7 C3 i; E6 H4 x! x9 u9 E Z
- STA PPU_ADDRESS
$ X k, m) q8 K - LDA #$009 Q6 v; s; E, H5 G" i
- STA PPU_ADDRESS
* M- U; X" X5 z, g - LDX #$20* e5 l1 P& u* F6 Y W) o$ n
- LDA #$0F
/ S5 G+ C( i9 V, ~6 H7 f - .Write_Data8 D# D4 L* L: U5 R0 H# r$ s
- STA PPU_DATA, l. k8 d/ G3 J. {$ s; o1 X
- DEX0 z( `# {! m: k
- BNE .Write_Data
- w! X, c1 O4 l5 ?: p2 c
9 _3 Z5 r7 X6 X2 L- ;清除声音 $4000-4013
# ^# C G8 m# p `1 Z+ l - LDY #$147 L+ r. Z, z% U* Y6 [
- LDX #$00% b' O) ]* N/ B& ~% c; S" Y/ I7 O3 p
- .Sound_Clear9 T( s4 z0 J$ Y3 W) i
- STA $4000,X0 l( N/ X8 o* ^" ^. z+ H
- INX' W, r7 X Z' j8 {+ C
- DEY2 q( \! Z* t! E9 K
- BNE .Sound_Clear+ V: v+ r$ v5 E' \' Y' c: g
-
: Z3 A% A2 Z: g( o! i; Q# M: _; S - ;清除 RAM $0000-07FF
! j7 a! v ^$ H' L* Q% X/ _" g2 Y - LDA #$00
* o. G/ u. S$ ~" U' _6 Q - STA $00* A" c0 S; O) |- H6 P! N% T
- STA $01, `5 B) w( @. n, \% f( r
- TAY' O8 |, d3 @5 i
- LDX #$08
/ [( _+ @! q' N' G3 P - .Memory_Clear+ `7 ^% I6 V1 D" [4 J1 Y2 a2 ^
- STA [$00],Y7 L! q& [8 j* F7 h- b3 q* L7 e
- INY
9 h5 X/ U+ q! k' ` - BNE .Memory_Clear
& t$ N$ R$ g5 C2 g5 q - INC $01/ J7 y3 {, ]4 ^+ ^7 p# [
- DEX4 v z5 m* h" `, ?+ E3 z
- BNE .Memory_Clear
; _ Y! X/ _8 J$ Q -
6 m9 `! Z @& J+ U+ H$ S: l! _4 E - ;精灵缓冲初始化. f+ d- @ E( e0 N6 F! M
- LDX #$00- o* c8 D. Y" @) F, y' \
- LDA #$F8
7 [& v) b4 z% a/ p! O, T6 i6 N: ^5 o - .OAM_Clear
$ a, o J. w( \3 R& {0 u" q - STA OAM_DMA_Buffer,X
; i9 I8 l" q! @ - INX7 O6 S L' W4 k, e
- BNE .OAM_Clear
8 a; s8 M1 U5 f -
7 q) b4 ^! e7 X% j - ;栈指针初始化2 o- }) Y. d$ q2 K6 U, v
- LDX #$FF D& N0 @, a) Y% P) o3 _* C- C( \
- TXS
2 v0 [7 ?8 ^1 p - 5 I+ H, t! Q* a- y
- JSR Nametable_Clear;命名表清空
' p* h: `3 s, P3 O! Y - JSR Palette_Init;初始化调色板缓冲, ^' T9 s. f( Z g: o+ P4 ^1 |! V
- JSR Static_Text_Init;初始化静态文本
, Q7 O- {1 d' r+ w - 1 o, x8 z% z9 G% U. v2 l
- LDA #MUSIC_ITEM_TOTAL - 1
: @! v. V2 |* W* J; d. y - STA FC_Music_Max_Index
2 D+ z( Y% U- D) B -
7 Y$ M1 Q( l u: e( J - LDA #$1F
( t1 G# A1 [% m" ~) o3 y - STA APU_STATUS9 H {* q/ k* w, S+ {6 H
- LDA #MUSIC_BGM - 1
/ ^- @) y8 o3 n& R0 a3 B6 y6 A - STA FC_Music_Index0 W' D1 x" J& G p
- JSR Music_Init_Process;音乐播放; o3 f; W: Q+ g1 {( |$ V" r
-
' B& l+ Q" c5 |, ~9 {1 E - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
' J/ W. p7 U: ~) `2 N - LDA #$1E/ C6 }0 o* g+ t) k# d
- STA FC_PPU_Mask_Buf4 S6 V. C* N3 V5 |, {, h% Y
- 4 h) S( N' e h/ E% @% l# B
- ;启用NMI处理8 s- o. b2 v3 p9 t3 t( \ I' O: n
- LDA #$80+ F& H0 K3 T& {$ }
- STA PPU_CTRL! A- \1 c9 {# x
-
3 `& O1 K1 e! n ^ - ;程序循环, 剩余工作交给 NMI 中断处理1 v; c# P) o. R* P$ c' N0 s
- .Loop
, k1 Z+ l- @0 L; P/ r7 b5 D- b% {& ` - JMP .Loop
' _' h- T R) m3 B3 o o$ Q
# W: O. K S; r% w- ;======================================================================
4 ]$ b& o( l V1 p" J! J, u! ?' R. x) k - ;不可屏蔽中断处理
! d9 K: K6 s% F - Nmi_Program
' b4 s& {+ X% I5 M# Q* d$ W - PHA" r( i8 y2 m2 q$ t, x( I
- TXA
9 w2 I* y, W2 E+ m- `- a2 k# t* D/ X - PHA( t* u) z- }* H5 b2 a
- TYA' k9 k9 E. {+ R
- PHA, _' |' V t. K# [1 H
- - I) s8 @- v6 ]& B+ y7 Y) C
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
- b5 B3 d* e7 Y; t0 u3 F' I - 6 j6 z+ y+ @8 s; J
- JSR FC_PPU_Procrss;PPU处理
2 o$ P8 E( a* P - ' R! h+ P2 ?3 j k$ I3 ^9 M1 b
- ;精灵内存更新, c) n9 f1 h+ L# n, b
- LDA #$008 o6 r( K: ?1 @ B
- STA PPU_OAM_ADDR3 a$ ^% J3 @ p$ I: [, v
- LDA #OAM_DMA_Buffer / $01003 _! B$ [2 G( q' G
- STA OAM_DMA
' @" S5 u; r; q/ R -
$ V( [9 Z5 L5 B7 f3 K- ]2 [ - JSR FC_Gamepad_Process;手柄输入处理
/ l# M; f- ^: M& r' w9 E3 r/ L - JSR Music_Select_Process;音乐选曲处理
! g) Z; K* ]+ i: f - JSR Music_Play_Process;音乐播放处理1 a5 s4 }9 I- b3 f4 {
-
8 ?/ E% @4 N, ^, M+ q# Y- R0 } - PLA/ D" e' G$ |# \( A+ M7 w @
- TAY2 a$ s% g# |+ q a5 w6 s7 _
- PLA
* p3 C" d3 |+ G) Y; l - TAX
# \/ i. M+ e+ _% s0 k - PLA
( P& N. [) N/ L, [8 G6 }6 t- p
8 E6 l6 n+ ~ I9 h$ `- RTI& `: z7 _* U# S; ]" @$ @ H. I
* U! i: J' Q4 V8 e0 S- K8 h- ;======================================================================
9 a" j. [6 u- u8 k2 h - ;请求中断处理- O3 k+ v8 C! V+ o1 X( C" @( M
- Irq_Program
& e. i# m' h% T - RTI
9 w$ N* p5 n* X1 g( h& ] - 7 P" a- b, B* l c, [ d
- ;======================================================================5 a' K! ?% ?) U- w% Q- x% v) o% G4 j
- ;中断向量表
6 ^2 t: ]( U. q8 u1 o6 ~. u - .ORG $FFFA5 c" f2 Z q4 o; H' D& |( t3 }
- .DW Nmi_Program ;NMI触发时执行
2 H- U( p5 q4 W9 J& g - .DW Reset_Program ;载入ROM时最先执行# D, F/ h& A" k" z# N% W
- .DW Irq_Program ;IRQ触发时执行
6 J$ C. D& a6 R1 T+ ~" F- ]: n
复制代码 7 B; Y- n- O0 [9 J. P
7 q* w" P- o# |9 n
% N2 U; _$ u& G0 W" A$ C
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|