|
- ;[FC][MMC3 精灵碰撞]3 @0 J T8 V5 g: ~. T5 M8 v4 H
- ;FlameCyclone 20230710 Y/ X5 l; n6 v3 y, s9 D
5 X! v7 m% w4 [! ~9 A5 m; s- ;文件头6 E1 Z6 {7 d/ ?$ K5 K
- ;======================================================================+ {4 U) O- o# {5 J" F
- .INESPRG 4 ;16KB PRG 数量# {/ k1 w$ o8 P6 b* B# H
- .INESCHR 1 ;8KB CHR 数量1 Z& p3 t$ O; V; I; T0 |2 m2 @( |
- .INESMAP 4 ;mapper 4' n+ x/ A; L8 z. ~7 h; v
- .INESMIR 1 ;命名表镜像 0水平 1垂直
" S: N5 r4 c: b7 h X, g - ) V( Q% E5 g! Y% g
- ;必要条件
, M# X, d" D# Q; X# g4 e$ f6 r - ;1.持有CHR ROM
9 W5 h: ]2 a4 w4 W7 O. j) N - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
; V+ B" ~# P: G6 a - ;3.精灵内存(OAM)不为空
4 Q1 ]0 R' @; d" l1 g - ! m/ @) f1 U" {' l
- ;==================================================
7 l Y; Q# Q2 M$ D3 R. J2 o - ;NES端口常量6 b: X3 f+ W+ B0 B+ k' V9 G
- PPU_CTRL = $2000 ;PPU控制寄存器, L) w9 W) H% x5 C
- PPU_MASK = $2001 ;PPU掩码寄存器0 y$ ]( p# \4 X- P# P& i" H+ C
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
) N9 Y3 K8 r" R% J - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加11 f* X# l; w+ x9 W, M) L) p
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1. G3 {! O8 ?# h- i t8 v6 B, {, P
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 / G( f+ u* B+ n n- u5 w4 M
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加3 ~8 r, f, W9 C0 N7 T; v. {
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
9 v9 C0 M, F* W1 Q - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
: u! d/ {0 w% x2 v - APU_STATUS = $4015 ;声音通道切换
; V8 ]) R, V, H3 I4 \ - JOY1_FRAME = $4016 ;手柄1 + 选通% z" M* h0 ]# t7 c" B
- JOY2_FRAME = $4017 ;手柄2 + 选通% l0 @. Q9 v" {& n
! c a Z6 s& D8 G- ;==================================================
$ T# D/ B2 {8 i* a - ;MMC3端口常量5 k+ b$ L6 ]6 _& Z
- MMC3_BANK_CTRL = $80009 I: E2 X5 v5 H. _; B* D
- MMC3_BANK_DATA = $80019 ~' u+ A4 b! ?8 k" U4 h& u
- MMC3_MIRRORING = $A0004 G' s" B; W, y- N
- MMC3_PRG_RAM_PROTECT = $A0016 V, e R Q l: O& Z. K* I+ k, V
- MMC3_IRQ_LATCH = $C000' V7 @3 D' \' ]2 n" X
- MMC3_IRQ_RELOAD = $C001) T9 U( }" k% c1 D( [7 V6 U- `; {
- MMC3_IRQ_DISABLE = $E000
( T8 @* ] }8 w) e) S/ n - MMC3_IRQ_ENABLE = $E001! p* w0 l. q1 G# _ b% ?
" @, |7 c1 b% |) [ ~0 B: O) [5 }- ;==================================================. }7 r' X" s& e4 ?8 ]5 f5 G/ P
- ;程序块配置
4 d% A h; M4 ]8 j# Z - BANK_DATA_MASK = $07
2 ^/ e: c. [) ^0 o4 P- c - ;--------------------------------------------------- ~8 O/ L; ]3 [5 n
- RESET_BANK = $078 G) Q6 a# Q j$ D
- RESET_ADDR = $FC00
. p4 ^- b# C0 k) N# s - H( A( M3 k/ [8 f
- ;==================================================" R+ }3 P$ e6 S$ z5 M& |5 Q& G
- ;图像块配置 w* I; N2 U7 R0 ?
- CHR_DATA_BANK = $08
" f C) Y/ i" b5 e, ~ - 9 |0 Y0 f3 t) J% o. f6 U z3 k& I
- ;==================================================) |5 m$ c/ W* r- v) R0 X
- ;零页内存地址配置9 i3 {* K, k; u# r7 {
- Use_Ram_Addr = $80
; b I1 ~, R9 B; { - PPU_Ctrl_Buf = Use_Ram_Addr$ s s/ c6 ]! ~& @% \# c
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
; }) H$ f. q/ z. n. q, @1 [ - PPU_Scroll_H = PPU_Msak_Buf + $01" w9 r3 n2 W0 J r9 V8 U' o5 n4 N) U; s
- PPU_Scroll_V = PPU_Scroll_H + $013 Q3 E6 H) h" ~6 C$ q
- FC_Data_L = PPU_Scroll_V + $01: \; r, S2 ?9 t: }
- FC_Data_H = FC_Data_L + $01/ h' z; p9 w. B$ K
- FC_Data_Buf = FC_Data_H + $015 S- ~ {$ R3 c+ G
- ;==================================================* q, z: C" z0 h% @3 Q
- % Q. ?5 ]8 q6 w; g8 P
- GAMEPAD_MERGE_FLAG = $04/ L; ? x& ~; A2 U3 x, Z- A% ~( A
3 V1 r0 H" b* Z0 K- Gamepad_Keep = FC_Data_Buf + 1& g8 k* v1 p: b# t0 z
- Gamepad_Once = Gamepad_Keep + 2/ F ~: F. Q. E1 @
- Gamepad_Temp = Gamepad_Once + 2
0 |0 W0 `6 i# \+ A8 x: u -
/ y6 o) y" a5 X& f& f4 I - Gamepad_0_State = Gamepad_Temp + 2
3 _1 ]5 I3 ]3 T3 `! J. P" ~ d - Gamepad_1_State = Gamepad_0_State + 19 w ?3 U2 h q; q; j- Z
- Gamepad_0_Value = Gamepad_1_State + 1
( r4 C; g1 D8 s. R - Gamepad_1_Value = Gamepad_0_Value + 1& S0 g: D; Y2 \& a+ f& O3 S
- Gamepad_Port_Value = Gamepad_1_Value + 1 }( y/ h+ H! R
- Gamepad_Merge = Gamepad_Port_Value + 1$ w9 K: }9 z7 I3 x q2 M
- 0 O2 {% J& }+ g c, _1 D
- ;==================================================! l$ H5 Z1 I) T. f( X B/ L9 M
- IRQ_Index = Gamepad_Merge + $01
5 k0 v7 O- Z* G- B. A0 g - Sprite_0_Y = IRQ_Index + $01
+ c2 @. J# Z( c" I# W - Sprite_0_Tile = Sprite_0_Y + $010 F& G+ O6 v/ Q, h, l
- Sprite_0_Mode = Sprite_0_Tile + $01
3 ~6 r( x% k! s, x - Sprite_0_X = Sprite_0_Mode + $01* ]7 u. N3 b7 Y
- Sprite_0_Hit_Move_Direction = Sprite_0_X + $01
+ A& ^0 s9 j) p' x - ;==================================================3 Y4 l0 w3 E2 x7 u q m
* m! @- Y& S% o/ H4 j- ;CHR图形数据
6 s! L1 K6 Y& P3 x - ;================================================== l1 h; i' ?8 a) z4 A, d- {
- .BANK CHR_DATA_BANK
' H7 b! Z3 V, o' f - .INCBIN "chr_bank/chr_data.chr"
9 z/ z d5 |& y: @ -
2 D* J/ g3 t, S. s - .BANK RESET_BANK & BANK_DATA_MASK
4 m/ O0 N+ q! l: a! Q - .ORG RESET_ADDR
* J- n) K5 ~/ O; J+ T0 ^5 E -
& z/ L% _. ~+ E& W0 b - ;--------------------------------------------------
5 D1 W& m" p1 V- w - Attributes_Data( P1 c) n" z' O2 k% s" e
- ;命名表属性# U- s1 X3 R# Q
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
$ I! ?6 e9 S3 T2 J0 O - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA% B/ |' I$ g- f k: ], a
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA8 t& G+ \" o# G2 w
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
& [7 Q2 t% [& e( J - ;--------------------------------------------------8 x( h" y( X" F& k( J
- ;调色板数据. r1 }" {: a" B9 G; q
- Palette_Data
; w" S* H! m& p, j4 O6 l- {1 J - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F5 q n" ^: _ @1 q; K. v
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
" W' z3 u# Q e( s1 X, R% d5 p - 7 f1 l: F7 e# m4 B4 ^% o, i
- ;==================================================
/ m2 N: ^& w* _0 Y7 n2 @, ^4 ` - ;命名表初始化
3 ]6 z. s! W( A- A+ `) C$ ^+ c - Init_Name_Table
" K; K7 g6 Q2 `$ t - LDA #$20
- h D9 {" f7 |" D0 j" ~ b - STA PPU_ADDRESS6 s* d% a& y2 A m7 x: g3 _
- LDA #$005 T8 {3 N) T) V" K" o. b3 F
- STA PPU_ADDRESS
# q+ u. S6 w. b# C2 q! u4 c - LDA #$00! C* w2 z- ^$ P& x0 @2 o0 {
- LDY #$00/ z, ^$ b/ Q, c+ j5 O) _) F1 a
- LDX #$10
. f* W( }) w7 ?% b! }. X - Init_Name_Table_Write
: ^) N7 ^$ E% E8 `% F8 _ - STA PPU_DATA
; ~# `+ r2 |% c# k) u - INY' z* ~4 {. B1 x# o0 G
- BNE Init_Name_Table_Write7 ~9 {& _" h* T; A9 |! d
- DEX( N7 t2 g! ~" T9 [
- BNE Init_Name_Table_Write
9 G5 j4 Z) v5 U - RTS6 n8 ^7 s/ p. L6 ^
- 2 [: |! M6 ]' x
- ;==================================================
7 M% N$ b( K" `8 L* ^ - ;调色板初始化! c9 J+ O- K ~& A
- Init_Palette
4 n8 {. C" l, ` - BIT PPU_STATUS0 x; z* S. E+ B& @' T }8 O
- LDA #$3F7 f) V W+ _& \8 u& @4 a
- STA PPU_ADDRESS# P% ]3 O' t! X( U8 B
- LDA #$003 c& D& h( ]9 b
- STA PPU_ADDRESS
" s& X4 d5 `& ?, n) W/ `5 ` - LDX #$008 Z* f+ u) M' i) @' m& u3 [8 s( ^( Z
- Init_Palette_Write' @" @, a) O/ e3 f# ^' ?
- LDA Palette_Data,X
/ d+ H. i$ m$ T0 ?4 M3 U - STA PPU_DATA
) x; c$ r( v9 F+ q# E* |) Y - INX6 X' J L" p8 ?# C
- CPX #$207 z7 X) {3 {! a2 |4 o
- BCC Init_Palette_Write
- ~2 K j7 g5 ?' ~. P- A - RTS
4 p5 v1 M" A0 c4 d. p N) X" D3 |. J - # ]# \" W/ x) R- ~9 |
- ;==================================================9 @& `; N! A+ S' _4 q
- ;设置命名表属性
+ E( A9 c" f, c% O% q% d1 P+ o - Init_NameTable_Attributes
; R! l4 Y* S" a- q - BIT PPU_STATUS) Y: |/ @' g4 U D* @4 D% O; I; v
- LDA #$23, K- R1 i# N% g1 ]
- STA PPU_ADDRESS
8 Y" L0 I$ \' H - LDA #$C0. x; B- e* s: U. w4 ]
- STA PPU_ADDRESS& C4 _% m* \9 z4 o. T3 V# F7 M8 W+ P" a
- LDX #$005 m9 u5 A/ P6 `7 E
- Init_NameTable_Attributes_Write
% f; [$ ]8 Q( C - LDA Attributes_Data,X
9 m4 z' e0 v% M - STA PPU_DATA
8 U, p* K; K5 C; c - INX) P( K, u3 @0 ]4 _5 t- ]
- CPX #$40' @6 ?6 W" `% ?3 l' \8 G
- BCC Init_NameTable_Attributes_Write3 N1 R: [6 t3 ^ n i
- RTS% r1 m* l4 k Q5 { B/ r/ I
, v3 M; x4 {6 g: s( T! L- ;==================================================3 ~+ p, }( o6 W9 ^
- ;初始化命名表文本! ]8 A1 s# k* k
- Init_Name_Table_Text+ `7 q( a% o [% M% ^8 a
- BIT PPU_STATUS
# a" ]* J4 v3 t4 \6 B* X - LDA #$20
4 o0 a& |& ?0 O4 q: H8 ?% E - STA PPU_ADDRESS" {4 O* T1 b3 Y# q5 u
- LDA #$00
v9 F( M" y8 { v) ?; r; r - STA PPU_ADDRESS( y7 t; d4 T$ k- v- G b
- LDA #$00' x8 J$ Y8 M# N! s: q( c% R! L
- STA FC_Data_Buf3 y. v) k0 Q u7 Z8 v* I" e( v
- LDY #30( I/ R5 f/ Q5 \, ?8 T
- Init_Name_Table_Text_Write
3 e7 j* V. T2 G" H - LDX #324 n+ ]0 d9 Q8 x+ N6 _% a! B
- Init_Name_Table_Text_Write_Char) p* S. F* ]: ]# u) |1 v4 \
- LDA #'0'" T7 h0 B) i% |( L3 p& M) C4 t
- CLC
. g0 n9 z! U1 H0 W5 |3 |) q$ X - ADC FC_Data_Buf
g: X7 {( S1 A8 N O - STA PPU_DATA8 I3 W6 u3 e2 x3 G* `0 i- B A8 A
- DEX1 X/ N4 J/ ~* |& D! L
- LDA #$14. ?. ]0 ?2 E: D5 W9 w0 [) g6 A
- STA PPU_DATA
! [9 G/ z; q! X: `0 V1 W. P' V - DEX
6 U" c$ G9 J+ M# C - BNE Init_Name_Table_Text_Write_Char
! e, C' l" u Y% p' g2 u - INC FC_Data_Buf
W, X1 }1 R/ a - DEY
1 Z4 w7 t9 _* ] - BNE Init_Name_Table_Text_Write h4 ^3 q2 o+ T$ ] E M2 V, q
- RTS
: t. T6 G S2 D0 A- J2 k - 1 ~, M: F, ^9 z# d" L) j
- ;==============================( e: m8 M& E. {! I' ?
- Init_OAM_Ram;初始化精灵内存
8 t8 G, @2 `/ f. g- O$ ~ - LDX #$00
% @# e& z. [5 A; V% G - LDA #$00. r8 o; Y. g/ s- v
- STA PPU_OAM_ADDR
+ P* ]! P' e" f - LDA #$F8
2 \+ `( o3 {1 G+ e. a8 b - Init_OAM_Ram_Write
) C; a2 T3 `8 m l7 T4 _( @% P O - STA PPU_OAM_DATA
V* a- [" }- y* |+ k - INX! E( X [4 u- N r2 K X' r
- BNE Init_OAM_Ram_Write6 q, y" W7 E' @
- RTS
3 ?& y" y* s& z4 c+ ^; B3 v3 C' a -
0 M5 V! j" o( \0 }' k4 u/ F - GamepadProcess;手柄处理
. v$ e7 r! I/ G - JSR GamepadDatacan4 L+ z' z5 E4 f+ L3 K, q8 g
- LDA <Gamepad_0_Value- O/ P' x0 x7 R. q9 I
- STA <Gamepad_0_State
7 y; O9 \) s! B# i; I7 |! o5 f3 _ - LDA <Gamepad_1_Value
* U9 J9 [$ s6 q, N& l - STA <Gamepad_1_State
: V* t$ P% ?; `/ ?! g1 h9 H - JSR GamepadDatacan$ }, i! \ g- h$ _
- LDX #$010 O' h3 c! Z* R/ a2 Y
- GamepadMergeCheck;合并手柄输入检查
8 u5 ]: W. T& X$ z; s) N - LDA <Gamepad_0_Value,X
& c' `- y) g$ Z5 K, M2 D5 e8 } - CMP <Gamepad_0_State,X5 |4 S6 |; G% f/ a7 y+ P) o: \! m; C/ Z
- BEQ GamepadMergeInput7 S3 x( g$ A) }
- LDA <Gamepad_Temp,X5 o7 Q. b: }! |, N; s7 y
- STA <Gamepad_0_Value,X
( z" T: W" p; R - GamepadMergeInput;合并手柄输入
/ w6 o2 n8 d/ G0 N# [! l* I9 | - DEX
6 s0 D" o E9 A$ j5 m& O r - BPL GamepadMergeCheck/ _( b5 c' ?. Y9 v3 S
- LDA <Gamepad_Merge
W. P+ D, j" M, p$ i0 @ - AND #GAMEPAD_MERGE_FLAG
5 D' K( l) ?3 z- ~+ ] - BNE GamepadStateProcess' I; V! G6 A; K
- LDA <Gamepad_0_Value
1 M, k% I- v, W - ORA <Gamepad_1_Value
/ l; B8 ~- X/ m - STA <Gamepad_0_Value
+ M0 J7 K1 W1 p: q/ n9 `7 j" P - GamepadStateProcess;手柄状态处理& L: e8 q G5 | ] G' j/ @2 B! e( J
- LDX #$01
% F4 A4 r; O E3 @' k: J - GamepadStateSave;手柄状态保存
9 [$ U, k+ z6 d9 Y5 ~ - LDA <Gamepad_0_Value,X
/ B9 S7 X0 y- t+ J6 {% { - TAY
/ L" [+ @* m" v: A5 B - EOR <Gamepad_Temp,X
3 g0 N" h# u$ @. J, N. s% J U* N8 W& _ - AND <Gamepad_0_Value,X
4 v* C7 b+ g- E$ \- _ - STA <Gamepad_Once,X
) g1 l. R6 t( c Q. a - STY <Gamepad_Keep,X
. `6 v0 d/ i5 ~1 x% h; J/ @ - STY <Gamepad_Temp,X
8 `/ O- p# s6 j2 R# G2 F - DEX
6 J; X i$ k ~; Y+ T7 }% [" I - BPL GamepadStateSave
: |8 t R( j' ~9 R* n8 N - RTS' b) X6 _* b; l% J# M1 J c5 f3 u" Z
- : z& v: ] G% J6 j$ @- z
- GamepadDatacan;手柄数据扫描
9 [& v) s: {) g t0 J) S - LDX #$01& h! Z% f" \0 q$ V7 @; \, g6 i
- STX $4016- ]' i$ D- p( K2 T
- DEX
6 z9 ?5 O; l& L: H. x' k O - STX $40162 d+ a; P. s& l1 a& ?
- LDY #$08
0 V N5 e4 d4 Y) h" a4 P% U& Q - GamepadPortScan;手柄端口扫描
* F( A/ a* v# M1 @" J2 m- P5 l% c - LDA $4016
- u- F1 D- Q/ z6 H7 J7 k - STA <Gamepad_Port_Value5 I5 _" j1 g& q9 L& _$ p4 n8 V+ Q
- LSR A
0 z4 g' T6 |( l1 ^3 S: p - ORA <Gamepad_Port_Value- }+ `0 S N$ I& [2 \* h' ]- ^6 g
- LSR A7 n" i) { T! D3 D) w8 m
- ROL <Gamepad_0_Value! V7 C2 n; Z& B& }+ X
- LDA $4017
9 {8 W1 h* m) R2 \4 d1 k - STA <Gamepad_Port_Value) o4 i0 x4 ^2 n6 r8 o
- LSR A8 C* a) ?1 s0 n. H! a
- ORA <Gamepad_Port_Value
6 _/ p$ E# C9 T1 X6 x% ]' z( r0 ? - LSR A
2 X2 E4 }8 ]( }8 k - ROL <Gamepad_1_Value9 f0 x* s1 n G: U- G! Y
- DEY" `( l! U; [2 e" j; N
- BNE GamepadPortScan4 |, H* ]/ J) k9 z* E0 x0 s
- RTS
9 _9 x2 ?+ ?! ^6 z- r - , r) x& r1 [+ X
- ;================================================== B! V6 j- K- y9 ?8 v+ Z
- ;PPU处理, l w( V. m1 |; f
- PPU_Process2 j6 P, l8 x2 b7 \: b: T( A
- LDA #$00
( V v. y- j8 w5 x i5 O( e - STA PPU_MASK5 j/ G/ F2 d2 {8 V5 Q/ E
- 1 R' p' i7 j6 i* ~ K! P
- BIT PPU_STATUS6 D' l: \/ z) h0 d/ [
- LDA #$20
$ {" l$ D. r3 f0 g4 E - STA PPU_ADDRESS' r a; ?+ j8 X6 {. U- J9 S& m
- LDA #$008 A: e4 G$ y* U* b
- STA PPU_ADDRESS; r: u& |6 A, y
- 8 Z3 H5 \9 n. ~! Z( i8 M$ X8 ~
- STA PPU_SCROLL
/ w( U) Z8 |( K$ w - STA PPU_SCROLL
& D1 g. s r7 _' D; \, U( c - 8 I$ I' [) C5 f
- LDA PPU_Msak_Buf
/ v) Z8 @ ^8 ^' u, H - STA PPU_MASK
4 w t1 X8 ^0 w5 S( z2 F6 f; X; m - ) P0 w V3 X6 q& w! w# ?
- RTS7 d0 g( }. v6 d' S# F8 j6 E
- 6 q, x8 G V& B& L
- ;==============================' Q0 V3 b- J4 ^# u) I! ^
- Time_For_Vblank;延时等待
( T6 p- f8 u% D: r - LDA PPU_STATUS, `% _/ z. R; K0 ?0 V3 N
- BPL Time_For_Vblank
, z6 _- ~% A, H4 G) v r - RTS& z9 j9 [2 \0 D* F. z
-
. T3 X) D @6 J2 d @! J - ;==================================================
/ y- s; z/ o7 }" a, V( w - ;初始化MMC3+ q M: m. _, m/ R2 b: E
- Init_MMC35 w X& }# a& G6 j. w/ I) Q
- STA MMC3_IRQ_DISABLE5 C) k x. Q p' ]" E$ f
-
/ e' S. m+ N' m0 \ - ;设置MMC3水平镜像0 W I' N! r) a& O5 D& r2 k
- LDA #$018 b0 {- A$ p1 l1 J6 N) u, c* @
- STA MMC3_MIRRORING+ `. v0 W8 N/ j m" C
- 3 `+ I N/ i# N( g# v/ H, ~
- LDX #$05
; y& d! u5 l5 A/ N, }& s - Init_MMC3_Chr_Bank_Write
; \) P" O% e" J9 E - STX MMC3_BANK_CTRL+ A% O! [4 P" ~( P% B: r% ^( J
- LDA MMC3_Chr_Bank_Data,X8 n) _$ o% b; n9 v8 P) w9 Q
- STA MMC3_BANK_DATA( b& E1 d4 G6 Q: @( G( @& W! W
- DEX
3 a4 O3 f, d& s+ O2 i6 Y9 f - BPL Init_MMC3_Chr_Bank_Write
$ R2 J( O' Q% N Q; X" A - RTS
5 a" k' p( [! D: @, X - ;--------------------------------------------------
- H3 H9 b( x, E' q1 a. c - MMC3_Chr_Bank_Data2 {/ l1 {$ D+ m4 T
- .DB $00,$02,$04,$05,$06,$076 P' _: a2 s: [2 y
- # n" `' x' b% e# B# m' ~1 B
- ;==================================================
7 A1 r8 \3 W: U* b - ;重置中断处理
m3 c z7 {" l1 Y1 D7 c$ A - ResetProgram
0 }1 f9 z# L9 |$ A1 N - SEI
& m: o0 L( l# r5 h - CLD
& ^+ `, ?4 m8 {$ F' M: @ v1 n - LDA #$00! u7 i3 E, ~9 g) p" r
- STA PPU_CTRL; ?: V# U* a, e" J. o7 j8 F* v: N
- STA PPU_MASK
# N" ~: k$ l# U" D/ ? - STA PPU_STATUS
% d# f) K- C( L+ b+ r* } - STA JOY2_FRAME ^* i, b( l5 V" k, D' T/ }
- STA APU_STATUS
2 w( d% ~* p0 D8 v -
! y* w5 ]! h7 Q* w9 g4 W - LDA #$C0
% ], L" n4 c8 J5 {7 b - STA JOY2_FRAME' f+ U' A$ Y. c9 h( L; Q6 `$ K: A
- 5 I9 l! I# n% n( _, [0 C
- ;等待vblank/ W1 [& Y ~% f1 d3 W! [( H
- LDX #$025 u' f1 T! ^( O/ \2 O q
- Vblank_Wait_17 O; v4 G9 F% ?# Y9 L
- BIT PPU_STATUS
) z& [- N9 L0 V5 ?( H - BPL Vblank_Wait_1( L: ^* J6 B, G2 c. E4 {- d
- Vblank_Wait_2 S q1 o& Y& t1 G
- BIT PPU_STATUS
; M( ?' E1 e8 K: c& P* z- g - BMI Vblank_Wait_2. @6 j+ N" m. M/ g: E! ^ P
- DEX
, z$ ~- k' l" `* O - BNE Vblank_Wait_1
& o" h! p; g2 [6 {4 r5 T4 O( Y -
5 K2 [$ v- {1 d! \/ I: E' M% k - LDX #$FF6 F9 d7 i3 Q+ v
- TXS) A5 d7 x1 ] M2 f& w6 J6 Y$ X# e" a' @
- & M% M3 S8 C6 O: p6 e0 z& J0 j" g
- ;初始化MMC3( [7 p- N+ p- P! G7 A6 g, U
- JSR Init_MMC3
+ @+ \2 _; P3 B1 } - 5 t# y$ n3 A. v- Y4 O& @' q8 V
- ;==============================
! N7 m% R; A' B M+ Q! ] - ;RAM初始化
( o( Y! _4 a" c - Nes_Ram_Init
9 E [/ Q6 R6 a - LDY #$00( Z0 O; q" ?8 V& @! v+ C, }
- LDX #$08- T- N4 l1 L% [( i& @* E9 a
- LDA #$00
" S% V Z/ G/ g5 l. O5 c+ N - STA <$00
7 F" _/ a. ]4 @3 f# e8 i2 J - STA <$01: Z" u! k' e8 u1 C. A K
- Nes_Ram_Init_Write6 p: L& x/ T7 i$ h, A( `
- STA [$00],Y$ m* ^. o4 i! E- L1 r$ E3 A& @
- INY0 q h; G- ]. b; L' \ u
- BNE Nes_Ram_Init_Write" }6 z. }- l s& d
- INC <$01
2 ?) X# m6 Z/ D- K. t - DEX. ]* E; [4 F/ Q3 R: a6 q( }
- BNE Nes_Ram_Init_Write
% S( Y# D4 u+ ^( F - 8 R# R v4 t% \4 ]8 f2 \1 k
- ;初始化命名表- ^2 ?8 D! F! D% X/ W* `- ?/ u
- JSR Init_Name_Table' e G( Z% r2 u
-
( Z/ s' t) T7 R% c8 c/ _3 B! c0 a9 Q - ;初始化调色板! x+ R- ]* z, A3 m. ~ u
- JSR Init_Palette+ i6 b% V) J- u* G6 j
- 2 x( X: V) f# {+ j& p
- ;初始化命名表属性( H4 s/ l5 @$ L
- JSR Init_NameTable_Attributes
% H) ?( {0 b8 J9 u7 r" C' s- d4 z -
, b! u' N; W4 } - ;初始化精灵内存8 s, k& Y1 n0 o8 d: B
- JSR Init_OAM_Ram* D+ m& F- O4 A1 _' [4 S3 L T
- ' _+ p8 f5 K c' d7 b/ U
- ;在屏幕上写点东西
9 ~/ _+ J# N/ L' x, ~; Y - JSR Init_Name_Table_Text
; u4 G! a; p5 Z, H+ M | -
) q1 C" a X1 T - JSR Time_For_Vblank3 H) h8 G" H) D) |- n
- ;开启PPU控制
4 E" E" Z$ Q: t4 j - LDA #$803 l5 c; a% n% d7 x
- STA PPU_Ctrl_Buf& N4 }6 W! |" s. v1 ?, t
- STA PPU_CTRL8 \8 Y5 G) i" e8 W: Z5 z% f# d
- ' L: I( E0 L/ I9 }$ O1 J
- ;开启PPU显示
) K) F( y5 F' L4 [* G - LDA #$1E
% a) t$ p. B0 g2 i7 I' y - STA PPU_Msak_Buf
4 P2 q# Z, n( e7 Y4 L - 5 H [; e8 J+ J, X9 n
- LDA #778 p. i& B) J5 J+ n0 z! X
- STA Sprite_0_Y
0 N& N) \/ n5 v. u$ X" I7 x4 k. N2 y2 Z - LDA #$1E
. U) \! ]% m. c) ^ - STA Sprite_0_Tile# M( l2 I; _* D/ c; o. X
- LDA #$20
" w0 ~0 [/ ~7 z& d; X: \1 ]6 `0 Z# r: P - STA Sprite_0_Mode i3 u2 p# D" @4 v/ m5 W' ]" l& F
- LDA #$005 M+ b* V3 n5 X- U C
- STA Sprite_0_X! r8 o' a) ^ [* \$ P5 a+ R
-
0 X; r* J1 Q7 H7 W5 T6 o - CLI* i# S% S E* c5 R8 m. j
- JMP Loop H" l% d O, n6 r: d; K1 [& ] ^
-
?2 _9 Z0 I, p0 e' l - ;==============================) t M0 t E% O( V2 O9 |
- ;死循环, 等待NMI中断7 b7 C+ i r% C: q* b5 x. n
- Loop; g7 k0 i7 {- }# j1 T0 {& k( \
- JMP Loop
* ?; j5 F9 u& I4 { - * D3 h5 \3 L0 q7 N8 v
- ;==================================================) W* O2 p& A R7 u! \' a' q
- ;NMI中断处理
4 m$ _& m1 Y4 e1 \( S& X* P - NmiProgram+ ^5 Y1 _0 s6 R8 N O$ k& W5 `
- PHA
, c0 V1 T1 B# `7 E( W/ T! ?1 r$ o - TXA" W P. G: G) Y- l3 I
- PHA
2 |% R- a/ J( L- z* j( p( k% j - TYA% J( B2 l: Q5 `3 W
- PHA
1 E* P- \! w1 C, o - 1 U& T; a0 X7 C
- BIT PPU_STATUS4 p! g8 k$ P2 K" P
- * v0 Y6 |; Z7 Z0 e5 v
- ;关闭PPU控制
1 L" A3 y5 u- l; d, v - LDA #$00
& E9 D. F; i# }6 y' `% w" O5 M. G - STA PPU_CTRL8 ?& R- ?% g5 |
-
* K# |* R0 n K0 v$ g0 A7 w - ;处理PPU
2 q' D& x7 ?% t" S0 e - JSR PPU_Process4 A- V. e5 L5 w3 U4 l6 p
- + t" M% B2 ]% I. [8 r. @3 {
- LDA #$00
* D: }! o$ Q: e P- x2 C - STA PPU_OAM_ADDR7 D6 m3 E" I) Y8 D
- LDA <Sprite_0_Y
1 j) n8 L$ e. h2 Y - STA PPU_OAM_DATA
3 K# w, w) ~: Z3 X8 U/ R - LDA <Sprite_0_Tile J$ p' }+ K9 J- o! D' z3 d
- STA PPU_OAM_DATA7 K9 r1 q8 C3 S) W9 f6 O! L1 Q
- LDA <Sprite_0_Mode
8 j) d9 n& Z; O5 e/ q+ |5 J4 E - STA PPU_OAM_DATA
' e/ v q6 F0 D5 n% T - LDA <Sprite_0_X* Z1 E8 g! U$ ^& p
- STA PPU_OAM_DATA
: C2 { G2 g; ^3 `# ~+ L g - % L+ K- R! k+ X( y V" A
- ;开启PPU控制" w% I$ n O! k
- LDA PPU_Ctrl_Buf
1 Y: |. ^6 Y" C, v0 C - STA PPU_CTRL
, \- L5 C, u, M b - & {6 ~2 \; b* g: f
- ;屏幕滚动3 c5 M7 h# Z3 T( t9 `
- LDA <PPU_Scroll_H
) Q, }& O( ?. S+ B4 V - STA PPU_SCROLL+ }8 d* l. B' v: t$ U$ A' v
- LDA #$004 n8 c p' |. p) c; T
- STA PPU_SCROLL
! w' Y1 {* E; I -
& B2 W/ b3 g; r3 z3 [- }% N - ;手柄处理
, W8 y3 E" ?. |7 f% @ - JSR GamepadProcess/ h( y1 t& q$ x
- 7 v) m5 [/ y5 Y9 [* `. X+ }
- INC <PPU_Scroll_H
0 \: B6 R$ o1 {: | - % ^ N$ \- v0 ~$ p, F8 ]( Y
- ;启动0号精灵碰撞检测8 w5 A1 C0 z3 \0 u* Z
- LDA #$01
* s$ F, a' c" c+ K- @2 r - STA Sprite_0_Hit_Move_Direction- k( x; N z+ J4 q
- JSR Sprite_Hit_Test6 u+ N. k4 x+ T( k
- / e& A& c2 L d% i, ^
- PLA
# A' j' X, d/ f& [/ r# V - TAY+ B1 e! s8 Q$ ~ q: n5 M
- PLA
1 l: |, J( f0 t4 }+ }0 m - TAX
6 C7 B! z1 m" C - PLA
( {* G j: g9 a' |7 F- M - RTI
' V: ~1 n% I: k+ A7 T
7 X; y7 d' }3 l5 E- ;==============================
. b1 L. ~7 X3 _6 }, h* T& A - ;0号精灵碰撞测试
# z8 o8 A$ f: g" ]1 R - Sprite_Hit_Test
0 R( ~. |, W- S - / q$ ~+ J0 W2 m! O5 P- Y+ ^# E; O
- ;------------------------------- {. ~ s: x; E
- ;等待0号精灵碰撞状态取消# C+ d n0 q+ }
- LDA PPU_STATUS
G4 V: d, z2 Q5 U E7 o% D3 T+ _ - ASL A
0 N4 B3 c" d$ L8 p: j* \( g6 Z2 Y - BMI * - 4* _' s& d* T* P& P' w! a; z# ~- p
- : s% X' @% ~# l. {9 i% a
- ;------------------------------
+ n" y) r8 p$ ]# F) _. i6 j9 U - ;等待0号精灵碰撞发生" n/ }. M6 i+ D) d
- LDA PPU_STATUS. ]/ D1 p6 q0 \
- ASl A. I% x- Q: ?- e' U0 R2 V- m- K
- BPL * - 4. O' L* W0 ? V) _. r- W: e5 E
- 1 l" G6 k% y! D+ f$ x
- ;------------------------------. m% S+ f* \# d0 f: M+ P& Q, ?" p( L
- ;行消隐等待 d8 W( u) D# @0 c
- Sprite_Hit_Scroll_Wait/ M: p- v: J* x
- LDX #$286 J/ j3 D3 T7 H4 \7 F \
- DEX
9 k% ~# T! m! o2 _+ K - BNE * - 1# Z, I% R0 X& X: V7 H
-
2 d. `7 ]6 ` Z* o5 W6 V- |( c, q - LDA Sprite_0_Hit_Move_Direction
* N% t) ~, z4 o; | m! X - AND #$01
+ h3 V- g5 ]5 G9 P+ ]2 n' z - BNE Sprite_Hit_Scroll_Set_Right
4 X( [8 A4 L) Y1 V: I - % O9 {. K* Y4 d
- ;------------------------------0 v# w0 p" V% z$ W, H
- ;分割画面向左滚动- C% Z6 S9 T% E3 s3 L( b
- Sprite_Hit_Scroll_Set_Left
, _. g& R4 ~2 r+ |8 m/ v - LDA PPU_STATUS4 n% I2 M8 M' m) l
- LDA <PPU_Scroll_H8 @( E8 e) i* B" ^. x
- STA PPU_SCROLL# P5 O9 r5 Z# `4 J4 ~
- LDA #$00
2 B$ H0 P% |: t7 V - STA PPU_SCROLL
' Q/ n) K% F! S4 u/ \! O - RTS
* x- G# M7 Z4 B1 `1 e4 h5 i
K% ]! V4 ^+ s. Q. |( I K- ;------------------------------2 c2 c+ d; _# c6 B
- ;分割画面向右滚动
p, y& R8 s/ J - Sprite_Hit_Scroll_Set_Right
@& l/ R) F4 ] - LDA PPU_STATUS
7 ?+ V7 ^# H3 n1 S7 d - LDA #$008 N! y( h- p. ^. ?- `2 T6 g
- SEC
) z/ u* `* A9 W& o9 q - SBC <PPU_Scroll_H, r- M4 W r& b
- STA PPU_SCROLL
# ]( P- w- M. A6 g5 Q - LDA #$00
# A* a- J$ P7 q - STA PPU_SCROLL
|; V/ [" u0 E. l5 l - RTS
1 G" Y! {. C3 X/ G! J% r" u# `8 v
. U& S5 V( j" Y2 ~4 S( T- ;==================================================& v1 t w! v4 d, u
- ;IRQ中断处理4 ]& V$ y' f) a/ N. `6 c. Q
- IrqProgram# Z# ~' |( W5 x' w8 g
- PHA
$ A- o6 T& [$ f* j, ~& U - TXA
4 n. t% _; b+ c% P - PHA
* W3 T( b" L2 C$ O/ J2 I8 E - TYA# v/ {5 Z3 ~) j2 b
- PHA
: h5 h/ o' t$ H( a -
& _1 J1 Z2 j+ b5 J' y - ;关闭IRQ
" Z% L' ?) o$ i$ Q& q& G9 m - STA MMC3_IRQ_DISABLE8 B" }7 ]( I. k1 Y
-
8 S L' @" t+ E% N' f+ c/ t1 n - ;允许下个IRQ触发* m3 n; b! e5 ]: M ^3 e. J! C: \
- STA MMC3_IRQ_ENABLE8 g2 c. V) `" X" d6 z4 J
- & y! b+ W+ U/ o A0 M, E6 h, d
- ;IRQ处理, 15线后继续触发6 e: k/ @ h/ J/ R* @7 t- }
- LDA #15# G4 `" K9 |8 t# d! M( Q
- STA MMC3_IRQ_LATCH4 E% c1 x9 }3 S, B9 ]; o$ E
- 2 U2 O: a0 |* i
- LDA <IRQ_Index
/ t! N9 n6 p# p; B# e7 p - BNE * + 4
! @! G% ]: J0 Y/ w- \ - INC <PPU_Scroll_H
. f1 R0 a" C5 A$ ~) ? -
# C a+ S4 g+ ] c* K. i( ? - ;设置屏幕滚动
0 N9 j; l; G/ Y) I; | - LDA <IRQ_Index) m2 {+ h9 ^+ V* U
- AND #$01
) ] m8 K# S- j5 N# u% w) l - BEQ Irq_Scroll_Right
4 }$ ]" T5 n2 b5 F - * n6 ]' u: P7 H* S
- Irq_Scroll_Left
+ o/ o& _ P& j, v - BIT PPU_STATUS" }1 g+ f- s" G! B1 ~* W
- LDA <PPU_Scroll_H6 x8 v) d+ d1 }$ `
- STA PPU_SCROLL( }! O7 s% F# `. X7 U8 z
- STA PPU_SCROLL
6 A! u! q2 S/ M - JMP Irq_Scroll_Over
9 ~. S8 ~" {( a0 r' _2 j- M1 ] -
5 C/ O4 `* g$ e5 Y- M# y1 h) W( N - Irq_Scroll_Right
- C$ a* W% \* g2 W - SEC
: N" ?( R- C7 x) C3 r - SBC <PPU_Scroll_H
7 C* K- v6 V- ?8 }$ A! L - STA PPU_SCROLL
M! E* d2 j. X7 m- W" O, [# [( J - STA PPU_SCROLL7 g0 j: i4 R8 x- G7 B C* [
- Irq_Scroll_Over
+ \! `6 g2 t8 p [3 s4 K" v/ Z( l - $ Z- n& |' M3 ]7 T- u
- INC <IRQ_Index/ |# q' `+ i6 c, W( H
- 7 O/ ?3 j5 x3 Y% Y
- LDA <IRQ_Index
8 A* g4 x; U7 T u' p - CMP #14
0 ]' j) y; v, ~4 c; N7 E3 D* A. k - BCC * + 5( P! ]; X }3 ~& n
- ;关闭IRQ& i/ h7 W0 E0 ]5 s, x
- STA MMC3_IRQ_DISABLE
: \/ V H. H' T- J% z3 t) l -
9 c! Y9 ]3 x3 M) p. @. D - IrqProgramEnd
( Q# Z1 A# m" _ `4 y8 D - PLA
- R6 x6 X4 m* M, ]$ x - TAY. d+ T) b0 c( ~, f5 i5 ~0 J% S- R
- PLA: Q' x. b4 T6 p0 f) P
- TAX4 R$ d: N7 A! s8 C
- PLA, }' [# |5 U4 O6 @0 ~
- RTI
" E- j7 c. Z! b# ^ - & o6 ]2 @5 B* V6 B! y! `
- ;==================================================
7 s8 e+ V5 s. z! C; T1 \- m - ;中断表
F. Z, Y: ^/ Z- ] - .ORG $FFFA2 y P' s, Y U U2 ?( m
- .WORD NmiProgram/ b% v, p, V# X) }
- .WORD ResetProgram I" o- c, j# j# f4 a2 D
- .WORD IrqProgram
复制代码 $ H/ `0 W' C: j) w% f1 H
|
评分
-
1
查看全部评分
-
|