|
|
- ;[FC音乐][MMC5 IRQ]; {* N7 ?$ \2 B. N$ S
- ;FlameCyclone 20230710* l" s2 P; ]6 Q: m( W6 \0 O- M* J+ \/ A
- 8 \8 f! ?6 Q E' n7 D9 T( v4 `3 G# @
- ;文件头
# P" b; L, I0 U2 Z - ;======================================================================& p- X7 r- e i& }& B( [3 }
- .INESPRG 4 ;16KB PRG 数量
# Y& ]0 Z# E5 d" t* S5 y) C - .INESCHR 1 ;8KB CHR 数量
+ Y% h* `# E9 F5 s- M - .INESMAP 5 ;mapper 5( P( b$ W) m2 e* }+ }
- .INESMIR 1 ;命名表镜像 0水平 1垂直" Z% Q0 M% m: V0 Y. P
5 w: u" g4 l, n6 z- ;必要条件4 s. a1 ~& N9 r4 A l- i* l3 v, ~
- ;1.持有CHR ROM d' X: k% x, T6 W% B, g
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$10002 J! }9 Q( d8 n/ u, d
- ;3.精灵内存(OAM)不为空& m( @+ {- m4 w; q
- , t: w1 C5 d# \, ?5 D
- ;==================================================
% L. |2 M* P! I' {4 K - ;NES端口常量
) U' ?+ `- ~; e8 T* q7 _' t - PPU_CTRL = $2000 ;PPU控制寄存器
$ m- K5 S) d' d) M& }: I6 ^ - PPU_MASK = $2001 ;PPU掩码寄存器, t7 v1 O) E; E# ]
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位" f- ^: `/ c! Q. t) `* {
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
* [6 M/ b0 C" y/ C - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
2 I9 G! d1 Z" \$ d5 x - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
6 Z) L) g# ~9 w. g9 K3 o8 z - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加: ~- E2 ?! @, N, a
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 - ~1 z* k5 W" _7 l1 k/ b
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存! i! J2 B8 U5 b$ j2 h
- APU_STATUS = $4015 ;声音通道切换9 C6 O9 D% ?( E8 v8 C! u
- JOY1_FRAME = $4016 ;手柄1 + 选通1 M, j, `' |# s0 P9 ? |& H) c
- JOY2_FRAME = $4017 ;手柄2 + 选通7 T1 S; H' `( D) V- M! k6 t( P
1 s4 B( X! L) D- ;==================================================+ ^! U8 K; R$ P* b C2 _
- ;MMC5端口常量
( P, \6 Q* C5 ?9 A2 `# z - MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4
: D# d) \& j" J, D4 K - MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8$ l7 {+ D: ], ? d ~
- MMC5_PRG_RAM_PROTECT_1 = $5102;
: e6 F+ A9 E7 Z3 O' J/ |8 H) y - MMC5_PRG_RAM_PROTECT_2 = $5103;
m) s% e3 T; C0 m& o( O3 u" i e - MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R5 V+ q g Q5 {5 q7 x' Q! |, n- ~
- MMC5_NT_MAPPING = $5105;
( x7 {! M; ]+ D+ l4 M8 U - MMC5_FILL_MODE_TILE = $51060 e/ J# i# K5 L% M
- MMC5_FILL_MODE_COLOR = $5107' @% H) n [2 j' R0 w7 O
- 5 I. [0 C' i/ f; q0 Z: h
- MMC5_PRG_BANK_6000 = $5113
- {) d8 Q/ h* W/ T Q - MMC5_PRG_BANK_8000 = $5114
8 c$ O' P7 ]0 ~- d: l" W - MMC5_PRG_BANK_A000 = $5115
$ X. j/ V% j$ i4 F2 G' i0 e" u - MMC5_PRG_BANK_C000 = $5116" A( ~8 j; ^. _! L* M k* N9 K2 [
- MMC5_PRG_BANK_E000 = $5117
3 [# C6 I. a- h A& \ -
m# ?" Z4 p* b* _& o) b - MMC5_CHR_BANK_0000 = $51202 J9 q4 e q# Z
- MMC5_CHR_BANK_0400 = $5121
0 D) [9 N! M, O" M) g - MMC5_CHR_BANK_0800 = $5122
) d" c1 m( w3 L2 I- N+ A - MMC5_CHR_BANK_0C00 = $5123
% f, a8 f) x) H& F+ _ - MMC5_CHR_BANK_1000 = $5124
4 A- v( g" `% C$ I - MMC5_CHR_BANK_1400 = $5125
% B- l( C) l7 i* t - MMC5_CHR_BANK_1800 = $5126
+ q' c4 n+ R! M, J! b! }7 o5 t - MMC5_CHR_BANK_1C00 = $5127
0 e. J9 X3 `# n - 3 M& }: C, E, K9 u( E3 z
- MMC5_CHR_BANK_0000_1000 = $5128# l. |1 p- J5 o+ E
- MMC5_CHR_BANK_0400_1400 = $5129& E) p. w+ Q! g# N. y ^2 F4 D3 V$ y
- MMC5_CHR_BANK_0800_1800 = $512A
2 [& a6 G# @2 A! |% t$ Q6 g$ M! X - MMC5_CHR_BANK_0C00_1C00 = $512B# ]8 t: I+ W; z- f: A
-
; C6 F! a9 J- B' |3 T |1 J3 } - MMC5_CHR_BANK_UPPER = $5130
$ q- O8 K4 v. B# P9 H1 p - MMC5_V_SPLIT_MODE = $5200
' w: ?- m" u6 k5 p - MMC5_V_SPLIT_SCROLL = $5201
% _' s0 D$ a1 A3 P) ] - MMC5_V_SPLIT_BANK = $5202 G, m, T# O# A
-
) Z+ T w8 p) p6 ?7 ?# A5 H" I# Q - MMC5_IRQ_SCAN_CMP = $5203
G5 M' B: W6 H - MMC5_IRQ_STATUS = $5204. H0 _* l! J2 x: b4 d% D* @
- MMC5_MULTIPLIER_A = $5205/ u% m0 K) ?+ Q& v$ x
- MMC5_MULTIPLIER_B = $5206$ i/ t/ n; i$ u( G0 ?/ X
-
* z4 F& i3 g% b$ V - MMC5A_CL3_SL3_DATA = $5207
' X* {% J) ?( H* k$ q {8 Y - MMC5A_CL3_SL3_STATUS = $5208( Z1 R; q' Q) o/ [+ m
- MMC5A_IRQ_TIMER_LSB = $5209+ g: z% z: H1 |
- MMC5A_IRQ_TIMER_MSB = $520A
$ S/ E- A/ Y8 X4 }$ ^
# c( f& t& @& B& ^" {( G. E) \- ;==================================================+ A3 G( _$ W g5 m: Q4 [
- ;程序块配置
, o1 v" d' u% K4 @ - BANK_DATA_MASK = $07- R- m- l( r% M) P3 B
- ;--------------------------------------------------
; c% g$ B" D3 c9 g v* G, k6 h; t( G - RESET_BANK = $07
$ v$ h5 ~( \2 C2 b/ E4 D7 G$ I- C - RESET_ADDR = $FC00
5 G& I; w2 i- M - N; s" v2 v7 d) n* B) N$ U0 q
- ;==================================================
$ K! g9 X# X' W* l' q" [4 L - ;图像块配置
: Y5 Z/ ?" |# L M# V+ P - CHR_DATA_BANK = $08
$ c: n! _% U/ f, }% z
% u4 j" P* h& V* t, X% h- ;==================================================
2 X4 w5 z4 L j2 \. K - ;零页内存地址配置9 ?7 I6 q5 A. K& j# j
- Use_Ram_Addr = $80
6 A% M* V' D ?$ N$ G0 L1 t6 Z - PPU_Ctrl_Buf = Use_Ram_Addr
4 q) P) v P2 U* {1 m, V8 ^ - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
0 I3 n2 i- _5 N! g2 ~ - PPU_Scroll_H = PPU_Msak_Buf + $01
R( J1 B# C5 ]! y4 w) ^/ E1 L - PPU_Scroll_V = PPU_Scroll_H + $018 S% s# o$ Q8 L+ n2 r+ c
- FC_Data_L = PPU_Scroll_V + $01
9 f/ E5 T ^2 B" I - FC_Data_H = FC_Data_L + $01 y& ~6 w: H. n; j# B
- FC_Data_Buf = FC_Data_H + $01& N7 S/ B5 u# Q6 r
- ;==================================================
6 K" U& D+ x) ^, b' ?6 g' c2 U3 [ - 1 z' u; c i3 B6 r5 |, J
- GAMEPAD_MERGE_FLAG = $04
5 f# Q' r$ d4 s! R' |/ M; f - ( |+ p! \2 ?2 ~
- Gamepad_Keep = FC_Data_Buf + 1
8 L+ F* y1 W0 u6 |; T) } - Gamepad_Once = Gamepad_Keep + 2
8 x" X0 C5 \4 m t+ D3 y - Gamepad_Temp = Gamepad_Once + 27 H9 _' g0 i* d- t# {3 x* C
- $ L- d$ I' a7 C. ?
- Gamepad_0_State = Gamepad_Temp + 2
! O8 M& B: ^" Z - Gamepad_1_State = Gamepad_0_State + 1
# _0 k0 t) }7 s' T7 K( i - Gamepad_0_Value = Gamepad_1_State + 1! _7 P7 ^. Z5 T0 K# n# y1 ?. W
- Gamepad_1_Value = Gamepad_0_Value + 1! y" z) M. L% g0 E6 {1 ~; U) q
- Gamepad_Port_Value = Gamepad_1_Value + 1
& s1 p V# k2 h& @6 D& } - Gamepad_Merge = Gamepad_Port_Value + 1
( h/ f7 x0 q% y2 ]# \ - * [# Q7 q1 k+ x6 e
- ;==================================================
& Q6 k2 S& i; S$ u7 f& l, b X9 f - IRQ_Index = Gamepad_Merge + $01
0 M* Y' z2 ]. o& Y$ J0 A - ;==================================================
) N; p& Z$ b0 E3 z; m. h7 ^
5 q3 [, r$ p( U8 }. J! _. `9 J- ;CHR图形数据; d, G# Z/ `, B, J7 `
- ;==================================================, q6 t2 h% m; y
- .BANK CHR_DATA_BANK
1 `; C2 M0 s3 J% v7 T3 C# U! q - .INCBIN "chr_bank/chr_data.chr"+ n% d+ z0 d& x8 ~( s
-
( a1 Y! u/ i7 H9 C - .BANK RESET_BANK & BANK_DATA_MASK
& `! ?! k9 H. C- E) D8 |9 B - .ORG RESET_ADDR5 o: Q% [$ K% j! _% t
-
3 W, f' Z9 M2 k - ;--------------------------------------------------0 N5 D6 P3 m a
- Attributes_Data
0 _1 s: b! d9 r - ;命名表属性) Z1 @4 A& U" K. o; K1 r
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$007 c" \; v/ K6 W) T5 v
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA$ ^+ R( D1 J( ]: [) \
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA+ e _) I' K& r# D
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
1 U+ B$ K* Z3 ~7 [, A* Z7 J3 @ - ;--------------------------------------------------6 R/ t8 Y! r6 F8 g7 ]
- ;调色板数据. O0 Q4 z! C5 v3 O
- Palette_Data
9 S, ]) H: }' a: k - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F) B- k. g. X3 P w1 k/ {; c' T* i
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F3 B/ f0 l( F+ K) @( v2 `" Q
0 N* Y" N: l/ F1 Q/ @0 o' b- ;==================================================! e+ T& N4 b6 |( s+ p5 \% Y
- ;命名表初始化
7 l5 k2 V+ Y$ W- F& X$ j3 h - Init_Name_Table; ?$ G; F2 G& j, [' N
- LDA #$20/ {$ J& E, C5 \; x% ?
- STA PPU_ADDRESS
4 Y! s" D: j1 d M/ r - LDA #$00
2 G: v) @$ H! q - STA PPU_ADDRESS2 P8 Y5 e2 M$ q* ]9 q) s' Z
- LDA #$00% U2 n1 h! J2 n* z& h: }4 Z
- LDY #$00
2 I `7 m; W' a f: o* K% R - LDX #$10
7 Y& s! y0 Y; g# I - Init_Name_Table_Write4 \; y6 n/ q& q8 N
- STA PPU_DATA% |; Y q6 Z/ o7 f1 k4 T
- INY
( W" s9 z( W1 m2 G% [1 D - BNE Init_Name_Table_Write/ m1 f: ^6 T3 T8 U* c7 {% r% R) [
- DEX- _ y7 k3 @% Q# ]8 |4 C% M1 s0 f
- BNE Init_Name_Table_Write. A: {5 H) _' o% M$ ]! k
- RTS$ T( J9 E' }1 u- X0 B4 M
-
' M" W5 N6 ]9 l. E+ S- a - ;==================================================' e& V; F# c- d# M
- ;调色板初始化+ v8 r* p! b A/ O" J" G: o2 N* q: e( Z
- Init_Palette5 Z5 x7 j' f8 [9 H8 s, F9 X
- BIT PPU_STATUS5 ]( l+ x$ r: O
- LDA #$3F
# q4 o& q2 d0 }$ K2 X - STA PPU_ADDRESS7 ?7 D) F" {" i) E
- LDA #$00
- S v }* G! ~. `* d - STA PPU_ADDRESS
9 D& Q, Q) T2 B5 F: y! K3 B3 G - LDX #$002 g; z* c! J7 i. H6 T# b
- Init_Palette_Write# W" ?1 p$ z" _7 E2 F5 I
- LDA Palette_Data,X- @0 h0 X# b- G2 P! E
- STA PPU_DATA
; M8 {: g: g; g - INX
7 h( O% N/ ~' z9 H - CPX #$203 L5 u7 G5 y: G3 J0 D7 _
- BCC Init_Palette_Write
# s. M) H/ {. X2 K+ `" a; c9 ` - RTS; e y6 h2 r. v2 U* `
- ) b/ P; y0 k: o& h, @4 N6 A
- ;==================================================
* U# y" r9 L8 q - ;设置命名表属性. H" @3 Q4 g% _* g
- Init_NameTable_Attributes
2 Y) A# E0 d( ~; R, n - BIT PPU_STATUS
5 i1 c) G) @% z3 K( u - LDA #$235 ]' e. n. O* W
- STA PPU_ADDRESS4 D7 G$ M& q- |, I$ N0 M
- LDA #$C0
! C/ i9 ~$ W P: }! z8 |$ k F1 z; v7 q - STA PPU_ADDRESS' r- _- t) Z9 Z& g/ ~/ W
- LDX #$00- o" F. S! m4 Y4 \
- Init_NameTable_Attributes_Write$ o0 `. {8 x* m7 g
- LDA Attributes_Data,X; q; M9 }0 n4 c; T% n; T
- STA PPU_DATA
5 }' s- }) y( w: R4 ] - INX2 g8 I" n5 @" I; B
- CPX #$407 l7 v, U8 h4 [- U4 Z% D/ f& L
- BCC Init_NameTable_Attributes_Write
0 d6 J+ y; v+ x# `6 { - RTS+ T! ~: i& Z9 k$ _' o" h
- 3 o, _( B# `' Y
- ;==================================================
3 n. H' c7 ]" L& z3 U2 s - ;初始化命名表文本: [& X) F# \ \# {; x, O
- Init_Name_Table_Text6 q Z1 O( ]0 y4 @
- BIT PPU_STATUS) `+ D1 }9 N7 H+ w; I
- LDA #$205 v+ X1 O; W+ y7 r& n, u
- STA PPU_ADDRESS% N* D. k) ^0 x3 S( K
- LDA #$00. \* m. G9 V1 K# ^
- STA PPU_ADDRESS
0 {1 Z7 R J4 L# L8 C8 H - LDA #$00
& m# I+ Q# n3 {( H - STA FC_Data_Buf' W9 I8 n4 ~+ D9 P7 B! a
- LDY #30" b" r- ]: n7 B) n% B
- Init_Name_Table_Text_Write
' n: N# K9 X: J& j0 q$ L6 ~# Z/ w - LDX #32
( i$ }. h/ s- W- E - Init_Name_Table_Text_Write_Char% C' w( [; _* O2 Q4 m
- LDA #'0'5 t9 X/ E0 a- j
- CLC, [0 M$ e% g; `! C7 i0 {+ D6 `, H
- ADC FC_Data_Buf
& u. \- V2 I# B* r+ V, f - STA PPU_DATA" b1 B1 j3 u% D5 g- c' d% g
- DEX
$ z' ]/ h5 h6 f - LDA #$144 a* c4 w$ R, F) j) Q- @4 j5 M# V
- STA PPU_DATA6 u' w; Q# v+ [9 x& u, C4 U
- DEX! y# Z: u8 ~( S" c
- BNE Init_Name_Table_Text_Write_Char$ ]* o7 V; ?* i* ?; K5 u
- INC FC_Data_Buf
* E/ l# C* r- m/ Y& K1 z - DEY
/ k s. H3 C$ y2 }% S! q - BNE Init_Name_Table_Text_Write: W: @4 y# j1 x& g! N. [
- RTS
+ ]+ V- v( B& A4 H: N) N
( f6 u. W E% U- ;==============================
# Y& w1 t, Y* o7 N8 x' l - Init_OAM_Ram;初始化精灵内存% u1 H9 t& R- m+ Q
- LDX #$00
% q, z( i4 G* w, T( Z& U# ~5 E - LDA #$00
+ Q& v L4 r7 h: T* e1 o - STA PPU_OAM_ADDR
R0 |1 n! w& n( Z/ F9 }. ?0 b - LDA #$F81 U# _! S3 f2 A+ p5 G' ^: |
- Init_OAM_Ram_Write
7 q) ~9 j) C' {/ H4 |. E - STA PPU_OAM_DATA
; Q& ^- X1 G/ }8 i" g - INX" s9 J1 e+ `; B# ~9 |/ r8 Y. l; }
- BNE Init_OAM_Ram_Write/ D) U. H8 Z9 I7 j8 L
- RTS5 u% H6 n# y' N0 b$ a0 Z: L! |& }9 R4 ^0 ^
- 2 V4 e9 j. M V% E# i
- GamepadProcess;手柄处理) ?8 W' K7 A: @( U
- JSR GamepadDatacan! q# J6 `0 M. `' s9 _; w t* h& J
- LDA <Gamepad_0_Value
8 R! M5 t7 b4 b4 h( N9 { - STA <Gamepad_0_State
$ L7 c4 Z' I+ Y8 s& K3 D* O - LDA <Gamepad_1_Value% ]* ?6 t) N* p8 {( p, @+ B ~
- STA <Gamepad_1_State- V7 n2 q% }5 t5 l$ C3 o o
- JSR GamepadDatacan
( a" j) w4 K" Z: _; Y9 Y - LDX #$01
+ r. v/ K- a2 E5 N4 y - GamepadMergeCheck;合并手柄输入检查
( P$ f; g F/ `1 i* P! R - LDA <Gamepad_0_Value,X- Y! ?* l0 x" E0 P/ I3 A) h
- CMP <Gamepad_0_State,X+ e8 s' q/ w+ g* b+ G$ B
- BEQ GamepadMergeInput
! m8 q) u6 b" K! N" i" |4 y7 ? - LDA <Gamepad_Temp,X0 ], D- _1 h& f* D' t/ ?
- STA <Gamepad_0_Value,X6 _- S: u# t7 S) r
- GamepadMergeInput;合并手柄输入
8 p* s) A# v- F! i. O - DEX g, a2 ]5 i- Z9 ?
- BPL GamepadMergeCheck
e: ]9 q# |; i' Z1 ~/ @4 S3 E- O - LDA <Gamepad_Merge( J0 j$ Z. l/ S& I$ \4 [. U# W4 F
- AND #GAMEPAD_MERGE_FLAG
- A+ m' z, F8 ~ p6 b+ T; w$ j - BNE GamepadStateProcess
; k9 G! }5 d# U. z* V3 }2 g - LDA <Gamepad_0_Value
^) C D6 R, x2 |6 ^5 v4 X; ^ - ORA <Gamepad_1_Value# z$ T& U7 w. B! X ?
- STA <Gamepad_0_Value
8 {4 L* {. f' C - GamepadStateProcess;手柄状态处理
a+ j# N) K" E* l H( q3 k5 @ - LDX #$01
& X8 N z1 X \+ X9 r: ?2 H - GamepadStateSave;手柄状态保存0 g: I) @2 Z% c8 {8 A4 T9 v
- LDA <Gamepad_0_Value,X
4 I2 S. y2 _ k7 L4 R - TAY
I, X% ~! h0 h - EOR <Gamepad_Temp,X
! U# V" P; y. n; T L; w - AND <Gamepad_0_Value,X
: o0 y* L8 i, N ~( E. L' { - STA <Gamepad_Once,X4 B+ U* |! t, l- F! d; O5 y" `9 H& u
- STY <Gamepad_Keep,X6 P/ K* |4 X% m0 @/ \
- STY <Gamepad_Temp,X" i, g" k. C% l
- DEX
$ l6 K- w. t6 U& M# }! x" b5 n# b - BPL GamepadStateSave
* g+ L4 k1 O, v8 b( u - RTS+ v/ n `* \ `2 ]# J4 W
- " t0 T5 _. M+ {( x2 x- k$ l
- GamepadDatacan;手柄数据扫描$ w3 `& Y$ f( n# }5 z8 g w4 d% }
- LDX #$015 V9 I, n; u5 T3 L5 _6 U6 L4 W
- STX $4016
~8 O; c& |$ R - DEX9 L7 U: s7 l: n
- STX $40163 b. N' j9 b" e$ ^0 v$ Z0 t. ?& Q& G
- LDY #$08: y( R) ]! t7 k w
- GamepadPortScan;手柄端口扫描* _4 b" D) w n4 T
- LDA $4016
9 k4 l4 V0 w* z+ ^' C( d( p; j - STA <Gamepad_Port_Value3 ?6 e; Q z7 T f* v' K# ^7 `
- LSR A
: E2 @2 U; A, _5 Y8 W - ORA <Gamepad_Port_Value9 o' b+ r) E! j) p
- LSR A
& x6 b( x8 l8 v j: x - ROL <Gamepad_0_Value" D$ j$ ?2 ]. c' ?
- LDA $4017$ M! K7 x0 @& c9 u1 V8 j6 g
- STA <Gamepad_Port_Value! ?' r$ n2 y: a$ H
- LSR A: A1 r! C% U# s( G
- ORA <Gamepad_Port_Value
; U% K. w" ]; m# H! Y' V - LSR A q7 C% s/ c! F- t" s6 K3 W" A
- ROL <Gamepad_1_Value
C% R. W! n" {0 _6 l3 v# e - DEY0 W! n6 e8 O1 z9 q1 F% j+ u1 ^
- BNE GamepadPortScan6 b( x2 @; _/ N/ s* r3 A; t
- RTS
* i9 Y2 m- O6 T -
) Z0 V5 m, V2 p( x+ T+ z - ;==================================================
& d4 Z- i& S# q7 c! W A - ;PPU处理
/ y% F4 ~/ n# N5 R8 F }# c - PPU_Process
, ^( I \& I0 i# u8 k - LDA #$00
2 h& Y4 ^6 n- [/ ]3 ^* M/ y - STA PPU_MASK5 [& E; r5 _* t
- # C9 b( E, E9 N5 U d
- BIT PPU_STATUS
% X; X) r- q# s" K" d5 d6 ` - LDA #$20
* k0 Y0 I1 H, j- R" ~5 u, u3 c+ g - STA PPU_ADDRESS
* t1 {! `" a0 m0 R$ ?1 ]. E - LDA #$00' R) l/ Z6 b' ~5 `
- STA PPU_ADDRESS) ?! p/ X2 d9 I x& |. }; ?
- ) w8 A% }% u! y: r
- STA PPU_SCROLL1 |% J9 p' P% [ `
- STA PPU_SCROLL
" B/ U0 h+ Y8 x$ L -
7 X l3 F# V3 \* }4 e4 Q ~ - LDA PPU_Msak_Buf' z6 B9 z( { I# G5 e/ }
- STA PPU_MASK
% a8 N) }$ Z. e - 3 N. `1 r" S! X: b" x
- RTS
1 ^' G# F1 }& ^& z -
0 S) F- ?$ H' g- B1 A+ w3 I& ]( _ - ;==============================+ i- b1 w; ]' E; ]
- Time_For_Vblank;延时等待
( Z) d2 u2 g1 a+ W; Y) T - LDA PPU_STATUS
8 c3 Z( h/ M" N - BPL Time_For_Vblank" V$ E* [; k$ C" a
- RTS
. x5 I" k4 R5 z. Y - % r9 T6 N% c" q0 a/ a
- ;==================================================
R0 H! F6 C5 o( p - ;初始化MMC5
% d. U9 U; w, ?' |9 X - Init_MMC5- x. F& x5 }+ P* @
3 @" S6 R6 q! L- ;设置一下6000-7FFF的RAM4 s4 u; T1 C8 v+ p7 H- D8 K2 }1 Z0 h2 }
- LDA #$00* [. k) a! ~+ {2 m5 g5 D
- STA MMC5_PRG_BANK_6000
4 T8 ^2 W% U/ ~1 T7 N - 5 j+ e: {! |5 v0 P6 T
- ;开启 PRG RAM 写入: k) A, r! Z9 Y4 ~
- LDA #$022 I( ?1 C% f i' |3 V; j
- STA MMC5_PRG_RAM_PROTECT_1
, f. j% p7 Z8 b9 N* N - LDA #$01* v: u: Q7 {1 Y/ y+ N
- STA MMC5_PRG_RAM_PROTECT_21 K. C/ V8 y- A
-
! K+ t3 S8 Q3 j7 x' O) S! @ - ;启用 1KB 扩展RAM ($5C00-$5FFF)
$ Q7 W$ ?1 v4 t. n - LDA #$02
4 D( Y p q* m8 z( v1 v! C - STA MMC5_EX_RAM_MODE
3 C) e8 O! ]7 b& v+ w -
/ }, l: k, O" y& ?/ ?1 \ - ;设置 CHR
Y9 m' T. _% s2 Q4 G( i# d - LDA #$00* q( S3 G9 U, h0 L
- STA MMC5_CHR_BANK_0000- ?9 K4 a' a T }9 i
- LDA #$01
5 _7 |0 G. S; P: y9 v, d - STA MMC5_CHR_BANK_0400
2 ?8 K( W$ L# B2 S; ?7 j: U% x2 K - LDA #$028 ^4 A9 i6 M; {& Y% S
- STA MMC5_CHR_BANK_0800
! `% D( Z: v' J- y0 z - LDA #$03
" t" V2 o3 Y4 X+ z9 i3 y5 M - STA MMC5_CHR_BANK_0C00% ?7 T: V7 S# k
- LDA #$04
# @' O& b6 Z# |+ v# G - STA MMC5_CHR_BANK_1000
5 ~4 y! G* W! i/ [: K' b: s - LDA #$05
4 d' X% ?3 r [ - STA MMC5_CHR_BANK_14005 H. t( M8 Z/ z& v0 w1 q
- LDA #$06
{& t/ [. j) J9 n( O - STA MMC5_CHR_BANK_1800
) ]. _. H% b/ c% v - LDA #$07
! f5 w4 y1 k; ? M; f - STA MMC5_CHR_BANK_1C00' ^8 k% b& p0 T8 k6 Q. \* s8 m$ G+ p
-
" N) \8 g. f# G) A- N - ;设置屏幕镜像- r& U) L1 G" z0 e' ]. e/ U1 }5 ~
- LDA #$507 [' S6 \3 z" A2 O% I C1 E; U
- STA MMC5_NT_MAPPING
8 j9 U" `. i% g8 @" } - ) @# r. ^) q* a0 Y, n
- ;禁用IRQ# W* Y; l% W( }+ o
- LDA #$00. N1 B5 q7 E! Q1 b4 T' U
- STA MMC5_IRQ_SCAN_CMP2 l; L+ w4 x4 X' j% A! B
- STA MMC5_IRQ_STATUS
( ~) {7 R& m& N2 K -
3 H7 g Z" P" |; E ~2 B - RTS3 w) T1 G- [- `7 H# K2 P
-
2 Y, N* \) G' V2 r - ;==================================================7 a. b+ o/ e% u; n; p& u
- ;重置中断处理6 j& v* V) M/ x7 }" d5 X
- ResetProgram
5 A6 r9 d: G! q& f+ S/ m5 u: W0 D - SEI+ k+ Q) R0 ]4 p
- CLD
K/ R( \0 d K0 ?7 p - LDA #$004 F1 o: z3 q$ J4 ~
- STA PPU_CTRL
, Y! z+ i" g$ r, N. J - STA PPU_MASK
( k) o1 R8 H# V$ K& S - STA PPU_STATUS
$ {4 k% z A. P' m) q$ `3 Z - STA JOY2_FRAME
( F3 ]- w" V6 t: Y - STA APU_STATUS" p' d1 u0 ?$ t/ N# O o
-
1 b- _" O5 a/ ^: ~ - LDA #$C0
& C( L! f5 R7 l% L# y8 O( k( {' D - STA JOY2_FRAME
1 E D1 W# Y$ B6 w A - / L7 |: h3 ]1 _9 n) A
- ;等待vblank
m- O3 {3 Y( s1 s - LDX #$027 H4 r7 @# g9 \
- Vblank_Wait_18 Z; Q$ ?, i3 M2 N: i
- BIT PPU_STATUS; I' N: S2 U1 H3 W8 S) b, l
- BPL Vblank_Wait_1: F D, W" l+ u. O& J7 F$ K
- Vblank_Wait_2" Z* Q$ _; P: T) n$ ]% A
- BIT PPU_STATUS
X4 A1 S+ o) L( u - BMI Vblank_Wait_2
+ g( Q7 u2 r' A5 s* i - DEX8 d4 ]: _% d% ^* @' X
- BNE Vblank_Wait_1
& i& J1 C! p8 p! R/ y8 ?: f% I -
4 o1 A% F! X$ s - LDX #$FF5 T% E5 E; Z* S& u
- TXS
, n- R( `2 T3 |3 P# r -
; {* j! p# A2 u( W6 B# a - ;初始化MMC5. \ S. d& o6 i7 K
- JSR Init_MMC5; |) T0 D8 L2 Q; v7 s
-
; Q5 G8 G# l8 B6 I - ;==============================
9 y7 N9 z; K# ^% b - ;RAM初始化' P' `. e8 y# C8 |7 R$ z2 h2 X
- Nes_Ram_Init& p; \! Y6 I, Y, k& C
- LDY #$00$ ~( N, }1 J5 r! t
- LDX #$08. g/ E e0 P2 n. E4 h% a
- LDA #$004 p6 H) ?; A2 x X' u. ]7 }( T
- STA <$00. P% u s4 N% w7 @# b
- STA <$01: E% W" \3 s1 ~" R4 m% n5 S/ {1 I
- Nes_Ram_Init_Write% ~2 O4 r8 B& L1 J
- STA [$00],Y
/ i1 z) j X3 l9 z1 U& {1 N - INY
% P$ m( I6 N& \; `" @ - BNE Nes_Ram_Init_Write! K4 m' Y7 y5 _# _* x
- INC <$01+ J# j: }, D1 c; [3 p
- DEX2 Q) U/ `9 l, J% G% Y# ?$ w
- BNE Nes_Ram_Init_Write8 p z* k6 A' L, X
-
* c8 V0 l5 R8 N - ;初始化命名表
5 g/ s) q6 C) T9 `9 D& A% r - JSR Init_Name_Table% W1 A6 G: z! @
- - F( g; |1 Z8 f
- ;初始化调色板8 w8 Q) D" w+ `! s
- JSR Init_Palette
9 n5 T: |; B: T% @5 r6 e2 S* D1 D - 5 V$ V( H& _! s1 m4 i& q: D2 z
- ;初始化命名表属性
5 K# n. b# I4 T - JSR Init_NameTable_Attributes
; Q5 {& x' n/ o! q6 b -
$ h/ }8 b' O6 C" y4 o. g - ;初始化精灵内存
6 I2 ~ }+ ~6 ?- ]. ]' A - JSR Init_OAM_Ram
' i! `3 G6 g# t/ r% |9 o -
& b9 I+ ^' t8 _8 r - ;在屏幕上写点东西
2 G, k8 l- z9 w* G- P: j1 k - JSR Init_Name_Table_Text
, |' S! U" z1 H0 z1 J; U5 c - 0 D. W; D' W' k6 K! _9 @
- JSR Time_For_Vblank
% ?( i$ ]9 T" K2 [ - ;开启PPU控制0 n! _9 I* s* F
- LDA #$88( d N6 ]& u7 B0 O% T) a/ M# Z
- STA PPU_Ctrl_Buf
6 N1 e- o' n, h) R - STA PPU_CTRL
- `9 w& O8 ^8 [$ I/ c -
, ]/ M1 Y. Q% [5 e! F - ;开启PPU显示
; T! ~8 W' ]- V4 b! { - LDA #$1E
9 }' A5 D* g; V+ U8 c - STA PPU_Msak_Buf
/ f. A- j" a& u- x! [7 ?* e -
+ Q0 Z& O- G W% @ - CLI
' w8 T7 t2 W/ b - JMP Loop
1 j8 S. i3 }3 L: t* B9 T -
: W: @* U! k. ?6 C" J5 L3 |* w' n - ;============================== g* [/ @ U) ~& d1 d# D
- ;死循环, 等待NMI中断
$ i) k4 V" p; ]* j) `6 ?3 j. E - Loop" b: l% j3 g6 r/ M
- JMP Loop
9 I% y7 i; }" s+ K( E! c - 7 a% {( {8 I+ y. t
- ;==================================================
, D7 o( Z& s% v' W: |% @8 c - ;NMI中断处理
: j! p) W T b1 g$ V, i$ W; Y m3 o - NmiProgram. U- a0 p8 l/ m I4 D
- PHA
& O- T) X/ a7 l* Q, _ - TXA2 c6 l+ G: E5 y% ?' X3 e
- PHA3 l- K6 H/ D1 N
- TYA
, [! `. q4 E. l; l" [+ W: z - PHA3 E1 o5 V9 Z* n
-
: {9 X' h3 D2 @. I$ V - BIT PPU_STATUS' K; ^* D/ K! [* a9 b( L
- . J. {# ~* E0 ~5 Y" X- N5 q3 t
- ;启动IRQ中断, 第16条扫描线触发. [. V. U0 @6 [& A, |1 d3 ?& k1 x& ?
- LDA #16( ^: z3 n; a. g# g3 W; r3 e
- STA MMC5_IRQ_SCAN_CMP1 w2 r) X' X% J- i
- LDA #$80
& |. @" c4 [- J% D s L* g - STA MMC5_IRQ_STATUS
/ g' L5 d: |' U - CLI
$ Z0 V5 }' U' q& h* q -
9 i W5 ^, C- n$ ~ - ;关闭PPU控制6 b7 k# N1 t5 J7 P% x! l3 R5 ?8 P+ A6 n
- LDA #$00
8 l9 l; U" [8 P0 J9 R, K - STA PPU_CTRL
! {, F5 _" V; ^& i - " U* I8 v# p5 h7 Q+ c
- ;处理PPU
/ }# i* _" |1 K; J- f5 G - JSR PPU_Process& i, |+ A5 H4 h% a& o6 b, W
-
" A9 M, W+ e" f5 h - ;开启PPU控制4 E8 F* {1 }; S I' H0 z/ `6 s6 T
- LDA PPU_Ctrl_Buf0 y) b- _7 ?2 K( l0 M' d
- STA PPU_CTRL4 Y j+ s8 ^3 {( u$ e6 s4 y0 w
- 6 R* f* G4 F; Q) r- x/ ^2 m
- ;手柄处理* u& r2 _* u( W0 b7 u& Z( N9 I3 o
- JSR GamepadProcess
+ N: K& X6 q' Y# o3 f) Z/ } - ! y5 i8 f% K( x9 M
- LDA #$00
4 d, U, I; C4 V6 R% F% ]6 p - STA IRQ_Index$ H: ?6 ^4 h! X0 w6 x7 S
-
, z4 N+ m5 Y, N' r/ C3 W - PLA0 s7 g) o2 s5 n8 G: v
- TAY, B% @8 ^) v/ B# d
- PLA
$ u8 ]+ j3 y8 K( `+ F/ ~ - TAX& G+ o% P' d, C! _* n; v
- PLA
; z8 J9 X! Q ]/ L( I - RTI( t2 W# h7 X% k% r/ z: T- B" ?
3 Q; ?, ]- f3 S. i2 n- ;==================================================3 N0 i0 W A! b) P/ v
- ;IRQ中断处理; w) B. n- x/ j4 y
- IrqProgram& P, \4 N6 |9 ~: X" Y
- PHA
1 w, d0 W: u# L( j* X7 ]( V - TXA
( l, q7 p. F8 b% | - PHA
# _( E2 F; ? r - TYA
; V) `# ]5 N+ ` s - PHA2 u6 p, R6 ?# F7 W9 u
- 9 ~, A4 B$ S* ^8 S. d
- ;确认IRQ
: M" o+ S5 {- v* [* l% w - LDA MMC5_IRQ_STATUS0 X. n8 ]/ A) \+ q3 E n; g
-
- |7 Z. |/ V3 |' N - ;允许下个IRQ触发
3 S9 H# F: A' k4 S/ l/ M - LDA #$80
) h9 E1 M- h0 b7 p4 ` - STA MMC5_IRQ_STATUS
8 k4 U/ l4 |2 A - * y" R U) U1 y! K4 C; _
- ;IRQ处理, 每隔16条扫描线触发
8 ?+ x- s$ c7 R$ e/ j) a - LDA <IRQ_Index
7 e4 |7 X# C/ B! s& U: l - CLC
' C( }( a( d5 Y) e( G; _ - ADC #$02) E2 a$ F( i- L! J5 B# W% C" p
- ASL A
& ?1 \: o: a- F9 e' y0 N6 h - ASL A
; D9 F% a3 S% C1 b( Z - ASL A
. d4 F% W* R" x+ H" [% u - ASL A$ j; {' I9 r3 O
- STA MMC5_IRQ_SCAN_CMP
( Z' i5 H5 Q: s9 Q - # J3 C1 t& Y1 C& s) d
- LDA <IRQ_Index* g0 h$ `8 ~8 p: H
- BNE * + 4) c1 f, K R% X* S8 g
- INC <PPU_Scroll_H1 W( E' f3 b$ k" \7 b: m
-
0 ~/ r/ ^9 p N( A - ;设置屏幕滚动
8 \" K+ l5 r4 t- |" r - LDA <IRQ_Index
# e/ B, D0 {2 g, H3 f( Q4 g: r - AND #$01% M- U4 s- z4 }8 z
- BEQ Irq_Scroll_Right
: x" E7 ~+ u! t7 |
|: q. p2 c" U- Irq_Scroll_Left: U5 a4 Q6 ]- b! w, ]6 k W
- BIT PPU_STATUS; d% G% j$ w. s
- LDA <PPU_Scroll_H
- b# u; E7 r: U. i7 n* g - STA PPU_SCROLL7 t* D+ v& G8 X6 {
- STA PPU_SCROLL! Z. | y$ R/ y; M" `- n- k
- JMP Irq_Scroll_Over5 a3 q! H' F% W, {7 e2 G
-
[7 R. M# K2 {, i' j/ Z; b - Irq_Scroll_Right
( M' S% ~2 l* F8 i2 Y - SEC
) ]& v6 e; F `: @" C8 y - SBC <PPU_Scroll_H
* u- A( h$ h: _3 t - STA PPU_SCROLL
3 u* U% R0 V { X - STA PPU_SCROLL
) ~% n7 j; j2 R, t- k+ I( L' r1 o% } - Irq_Scroll_Over
) g, c9 x2 `* d' W, t) ~ -
; o B2 t, V% t7 l( S) \' ~) f - INC <IRQ_Index5 p0 H8 b J( j2 o' {: a
- ; P* C. V, X Z+ N( R" F& a
- LDA <IRQ_Index5 G8 h2 M5 o, S) K- w2 j
- CMP #142 y# J T2 H9 @
- BCC * + 5
1 B# `- f8 s0 `! j- Z$ Y1 M - ;关闭IRQ
) S' F; A- k* z! ` - LDA #$00
$ S2 F) b+ I8 Z- j4 s - STA MMC5_IRQ_STATUS' T7 _4 m5 \" ?2 X& C
-
# Z0 G7 }; x% J7 o) b - IrqProgramEnd
' N* I8 E- h- {" z7 v - PLA( z1 v; G% J1 L @0 C/ A" d* o
- TAY
+ ?# x1 y* F; X0 ] - PLA& ]% i2 x C: `6 Y$ q
- TAX
& w- x( w( ^% [* G - PLA
: o; m$ u$ |( G5 v% q/ Y8 d - RTI6 L9 }& P+ H$ O& y
-
- l! u2 L" M5 a - ;==================================================
A; e8 E6 {/ U* ~* Z k8 | - ;中断表
: `# B: C% Y/ X5 x, Q) i - .ORG $FFFA9 I7 ^+ z' Y4 E0 M7 ^$ } [: M3 d* F
- .WORD NmiProgram
0 L/ M8 y% c: q3 X5 y - .WORD ResetProgram/ c" E# \8 Z2 T+ y# n
- .WORD IrqProgram
复制代码
+ l$ O1 S6 ~) @( d4 y2 ~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|