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