|
- ;[FC音乐][MMC5 IRQ]( s0 _( a. n' J9 v' Z% [/ C
- ;FlameCyclone 20230710$ e/ |& U& O" D9 L# O
( S2 B& Q3 l2 K2 A- ;文件头
9 m' S" W; r }9 P$ m) E - ;======================================================================
" b, P A: X. D7 k8 H/ | - .INESPRG 4 ;16KB PRG 数量, V+ t3 ~1 Y" f9 w D* e0 V
- .INESCHR 1 ;8KB CHR 数量
& ~* D/ ] s5 X6 P0 s9 ? - .INESMAP 5 ;mapper 53 Z2 M+ ^& N& e! a$ ^
- .INESMIR 1 ;命名表镜像 0水平 1垂直
: A/ ^: b a5 t3 T9 } | - ( Q5 u/ F; }/ ~: H7 t9 j( c: s
- ;必要条件* |2 c: q5 h5 T; ?! V" ^
- ;1.持有CHR ROM' v. z$ v) T0 Y: Z/ K+ y/ I
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
) @- A3 P) _4 u% i0 t# l - ;3.精灵内存(OAM)不为空' E, R+ G* @7 T. h
! i1 v+ X7 Q9 ^$ x* X6 V9 X- ;==================================================
& g' K+ T; h i; b1 [* v - ;NES端口常量! r. K% k' k3 x
- PPU_CTRL = $2000 ;PPU控制寄存器( l! I+ l3 m0 \- _( t- m
- PPU_MASK = $2001 ;PPU掩码寄存器
/ C$ ?8 d6 Q8 `, R+ O: O - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
1 D! @1 {: v: T/ b4 l5 O' F4 K - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
" |& q; `8 n1 A7 V4 V2 ]! W - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加10 S- g( I& M$ ]0 I8 l
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
0 u# }& J; k) w - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
9 L. h: }5 n# B3 E7 l/ C - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
* [3 ^9 |6 q, o( G2 l - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存7 {2 j: n- L( {* C) b
- APU_STATUS = $4015 ;声音通道切换1 m! L; Z5 M" s8 D/ d7 H8 |8 G
- JOY1_FRAME = $4016 ;手柄1 + 选通" R$ a+ [6 l1 K
- JOY2_FRAME = $4017 ;手柄2 + 选通7 K( I1 M8 `' z; W. a- r5 A
* A- @0 j, K" W/ ^/ j# X- ;==================================================
7 g: L- K4 s% x% M+ k - ;MMC5端口常量
# P# g9 K4 e9 f5 l7 ^# @9 O - MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4" o# @+ N% p% i7 _' h
- MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8
, h; [- g$ s1 [* t: b% v0 _ H - MMC5_PRG_RAM_PROTECT_1 = $5102; H& o& h9 I& E
- MMC5_PRG_RAM_PROTECT_2 = $5103;
& \: u4 v5 M1 c) j r - MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R, f' T* Q, {. E, H1 c$ u
- MMC5_NT_MAPPING = $5105;4 w k/ i v# X: I
- MMC5_FILL_MODE_TILE = $5106 E6 t+ n) I3 q
- MMC5_FILL_MODE_COLOR = $5107
5 V& L% I3 M. a1 A9 m: C - ( V8 l5 G/ g2 z2 b( ?; `+ F
- MMC5_PRG_BANK_6000 = $51136 X. {5 o, n5 @0 p3 L
- MMC5_PRG_BANK_8000 = $5114
/ @# ^/ \( T2 N& I% c5 M. A - MMC5_PRG_BANK_A000 = $51154 W* k" v! v" ~2 R
- MMC5_PRG_BANK_C000 = $5116
% F" ~/ x% U; r3 ~ - MMC5_PRG_BANK_E000 = $5117' s0 c c) v+ T( C0 Z* d+ ^
- # A3 I9 A; }$ R6 e! c
- MMC5_CHR_BANK_0000 = $5120
6 W4 K0 _$ }; D2 ~1 I, g+ R1 e - MMC5_CHR_BANK_0400 = $5121$ e4 w' x1 K; }$ {; G( K
- MMC5_CHR_BANK_0800 = $5122" I4 v% s+ H+ Y# u Y
- MMC5_CHR_BANK_0C00 = $5123
1 ^; F/ j$ H3 f& i( g' L - MMC5_CHR_BANK_1000 = $5124! u. X1 m0 }$ |, b D, \+ t
- MMC5_CHR_BANK_1400 = $51258 v' d( [$ P# e9 r8 ^9 q3 m
- MMC5_CHR_BANK_1800 = $5126
9 i" `6 U: f6 U# |6 | - MMC5_CHR_BANK_1C00 = $5127, X$ d d' I7 x* ?5 P5 l! L& H
6 j: ]) p8 _0 `- MMC5_CHR_BANK_0000_1000 = $5128
4 C/ C" m. v R8 V% V - MMC5_CHR_BANK_0400_1400 = $5129' w. Y2 j, ~ }; J. z
- MMC5_CHR_BANK_0800_1800 = $512A
; T0 l9 Y3 x- g; R3 B - MMC5_CHR_BANK_0C00_1C00 = $512B# P4 _6 o6 w5 p9 V) x/ T6 x: [, p2 a
-
& k& [' V+ |8 p _" k - MMC5_CHR_BANK_UPPER = $5130
9 ~* R, ]: v/ D) \7 ], h: } - MMC5_V_SPLIT_MODE = $52003 o( v$ |* B' ^% x7 V$ V
- MMC5_V_SPLIT_SCROLL = $5201# ?' X, d' B5 |2 B9 ?. V% {, _
- MMC5_V_SPLIT_BANK = $52027 {4 ~+ M5 ~, `! ?+ \, [
- $ |$ R% i3 x2 M# J7 l
- MMC5_IRQ_SCAN_CMP = $5203
9 t+ \4 q3 i! g, V - MMC5_IRQ_STATUS = $5204
" H% h: @0 f& f, R5 T - MMC5_MULTIPLIER_A = $5205: H2 j |7 L' U
- MMC5_MULTIPLIER_B = $5206
7 F# ?1 |) m6 w0 i6 |( X -
) q/ }9 X3 I/ [# Q+ U: N. P4 s - MMC5A_CL3_SL3_DATA = $5207# H4 t! m b1 b9 Z3 H) F2 j1 X
- MMC5A_CL3_SL3_STATUS = $5208
- k& M) E( c+ x$ `$ }9 C3 e - MMC5A_IRQ_TIMER_LSB = $52090 N, v0 _! N2 R% J
- MMC5A_IRQ_TIMER_MSB = $520A
$ F7 y% c" c/ `. Y0 O
/ d( |/ E( j& f' B) _& @9 V+ D- ;==================================================
0 q# D; u8 I) l8 _ - ;程序块配置
! D/ x! v5 q; U% q$ J - BANK_DATA_MASK = $07. x" W( D+ v0 U- u. ^( E+ a: V" ?. Z
- ;--------------------------------------------------+ j3 H7 M1 H+ M+ D" } F- A8 C
- RESET_BANK = $07: F$ I: O+ a$ ~! k( i1 i+ y9 T
- RESET_ADDR = $FC00( }5 F) v( t- g" X, j
& G# s& y" p! I# f3 u, G M$ I- ;==================================================
/ {4 \. h% ^: a* B" N; p1 Z - ;图像块配置
. ^9 X" D1 q! N) }" e+ z; | - CHR_DATA_BANK = $083 ?$ M3 g( X7 d. G" z6 l4 u+ k/ s
- / @5 J( r% v: k {2 t( M; E
- ;==================================================
$ ^" L8 g: V% E! F3 x8 ] - ;零页内存地址配置
: H) Q& B0 H) g; i* w0 e - Use_Ram_Addr = $809 b# G* s8 |* m4 B# N
- PPU_Ctrl_Buf = Use_Ram_Addr
6 Z) O# R$ ?) A/ G: m* K( Z - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
% r% S% ^/ ?0 d1 E2 {; Y2 b8 S - PPU_Scroll_H = PPU_Msak_Buf + $01
& s: Y1 V# V, A6 t; K' U - PPU_Scroll_V = PPU_Scroll_H + $01
% u& l% o! o6 N% t2 J0 E1 h - FC_Data_L = PPU_Scroll_V + $014 }( A* V; k! z9 S! D0 E8 `
- FC_Data_H = FC_Data_L + $01
- h. z, C0 @0 H/ Y9 I - FC_Data_Buf = FC_Data_H + $015 H5 R% z# X3 D0 U& k+ p& b5 H% K7 G
- ;==================================================/ u z1 J+ C# H- @8 M# O
- ! ]1 G% f m5 O, B0 j, D i' U$ k! o
- GAMEPAD_MERGE_FLAG = $04+ S- x, D4 z! H: d1 ]3 A1 J
- : i0 S9 X! p0 O: m
- Gamepad_Keep = FC_Data_Buf + 16 ^) K8 d, A* v. e% f A+ z
- Gamepad_Once = Gamepad_Keep + 22 O) `) v+ ~6 h" }; {2 O1 g
- Gamepad_Temp = Gamepad_Once + 2( z# ^, O; [% s6 d( g
- + C* \7 k8 y F
- Gamepad_0_State = Gamepad_Temp + 2
0 R: S! O3 \+ w+ ^ - Gamepad_1_State = Gamepad_0_State + 1
4 i, a; w u6 [) E0 ]0 Q) p - Gamepad_0_Value = Gamepad_1_State + 1+ Z9 M7 M/ u8 @7 p, Y% l* B
- Gamepad_1_Value = Gamepad_0_Value + 1
: U3 @2 l6 @4 C7 A* e+ I - Gamepad_Port_Value = Gamepad_1_Value + 1% K& T- a) k# G$ j' f( K n
- Gamepad_Merge = Gamepad_Port_Value + 1
X8 V. V# C! m9 y2 [3 @/ a
C! j" K4 p, i5 [% a" O- ;==================================================
/ a- x: J: a8 C0 q6 { - IRQ_Index = Gamepad_Merge + $01# x4 s$ Z0 ?+ r) t
- ;==================================================- D4 E1 d0 d0 _7 D' P
- 0 ^3 D; C; P& n. a" q
- ;CHR图形数据
2 z. b+ r# W& V4 v. d - ;==================================================
, Z! |7 E6 e1 Z) U' ~* h - .BANK CHR_DATA_BANK+ `2 Q# K2 [; y$ w- j
- .INCBIN "chr_bank/chr_data.chr"9 l/ i5 x1 c" q Z. T8 f( g3 V- _
-
% b' M1 A; A/ _ - .BANK RESET_BANK & BANK_DATA_MASK
1 o ?- x% K1 H, b$ t' @& V$ E+ `2 M - .ORG RESET_ADDR% j8 l5 l" ?% b4 n- l. e+ |1 y
-
) n4 h" q# d1 H, b" ~ - ;--------------------------------------------------
I/ V5 e& r% b - Attributes_Data
" z O/ Y1 K6 s% G& | - ;命名表属性
% ^, B! P2 I6 W( I6 G6 x7 X; u9 R - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00. |( `) W* y* H, p( C* G! T) |
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% H. ]9 W8 O8 A5 s; B* S/ q
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
- g2 E8 H. Z1 T$ t6 C7 J - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
8 X' [, k) M f - ;--------------------------------------------------/ W1 m T# |- B% P4 ?9 r7 U
- ;调色板数据1 d$ l& i, V, }* x# m! d
- Palette_Data# c8 F( T: g1 P6 L1 Q5 K
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
c; a/ ~% [$ E - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F% f4 Y2 {7 h8 [2 Z& L0 U
- 2 r# F1 R) W- a: X8 Y9 G
- ;==================================================
4 l. y& x( ~0 r& R* {1 y" N& X$ ^ - ;命名表初始化
7 k% J% c6 W+ g% O' j - Init_Name_Table- X9 S0 K- U9 {9 F0 Q
- LDA #$20
/ U( W+ a0 @! I+ x4 C - STA PPU_ADDRESS
/ l5 G; j& B" k+ ~) e2 O& Y% F# P - LDA #$00
" q/ n5 u4 T8 M0 Y/ T4 R - STA PPU_ADDRESS
: d3 R& J5 E* P - LDA #$00: O, k& {; i- U! E
- LDY #$00
4 y6 u7 w- q. V+ G0 f Y o" g - LDX #$102 d( Y5 r' ^% M5 J E% x
- Init_Name_Table_Write
8 V' B6 w/ ?1 k7 D' `8 U" I - STA PPU_DATA. f# I$ `) G) E |0 h' Z
- INY+ K7 _& @ r2 N& F |5 ?
- BNE Init_Name_Table_Write
% |3 H% L- ?1 _4 e$ _, t - DEX0 x% d, i. N# {3 Z8 ^6 b
- BNE Init_Name_Table_Write* b" ]$ ]0 ~0 c. t
- RTS
0 F# ?$ _4 |: {1 N5 K -
$ d6 ]+ x& l/ a' ` - ;==================================================
: o' }6 q0 L2 G6 {; ^ - ;调色板初始化4 {% i( N* P5 j* v
- Init_Palette2 x7 C1 q: \# U
- BIT PPU_STATUS
# m% @8 q( ^7 {5 o1 T" f - LDA #$3F4 W G' P/ z2 [0 T) s. R; n3 n
- STA PPU_ADDRESS
D, b/ V2 O2 l" u4 f' L4 N - LDA #$00
8 Y' l/ M1 n+ `2 ^( ]& e; P - STA PPU_ADDRESS
) G- p1 [" B1 }& f4 h/ O - LDX #$00
! k6 {8 }7 A/ x; B5 ?! l" {7 O9 a - Init_Palette_Write
+ O- A6 ~4 N! X* s# V. }3 ? - LDA Palette_Data,X4 h! m# F3 _( W8 B9 V7 r. h- @: G8 [
- STA PPU_DATA0 K1 }. L( [5 d+ i5 }9 X- ?
- INX
* \4 x3 _/ w8 x - CPX #$20
5 @5 Y+ i' b8 R5 s$ \- O - BCC Init_Palette_Write$ z5 c3 F8 r- w- D% m
- RTS6 N0 K8 M$ ?' h2 N
- 0 [8 T4 D5 A, F
- ;==================================================
) z& ]+ z$ |6 }1 x( ^6 W - ;设置命名表属性
) N8 o# R: U! i5 A& m - Init_NameTable_Attributes" `+ ?+ I( E1 s$ k s+ o. k( _
- BIT PPU_STATUS/ ]7 Q+ m, |# u" q& i
- LDA #$235 y! r- O; L+ q& N& Q( N
- STA PPU_ADDRESS
- a; R4 ^( _5 c+ X" X7 C" u - LDA #$C09 i p7 J2 k( W9 L
- STA PPU_ADDRESS
0 O, Q# [; G3 h - LDX #$00
5 n, e) P! j- \( S+ a - Init_NameTable_Attributes_Write
( {9 E- G \2 i" ~2 s' A! f - LDA Attributes_Data,X
_. Y+ @! l6 e7 d - STA PPU_DATA
! Q) I) B/ M2 ~7 g c5 N/ V - INX9 N7 B' A! C* `# c
- CPX #$407 |& }2 q( Z* S h
- BCC Init_NameTable_Attributes_Write4 X8 m$ c! P' q" }$ z
- RTS
' q+ i# ?& h @+ ~" K' ]% _ - , x9 c5 Y& y! K8 e) i
- ;==================================================
/ [& t6 G, h! D& F - ;初始化命名表文本* V& z0 P+ F8 v" {- d5 V1 o! ]
- Init_Name_Table_Text
, ?, _5 e- u1 n( f, h+ c - BIT PPU_STATUS w" K( }0 K" k; t4 Y$ O
- LDA #$20( ]. S( @- @, Y9 I( |) H5 c7 v: d( y
- STA PPU_ADDRESS: W/ H% c5 U2 r" {
- LDA #$007 N& U4 [/ n. d: u0 n
- STA PPU_ADDRESS$ K( q6 A/ u' i, g
- LDA #$00
$ @! s# J" ~# J) r! ?7 F; Z - STA FC_Data_Buf
& v" }1 \/ u( y2 i' Z2 _3 S - LDY #30
1 T: m! k. H4 u" e - Init_Name_Table_Text_Write
) z; _, q# Z) E# `, |. y) h' `/ d - LDX #32" \) s2 z3 l: \
- Init_Name_Table_Text_Write_Char, y [; T" Y/ ]! Y
- LDA #'0'
0 J+ h2 i# f1 ^$ b$ ], b. r; P - CLC( U$ ?2 h8 l, p' n
- ADC FC_Data_Buf: A# N8 @& U( F8 w
- STA PPU_DATA8 h. ~ F v+ \ s
- DEX+ Z6 J0 }; L! f; j& y* {
- LDA #$148 S" T6 m* K( Z* {
- STA PPU_DATA
3 k3 A$ n; H1 ~) I1 ^( K - DEX
( ?# A& @$ K- q) {2 E - BNE Init_Name_Table_Text_Write_Char4 i, ?7 V- ?' p6 O1 y' T' T4 T
- INC FC_Data_Buf! q, Y: V0 J3 E( W* ~ w5 l
- DEY* `- |2 p( e5 d* @
- BNE Init_Name_Table_Text_Write
M+ U. u: ?' X) y9 p9 g: h) m - RTS, g* g- A. `; C% T2 j. ~7 W
- - O, O% j& F4 }4 U
- ;==============================
4 f" O- A& p4 H* R! _ - Init_OAM_Ram;初始化精灵内存! | Y* y+ ?' [- G- b6 h1 Q
- LDX #$00# q4 |0 W3 e" ~# [
- LDA #$00
2 }% {& @+ e5 ^# t) t# _ Z - STA PPU_OAM_ADDR6 F* }' M# L6 |. h3 A5 M
- LDA #$F8
0 f* {) I. a. Z - Init_OAM_Ram_Write
# B, X5 e. u. Z7 c3 H4 Z7 T. ]1 A - STA PPU_OAM_DATA
. r P' I+ {8 R) q# ^# ] M3 r - INX
, V( j8 J* {. ~5 {1 ^+ B - BNE Init_OAM_Ram_Write
5 M. y6 E) u* z2 ^! G# t - RTS- m6 G) [1 e. O! h! H9 q, `% t
-
( m" f( w* |1 j* V" U - GamepadProcess;手柄处理4 h r. b; Z* m8 w- O2 h
- JSR GamepadDatacan
: B2 M. k$ P$ f }3 q, T" ~) K - LDA <Gamepad_0_Value
. {' g, O$ i. C7 o) h4 U - STA <Gamepad_0_State8 h5 o1 I5 l& ~, |# j+ P
- LDA <Gamepad_1_Value7 c& a Y) e9 `" B4 a
- STA <Gamepad_1_State0 a" Y" Y4 n1 C# b4 z# r! k4 T
- JSR GamepadDatacan0 ?; b7 H" ]0 H8 G! W9 M1 r$ V6 c
- LDX #$01
8 c6 u/ ^" B. @/ u# F - GamepadMergeCheck;合并手柄输入检查% J1 J7 P$ G5 K b) u% B' b
- LDA <Gamepad_0_Value,X2 z2 e f1 g$ \! Z. q3 o
- CMP <Gamepad_0_State,X
, J* g9 ^1 b, T d3 U4 D9 | - BEQ GamepadMergeInput
) m: m3 M% Q' ~- ~6 ]; [; V - LDA <Gamepad_Temp,X
2 I6 k" {2 m/ J/ W5 t) f/ c. _ - STA <Gamepad_0_Value,X; k( E$ w; p( \2 d: ^: g/ b
- GamepadMergeInput;合并手柄输入9 q0 U- L+ ?" q& _/ K d
- DEX
9 \2 Q' x! Y) B& x - BPL GamepadMergeCheck" J. P K6 S+ i* n4 _& E8 d9 d! ~
- LDA <Gamepad_Merge P! U: j- {+ _ i, x" V
- AND #GAMEPAD_MERGE_FLAG
& O, a& F& v+ f5 [0 M8 f - BNE GamepadStateProcess
, z. v3 Y& i# ]0 G - LDA <Gamepad_0_Value
2 N+ m; }1 a7 t3 }3 ~9 d" ?) v - ORA <Gamepad_1_Value0 i+ `. b0 P- E8 ]
- STA <Gamepad_0_Value
6 i2 J7 T6 s4 p: J! X G' p - GamepadStateProcess;手柄状态处理
! F. M+ Z8 u* n% S+ X) i - LDX #$01 u& v g4 z, z% F8 L
- GamepadStateSave;手柄状态保存# O4 a: J! V0 D, C. g3 X6 h N
- LDA <Gamepad_0_Value,X
2 l) @2 [/ C9 N" u( p - TAY# _! q2 c6 U, w5 \9 R3 r, ?; A
- EOR <Gamepad_Temp,X
+ n+ f- V _8 l3 ^ - AND <Gamepad_0_Value,X
6 L2 k% A. @$ U- d) G* ]* _+ ? - STA <Gamepad_Once,X b* B9 Y4 n6 [1 P$ y1 `
- STY <Gamepad_Keep,X$ ]) ]' y4 A& g' \/ O- j; C
- STY <Gamepad_Temp,X. ~1 i& j8 j; T: x8 h% ?7 @$ M, s
- DEX, o, ~ h- P1 Z6 {+ _
- BPL GamepadStateSave
& D( o# k3 H+ }; }9 O - RTS
) |/ J: n. S4 d) F; i4 U - , \7 L- x) ~; t% J8 j+ _ C
- GamepadDatacan;手柄数据扫描
, Q8 C) F" A' H i; S - LDX #$01
3 ?6 \3 B6 N1 m7 R9 X1 | - STX $4016% P' H9 S0 P! G4 O
- DEX
" }8 w' O9 T5 ] t* `6 F0 ^6 V) y. d, t - STX $4016# t n& r* q. c a; b% a
- LDY #$08# `/ I u. U/ H! E$ P$ Q
- GamepadPortScan;手柄端口扫描
. X0 e. S: E3 w# `1 y - LDA $4016
. i8 N |3 v% b, d3 c+ ]0 t - STA <Gamepad_Port_Value! h1 [1 q8 f4 v
- LSR A0 Q& B2 I% P# c1 Y0 f
- ORA <Gamepad_Port_Value/ f4 c; D, H9 p9 E' E( s' o
- LSR A
* `# }: R* l/ q - ROL <Gamepad_0_Value5 ]' U0 l$ T( x0 j* M: ^) u
- LDA $4017. d( j: o3 f! ^9 q" C
- STA <Gamepad_Port_Value
! j! s: O1 F7 S; @0 Y; E - LSR A
! @/ b1 b9 d6 q3 g$ {+ { - ORA <Gamepad_Port_Value k, C5 K9 n) l2 X
- LSR A
" h6 p" I% C8 d5 g7 f: K5 ] - ROL <Gamepad_1_Value8 C- a2 @! U* b0 J9 k( c# |
- DEY
/ e6 `: z* L! l( _ - BNE GamepadPortScan
/ F8 y6 I& G4 Z! o - RTS
5 [4 l5 g8 ]6 r$ t4 t" F -
; {+ B$ _/ l1 Q9 i - ;==================================================) ]8 Z! w+ j& z2 q5 _" A( t3 V+ V
- ;PPU处理
5 ~/ J7 m6 l9 [8 y5 z: Q - PPU_Process& }" \/ m; R1 n2 d8 n
- LDA #$00. U0 W, K6 x# b& U! J
- STA PPU_MASK
( C4 v+ J' U% u4 u% _: ? - " ]& \9 d0 b6 R9 b: T* o' B" I) U- S
- BIT PPU_STATUS
" P6 X' c1 l/ P0 Z - LDA #$20
, E- }1 u. s7 {& X - STA PPU_ADDRESS
- _. m0 _, Q* S! v" F( r5 C - LDA #$00
+ [) \. @. c Z# Q/ w3 `. e6 B+ L - STA PPU_ADDRESS% A2 X! {2 @! F* V$ I
-
0 ~: F: Z- S/ ?6 n4 U - STA PPU_SCROLL
% M$ m$ p! F( p0 s - STA PPU_SCROLL9 t7 m5 [0 {& {% H! s- t$ ]/ R
- 8 ~3 _1 a) L' p7 Z" c8 R) a- S
- LDA PPU_Msak_Buf
' B- {/ s( }$ n; L8 ` - STA PPU_MASK
% d, M" k7 t3 L$ U - * s( Z4 Q, w; M- s% {
- RTS; j3 K. n' Y/ @/ v9 {
-
w" \7 `8 E: a" ?( ] - ;==============================
; f2 f) J4 N1 U% S1 a - Time_For_Vblank;延时等待5 Q6 D9 A% F- Y0 C7 H: h
- LDA PPU_STATUS
# t4 E! V4 `- H: i - BPL Time_For_Vblank6 B* s6 Q: w( B# \# o. G, h' e
- RTS
' ?; H2 z( o9 f. | -
0 k3 l$ s6 z y/ I# f- y - ;==================================================
8 @# G2 t, J7 L$ _6 o - ;初始化MMC52 o$ K- B& a5 G! W* |- f
- Init_MMC5
! @1 b9 K7 G$ _; v5 O8 ^ - \- J! D6 N5 _
- ;设置一下6000-7FFF的RAM! `9 P5 U% y- K2 `$ H
- LDA #$000 g: ]% @! E+ H
- STA MMC5_PRG_BANK_6000 R0 A- D( O+ E# N C
- 1 b7 ?" `* Y$ @$ \
- ;开启 PRG RAM 写入
% W- |! R$ h# ]$ V1 C - LDA #$02
# U" n5 p0 M. ?6 G - STA MMC5_PRG_RAM_PROTECT_1
) _5 v& x6 R, {6 j1 w% u+ k - LDA #$01- c5 I! Z/ ^" ]: R7 U" P3 [; s% _
- STA MMC5_PRG_RAM_PROTECT_2: T* l0 w0 V' W; Y2 t( D
- 4 u6 D2 D+ l" V; B* E- E) _( p1 ^
- ;启用 1KB 扩展RAM ($5C00-$5FFF)7 c' A+ M6 a( E7 J5 r0 U0 Y+ h4 G( x
- LDA #$020 J/ |" a( B. {3 i2 l3 }6 d
- STA MMC5_EX_RAM_MODE
2 ~& @+ ^: `6 ^5 H - $ K7 [8 P B; T, Y
- ;设置 CHR
' m L# f9 y' v s - LDA #$00
$ T" T% p; ]% f( f - STA MMC5_CHR_BANK_00002 M0 c* c4 S" h% S
- LDA #$01; L' ?0 h) x, w3 a
- STA MMC5_CHR_BANK_0400
1 m, Z) W9 h6 ?8 s8 p1 H& E. ^2 }( K - LDA #$023 A* c" A9 @+ f/ F) P
- STA MMC5_CHR_BANK_0800' R! F( x0 d! s% o$ C
- LDA #$03
+ T, ~3 u1 M) q4 D* V; k6 c8 }% h - STA MMC5_CHR_BANK_0C00
. m) X5 Q8 S& S" ~# g) }1 D l8 [ - LDA #$04- S; B0 c: n1 W/ e5 x' {; E5 y
- STA MMC5_CHR_BANK_1000
+ z U8 S9 Y& b6 i3 e - LDA #$05
% `$ u6 O! Z& E& k - STA MMC5_CHR_BANK_1400
& k$ m _! K2 [) K9 P - LDA #$06
0 t" ?! L( @) ]1 p - STA MMC5_CHR_BANK_1800; U, Y, L9 N0 V9 j2 ?; G' F
- LDA #$07. h, e) G6 V. v; O3 j4 q
- STA MMC5_CHR_BANK_1C00
8 P2 f# q' m/ v% s4 X1 K - 7 c! ]! |, H5 g, l6 g# q% I0 h
- ;设置屏幕镜像! W2 g7 Y& k; ~9 p' v, }, k7 h0 A
- LDA #$50
. Q5 a( w$ W: {# `0 `& i, u8 g - STA MMC5_NT_MAPPING
* I \' \* n0 Z, J$ V2 ~+ y -
7 N. y S/ |, n4 R4 A - ;禁用IRQ k6 ~- V' T. U
- LDA #$00
4 P' `3 |$ y. Y# H - STA MMC5_IRQ_SCAN_CMP
9 ]' @2 b& ^1 ]7 H' r+ u - STA MMC5_IRQ_STATUS
$ x- D0 Z9 \( q( t4 p; f3 h -
6 V& ~8 m. q. ?( J' ~ - RTS
" X: h; \0 K) |# W - " T. U* s/ ^1 e8 g% a* V
- ;==================================================& {1 t, ]6 c; c% Z! F
- ;重置中断处理
7 b4 ~9 t& W9 M+ I7 ^ - ResetProgram
( |% O. M, K# s7 ]- p% `7 [ - SEI
- z0 P7 b h Y/ r - CLD
( r/ y* x% |, A - LDA #$00- R( l- e8 d) A7 _3 v/ `
- STA PPU_CTRL$ ]( p1 @* W; r( ] d* v
- STA PPU_MASK
9 V* o# o& K% R2 l' {1 U - STA PPU_STATUS
0 ]& N: ]7 |9 d& _4 e4 b+ x2 X - STA JOY2_FRAME
1 a: }& @6 u7 a0 f% o - STA APU_STATUS0 K! e8 H C: X$ S6 W
- 7 s/ v4 C) k& ?( E- }8 ^
- LDA #$C0
$ l, x+ P4 l- U# [ - STA JOY2_FRAME
3 B; X- S! B$ x. \) d E) R, u -
5 k8 D2 r" n) ]6 n# y - ;等待vblank7 j+ ?) ]7 f9 G3 G9 q2 m! A
- LDX #$023 o+ I2 I8 r/ \$ z7 y
- Vblank_Wait_1
% r- D( G5 n" m0 x! S; W3 R- n - BIT PPU_STATUS
6 f2 M( K( e' A# k - BPL Vblank_Wait_1
! t4 ~8 S7 J ] - Vblank_Wait_25 P$ _- y4 W8 u" i$ ]/ m
- BIT PPU_STATUS, M$ U8 J( B: J
- BMI Vblank_Wait_2
2 h5 U6 P/ L; e3 r/ `* M! I - DEX4 P* W% r* R3 T. I- C
- BNE Vblank_Wait_1
8 L t3 V+ a9 Z- r3 N+ X - # _# ]1 k7 `4 c
- LDX #$FF
: n, ~9 z1 h& I" d. p3 E - TXS
- F, B4 P& [. _! s9 O - ) ^1 C3 K5 P) }! ]0 a* e7 _8 F
- ;初始化MMC53 G n- M2 y- \
- JSR Init_MMC58 N/ ]8 u9 v5 {/ X+ v
-
$ k3 I6 T! j) e4 d. ~/ @2 A. h4 c - ;==============================) _6 Q; [5 z5 r
- ;RAM初始化7 O A# a' z) l- v
- Nes_Ram_Init
$ j3 S0 N9 E9 e& q - LDY #$009 j i2 a' T- r! E! E. c! R) q1 I
- LDX #$083 X4 ]. J5 j1 j) l9 Z+ M
- LDA #$00
! h) Z* J' U5 r e) g - STA <$00/ }7 D7 p9 m: ?. @+ B r" |
- STA <$01. ~ p- V8 i9 Q. H e! I+ b
- Nes_Ram_Init_Write
# W3 E8 E K- V. D. [. a - STA [$00],Y
, M# C ]+ f% Q; P: O Y# W - INY
) b) R' C4 w$ H1 Z8 L+ W2 { - BNE Nes_Ram_Init_Write! ^' W* B. a! {! D N/ [
- INC <$01* D. G- r2 ^/ }9 t; H
- DEX- v( i( n8 h1 a4 n2 `8 Y# ~
- BNE Nes_Ram_Init_Write" b+ q5 a$ M! T- E) S& M
-
9 o6 t P" n6 }8 o2 ~/ e - ;初始化命名表
# a( o- d" h# o1 A. t8 Z8 P - JSR Init_Name_Table1 j) h% W2 y- N
- " m( P! [9 b- @' t( U7 h, v1 K
- ;初始化调色板$ n+ Y; y Z i2 N
- JSR Init_Palette
: e: W( _2 V, N6 J -
4 P& D. t8 U$ D) Q3 r - ;初始化命名表属性
% @$ g" D& p9 S9 n+ z9 g( c - JSR Init_NameTable_Attributes
! A/ e2 {) d% Q* b, y2 y4 V( x - . n+ `; y& Z, b/ `
- ;初始化精灵内存+ a7 C3 e7 t* G+ h! A( a& T/ s
- JSR Init_OAM_Ram( i* G2 R: D$ X0 i7 a! n: d( Y
- # d1 ~4 x8 M. f& |; z
- ;在屏幕上写点东西
2 Y- w1 V7 a6 U6 C( H N - JSR Init_Name_Table_Text/ {. Z1 J2 m% w6 B( {% q& ]
- ( M' \+ `! h2 ]: o0 J1 s4 D: _" c3 g
- JSR Time_For_Vblank
# s2 H. S) n0 D6 r$ X1 M8 B$ P - ;开启PPU控制
7 [0 z/ }- J. E, T - LDA #$88
" d' C0 Q1 {6 D; |# u - STA PPU_Ctrl_Buf) R2 U5 m" V' W; g' |
- STA PPU_CTRL. J8 x9 r; H( Q* ]# ?+ t3 U) f
-
, l) j& `6 J% M" ^ - ;开启PPU显示8 Y: x1 _# J6 p0 O- U
- LDA #$1E
# h- g9 e) N& H5 { - STA PPU_Msak_Buf
8 i* h, O- U' n - - W3 O) t u/ h3 c' g8 m
- CLI
- O2 ^% i2 ?* w) Q+ X1 ^ - JMP Loop
6 @8 u$ c3 o3 e4 W5 n; Z- A" |# _ -
* t0 b: G0 h* b6 M1 A. G+ H - ;==============================
3 @* s( }1 C" @, [6 y: e, x - ;死循环, 等待NMI中断; Z" h- t# a5 Z- x& Y
- Loop
( @" e7 o2 ?2 R A% c7 P0 o, e - JMP Loop( A7 `$ K6 Q. ]# x1 g, I* K/ u
- 4 f' v$ D5 [2 V( o& A8 G
- ;==================================================
. D: |$ O$ L: y - ;NMI中断处理% x6 F) e* M5 m/ c7 c( V) o
- NmiProgram
q0 G! L. v! w - PHA" U8 q/ ]3 K4 z- ^
- TXA
& N( N, I8 y3 D; J) h) h' H - PHA
% H$ Z/ s' L+ L. j9 g; g - TYA' y3 c+ H" _1 `, B
- PHA6 H1 d( {6 `3 ]/ _' l( D; M
- 7 g4 x. ?- E9 A' |) ]+ e
- BIT PPU_STATUS7 J2 O" }* i& b5 U2 c; {) t% c
-
, L! V1 I! s# J( j; m: b ~ { - ;启动IRQ中断, 第16条扫描线触发
( h; j$ B* d& ?+ y8 ]9 Z8 f, ]- Z- a - LDA #162 y, ~8 ]8 ?: { \/ S2 L U) `
- STA MMC5_IRQ_SCAN_CMP0 l1 l1 M7 G$ B
- LDA #$80+ n$ K, n6 l, N. M/ k7 B
- STA MMC5_IRQ_STATUS
7 x7 y# C1 \6 O) A' O8 C - CLI
. i/ V s$ ]$ P1 {0 S" D -
) m" D2 Q/ T. K% g+ ` - ;关闭PPU控制1 r+ Z2 |! N5 ~3 U: p. U7 x. @1 j# s
- LDA #$00" H( K4 X1 C! R8 O2 q- N P, ~
- STA PPU_CTRL9 r5 o3 B v3 X; F; U; E. j, T
-
. D) |- ^1 b3 d$ U, P n3 U+ o - ;处理PPU
5 F2 d- f T# u - JSR PPU_Process5 p& H4 Q! u* ?! h5 r0 w
- : R7 v, ]3 A0 B! t; c, K
- ;开启PPU控制" Z3 N+ u7 w9 ~7 k; ?/ O
- LDA PPU_Ctrl_Buf# ?* \7 Z6 S2 h! D
- STA PPU_CTRL, ^7 m6 i" V- t" @
- $ Y' c! |3 I; p; W7 Z: X; i5 H9 A
- ;手柄处理& u+ X& G" J8 a6 G' k8 |$ ^
- JSR GamepadProcess
- l, N. K+ z' g% a7 s0 W - # D$ T ]! y9 i0 N3 k/ X# }, u; h
- LDA #$00
7 |5 I& O7 c. c4 d" W2 @2 S - STA IRQ_Index
$ o* b X& U+ W( _+ [ - ' V' L$ ]7 b2 @
- PLA
; Z& ~* e. ~, }! S1 i9 R - TAY, }) ?" c7 ^' T& D
- PLA$ o. m3 M' k& G6 B8 y+ y
- TAX
5 W# j2 P- q' ?9 M' G - PLA
( P1 D* l4 @- }0 _% Z, ^ - RTI
1 Q8 X" P, K- \" F4 H
% I8 [+ X N1 `! v# ?& l- ;==================================================
& O3 K) U; ~' S& b5 F - ;IRQ中断处理6 e7 x$ Z" R. E8 f
- IrqProgram P N- S& |7 ]9 j9 S4 w8 W
- PHA
* n) m) R0 o w# M0 p - TXA
( Z- T1 _7 n/ r( h2 ~# e - PHA) ]% J9 L& D0 h
- TYA
* D: E& K5 ^$ u1 l - PHA
8 N3 z l2 g8 {( }$ z6 d0 t - ! j8 b" a' m. n$ K+ W* T; D @
- ;确认IRQ# l$ c* Y1 M6 ^. C2 n" V% v! z. }
- LDA MMC5_IRQ_STATUS: V& ?3 A8 g7 q+ V- ^& z2 {
-
! i$ z& n8 i1 d; o - ;允许下个IRQ触发
( j; e/ P# d* C# X$ l+ S - LDA #$80
2 Q9 d2 j) R0 V$ ? - STA MMC5_IRQ_STATUS
& {$ t4 D, j0 b$ j8 D+ w - # g( o) Z7 g9 S% l
- ;IRQ处理, 每隔16条扫描线触发
' f9 t/ w% Z# B/ _/ e, I - LDA <IRQ_Index. V4 k$ g. z- F* @
- CLC
4 c4 G- o! B8 J: ?2 B5 J% W - ADC #$02
2 k. E0 ^9 T9 s - ASL A- \8 D+ M6 r+ q8 r
- ASL A
5 `- d( z5 s$ E9 Y - ASL A! Z6 z" H- i% e L3 \$ k) d i; R
- ASL A
' G0 ?3 L, {# z% D - STA MMC5_IRQ_SCAN_CMP
1 y& {/ I2 d4 @: W- L" S -
+ K! u" G9 U. K" ~: ~ - LDA <IRQ_Index! |. e' R/ @! R, l* q
- BNE * + 4, ^- C G1 H7 g% t
- INC <PPU_Scroll_H
! j/ T0 P* }" Z) _4 z3 z, c - ; v; a6 ^/ r2 f8 C9 r9 \
- ;设置屏幕滚动
! K+ ?6 |$ I$ X - LDA <IRQ_Index
4 J* t5 v5 A! \: m- R - AND #$01; J$ d1 L8 ]* F( |( L/ y
- BEQ Irq_Scroll_Right( l9 x. P; C% J: j
; C" w- j9 k1 k" e; S/ z- Irq_Scroll_Left
1 q6 S1 v6 z. Z0 J - BIT PPU_STATUS
7 u0 u0 y: j0 m- ]% A - LDA <PPU_Scroll_H
6 y: M c) S; J4 N - STA PPU_SCROLL, a) ~2 `5 Y' v) e1 B
- STA PPU_SCROLL
# V9 |0 w! x3 z3 ` - JMP Irq_Scroll_Over
. z9 t% H( X, K8 g7 N# s9 o -
, {. B0 q. k0 ?0 L7 p - Irq_Scroll_Right" O) V; b& A4 o) z A7 W
- SEC/ m( G' t5 d& ?1 i. f4 s
- SBC <PPU_Scroll_H
, j( U5 P4 D- m, O! a - STA PPU_SCROLL4 I) f" }) Z$ y7 M+ g
- STA PPU_SCROLL2 Z* g6 k0 @: u% s. q" q5 Y
- Irq_Scroll_Over
, W6 _( d& v1 ?" c) h8 D3 m, @$ r -
. P) E6 N% p! U3 y& D0 l! N( s - INC <IRQ_Index
6 S% Q" e; O% y5 B/ A$ v& F -
: ?; _3 J" f, d+ A) L( X6 \ - LDA <IRQ_Index$ G8 N% d0 ?4 r6 d
- CMP #14
6 L+ Q ^8 x5 o# G* @* I - BCC * + 5
9 i) ]/ n8 L% f - ;关闭IRQ
- l% ]0 t& w1 Q - LDA #$00
4 r3 e/ ?: l2 b, t - STA MMC5_IRQ_STATUS+ w% S; L u6 d
-
; T; @+ U6 q H! g5 ]/ e$ J! i - IrqProgramEnd5 G( x+ u: ~* p3 y
- PLA; D9 P* K( N& u0 v$ f' n
- TAY
B( ? v: O( ], P5 _, K Z6 p - PLA$ U% S. M; ^+ U$ k9 Z8 m$ [6 s
- TAX# |& }& S0 H6 I9 ~& Z
- PLA0 @+ g+ N: P" Z
- RTI! u% Y7 o) D- m# ~% B$ J$ S
-
1 \ p9 v4 m/ K" |$ y; l& P. Q ?- V - ;==================================================
' U* B6 ?% X& n8 x9 o% c - ;中断表5 o3 ` b A0 ?- ~: [* C5 T+ K
- .ORG $FFFA
: [- E' ^! I0 d# K. Z2 w) ^ - .WORD NmiProgram
5 N4 s9 Q% N. k9 u - .WORD ResetProgram$ @3 t) K4 c/ e3 W5 B* _' m0 K
- .WORD IrqProgram
复制代码
5 U* F& L2 _" K. d& b' n9 ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|