|
- ;[FC][MMC3 精灵碰撞]
7 e% P. ]0 D& S - ;FlameCyclone 20230710
% j, U. C/ r: l4 J, L3 Z! i
/ P% J- Y c# O+ Y& _0 Y. @- ;文件头& Y3 p7 A F0 U
- ;======================================================================! M! g, ~' H6 F! S+ R6 q
- .INESPRG 4 ;16KB PRG 数量
# w7 v: R. f" k1 D! \* ^5 m' [ - .INESCHR 1 ;8KB CHR 数量
4 _& j; [( `" u - .INESMAP 4 ;mapper 44 {7 z0 C7 X/ [: b5 I, T/ k p2 W
- .INESMIR 1 ;命名表镜像 0水平 1垂直
' Q5 V } V; l! A, }/ L - % }2 i3 a; j2 \5 j
- ;必要条件- G2 S5 w) B8 ^+ T* b! f2 p. d* H
- ;1.持有CHR ROM3 c: L) @( G5 e+ o3 n
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
; W, t9 Z0 n- l+ k- U - ;3.精灵内存(OAM)不为空
. H4 ~5 W$ \5 Z3 l, c3 R7 L1 }2 j - . x# k" ?( v3 _ I e: w, B
- ;==================================================
+ `2 r2 W3 `" B- | d1 v# a% |- p - ;NES端口常量7 \" Y; C7 G+ I+ ]. ]4 I# L
- PPU_CTRL = $2000 ;PPU控制寄存器0 T& D. T9 D) f0 ]
- PPU_MASK = $2001 ;PPU掩码寄存器0 l. I" R) R- J. S! c" F
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
" ?; t9 }. o K. k. k+ y - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1 J3 M" _: ` u4 I
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
+ z8 T2 h) c$ O1 p+ y( b2 A5 [ - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
9 [2 ^* j+ e/ y- ?5 r, G4 `# o - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加# {* h" G$ J; L6 z# x& j
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
/ n5 b" ~% J" \ - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存- Q- q0 b7 z t- k6 C
- APU_STATUS = $4015 ;声音通道切换$ q9 C7 ^ s) G3 h0 J) v
- JOY1_FRAME = $4016 ;手柄1 + 选通" B+ a9 W8 F6 {4 u0 _: v& _
- JOY2_FRAME = $4017 ;手柄2 + 选通+ Y9 x, ~% ^( q- n: P6 ?: |
9 z8 k' v3 o* _% F/ X- ;================================================== A y) F4 h7 t2 A5 M
- ;MMC3端口常量
# Z0 i1 Z* a6 |# d) `! E- ?9 R2 { - MMC3_BANK_CTRL = $8000& J* t. I5 r9 l5 n R0 v- D
- MMC3_BANK_DATA = $8001
& F" `7 J, x# U# _2 g$ X - MMC3_MIRRORING = $A000
6 \5 }$ h- o; p+ z0 \7 E - MMC3_PRG_RAM_PROTECT = $A001" X$ S3 I+ K/ j1 D
- MMC3_IRQ_LATCH = $C000; X1 Q* b7 L) a0 u7 k
- MMC3_IRQ_RELOAD = $C001
4 v5 C+ Y+ P+ O" d - MMC3_IRQ_DISABLE = $E000% X- F* h, _% R# w. [
- MMC3_IRQ_ENABLE = $E001
) D$ F( e0 ?# C" R5 M$ J - p1 f3 J! L. U i
- ;==================================================5 T! `, c; `2 P- e& w; y
- ;程序块配置! a* e0 `8 X+ ~+ ^4 ^4 `- H7 {, v
- BANK_DATA_MASK = $072 w8 @! j! ?+ J$ A5 {! U; m# V4 \
- ;--------------------------------------------------
! b& q2 |& z9 ?, h* D - RESET_BANK = $078 \' K8 B; b( X0 Z5 F f8 B
- RESET_ADDR = $FC007 I G4 i/ l8 F$ y9 s; n {' w
3 G$ F/ u2 z3 _' G5 @7 r! Z- ;==================================================; C% h$ P* {2 D% K% _ i! J0 `
- ;图像块配置4 g. v3 h1 V9 G- F5 ^& r/ s
- CHR_DATA_BANK = $081 ?/ I+ A5 w& I* ~ f
# h* {, C5 P) [$ E, N4 Q- w2 c- ;==================================================
& m/ `9 O1 I, w+ R2 y, f/ g: ~ - ;零页内存地址配置0 Z( R( p9 l6 m+ p' O: I
- Use_Ram_Addr = $80! Z9 }2 g0 v R0 r
- PPU_Ctrl_Buf = Use_Ram_Addr6 P* G. c w3 s1 @9 z, \
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01' Y* J; Y" I; `- a) ] h/ k
- PPU_Scroll_H = PPU_Msak_Buf + $01
& H7 @6 b* p. ~1 R - PPU_Scroll_V = PPU_Scroll_H + $011 H! }9 W6 H/ I5 K
- FC_Data_L = PPU_Scroll_V + $01/ g* o. t6 Y' f6 d0 P4 B
- FC_Data_H = FC_Data_L + $01
! a1 C- b7 V3 m' D2 A) I - FC_Data_Buf = FC_Data_H + $01
J5 O" V' q+ | - ;==================================================
2 Z7 \" @' v8 k5 L - 2 J" v; V/ n- p5 @+ D- B
- GAMEPAD_MERGE_FLAG = $04
$ n! G7 C1 X: _: B - 4 X, @- _. h! x3 G( ?
- Gamepad_Keep = FC_Data_Buf + 1
( F2 \7 y2 D, b8 ^5 h - Gamepad_Once = Gamepad_Keep + 2
$ @( U2 Z. r7 H, F - Gamepad_Temp = Gamepad_Once + 2
3 n( E# w$ q0 L5 x) g! n: d - " L3 K' K% T* _1 i1 a8 B" u
- Gamepad_0_State = Gamepad_Temp + 2
6 S# o- `! c3 O/ f6 e8 O ? - Gamepad_1_State = Gamepad_0_State + 1
5 A0 H! u4 ]. k7 v( u4 v - Gamepad_0_Value = Gamepad_1_State + 1* u5 {4 H+ a& s5 K2 X1 Q7 o; V
- Gamepad_1_Value = Gamepad_0_Value + 1
B+ I9 K: |/ H% [# C H - Gamepad_Port_Value = Gamepad_1_Value + 1
4 J1 U ^7 u8 W - Gamepad_Merge = Gamepad_Port_Value + 1" X; e+ I# ]& h5 ~
( p$ m& V, A' F- ;==================================================# j$ ?$ v' ~; q! g2 c
- IRQ_Index = Gamepad_Merge + $01' G) k7 o4 E* g* D' P0 U+ ^+ K
- Sprite_0_Y = IRQ_Index + $01* D o p5 `* W2 n) e
- Sprite_0_Tile = Sprite_0_Y + $01
9 k6 S& q; J9 w1 l3 E; o0 Y - Sprite_0_Mode = Sprite_0_Tile + $01
9 w- B$ ]: D! f - Sprite_0_X = Sprite_0_Mode + $01! H2 d! N5 l" M$ o9 H/ w6 }
- Sprite_0_Hit_Move_Direction = Sprite_0_X + $01
0 o" [5 y E' e - ;==================================================& g9 R! ?) }+ R) a9 u, L
. l. _6 E& q5 D% i2 X- ;CHR图形数据
% E/ ?; D( M* J8 o3 M - ;==================================================' Z# `+ A# o8 S$ M, P# b' a* G" K# L% J
- .BANK CHR_DATA_BANK+ R% q# ]! `) Z9 e, G) S8 W3 S
- .INCBIN "chr_bank/chr_data.chr"
, f! x3 S* k$ x( w% t6 F - 5 m) t0 S' ?5 y* O3 e6 m7 \
- .BANK RESET_BANK & BANK_DATA_MASK
" r/ K6 ^8 y; `6 d* M! Z& B3 e. z5 q - .ORG RESET_ADDR5 V( f$ q. T3 o# A6 ?" `, w% M0 ^
- ) D7 B8 v m* s% N7 S
- ;--------------------------------------------------
, Y/ s9 O: t. @: Z% d - Attributes_Data8 D" X, v# P% U# f" u7 Z @3 o1 n! q
- ;命名表属性: f# F3 g# v M' I4 ~
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
4 ^9 \, H, i( E. w( S O. n( u - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA6 `8 E& B0 { J0 A9 c n" G6 |: h
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
4 Q( y4 M3 _1 D0 ~ - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$553 p$ B: G: O6 r3 c6 C7 L* M. q
- ;--------------------------------------------------7 g/ R7 N, O- ?+ X- f" Y* w8 o
- ;调色板数据0 {; K( N6 |0 h8 x+ M8 d' D1 l0 i
- Palette_Data% F% p) K% K3 H8 e* e& B7 Q1 V' ]
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
5 p W* Q: U3 P) ? - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F# Q. m% c3 B5 j" ]9 O% {
- : \3 L) ]# l1 `0 G" s6 U5 m" g
- ;==================================================+ o0 \$ W+ r$ c" X" ~6 M4 w
- ;命名表初始化
/ o- F* L1 N6 I/ ^ R( ?# _7 f - Init_Name_Table
; K, a9 t3 s; L, o - LDA #$200 E. I* e- V# g
- STA PPU_ADDRESS- A4 l! O' Q; S
- LDA #$00
; P5 S8 I" f p& f1 j - STA PPU_ADDRESS( g, I3 p' C& {
- LDA #$00- N7 w5 q8 G' m: q$ _, D* w8 L
- LDY #$00
. ^( b# @. g9 {. \ - LDX #$103 V/ m, G8 B! o: ~* a" f. u; n
- Init_Name_Table_Write$ i! E8 }* y& o4 O4 K6 E) X: i
- STA PPU_DATA3 V& X* s! d) x* v4 G5 D
- INY
0 d) V* w3 o1 j - BNE Init_Name_Table_Write
8 p7 M8 e5 C* t/ ]& g# m. f/ {4 r - DEX
3 m! y4 W- f" l) R' ^$ U - BNE Init_Name_Table_Write$ Y' o# Q% l H2 N8 N# U$ l
- RTS# c# Y* K4 x4 Y# D9 ^
-
0 `' l9 L' m' R - ;==================================================) o# l: O! s# G0 I! M
- ;调色板初始化" e# I. `4 Z7 Z2 M) G
- Init_Palette
+ e" ?% I: E- l6 r% ~ - BIT PPU_STATUS: B4 g5 t# [) k& T
- LDA #$3F
* g5 O2 C9 V! E' I7 J# Q. F4 e - STA PPU_ADDRESS: |3 \6 T6 x, {- w# D# f! X
- LDA #$00- y. L8 S; S" w* h4 l5 k7 j2 T" ^/ T
- STA PPU_ADDRESS
X( n! C z* _1 Y - LDX #$00
7 A5 p" G2 N( D. w - Init_Palette_Write3 B; d% c3 f$ v. {+ D1 Y
- LDA Palette_Data,X% D0 p. k$ O$ A0 w& h2 {* T
- STA PPU_DATA0 m# R4 O S1 @/ b
- INX' ]/ @( d' d7 C; p
- CPX #$204 N! Z2 t, }7 F. C; M
- BCC Init_Palette_Write
3 `6 n5 {" \* `# K1 ] - RTS
! S+ T# ~( Q3 M8 p - : g9 r+ D' _' B! M+ A, l- n& Z0 E
- ;==================================================9 @7 w5 u v# c& g }* h4 K# k
- ;设置命名表属性7 c* e" p/ z4 l. F
- Init_NameTable_Attributes5 O( U# q1 y) C9 ?" s% h
- BIT PPU_STATUS9 {6 j& e# V; y" V9 J( L
- LDA #$23
$ a+ B; p, M" y8 ^; Q3 d - STA PPU_ADDRESS2 p0 n: p2 G( _5 R! R8 _
- LDA #$C0 g+ {8 Y! p5 x
- STA PPU_ADDRESS& J! q# P6 X# d) b, |6 c6 S& E$ v' p
- LDX #$00+ Q2 `5 y( ]$ I t
- Init_NameTable_Attributes_Write
( ^8 A+ z% w2 i: A3 \- G' Q - LDA Attributes_Data,X
9 y, E4 k& U( e, C9 h - STA PPU_DATA; m( _0 S$ ~6 H. y7 \
- INX
3 o( O9 x' {, G- ] - CPX #$40
. Z* X% r# \5 s; }5 v+ Q( C/ G - BCC Init_NameTable_Attributes_Write* }6 u3 G8 K4 B5 q4 V& r! ?$ v) h
- RTS0 j0 b! R9 z% q$ H4 q Q
- 8 m5 v) L5 s; y/ {4 Y9 l0 A
- ;==================================================+ R" O7 E. F: E9 h9 }: n+ L7 U1 t
- ;初始化命名表文本
$ j' c1 F* F5 Y* Z - Init_Name_Table_Text
6 i' m, n' D" N - BIT PPU_STATUS
6 m& K( g E7 @1 g: e0 K - LDA #$20
/ e2 |8 B* u: h/ O, N5 h - STA PPU_ADDRESS
- g3 A* o' l0 H3 n# J5 N4 t, C - LDA #$00+ D8 Y1 g' c& Z" b& [. g; l! F
- STA PPU_ADDRESS
9 E( J7 n. I8 C | - LDA #$00% L% ~2 m' C0 I4 b5 \
- STA FC_Data_Buf
3 i U! N; c" g, j3 ` - LDY #30
( ^' K6 r' Y) A# w/ w' l; ~ - Init_Name_Table_Text_Write4 t2 M% c7 v6 P) `' V1 Y
- LDX #32
4 V7 q; h" h: ^4 y2 {( G - Init_Name_Table_Text_Write_Char
' ?1 x' e) V' o) v0 z* w( |* l - LDA #'0'
) O3 f+ R; Q+ ~2 t% g* J% s, m& ^ - CLC
- G6 |" c) Y* W; K# q0 c - ADC FC_Data_Buf
$ U6 _- T4 r# }7 @( D7 Y7 M - STA PPU_DATA# {0 R9 q# p9 |* f5 s6 ]
- DEX4 H2 h- d$ H0 g
- LDA #$14
1 S9 F6 }' D& ^$ `0 n1 Y$ v - STA PPU_DATA
. U4 k0 f0 d- X* g+ U- K - DEX3 j6 ~6 t1 I9 O. G" f; B
- BNE Init_Name_Table_Text_Write_Char
" m0 F& x0 y7 o$ Q - INC FC_Data_Buf ~0 G& ~8 A8 u1 A" @
- DEY
, D s7 ~* }. F) ~ - BNE Init_Name_Table_Text_Write
2 C+ B9 h! M" W6 ?: P* D+ c - RTS
, Z6 n. |) Q. z - F1 t8 O+ ~3 V+ E \
- ;==============================6 I& B g5 `, Z+ ~0 @& U
- Init_OAM_Ram;初始化精灵内存' v+ u7 U6 L9 w" ^
- LDX #$00
( B' Z. [! Y* v! L: U; b1 J - LDA #$00
0 i7 C3 ^. C$ F P: J* j0 e% Y1 n: d+ ~ - STA PPU_OAM_ADDR
- I$ g. \! u( R, ?+ s2 [' A+ W - LDA #$F8$ I# ^+ J$ t! L9 g( \& m7 c: A& ]
- Init_OAM_Ram_Write/ f6 _+ z1 ^: t4 G- \: z
- STA PPU_OAM_DATA3 L" u" `0 {1 [' S
- INX
) V& _+ J+ L* \0 D4 A - BNE Init_OAM_Ram_Write' V7 l0 A1 i: A( n/ y2 Z
- RTS
+ |9 `& ~# R9 ^ x9 E+ V) h -
% U- R/ O, T/ W4 F- e( T% Q' c. O - GamepadProcess;手柄处理; Q. z, q2 b. a% r6 I! D
- JSR GamepadDatacan. z6 U3 r+ b; A# B3 P Z/ x* t$ @
- LDA <Gamepad_0_Value
/ }# ?, h9 i$ D8 C - STA <Gamepad_0_State7 U6 N6 {4 K& h, `+ [/ ~+ U
- LDA <Gamepad_1_Value
- r) `7 ?, ]5 I+ ]+ z. ? - STA <Gamepad_1_State. I! Y# F$ z& U) ^. e5 ?9 |- ~
- JSR GamepadDatacan& N8 ^7 X7 T, u8 ?8 G! m& f3 g/ E
- LDX #$01
( A; G. Z h) b! f" g- @ - GamepadMergeCheck;合并手柄输入检查: M7 C k. C% E) a3 c" d, h/ X
- LDA <Gamepad_0_Value,X
* y6 N. k4 i) c J4 y3 p - CMP <Gamepad_0_State,X
- z7 w$ @3 u8 |; n - BEQ GamepadMergeInput
% B `- A+ H; w6 R0 v9 a - LDA <Gamepad_Temp,X
3 a, a. G; p. B7 R$ e6 G2 D8 w - STA <Gamepad_0_Value,X1 C" u1 _$ N# u( S
- GamepadMergeInput;合并手柄输入) K$ c9 o; _ V" S: ^
- DEX
! P7 C4 ?' c4 G3 s - BPL GamepadMergeCheck
% ? l) I6 E8 ^5 z5 D' e - LDA <Gamepad_Merge. i* n D! @. m9 ?* g
- AND #GAMEPAD_MERGE_FLAG
8 k2 T5 ^9 t0 |# F" u - BNE GamepadStateProcess
; f" h/ c( d1 T% o" |8 S4 F R# J - LDA <Gamepad_0_Value
$ E7 E* H5 q8 }2 H - ORA <Gamepad_1_Value: x- P5 X _: C J% ^ ^; _: G, B
- STA <Gamepad_0_Value: s+ S' z N) \: j. l1 S. I
- GamepadStateProcess;手柄状态处理" q$ w" U+ ]% R% M. u; v) x6 f
- LDX #$01
4 i9 I1 ~/ i5 Z - GamepadStateSave;手柄状态保存
' `4 T. U, M, H, W - LDA <Gamepad_0_Value,X
/ h( I8 Y3 S" O8 y+ v: K - TAY# @$ ^ Z6 W+ [. |
- EOR <Gamepad_Temp,X
0 z" k8 X7 a+ \2 i( E0 d - AND <Gamepad_0_Value,X
9 i0 b% {9 {& V( s" m( q; L0 A; N - STA <Gamepad_Once,X
3 j( h( n! h0 v1 P - STY <Gamepad_Keep,X
' [5 C( m' g/ B( l - STY <Gamepad_Temp,X8 q( I& |+ ^4 A
- DEX
7 e9 o; d& `: X$ d* M - BPL GamepadStateSave) o6 O) i, I1 |2 j9 ?) E' W
- RTS' v% H1 I: c& J
- r1 `' X9 w9 F* Z9 b7 @4 \- GamepadDatacan;手柄数据扫描, Q' c+ _7 n4 y. z( }( D- |
- LDX #$014 u# w$ q% j2 \/ }
- STX $4016* R; |: ?2 ?& [3 ~9 w
- DEX9 j, w$ `9 o6 g% h: ?, a$ |
- STX $4016
% I4 n- O" t0 X$ Z - LDY #$083 C3 v3 K$ L: w- Y' ]1 o& g1 ^
- GamepadPortScan;手柄端口扫描
6 |8 g+ o0 S2 k( x. Z$ a - LDA $4016
3 w* [0 p7 \5 y' @- a - STA <Gamepad_Port_Value
/ u+ U# u' f' }+ x/ M! _ - LSR A
5 m; X/ L5 V% T; u* H4 b( S - ORA <Gamepad_Port_Value
* K4 y; Y' J4 n# h9 ^$ L( s. { - LSR A3 j; A( _- I# T; R) L* |( S4 X
- ROL <Gamepad_0_Value2 e1 b9 L% x7 ?0 I" i. X
- LDA $4017
+ r' o" h; [5 V: v( Y - STA <Gamepad_Port_Value
2 ?1 G! t: }9 Q/ w( v0 l7 N. s D - LSR A6 N$ z' @2 f# _' F2 a! a2 b" `3 {
- ORA <Gamepad_Port_Value
+ i; ~! w2 V0 ?% T" S) J5 N - LSR A
1 K4 r. @4 M; N# U - ROL <Gamepad_1_Value$ E. O2 K% O8 z
- DEY
6 E: N. w8 E9 h6 [, t. V - BNE GamepadPortScan
: v+ d% d+ w8 P( _" V' T - RTS$ w h! O; t! g" r$ y- G
- 8 t! n4 o) I" J! L$ x6 W' _
- ;==================================================2 c- k# }2 _ q$ H' J
- ;PPU处理
& j/ e( \$ J2 }0 K - PPU_Process; ~* v; V: ~3 M+ h% p* E! T
- LDA #$00' Z) I- I$ `; S& c. m; y- \
- STA PPU_MASK3 d' n- ]; w) y
-
8 J: B) R V; \* `( j - BIT PPU_STATUS
( q" Q( ]& c* \) s7 w* x. [3 \ - LDA #$20
2 b- W @( q+ v0 {) i# J/ k0 w - STA PPU_ADDRESS
) {. l1 O& _( p* w6 s& G/ _ - LDA #$00
6 N% |2 [$ G0 D, k t4 w+ [ - STA PPU_ADDRESS
( k) Z; q. f/ q8 f" t1 U. ^ -
) i- y7 i1 E9 r3 Q - STA PPU_SCROLL4 l: P& M' T* l% w* c
- STA PPU_SCROLL
' m% c ~$ P- B! I* D) |! `- q -
1 E( i. F4 x1 G( X; o2 f3 t" j - LDA PPU_Msak_Buf* r5 @* r' r8 X& y# U7 H4 b9 V4 j
- STA PPU_MASK- R; J2 l3 g/ H9 l5 J
- P4 P/ v ^8 u1 f) [- |
- RTS
~' h: z3 Y# s$ J' F+ Z) d' e( L- _ - $ @+ M. ` Q3 f+ S7 o3 m& x" T' v
- ;==============================8 U1 q& y" a4 q+ M! I$ i- d
- Time_For_Vblank;延时等待 O; o; W, M% {7 I; n
- LDA PPU_STATUS
6 M4 K0 d3 v& u2 n0 R* L - BPL Time_For_Vblank8 T2 x$ ^" q& @! A, z; ^
- RTS
5 w) P) W# C, H$ p. X9 c -
& q* Z S& B( L, o* X7 X - ;==================================================
+ ~% B$ g2 w! l" B8 Y' ] - ;初始化MMC3
. N+ [. S* _; k" _ - Init_MMC3
- |" {* o3 o4 ~# a2 P4 n - STA MMC3_IRQ_DISABLE. W* F/ ~4 {1 B/ @% u! v5 ] q
- 4 h1 i- Y5 U% W- @. k9 x
- ;设置MMC3水平镜像+ N0 i* c7 I4 L0 s5 J5 ^7 P
- LDA #$01
9 M6 z' e* u5 h0 X( _! Q Q) U# r$ k - STA MMC3_MIRRORING
7 f6 n' P, R; U -
0 S# {! x- l' n5 _ - LDX #$05" E, g% c& Y5 J! N$ b- X# o& K/ ?
- Init_MMC3_Chr_Bank_Write- d) `% C. g0 y, M. y1 @
- STX MMC3_BANK_CTRL
& r5 l$ ^2 i2 k p' O+ s - LDA MMC3_Chr_Bank_Data,X+ W; a% `0 V+ }( n/ E+ P. u% N
- STA MMC3_BANK_DATA
, S0 }) n2 w/ e3 t# w. I; J& W4 [: X1 ^ - DEX
0 E% v4 [4 @: c/ t. L/ F: i - BPL Init_MMC3_Chr_Bank_Write
, T+ {; I- H/ e7 x/ z - RTS1 P5 M, F- G8 _! t! c5 t+ \7 ~
- ;--------------------------------------------------/ c$ K6 b. `( ]7 d8 H) z, z4 ]9 e1 W
- MMC3_Chr_Bank_Data
, p2 T6 [0 ]/ ], k& Z# D - .DB $00,$02,$04,$05,$06,$07+ [3 C' W4 O% H- p
- ) `3 u+ A% E0 C$ z
- ;==================================================4 k3 w8 ?( G" \
- ;重置中断处理* h% i8 P# K; Z. j- j
- ResetProgram1 `# j" P, `3 k& s! N
- SEI( J+ i% a" X7 ]
- CLD
0 K4 w- T' a5 R: [% ?2 g - LDA #$00
6 A5 A$ m; K8 ^! ?/ J - STA PPU_CTRL2 c5 H1 I7 X4 a U; ~- ?
- STA PPU_MASK
" ~; b+ m! y4 y) J - STA PPU_STATUS' K: a, _' p+ x/ C
- STA JOY2_FRAME
3 g9 Q' ^* K3 _& n# E - STA APU_STATUS
' ]9 `6 }' c, ^" X) X - " G8 \+ b' u. \3 e3 j9 J9 h0 J9 p, g& B
- LDA #$C0( S0 D9 k* W* s/ Y
- STA JOY2_FRAME0 A7 ~, b( ^3 @3 @3 @
- 1 B; q6 U1 G, p: s8 S
- ;等待vblank
; n k$ Y9 [' R - LDX #$02# S# z) l2 T" l) u# t
- Vblank_Wait_14 @& C n/ l( I3 X% a0 i+ ^2 h
- BIT PPU_STATUS$ ]$ h& s( @8 r1 H7 |
- BPL Vblank_Wait_1
; b4 C% V4 R* R7 U1 {. J3 v; k - Vblank_Wait_2' H# @0 M# T/ L$ i
- BIT PPU_STATUS- @5 y9 e! m5 @' W7 G
- BMI Vblank_Wait_2$ M8 m$ n: |. L
- DEX: V. ?+ b/ }/ c$ V. H. `) \
- BNE Vblank_Wait_1
2 d6 b& W) z' M5 d -
! y; m+ e* N4 R% D1 | - LDX #$FF, S0 I% ]7 U! i
- TXS/ x5 S1 B6 b% ?$ d9 D, G
-
0 z. ^4 d$ K! w8 ] - ;初始化MMC35 V+ X# |5 I5 J9 ?) u
- JSR Init_MMC3
- }( `" I c, E, G- v - . r( z# h3 Y4 w' r! ]0 O
- ;==============================/ E( c b+ S1 }' N, u; j( Q- G
- ;RAM初始化$ M9 @, V6 F& n1 s8 w @
- Nes_Ram_Init
/ |9 W' @( B# N - LDY #$00
; P) _- [" y9 u- y& T+ E# U - LDX #$08
/ B/ B3 c$ \: u+ K1 z# X5 o - LDA #$00* `. P+ x t* D ]
- STA <$00. L; ]+ v5 _2 U R
- STA <$010 ~2 u3 |, T3 z b% H4 Q" n6 J2 d5 L
- Nes_Ram_Init_Write
* |/ r1 }1 w1 \- T - STA [$00],Y/ V% k7 ?2 V R3 A0 V9 q
- INY
/ S* k' m. A& t y0 w - BNE Nes_Ram_Init_Write: Z* k; \9 V+ X9 X( k1 L$ f
- INC <$011 d4 w- X' J1 {$ ?- d B
- DEX. L7 k3 b+ J! ^( E% \$ l
- BNE Nes_Ram_Init_Write1 T' W: M% {: Z8 E% h4 P
- ; `$ E- x6 n( Q* G
- ;初始化命名表
/ H7 q1 O @, y" U) [- n/ R/ u( D - JSR Init_Name_Table) u: C( x6 _- Y8 f; c
- 1 s7 W8 ]. M! z8 L
- ;初始化调色板
% P# E5 z+ }; A' O - JSR Init_Palette" R# k5 Z7 }) ]: O& A9 M
- ( Q, `* v/ _, t! D
- ;初始化命名表属性9 X- C1 ^$ f4 L2 m% g% `
- JSR Init_NameTable_Attributes+ Z# B9 P: s' y) ~. r3 A
-
1 l& n& P& Q$ B - ;初始化精灵内存
5 I/ ^0 l( P* C - JSR Init_OAM_Ram. `6 q3 x( m& b4 M9 f
- 6 M% B! I* l- I1 Z
- ;在屏幕上写点东西
+ c! O$ p- M4 C1 v - JSR Init_Name_Table_Text
2 x0 J+ Z& S: y" u i0 t - # W8 M+ i# D/ u
- JSR Time_For_Vblank
3 F% e8 G% v' Y3 W) Y; }+ O - ;开启PPU控制
( q E& e8 |! L: \$ H - LDA #$80
' F# g; _6 j! |! K; C% h) @ - STA PPU_Ctrl_Buf
2 P# w! E$ ~ t, z( H2 l6 d& D - STA PPU_CTRL9 M) X3 Z5 q4 p! F
- 6 I" z, p' y$ }$ q, y
- ;开启PPU显示0 p# S1 [. ?% I* I
- LDA #$1E0 [$ X4 f( e) U) X, Q
- STA PPU_Msak_Buf- r, t1 }. Q# m( F" a/ u5 |0 `% P* a' f) _
- ' p2 I$ P/ Y$ b( `7 ?
- LDA #77
5 A) z1 o; I' q - STA Sprite_0_Y
9 b( Q5 Q" ]' }- V7 q9 G4 ? - LDA #$1E4 g4 z, Z/ @4 h# U# m
- STA Sprite_0_Tile
6 ^5 J/ s# {3 S# N# _, w1 E - LDA #$201 h' w- M5 J2 f* ~
- STA Sprite_0_Mode
' N: n |$ c6 L6 u - LDA #$00
9 L; X2 a N3 Z) Q - STA Sprite_0_X. Q. }+ M5 L4 d
-
! |% d& A- G1 z6 N e# D; _ - CLI6 A0 A, O9 h' O% x) H$ _' W
- JMP Loop
. G' `0 Z5 I& m+ @ - 1 _+ \8 X( _- ~
- ;==============================
: M7 k( p: Z. v% ^2 u8 s - ;死循环, 等待NMI中断7 V. F3 L+ ?6 \% T" x
- Loop
7 A; l! S4 M5 a. A6 Z7 F5 h; A) C - JMP Loop
! L1 y3 n2 J- V2 y
/ u8 r+ E0 p- y% x- ;==================================================
; c. `+ {$ Y" w* h) L" b6 P3 u, ?0 ? - ;NMI中断处理
$ w p7 I1 g0 k: t - NmiProgram% {$ w( |& i/ ?+ `8 k) C
- PHA
1 }$ ?' s/ U8 G- I5 R- y# F% V+ Z( x - TXA
. d: G4 k1 P$ \2 h2 k- V; N7 Y - PHA
: y' Z/ R6 N' q- x; G3 [ - TYA
" m- |+ q0 h" d2 [& g: r( n( Y- S - PHA8 o4 \2 |7 o" H' Z; P# N' `
- " A' J' p7 X; }) T3 Q
- BIT PPU_STATUS
$ X" y: ]+ O A5 h; A( }9 i" s - $ l2 L, s9 z `
- ;关闭PPU控制
- _/ E/ m F, y" i( T { - LDA #$00
! N- V$ x3 l7 [8 j7 U* U) g8 L - STA PPU_CTRL% y: j- S O1 } P9 C' D
- ) g6 I) h2 H% T
- ;处理PPU
- A+ y' z7 z5 ?8 ], \/ i* w - JSR PPU_Process, T& v$ k# X$ H9 H
- + X! Z+ ~( o9 e5 x3 [5 \7 x
- LDA #$00
0 b8 E/ V6 M Z7 c G6 ~ - STA PPU_OAM_ADDR
+ ?5 ^: ~. ]- S% ]+ S - LDA <Sprite_0_Y+ ]: N& z, K, u+ J1 @0 ^* s
- STA PPU_OAM_DATA
# d# M4 `$ T B - LDA <Sprite_0_Tile
$ L: g" a/ {3 X" [: T - STA PPU_OAM_DATA$ `7 b' x4 O0 V( t) q% U3 y& h, C2 r
- LDA <Sprite_0_Mode
, Q" C% Q' x" R! R - STA PPU_OAM_DATA
. w5 \* o7 A1 R K/ E/ G - LDA <Sprite_0_X
+ s' Z' d& C- }% c" L- V. M, X - STA PPU_OAM_DATA
6 A' W( g. O3 O3 n) V& R' Y, M -
) F) L9 Y! Y Q6 R9 [2 Z) ~ - ;开启PPU控制
/ @" _# l4 C" Y; m - LDA PPU_Ctrl_Buf# a. ^. E2 c2 k( v; V1 X
- STA PPU_CTRL
9 k3 E1 {6 w! C3 @5 t0 o -
& }& S: F$ Y& e2 O$ D - ;屏幕滚动* J, D+ @" w" W, a6 u% H- O5 z
- LDA <PPU_Scroll_H
( \" X$ W$ \# H; u9 D* w: a - STA PPU_SCROLL
; s5 F- k5 U! A& w/ n2 m, T" L2 U5 L - LDA #$005 A4 T6 G$ a# J2 g! v* i: S* o
- STA PPU_SCROLL; r1 z1 @$ e8 K4 k. N. \7 C! \4 g
- & ?) [% V' Z% U- P7 {
- ;手柄处理2 O( r7 X! o; X; C% ?( D
- JSR GamepadProcess
0 E4 h2 {) Y7 x6 A - ) H& x |- F' h1 F' ]1 R
- INC <PPU_Scroll_H% @9 N ^2 } M* R
-
/ u% X* U; |. @) @6 ? - ;启动0号精灵碰撞检测
' Z/ J7 o# g2 V% C3 q - LDA #$01
% B9 K5 i" K- V7 N4 i; P, ~ - STA Sprite_0_Hit_Move_Direction8 W$ R. o$ V3 q# C9 I. |
- JSR Sprite_Hit_Test7 k6 Q4 C% @& O1 P8 X9 E! K
- / ]9 b* I* l9 ^1 d& F7 ?0 r* r) }
- PLA9 b( F# Z7 h8 m; {! S2 U2 M) P# I
- TAY
; h; P' c: I3 H8 U/ } - PLA* M& w: A; o1 ]. Z0 i3 u& z* V
- TAX
0 w# c& i- \. c6 s. l! z9 x% F- H - PLA
) z- i1 D. k$ ^ n1 u - RTI
1 b7 l$ d3 T8 C2 q2 a% ]! h* K - ' L! v- m4 \5 b ~ b. Z6 y
- ;==============================
' O. e% ^. U* a) M. a9 [& T - ;0号精灵碰撞测试( ]$ w# S9 G% c5 }. h# z+ S8 Y2 F( R O
- Sprite_Hit_Test9 R) ]8 k! U7 d9 s* h$ |! v n
- $ X0 w6 D' z- G! A5 b2 Z$ s
- ;------------------------------
3 v7 l* d% e5 G - ;等待0号精灵碰撞状态取消
# s0 U/ C& @, @: d" r - LDA PPU_STATUS# u4 H6 y; n* s5 h8 f. p
- ASL A
6 z/ Z9 R: i5 x! x- d* m! O9 O - BMI * - 4! D' f$ h! S6 W& w, t2 v: G
-
0 W7 t$ j3 j$ S8 L9 t" f - ;------------------------------
. L5 s1 W/ j: B" d1 M - ;等待0号精灵碰撞发生6 |1 N, ?2 _* h6 }' p# S$ O
- LDA PPU_STATUS
, [6 J- {7 F! x, E! l& u - ASl A
o' t. U; w% a' K: i7 H - BPL * - 4; u8 N. Y8 k6 w, w
- $ G- `* |- M8 j8 P' ?
- ;------------------------------
4 q0 K4 w$ o9 a - ;行消隐等待
; m1 @) u6 B' f - Sprite_Hit_Scroll_Wait
& V3 R6 O( M/ a8 R$ y4 j/ K6 w - LDX #$28
3 V" [$ G1 N8 Z' }8 n - DEX
( K* F( h+ I/ \) |+ ]( ?* t3 n - BNE * - 1
+ Z/ f- O/ M- p( X" Q - ! L0 O' g9 W# v- w7 X
- LDA Sprite_0_Hit_Move_Direction
# a. P1 s& R L5 o/ g - AND #$01* T, p, \& M( W: K
- BNE Sprite_Hit_Scroll_Set_Right) Z- U! _* w) {- j3 j( M! l7 A
. v/ G1 u+ u0 l2 n& L4 h1 m- ;------------------------------& M8 c* M. D7 w5 m
- ;分割画面向左滚动 Z f1 j4 G6 G
- Sprite_Hit_Scroll_Set_Left& L: s% D9 _2 u% p& Q
- LDA PPU_STATUS9 K8 I2 l' m( ^) D4 n% X
- LDA <PPU_Scroll_H
, A. C) K! H3 K8 f& V7 l9 ?3 r1 c5 q - STA PPU_SCROLL0 }1 E* E% k0 D& y
- LDA #$00
9 t2 D6 }, t& K; z) g, Q- Z - STA PPU_SCROLL
7 @3 l9 S8 n: L - RTS
3 {; ?& e! {- d% r - 6 B4 J) [% r: B- c7 _' S
- ;------------------------------, X: j$ _$ A# Z3 m! U; G8 T$ }
- ;分割画面向右滚动# T# Y% p5 }9 _+ B' z2 ~
- Sprite_Hit_Scroll_Set_Right
! I6 }4 h% P3 ]: k* ~4 o+ ?1 ` - LDA PPU_STATUS& ]% u$ t+ |- N/ a5 N6 \# j; N
- LDA #$00
8 S9 Z5 N |# \8 n0 ~; C$ X! } - SEC
, Y, ^% f6 t" S8 O0 v0 { - SBC <PPU_Scroll_H
4 C3 Y \/ i! T$ y# O1 Q8 M - STA PPU_SCROLL
. V- Q, P( Z0 _; n; t - LDA #$001 d# p0 K1 G& e% V1 Q) c
- STA PPU_SCROLL9 H3 s( p+ S4 A9 D; H
- RTS$ @8 E# G. h% E* F
- 8 G/ X7 r& S, i# I& @, y
- ;==================================================
/ T1 @* @/ m$ L) y$ i* o h5 V& [ - ;IRQ中断处理
7 g, `- d3 e9 G/ v1 m: x - IrqProgram+ A0 I. l& H @5 r/ k( h1 @
- PHA
t4 {- D& N3 f- d% B - TXA
* R9 S- p# W6 x - PHA, q8 N ?9 \% b6 P% t4 c& ^
- TYA
5 J1 G$ K2 m+ V7 W$ X" x - PHA
! T0 e/ X3 Y' l, d) E; h -
! m& i1 y8 H7 U- H - ;关闭IRQ* h g2 @" W4 |! |7 D k
- STA MMC3_IRQ_DISABLE u! h3 u8 V! _( Z; R' s% q
-
2 J- ~* u5 E, M# C3 o0 B" t - ;允许下个IRQ触发
+ k& h8 a [ n - STA MMC3_IRQ_ENABLE( i6 Z3 i& S. q* K' t! z8 p
-
9 v5 s. w: G$ l+ o6 W - ;IRQ处理, 15线后继续触发
2 w! v! H( w0 G - LDA #15. q; C: X( S+ E4 S) O; g
- STA MMC3_IRQ_LATCH3 `; D6 {* R" X2 b* t# P* Y4 J
-
; Q* N5 c8 @) E' B+ z - LDA <IRQ_Index
9 {1 |( W: f: d: X0 r - BNE * + 4
# Q3 @) M) M9 O9 Z$ @7 L - INC <PPU_Scroll_H
5 Y7 g* [( K1 k. ~) Y& [0 S -
% [+ z& P6 K; I$ Y+ t - ;设置屏幕滚动8 Z1 s! N- f- E8 u% F( p/ Q
- LDA <IRQ_Index
; W- z6 i2 U; d: q3 h- x - AND #$01$ p4 M5 b- g& y3 [
- BEQ Irq_Scroll_Right
; S0 h9 @& u( g4 ?& g! }6 \ - $ y9 M0 y. d5 @5 k* h
- Irq_Scroll_Left o) r8 ^, m- @9 t/ W+ }% a9 X# G
- BIT PPU_STATUS
2 L7 j7 M1 @. A: B3 s) r2 M - LDA <PPU_Scroll_H5 i/ s* E7 v- E2 g. m4 c9 [: J
- STA PPU_SCROLL! b( v4 d+ Y0 u
- STA PPU_SCROLL
& R, R4 v* O* U5 ?" W+ e - JMP Irq_Scroll_Over
. r( V3 d, |3 H2 Y - 8 P1 [2 R6 [ T) Z8 I
- Irq_Scroll_Right% u0 R X. h/ X3 C( c5 w5 n
- SEC& k( p* r S" X% Y
- SBC <PPU_Scroll_H5 i3 o. O; F3 P) w+ ^/ v
- STA PPU_SCROLL+ ^! d3 A3 f4 t
- STA PPU_SCROLL- y4 n4 v$ Q) q0 Y! k2 X, h
- Irq_Scroll_Over
$ q: d: v7 c& i2 D; O -
\! g# i: r7 t - INC <IRQ_Index
; U3 N! s2 p' Z3 {: G - $ t: E6 B( A! K) p5 u
- LDA <IRQ_Index' ]6 d% [/ k' V% J
- CMP #14: P1 t5 m( n' C: [8 [+ H" x) X2 C
- BCC * + 5
{" B4 g% [, \ - ;关闭IRQ
& Q( S, R5 X! B9 {. A* L6 \ - STA MMC3_IRQ_DISABLE
& J4 n+ k4 J% V$ t/ m4 Z -
m# y; X: A. U$ p7 \' j0 \ - IrqProgramEnd. i% S& b: q! ]+ w
- PLA
8 j/ j2 c1 g5 o4 E) C1 r; m - TAY
, a! w! G. h7 ~$ C - PLA
! \+ d4 [/ k5 z7 Y - TAX) w1 }0 c; I2 O2 K& v
- PLA
0 u7 b# G- z( K' `/ b - RTI2 k0 r9 L0 u5 Q
- . r+ H7 K5 p/ V% _* C
- ;==================================================' Q/ a& Y$ @* n! ?, h
- ;中断表# `, ^5 O) l1 |7 h. N
- .ORG $FFFA
0 L4 e, e9 h0 {8 x3 `1 S - .WORD NmiProgram9 u E# T/ K g3 o& S
- .WORD ResetProgram* e& F$ d; C6 R- p# w
- .WORD IrqProgram
复制代码 : f; z! n* ?7 {+ H1 r6 `
|
评分
-
1
查看全部评分
-
|