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