|
- ;[FC][MMC3 精灵碰撞]/ K b" H$ X9 ]" \
- ;FlameCyclone 20230710
5 m2 l3 \, K9 N0 ^
4 e! o/ B* e* G, l' C0 V. X! t; l- ;文件头
& b1 Q7 n: H# \ a& ]# c - ;======================================================================
8 Y8 \2 ~# q0 m+ i7 N - .INESPRG 4 ;16KB PRG 数量 c1 ]) ^: v9 [6 b0 r' Q! `
- .INESCHR 1 ;8KB CHR 数量
" g4 v0 s) S# L1 u# U - .INESMAP 4 ;mapper 4
6 X4 f; |+ {1 o6 q# a - .INESMIR 1 ;命名表镜像 0水平 1垂直
* m2 N1 q* e& h! q7 I - 7 J. ~3 s; I; D+ O6 F7 F7 P" Q8 M
- ;必要条件/ o. o% v# |& ^' [
- ;1.持有CHR ROM
4 O* ]4 N5 Q% F - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
{, c# F" r6 Q5 t! W' l - ;3.精灵内存(OAM)不为空
+ }* s" B2 N! Y. y- A) f9 `
. y- M! O6 a: g- ;==================================================0 D1 T) x2 ]2 _% l
- ;NES端口常量
. n1 D% M ?" I& l8 [, ^ - PPU_CTRL = $2000 ;PPU控制寄存器
" C: i0 Z; k' ]+ D# a- R - PPU_MASK = $2001 ;PPU掩码寄存器4 C3 d) o' V7 T+ u" h
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
}8 u! j, {$ _ - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1% p! S# A2 d3 b/ N# y
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
8 w! a: K) v5 U3 I& \. m: i5 b' k/ d3 C - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 ! K9 K1 S* G" w0 c9 w
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加+ P K' Z" M2 k
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
: I( ?3 O) N, \ [- t - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存+ F1 n6 Q6 G$ m1 R
- APU_STATUS = $4015 ;声音通道切换* }1 X8 Y, R- h* \
- JOY1_FRAME = $4016 ;手柄1 + 选通3 K) n. M% j2 g! p6 @2 P6 ?* H6 C0 }
- JOY2_FRAME = $4017 ;手柄2 + 选通8 N$ X! j. x4 `8 s1 i K
- / n* L- y& Y% i
- ;==================================================, w1 ~$ ^3 C* I: r* s' a
- ;MMC3端口常量# A" s. d! [, x. t* h) W9 R2 R; y
- MMC3_BANK_CTRL = $80006 p1 e/ i# O0 n+ z
- MMC3_BANK_DATA = $80017 f4 S# W, s5 b9 |3 O, j
- MMC3_MIRRORING = $A0000 l' {% i, D5 Q! y$ {: O' D$ i4 S K
- MMC3_PRG_RAM_PROTECT = $A001
6 v* D8 }6 y& C$ f7 z+ \6 W - MMC3_IRQ_LATCH = $C000- `2 y2 V( V6 s
- MMC3_IRQ_RELOAD = $C001# |% l! h* Q' t0 \/ @
- MMC3_IRQ_DISABLE = $E000
) M+ A2 `) ?9 \/ Y* } - MMC3_IRQ_ENABLE = $E001
% V" Z& v6 H# [% N! ]7 X - 8 n! ]- W) q0 A7 i- W. \* L& g
- ;==================================================& ~5 Z, H3 s# G3 V4 ~/ ~5 `$ i
- ;程序块配置
! O& w# b# T) H; M5 M0 ?: d - BANK_DATA_MASK = $07
* J% ?' D$ w. f* z% {; C" R6 j - ;--------------------------------------------------
. E( t4 q- d3 F: P7 P, a% K( @' | - RESET_BANK = $07
2 r' c! C) X- V5 ~ - RESET_ADDR = $FC00: x5 G& ?2 v: ?- H3 u
; f6 {1 R7 B2 \+ R* H" P- F8 c- ;==================================================
+ o- u7 E- D$ X6 \0 x- k+ n - ;图像块配置
) ]+ k4 [& K! d# I - CHR_DATA_BANK = $087 r8 [4 M e3 A/ C: ]5 g
- 3 V* H/ x# F' |; p/ q
- ;==================================================5 h5 W/ I! |- }# p% b! }
- ;零页内存地址配置7 V0 b" R* w3 B, i2 s. P
- Use_Ram_Addr = $80! ^* F T5 g" ?+ a) P
- PPU_Ctrl_Buf = Use_Ram_Addr$ q- q' }4 c; k
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01: A; y9 ~ p) \0 A9 Z
- PPU_Scroll_H = PPU_Msak_Buf + $01! X) E- F* q/ r- X O
- PPU_Scroll_V = PPU_Scroll_H + $01- R5 S9 l; S9 w/ V" w0 r
- FC_Data_L = PPU_Scroll_V + $019 k& j1 K' t% Z! s0 y
- FC_Data_H = FC_Data_L + $01
3 w0 W6 P L. t! x - FC_Data_Buf = FC_Data_H + $012 s/ e/ M% \* V) G
- ;==================================================
. h* `3 g/ {9 V: P( H8 u. Q - ) G) M6 o {, ?. f# b0 c$ m2 L
- GAMEPAD_MERGE_FLAG = $047 J# L; B2 `9 _3 @ ~
- $ x6 h- u. v; a5 k* y
- Gamepad_Keep = FC_Data_Buf + 1
! U1 U' i0 m2 s$ I - Gamepad_Once = Gamepad_Keep + 2: Q8 h; B$ j9 |7 O. c/ h" ^
- Gamepad_Temp = Gamepad_Once + 2% w2 l T* e: v/ R; {
- 3 Q" p( G$ O# Q6 P6 a. R
- Gamepad_0_State = Gamepad_Temp + 2
9 r1 K) J( s& @/ X$ ~2 r - Gamepad_1_State = Gamepad_0_State + 1' z4 a$ Z9 c4 h C q0 A& Q4 K
- Gamepad_0_Value = Gamepad_1_State + 1
& W, T3 z; {, f5 n - Gamepad_1_Value = Gamepad_0_Value + 1
( R S! a. k" C5 G - Gamepad_Port_Value = Gamepad_1_Value + 1
+ K! x0 q& r0 E) a* d - Gamepad_Merge = Gamepad_Port_Value + 1
+ `7 U8 k1 q$ P( e0 M
+ T) z* w u1 y7 _- ;==================================================& ?7 Q' _0 D" K k* |% l) U6 H
- IRQ_Index = Gamepad_Merge + $01
6 m! V- }/ S) v" O - Sprite_0_Y = IRQ_Index + $01
4 \8 `1 D o# G - Sprite_0_Tile = Sprite_0_Y + $01
* e1 Q5 ^. _) r8 p0 @ - Sprite_0_Mode = Sprite_0_Tile + $01
/ I0 T4 J" E1 ?6 D4 Y9 S, k - Sprite_0_X = Sprite_0_Mode + $01
6 s! i, w4 i, i/ Z# s4 O& Z - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01& G$ _8 d) ^ e3 R
- ;==================================================
, w4 _' [. e. X5 q% A; ~* r
" v8 I8 i7 z' I# u0 L+ @# H/ p/ K- ;CHR图形数据/ U: f& P! j8 i& W" M3 d
- ;==================================================! {) n/ W U; [9 ~( C% B( n) l
- .BANK CHR_DATA_BANK
" r$ L: [. X8 M$ `& w - .INCBIN "chr_bank/chr_data.chr"7 D/ t% z1 O* W1 M
-
$ u" H3 F" \$ k$ b7 O4 {8 F$ b& q - .BANK RESET_BANK & BANK_DATA_MASK
( Q7 Y! ?: b/ Q1 Q* Y8 C9 J - .ORG RESET_ADDR- n' i5 K0 i" i( p
- % }. i( ~: w3 _. H' Z
- ;--------------------------------------------------
( y7 P2 C f- ]/ @/ h9 f5 h - Attributes_Data
T5 z% N% a5 o7 n2 f - ;命名表属性; F4 ^3 t- R! p8 n" s% c7 K2 `
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00! I' z( ^& U# p5 M9 _
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
8 n' n, H) L, F0 M% F1 S; a - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA. w' `% p. ]4 U/ G
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$559 q D! ^$ T- w8 y2 E- _: M
- ;--------------------------------------------------
0 B3 r5 x' l7 o' u - ;调色板数据: ^+ \' j' f0 E7 s! m
- Palette_Data
9 b4 F/ v9 ?' q* Q' K - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F9 e& \* X4 B5 x9 a
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
! \+ v" i x, u! ]3 C - 4 B% V4 w( c5 w/ l8 E
- ;==================================================
, i# L, @, e' X5 n* |$ o2 @- q- ] - ;命名表初始化
/ U5 D, Y' N R9 E1 I% u; b - Init_Name_Table
6 L- q) ~9 C5 b - LDA #$20
2 F$ i2 n$ `$ R ]1 H; F' K- h - STA PPU_ADDRESS1 {+ D1 L$ g3 t! b
- LDA #$00
V( x1 |" m% \' h; h; m - STA PPU_ADDRESS
; j1 D8 @) S+ v9 D$ @0 s- ]3 N - LDA #$00
! {0 l2 o6 w% M - LDY #$00
K! \' }- [7 t; ^ ]) k - LDX #$10
. x3 u0 s, f* f: q; K$ s - Init_Name_Table_Write
( M+ W. B' o% e1 U- \" `! L - STA PPU_DATA$ D! d( q3 O( w( K* `
- INY! Q. ~6 q$ G! L4 h6 U
- BNE Init_Name_Table_Write1 z" I9 F+ P% S) w5 B- q
- DEX
3 m% g0 b$ @) L( L - BNE Init_Name_Table_Write" K7 ~, l) ~7 `( m* I8 E
- RTS1 G; V' V& N9 I: y4 p) X6 o
-
6 p9 z8 P- w3 t* M5 `6 b' o j - ;==================================================
4 S2 J& f! _" G$ Q - ;调色板初始化; X/ s4 {- A; l: N; ]
- Init_Palette8 j3 Q0 z! A3 c* K4 k& p
- BIT PPU_STATUS3 k7 a [: @0 g( W
- LDA #$3F0 }" v# y& m8 j( D
- STA PPU_ADDRESS7 s, K6 P8 ?9 X+ |4 T
- LDA #$00
: I6 W7 |% s+ ] - STA PPU_ADDRESS
6 W/ ^0 `, g- Q+ f2 A [6 D! H - LDX #$00
0 K- ?, K$ b$ Z, ^ - Init_Palette_Write1 z) j" ^: {- h0 Z, e0 X
- LDA Palette_Data,X
7 \* D) v/ s4 ~2 ~! f( B' ^ - STA PPU_DATA
3 w; u2 m5 G* S0 q2 P- G3 u% f - INX
. X0 t0 T4 p( ^' V& c. e9 X. }, t% x - CPX #$200 n2 B1 j$ R) N+ I# g
- BCC Init_Palette_Write& ~3 U* c$ E- L; ]8 J# R7 R3 I
- RTS
2 G0 ]# q$ a; ]! c9 O% j -
, v: j* s% U F4 G8 J5 I1 h( E - ;==================================================. _: k5 o# D( F3 N% n2 j
- ;设置命名表属性. Z# D8 i" u: \$ d6 h6 M0 @" F. s
- Init_NameTable_Attributes: V- a; Y9 ]/ b
- BIT PPU_STATUS
1 ]# E8 j9 x; i+ X - LDA #$23+ t1 K1 c) y( P' t
- STA PPU_ADDRESS9 u! M- K5 N/ \) j' I* N! e
- LDA #$C0
3 ^9 Y' I0 d p6 }1 c1 i( N - STA PPU_ADDRESS" ~ C* t; i4 Z9 I
- LDX #$00
% }% A5 I% r7 T0 M - Init_NameTable_Attributes_Write
/ z' M E4 A9 K7 O7 Y - LDA Attributes_Data,X
& D L* ~) L$ x+ ]' F - STA PPU_DATA
$ F& [/ O1 g4 p* }0 f2 Z/ Q - INX/ @ [# H) Y- ?' d# K5 {$ S# B
- CPX #$40! K, t. k1 v) z9 K( N
- BCC Init_NameTable_Attributes_Write
& }. P0 |. y8 d! A - RTS
4 C# L( `9 h7 `" d. k5 s6 i - , M: w m$ w c' l
- ;==================================================
Y3 a1 x; c+ f3 f - ;初始化命名表文本: o# H* k# ~# X: s
- Init_Name_Table_Text# M# C8 B" n8 r8 h1 ]. g
- BIT PPU_STATUS- O. D# b. ^5 G8 {
- LDA #$20- e! D4 f. `0 U& ^, S! U
- STA PPU_ADDRESS3 F+ Y4 `% [5 n1 f- K6 {" n1 y
- LDA #$00
9 c- |& }+ f% H# d( U1 Z - STA PPU_ADDRESS
' D% H6 D& x% z8 H- Y - LDA #$00
7 k2 ~; K( f( V( Q0 B7 J/ a - STA FC_Data_Buf/ @6 y; r4 @1 u
- LDY #30
; |0 E! K; \1 F - Init_Name_Table_Text_Write
, X" g* d9 P; B7 L+ |' l - LDX #320 L# v! K4 i# {) L- K* D
- Init_Name_Table_Text_Write_Char
- H8 ^5 s' H1 R% | - LDA #'0'
1 Z" k h9 V6 c, ?9 D' j: k; K - CLC- @% C4 m) j: x$ T
- ADC FC_Data_Buf
' V. F7 @9 [- M3 q: B) a - STA PPU_DATA# X* v# ?5 Z: \. W( P- b# w
- DEX6 P* ]2 h; k7 {3 k* ^! ^) s
- LDA #$140 P3 n6 i) [0 P9 r! ]
- STA PPU_DATA C% Z4 @' f1 k: _. N3 d1 {
- DEX
8 h/ Y$ A8 I' L - BNE Init_Name_Table_Text_Write_Char: {. k* ?9 O6 A. U" K8 u
- INC FC_Data_Buf
9 b4 N" }1 T+ H* m+ F - DEY( K; e' R/ e/ |8 m
- BNE Init_Name_Table_Text_Write7 P) ]7 Q9 r* g- X
- RTS
+ J' D/ {( W/ {: \/ |, @
+ e5 a# ]" o% |% \& c- ;==============================
5 h! }3 E2 o/ t* ~- d, [, } - Init_OAM_Ram;初始化精灵内存
0 U0 U D3 {, j, U5 R) Q - LDX #$00; p% Y- p4 h* o5 q5 r2 I
- LDA #$00
# R0 [. C3 z3 [* T, P$ E: r9 y. E - STA PPU_OAM_ADDR
+ ^/ X- d* _$ }. {% N6 x - LDA #$F8
- l) {7 H! o5 A7 q8 G) @ - Init_OAM_Ram_Write
/ |" m1 y A1 P& i1 T - STA PPU_OAM_DATA
6 z: M" f9 [+ g; O# N( J - INX6 u& g. g5 I7 i p5 k+ |: ~* v
- BNE Init_OAM_Ram_Write4 J$ f' k! ?, @2 C- f/ H4 R
- RTS
! A D1 o3 m& v& {6 n -
1 w& Y* o: c& l/ x( P# P - GamepadProcess;手柄处理" e* F$ D7 h, Z" c$ R/ K( E: k* U2 @5 m
- JSR GamepadDatacan
) V0 D$ M# S0 \5 s/ [ - LDA <Gamepad_0_Value
2 f& K1 ]. O4 [% d6 k6 y - STA <Gamepad_0_State$ S4 n) t; ~+ g$ S3 m. i. J4 V9 p" ]/ V9 s
- LDA <Gamepad_1_Value0 L% c+ f7 ]. g3 G) S
- STA <Gamepad_1_State
' X0 W- g" B8 n' {0 ?; L - JSR GamepadDatacan
# J$ I q. K+ O; B" V- c& L - LDX #$01
3 ~* h# y. [' g* A5 V& { - GamepadMergeCheck;合并手柄输入检查
9 u1 u9 a- v! {0 B, v - LDA <Gamepad_0_Value,X
U' z2 q% K0 T, t - CMP <Gamepad_0_State,X
# w1 a* {: H0 q6 _7 y - BEQ GamepadMergeInput; D* N4 @+ t1 ]6 x" y4 q" z
- LDA <Gamepad_Temp,X% F& A6 ] K7 I4 K Z) y* @2 K7 Q5 C! @
- STA <Gamepad_0_Value,X# ?1 e* u8 v# l) @: C
- GamepadMergeInput;合并手柄输入/ Y! Z( s' I) I0 F
- DEX- e# m$ X1 y1 Q, ]
- BPL GamepadMergeCheck
- P7 W1 e2 }$ p% R; P - LDA <Gamepad_Merge$ {! q: @' M' G# L# M
- AND #GAMEPAD_MERGE_FLAG
# n( r6 X% b6 D0 F1 Z- b# x - BNE GamepadStateProcess
6 p+ Z- R2 C2 Z/ v. m$ e5 I2 L4 j5 J - LDA <Gamepad_0_Value2 j0 B0 t% {1 f' B6 i
- ORA <Gamepad_1_Value0 A' [6 M# H+ q; p6 i" c
- STA <Gamepad_0_Value+ t9 Y, M% }+ R) B% }$ }; Q: ]5 x+ D
- GamepadStateProcess;手柄状态处理9 q/ L& B! ~: P3 p5 G7 J! i
- LDX #$010 R# o8 ^) e' @3 S! B7 |$ N3 v) ~
- GamepadStateSave;手柄状态保存' ?, b% X) E' x4 _5 G2 G
- LDA <Gamepad_0_Value,X
4 F4 i. S E( {6 @, q3 w - TAY" n. x9 f: u1 P( G& n' [" h7 D
- EOR <Gamepad_Temp,X
; o& U, ^2 z) t# U - AND <Gamepad_0_Value,X- S. O: q" V* }- l1 z# h9 {4 S! w
- STA <Gamepad_Once,X
' G/ ?! }$ d3 I! P% t$ Y - STY <Gamepad_Keep,X
" @/ m C% G0 {5 Y W# y; L - STY <Gamepad_Temp,X
+ |0 U% _# \1 u$ b - DEX
# c5 W' P% ?# `. c h - BPL GamepadStateSave
1 r6 D9 C8 E$ w- U+ B - RTS
. a& b( M( _3 ?6 r - % m, p7 g1 z$ g1 \; u4 Z
- GamepadDatacan;手柄数据扫描
! j/ i7 ^ o2 k4 z8 E - LDX #$01+ h. V2 H2 v. l& t7 e J
- STX $4016, ^3 o. d: l* ?) e9 y% a& J* ^
- DEX
: P/ e9 g* u( w# L: w - STX $4016, i2 G7 I, I- Y! l) j3 }3 W5 t
- LDY #$084 t5 }* \% I* X( w
- GamepadPortScan;手柄端口扫描: h! N- J2 I: S0 q! f" r! s
- LDA $4016' b- X$ }* ^/ b+ J0 y _# E
- STA <Gamepad_Port_Value
X- H% l% p* G- y9 Y/ c' T - LSR A+ B" d0 K- X# ` V, F( h" W
- ORA <Gamepad_Port_Value) e8 d& @. S4 }9 ~
- LSR A6 v" p$ c7 G, o+ [3 Q1 A% C9 m3 }( {
- ROL <Gamepad_0_Value! B7 x, l8 l* j7 r5 _$ ]
- LDA $4017
+ I2 C3 n& ^8 l5 h- g6 U- U2 Q1 r - STA <Gamepad_Port_Value
) ]1 _2 s, ^, x" `; g2 Z& i- [ - LSR A1 ^- S1 z9 \! m( r! @$ G& W, z
- ORA <Gamepad_Port_Value; J- \1 ]8 \! o6 c8 D
- LSR A
2 D* Y, X u O$ s - ROL <Gamepad_1_Value8 n. j. l% K, X. P- m
- DEY- ^2 b8 N1 q% n0 a
- BNE GamepadPortScan9 k9 C' S' \" b: I
- RTS
7 l e$ U; `$ T- ]3 i - % S) v6 D8 v- i. E5 u. l" o
- ;==================================================1 b( w- g5 |( U6 }' ^
- ;PPU处理
5 Q g$ v- K# n - PPU_Process8 C: H% ^) X0 w/ O5 m
- LDA #$00- m% O0 [ X; r
- STA PPU_MASK
l& [" E, u+ m, ^/ f, j: o! L9 g - * [3 ~% K4 j7 N% K
- BIT PPU_STATUS
, U4 K2 R- y4 q5 m1 [7 D - LDA #$20. P, t. \* E7 |. @3 R, s
- STA PPU_ADDRESS4 C2 S: L' n8 I: G
- LDA #$00
' R8 ]2 e! x6 K' e# L - STA PPU_ADDRESS
C8 R2 e5 R6 p4 i% _ -
1 ]2 {) k1 p. G' s4 v8 e - STA PPU_SCROLL
- q/ Q" t9 k7 O - STA PPU_SCROLL
# l6 g5 V+ _3 K& _' {. x2 Z - # K! o. ]8 ?' v' S' ]: {
- LDA PPU_Msak_Buf
+ Z0 \1 p3 m6 J+ @2 j% [ - STA PPU_MASK
# {+ X+ ?' s5 j+ B4 g/ ]5 f - ; ~- `1 x; H# \: {2 z
- RTS
& M# o* A, z* Z1 U* Y: v' |0 \ -
d" n" D( n1 p - ;==============================) ?) |3 u! d6 q+ a" T8 [
- Time_For_Vblank;延时等待. ]7 Z# v3 @! b; u7 m
- LDA PPU_STATUS
5 {! d; j* k: j2 j! h% z* N- c - BPL Time_For_Vblank0 A4 _0 @* d# P: C. @9 {# m% z
- RTS
! k0 s/ L0 J6 ~0 x4 U5 J& T# C - 7 U! C1 B6 M1 i; H- R# h
- ;==================================================% R q0 m7 w$ }0 r
- ;初始化MMC3
, r, q& T# b$ B* Y0 h5 v5 Y - Init_MMC3. s: Q0 r2 d/ c+ D0 }& p" |& f
- STA MMC3_IRQ_DISABLE
7 t- A3 Q6 v- k- } E -
- O$ J& B {: d8 C2 \ @8 h& }- ~ - ;设置MMC3水平镜像* f+ Z( y: m& q: i
- LDA #$01
5 L! }$ Z# L- \. N - STA MMC3_MIRRORING
7 A& h R. \6 J) C& K# s - 8 p( f# ~' p) x
- LDX #$05
: [+ B) o) ~* X4 h$ c5 P, } - Init_MMC3_Chr_Bank_Write: D: u" z ^& r6 q" ?8 V/ I5 `
- STX MMC3_BANK_CTRL
( |5 ~" x& F5 \. i1 O7 ~ - LDA MMC3_Chr_Bank_Data,X6 W- J9 ^+ {' s
- STA MMC3_BANK_DATA
( y! k( A2 }7 }# g - DEX
, B* i4 ^( _! [# S* j9 d. W7 D% a3 B - BPL Init_MMC3_Chr_Bank_Write
@" h& E3 D/ A - RTS6 Q7 R8 b: c2 x
- ;--------------------------------------------------' J- Q. ]% q) U- P B
- MMC3_Chr_Bank_Data5 j4 R6 \& u0 J) a- m* a( l; y6 X
- .DB $00,$02,$04,$05,$06,$073 ] u! V5 _" w5 {
- ! N( w3 R) l0 [8 [1 a; v
- ;==================================================
/ d7 Y$ L3 n) L7 Z0 A' a6 | - ;重置中断处理
M+ e `& g& R1 h2 k - ResetProgram
% T% R& x$ H8 \2 R2 g& S U" y - SEI' G5 W' `1 B) g2 @- b' z' e; h
- CLD
1 e, O/ p. c$ F5 \" o - LDA #$00$ G d4 @& A% U; f% N4 f8 I
- STA PPU_CTRL& s1 K$ O) x' n$ |0 Y
- STA PPU_MASK
1 Y; d* d" z8 C - STA PPU_STATUS
9 G6 ]0 O* g7 C6 E5 b& x. c - STA JOY2_FRAME7 e/ }/ [" t3 G: `$ ?' ]
- STA APU_STATUS' h. S, |5 b1 o
- - ?" v z R$ |1 d
- LDA #$C0
_4 x3 I% J, Q9 p6 ~ - STA JOY2_FRAME
* t4 k" p4 G7 c - - s5 r/ }3 {' R; R
- ;等待vblank( H8 Z, T, n* u6 b$ o- p- M
- LDX #$02
& x/ v. m7 S+ \" z5 ]8 d+ u- A - Vblank_Wait_1
+ J: b U0 F+ V. | - BIT PPU_STATUS. C6 `( V: X+ j
- BPL Vblank_Wait_1
5 h3 j9 s- q1 b7 B - Vblank_Wait_2
% k) x1 X4 h! C8 K f: h7 `! h - BIT PPU_STATUS
, ^8 L- ]: J4 V! C) R' c, P - BMI Vblank_Wait_2
6 J9 h% h) }$ @% l, |. p - DEX1 n" ? d3 h% e
- BNE Vblank_Wait_1
0 h1 l- D/ c% s -
8 E* d0 A5 h8 {. ]$ o - LDX #$FF6 W1 j' q% V* z2 ]
- TXS( `% |. ~' D# h% G& {5 g9 W/ n
- 5 F! @, Z1 z9 C5 a
- ;初始化MMC3
P! w& b! r3 P L9 Y* z" w& y - JSR Init_MMC3
: W9 d1 \+ Q3 w4 |" P2 [: i, L4 P0 B* l -
, F F7 I; r: Y. Q' i) ^/ ^ B - ;==============================
: R; D& x% V4 t. Q" L$ a2 x - ;RAM初始化
+ [' H! X: \8 H, A W/ ` - Nes_Ram_Init
( f8 D+ I# J: t$ D6 i' o6 S' H - LDY #$000 ~3 ~9 }1 ?0 K: {
- LDX #$08; f6 g* i7 E' g! x. r8 e1 g3 f
- LDA #$00
# Y: j: a' @3 i4 O7 p( L' ~ - STA <$00. i% U3 j8 T# |# j. o' u
- STA <$015 F7 m6 I K! [$ k# m9 q# v
- Nes_Ram_Init_Write
: f8 C# e/ V! C+ j h8 Q' B - STA [$00],Y
! \8 B Y3 r% Q4 \7 c9 r. k - INY
& j& i+ Z0 y7 w5 A5 v* t9 z - BNE Nes_Ram_Init_Write
2 w. z, B4 H f! I6 M4 |3 ?% y6 B - INC <$01
5 B' x5 W8 Q W - DEX
5 G. _1 ~8 ^3 v! Q - BNE Nes_Ram_Init_Write" x/ {8 ^- H1 J9 u
- 7 {: `( m6 X( H+ c$ T( i
- ;初始化命名表$ |- s# L) g. P5 x9 o9 e5 ~1 U
- JSR Init_Name_Table
5 {+ v+ n3 C) n2 I# E7 D -
0 m$ A) y2 o" Q5 M/ x0 {2 c - ;初始化调色板
" H. c) g* G8 c5 L5 B' T! U6 H - JSR Init_Palette0 k0 o: U4 n3 |* b
- ! `/ r4 x3 l" [- o
- ;初始化命名表属性: H" j" v2 J/ n: y. u
- JSR Init_NameTable_Attributes
0 }( z; g4 Z Z$ L - 6 b& @( j& n* ]" O
- ;初始化精灵内存% P8 O$ c1 S$ \# a5 B5 O
- JSR Init_OAM_Ram" W& i( `2 Y: |( _0 u! a! ?6 m
- 6 \6 r+ @3 {/ t, ?& e5 c0 W" j$ {
- ;在屏幕上写点东西
$ Z( K' J; t; f7 g/ G3 D% x" V. K$ H - JSR Init_Name_Table_Text9 n3 P. Q* M( b& d
- $ i& q9 C1 Q ?4 j
- JSR Time_For_Vblank
% Q$ ]: |: K5 H% e/ ]7 I - ;开启PPU控制2 ^- O* b/ K% I6 S0 J
- LDA #$807 b+ _ N( c7 {! w) ]
- STA PPU_Ctrl_Buf4 i7 o/ F( {$ D9 u5 J: f3 j5 i& P
- STA PPU_CTRL
_) Z x. c4 _/ q) f - $ y. W* U$ x& J% J/ V
- ;开启PPU显示
5 P1 {% j, ?& q# Y$ j - LDA #$1E
, N: T2 i7 A4 I - STA PPU_Msak_Buf
) J, E& u' u9 _3 } M- T0 G -
+ g5 D7 c8 }6 { - LDA #77
/ w4 T4 P- w9 v% L$ Y/ E) I+ k, r) v* w - STA Sprite_0_Y) v; k* ]! i6 R, z/ H
- LDA #$1E
( a3 |8 ? h3 U - STA Sprite_0_Tile
5 x+ e8 c: z3 T2 A+ D* `3 I. L' j2 ` - LDA #$20
6 Z5 P* T# _$ X ~2 @% Z8 m7 M - STA Sprite_0_Mode2 K) H o! U$ w; o* Z! X) @, m1 P
- LDA #$00
- d' e" L7 X3 d' B3 I m, h7 Q - STA Sprite_0_X$ P* C% k* T( l# a1 s* V- E# m
-
9 {; o2 i( W0 M. Y# ^ - CLI- C1 k8 K, H- v* v: E. [
- JMP Loop1 q0 @5 U, T5 J3 _# s
- , s6 ]7 a6 M/ i2 c4 z5 _4 c
- ;==============================
( ]! e9 b" G( P% q - ;死循环, 等待NMI中断- I, k" ^) b$ `0 o/ x
- Loop# P9 y( S; B5 r; |7 I5 t
- JMP Loop
* h9 Z) l4 \3 j9 g. X - ) p2 [3 B3 Z% ^+ ]0 i
- ;==================================================
$ ]* a+ a D; }+ _# U - ;NMI中断处理
* N4 \% H* t% C3 H, [' z6 L+ u - NmiProgram: d9 H# M! U0 K6 h
- PHA3 @6 ]( t' g( s8 u. [8 j' l0 k5 E4 ?
- TXA9 S. Q: o" r& H- d( J
- PHA
+ x. h. u' d+ J- A8 D1 P - TYA
' b1 ~2 X% a/ l4 C9 k - PHA
5 v1 F2 E% [4 w - F( p$ c. q8 c
- BIT PPU_STATUS2 y3 f2 W8 r3 R$ V/ |7 W/ ]/ B
- ( Q4 X7 t2 ~9 t
- ;关闭PPU控制
" F' j$ Q+ H0 @) D( v x" o. p - LDA #$00
+ q* n1 `: N5 W* q* y: v# ?# ` - STA PPU_CTRL
# S% B6 z* J; f6 R -
3 g9 n' e; R# W, m3 V( B - ;处理PPU
$ h' f; j$ L, l% V - JSR PPU_Process
* s- C. r! s. [4 ]; L) a - 7 R$ E7 q# y* `: Y
- LDA #$00+ w( W9 ?! v2 Y2 W/ m9 D% C
- STA PPU_OAM_ADDR# m, G* _0 s* r0 t% n' {3 \
- LDA <Sprite_0_Y- E$ d+ M9 C$ k" l
- STA PPU_OAM_DATA
% d2 x& ~% C3 }/ H7 ^* _( P0 j - LDA <Sprite_0_Tile
7 `5 a0 V7 B9 ^2 G [) w - STA PPU_OAM_DATA$ W* a5 f% B6 [) _; y* S& K
- LDA <Sprite_0_Mode' w9 U8 q+ m8 S7 O) g" s9 C' T
- STA PPU_OAM_DATA
- W' ~) l& b# g" a& ]* z - LDA <Sprite_0_X0 a2 T, ^# y6 p" H
- STA PPU_OAM_DATA
# t. m4 b( N2 k, _2 ^/ }3 Q -
1 {' f( r& M+ |: Y$ b/ ~- n - ;开启PPU控制
. B b( @) u( w8 I( A1 D: c) g( j& a - LDA PPU_Ctrl_Buf
' h; V. j6 R+ \1 R5 h }- X - STA PPU_CTRL
/ s. a9 m$ C- b9 q% b - , G* U+ Y4 D0 A6 O: M$ M! p
- ;屏幕滚动
, N: i$ ]3 m" q/ W5 s) K - LDA <PPU_Scroll_H3 r7 D( G6 _0 c2 L
- STA PPU_SCROLL9 O% T( O6 J1 V- {- ?
- LDA #$00+ L9 L) `$ m7 O5 V* Z2 J3 {
- STA PPU_SCROLL/ R0 g8 U& J; {! C* J
-
/ D. R l+ d: m' E3 E( j - ;手柄处理% e. F& @9 J% f% Y3 {* m
- JSR GamepadProcess7 B, M0 N- K8 G% p$ y
-
8 @/ _( m) t( {0 |1 @) ]! R( K - INC <PPU_Scroll_H
) k z: H( f F - 1 M( M% f; Q/ c
- ;启动0号精灵碰撞检测
" o: @$ H/ h1 y - LDA #$01
# L- O' V+ q" r+ t - STA Sprite_0_Hit_Move_Direction
. G. m- X) {; L! `# L - JSR Sprite_Hit_Test1 _( Q& z+ g: j5 |. w" R
-
: K' t b* G) V6 d8 _$ p - PLA) z$ h7 {9 W) Y U n
- TAY
- z( a! u: P; {* U9 C' A - PLA0 O7 x1 J8 U$ `6 L V( `$ o7 Y' x* t
- TAX
" l" @( U; [. L. w - PLA B/ p0 }- A1 ^1 d
- RTI
9 ^! }$ F: X1 e6 O4 ~& y2 Z6 h
7 W. B# l" G, L7 @& r0 s5 Y" k- ;==============================; }" J/ z+ Z' P/ e
- ;0号精灵碰撞测试- z r2 f$ @6 Q; T, ]
- Sprite_Hit_Test' w& B3 g( a0 v
- / F; Y% P! c' O+ a$ d' A2 ~) y
- ;------------------------------* b, G) b" l- _% _ S: A+ I
- ;等待0号精灵碰撞状态取消
* w) F9 ^! X5 ~4 h1 N7 x - LDA PPU_STATUS
# t6 O5 A1 A8 R( y& a - ASL A
, M i Q. G) u" ^# B# n - BMI * - 4$ W, A! {& U2 R! _
-
/ O6 X, W/ h- p w! d- D- ^* f - ;------------------------------
1 p1 y7 i' S& O& s Z+ Y$ S - ;等待0号精灵碰撞发生
2 e5 e& ^1 U, i$ f - LDA PPU_STATUS
& c2 w0 y( d0 d- X/ [; m _8 P - ASl A1 T+ E9 I8 c- w1 v" v# |1 S/ q8 f
- BPL * - 47 m8 X, {8 }/ w6 |: A
- * q# M3 W' }% x; _( u
- ;------------------------------
5 X* A0 C& B& D6 e$ M) I' @ - ;行消隐等待; q: d) l4 p6 c
- Sprite_Hit_Scroll_Wait
, V, k# ~- ^" Y/ }' X+ Z+ D8 X - LDX #$28" p; K. v1 R( O; T$ n$ n, k" m
- DEX
. A* z: ]: d1 I- }) g - BNE * - 1
4 J5 X$ i& q. {( @- t - ( |* m9 U( g) F0 b
- LDA Sprite_0_Hit_Move_Direction
, v1 Y! F7 f! O' k! M) q - AND #$01) i' s$ N: x) W# n. z
- BNE Sprite_Hit_Scroll_Set_Right
& R! D i/ G& ?( K5 w# c - / _3 E. i6 W" L2 y' t, h( ]* O2 z
- ;------------------------------% P9 q. U5 F" _+ n
- ;分割画面向左滚动
8 Q/ W- p7 Y9 Z+ `- x - Sprite_Hit_Scroll_Set_Left% M! k8 }8 D1 g k3 J
- LDA PPU_STATUS; @9 i% D0 S8 h* B) _! C) z
- LDA <PPU_Scroll_H
/ x+ i9 M% X: \! u2 } - STA PPU_SCROLL
! a* w, w2 z3 U6 j# G# h) r+ u - LDA #$00$ C+ G6 ^/ ~( n% G& h
- STA PPU_SCROLL
9 c2 i6 ]9 x% {1 a/ W: @$ i - RTS
1 w$ Y2 @, [! ^/ |5 X: ?! u* v( j - 5 g! r% U( s6 f
- ;------------------------------% B5 G, K, x v# @/ w$ Q$ K% L
- ;分割画面向右滚动3 w+ F! h0 w6 z) R4 l2 |
- Sprite_Hit_Scroll_Set_Right
) t" Q- u$ K: Q. q( L+ P; } - LDA PPU_STATUS3 |* D- D7 W" n/ B% Y1 O) z
- LDA #$00/ z2 J2 Q6 I2 a& o. |7 m
- SEC9 l+ d# Z- t/ x, g/ U
- SBC <PPU_Scroll_H$ g- S$ @1 f; i- @& Y: n8 d
- STA PPU_SCROLL
# A% ^6 Q) P' |: [ - LDA #$00: C& q0 p3 n7 v- T
- STA PPU_SCROLL
0 J$ v" ?2 H l3 A% i5 \ - RTS+ S6 a% n' Z5 A- H2 D
; c$ [9 v$ `, M* \' W# v3 \" t- ;==================================================
: A: Y ^& u0 g' t - ;IRQ中断处理
. k& M" c" ]9 ~/ i& z6 y - IrqProgram6 O4 q' U5 T2 N; k
- PHA
Z/ Y. j& j5 A' g z) n - TXA J }) t, W# J( F# q0 Z" }7 _* f
- PHA
2 l' D+ C/ N5 v. V+ Q, c: Q - TYA* g& ?5 C. ?5 _* {5 e- w# `
- PHA
$ U. v7 `. p) t -
, Y4 w6 q O9 a8 a - ;关闭IRQ4 N5 w' c4 w/ l0 u$ D
- STA MMC3_IRQ_DISABLE4 u3 K8 F5 o C) n2 e; ~$ a
- 3 y/ ?& O6 r, x2 B# b5 M
- ;允许下个IRQ触发9 q4 M- n; \: F$ n
- STA MMC3_IRQ_ENABLE
; S" Y: y$ I- ~4 ] -
& g/ ~% m' R9 H - ;IRQ处理, 15线后继续触发+ n% f8 c( |* \- x
- LDA #15: U3 c$ q9 @( S: i
- STA MMC3_IRQ_LATCH
' O0 C0 R: W$ ~" f, P -
2 S) E" F5 y" X2 k8 F7 s - LDA <IRQ_Index
' E8 v \/ z1 @% a' B' N - BNE * + 4/ y* J! W6 Y: ]1 c9 w8 |) Q* @
- INC <PPU_Scroll_H
8 {0 K- B& K- V, g* [8 q -
' n: W/ i, D7 W0 Q - ;设置屏幕滚动
/ S& @# B* t t3 J0 J5 e0 i - LDA <IRQ_Index
+ o% ^! C( u$ Q - AND #$01
4 E* R, r( M* y3 s1 A/ k - BEQ Irq_Scroll_Right
+ K [/ z5 ]) }% X5 d/ x6 q. Z% e - / J: Q0 i$ L9 }+ B/ z# q
- Irq_Scroll_Left6 h8 J6 W# Y" _8 b9 u' W% n3 `) Y
- BIT PPU_STATUS3 W6 j8 J5 R0 Y2 n% {) I. r3 A- G4 |7 d3 P
- LDA <PPU_Scroll_H
" A) b, A: d) q2 _5 [ - STA PPU_SCROLL5 V8 Z6 O. t: g! y
- STA PPU_SCROLL
" D5 C" f5 @# W8 ?8 B2 Z - JMP Irq_Scroll_Over+ \: {6 I( a! X- q$ T8 `
- " |! P: z: X8 e9 c- B
- Irq_Scroll_Right0 {" E$ S9 l6 `9 ]0 l
- SEC
6 @: p z+ T7 X0 C. T3 Q2 ] - SBC <PPU_Scroll_H
; P: x" }1 b. d& e( C- E - STA PPU_SCROLL
8 K: s; t5 q3 } - STA PPU_SCROLL* z4 ]+ g" [; _
- Irq_Scroll_Over) J3 s& [) T6 T3 I }% {
-
. ~" a- b! _0 M5 N% B3 C" R - INC <IRQ_Index. a1 X. k3 c6 p, w' P0 z: d/ g0 ^4 U
- - U- `( Y0 ~5 R' ~3 [
- LDA <IRQ_Index
3 |0 b* C2 \6 k* @; M- c! I: Y5 g$ B - CMP #14; v+ B& ]/ o/ Z3 O b
- BCC * + 5" y1 L) j0 d6 d* }% a) v3 P$ }7 ~% P) h
- ;关闭IRQ
k4 ]- W9 ]9 d4 j" q$ r% j - STA MMC3_IRQ_DISABLE" ~& J$ D$ `# e% m9 f5 T
- F4 L! T q- P/ O8 ~
- IrqProgramEnd# F, |! j, l* G! `. B
- PLA
' \" t& g- {3 b* Z - TAY: _: G2 }" R2 {3 ]5 |
- PLA
w6 m* u1 S. U+ Q, \0 d* q" v - TAX
0 d' ^/ R3 R' \ - PLA# v% A" T. [ F$ I; G
- RTI
6 o7 P- P4 [" T3 p0 I8 `" w -
0 Y. E# t5 A5 n# F - ;==================================================
4 N& M. e2 b) `. x2 ], Z1 Y+ B& D - ;中断表9 m$ `0 }) b& o9 j8 O5 D
- .ORG $FFFA
% X$ m3 k+ E2 Z! {* {2 V - .WORD NmiProgram
1 H# n1 o$ ]# O6 w: U - .WORD ResetProgram0 y9 j& T% `$ u
- .WORD IrqProgram
复制代码 5 ^# l5 T C* K- T$ y5 @* v0 K4 O
|
评分
-
1
查看全部评分
-
|