|
- ;[FC][MMC3 精灵碰撞]' G7 W7 ], t; D% a/ H
- ;FlameCyclone 20230710
$ C# L5 L* [0 E; B, f
( @6 b6 E7 g0 I" W% z* X# s1 y8 I- ;文件头
, I7 g" a. @; ^1 K& Y - ;======================================================================
0 H. e$ M+ x: J- b: Y - .INESPRG 4 ;16KB PRG 数量1 B3 ^; O1 H- P5 m* G5 x
- .INESCHR 1 ;8KB CHR 数量+ x+ `* g' B; V" n
- .INESMAP 4 ;mapper 4
& K0 B4 y. X( c9 O& k! k% v - .INESMIR 1 ;命名表镜像 0水平 1垂直
7 h: ?+ K" ~8 K# s- z2 _
) O. f. ^- p) h, f# d% w$ O% v- ;必要条件+ I# L/ t& f. x& V2 y
- ;1.持有CHR ROM( V! K' g" l9 d7 q3 x
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
) u. f% A2 u7 A - ;3.精灵内存(OAM)不为空: _. v7 }8 g2 ]! v M: L
9 ], F0 X/ o* ~- r- ;==================================================
6 Q+ q5 e1 _ y: R - ;NES端口常量' s% F7 ?3 u9 e/ h: N3 X7 T
- PPU_CTRL = $2000 ;PPU控制寄存器& k' L' G! m I! l
- PPU_MASK = $2001 ;PPU掩码寄存器
! `) m8 ?4 D1 d) s - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位3 o' y: M. z$ Q/ V3 [/ o7 y$ u: y4 S
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1' P! _# A, ^' g8 f* b
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1/ j0 J, y0 [' F8 [6 ^) I6 ]
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
2 c% f/ X) R1 P8 s5 ~ - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加. @% ?4 c, K; B9 M) R) O" R
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 p. F- d4 m3 G2 v! c9 N' u
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
& U# q% u: n: o& H - APU_STATUS = $4015 ;声音通道切换
( T! k/ W5 B3 |! s! g - JOY1_FRAME = $4016 ;手柄1 + 选通6 _5 V" A+ |4 S6 }
- JOY2_FRAME = $4017 ;手柄2 + 选通) ?# ]( p$ u! H$ N
4 I) P, N- N# Y% U6 v$ k- ;==================================================, I( V% {0 J1 S. Z, c
- ;MMC3端口常量
; \' Z! c. m4 L& x9 f - MMC3_BANK_CTRL = $8000
# O% z$ h2 |5 h$ F - MMC3_BANK_DATA = $8001# b) r3 f2 }- s: C2 w" M
- MMC3_MIRRORING = $A000
, g# u$ K$ \ z! p - MMC3_PRG_RAM_PROTECT = $A001
/ p. D1 T% b( O2 b, p - MMC3_IRQ_LATCH = $C000
; w( i' z! b- r: R6 o( [+ v" v - MMC3_IRQ_RELOAD = $C001
- A% i3 x2 H, ]2 S4 B6 d2 { P - MMC3_IRQ_DISABLE = $E000
1 m, P7 c" b& t - MMC3_IRQ_ENABLE = $E0013 |* ~9 _9 N6 _7 Z/ ^! A
2 y% a4 s" ?* }$ b! G* [7 W- ;==================================================
# W7 t0 _! g/ K! e$ ]% T - ;程序块配置
5 s. G& l: ^; a9 g5 |( _ - BANK_DATA_MASK = $079 Y- Z7 ^) E: O$ o( m
- ;--------------------------------------------------
( i5 y( q/ ]& Z) g - RESET_BANK = $07+ E5 ]- f7 [+ z% A9 V' R
- RESET_ADDR = $FC00' m: P; U, r. _& P
/ y$ a# [* u- r- m- ;==================================================5 c6 `8 Y) q" z3 R$ W! `& R- K- I, u
- ;图像块配置3 h- L' b& i0 {; e
- CHR_DATA_BANK = $08' T( a7 ~. F" e" P+ p0 i
: M b" r* F% G- ;==================================================' I+ A4 f7 h4 [* q' P! ~
- ;零页内存地址配置
. O# o6 Z, ^' L/ N8 T Y - Use_Ram_Addr = $804 C o( h8 Z$ Z4 y" {
- PPU_Ctrl_Buf = Use_Ram_Addr
# x. o! }% |7 |6 e1 e2 K* \5 D5 ^5 f O - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
% u9 q' G; C" a4 Z! r: q+ J - PPU_Scroll_H = PPU_Msak_Buf + $016 R- `# W3 |* z1 W" x
- PPU_Scroll_V = PPU_Scroll_H + $01( G) O* P8 g Y: x
- FC_Data_L = PPU_Scroll_V + $01
5 o6 M% K+ ?& s0 ~4 a - FC_Data_H = FC_Data_L + $01
9 N m( X% s0 H. H6 _7 t - FC_Data_Buf = FC_Data_H + $01( C, T' A; f R; O8 C" `1 N
- ;==================================================% ^9 ~9 `' v! ]+ j. D
2 Z' q1 b# S: q) Y. C- O- GAMEPAD_MERGE_FLAG = $04
' Z" M/ r; }$ Q6 A; w& a8 e - 9 c! `2 r E; h: C
- Gamepad_Keep = FC_Data_Buf + 1* x' {. @- c. d; y& f" ~$ f- Z
- Gamepad_Once = Gamepad_Keep + 2
7 P4 K; L3 _% c; m3 P& S - Gamepad_Temp = Gamepad_Once + 20 ^+ |9 a: c* m5 j+ x) P
- . Z9 ]9 R, {- j( Y
- Gamepad_0_State = Gamepad_Temp + 2
; ^1 ^0 v, B, y e. W - Gamepad_1_State = Gamepad_0_State + 18 A% E$ R/ y; N( V# t
- Gamepad_0_Value = Gamepad_1_State + 15 k5 Z& F& \/ v( ]
- Gamepad_1_Value = Gamepad_0_Value + 1
j9 F' I+ c) t+ }: W/ Q0 v5 ? - Gamepad_Port_Value = Gamepad_1_Value + 1$ ~& ?! S" t! A, L: H
- Gamepad_Merge = Gamepad_Port_Value + 1; V9 K7 @; E& U1 t1 z; l! k
+ i% ]- _' G+ J) p0 B- ;==================================================
7 i$ K9 H2 W, K7 { - IRQ_Index = Gamepad_Merge + $01
* e8 [( b/ y5 k, }8 G" q - Sprite_0_Y = IRQ_Index + $01. n/ }- }0 {' r* e" k( @9 @; S
- Sprite_0_Tile = Sprite_0_Y + $01
( C6 P' g7 D$ F" d' t - Sprite_0_Mode = Sprite_0_Tile + $01
/ o! i/ Z2 p) M% V8 Q7 K - Sprite_0_X = Sprite_0_Mode + $01
a) X1 }" C9 f7 N. I. Y; F - Sprite_0_Hit_Move_Direction = Sprite_0_X + $018 {" y/ l! `9 s8 s; p/ b' P# W
- ;==================================================
3 s# R8 }8 [; e+ N$ A* w/ W - % s* v1 U3 v+ r9 `) h$ m
- ;CHR图形数据
( p# ]/ `+ r3 a! {- b - ;==================================================
( d( [% u" _: Y: E* J3 ]) S - .BANK CHR_DATA_BANK
" p) b# y' G6 q$ b! S) ?1 U/ q- S - .INCBIN "chr_bank/chr_data.chr"
9 w% o$ l ~+ I$ x$ ~: ` - * T5 d% C" H( z$ u0 k9 v/ u
- .BANK RESET_BANK & BANK_DATA_MASK( M" x, t7 k: V2 E: f( o' C/ a
- .ORG RESET_ADDR; I( o" a$ p! j" a
- , y. b9 |- ?% b! J( A
- ;-------------------------------------------------- f1 d% j2 V4 C9 s
- Attributes_Data
2 c' k( t/ N* Q - ;命名表属性
) |9 R; _# a: }9 p J" Y - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00! [5 U; \7 f ?6 R) q' A
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA* I, E0 r' H' @+ G1 B! r3 p2 U
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
: c. g" _5 c' G+ z, I8 } - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
2 m( |9 ]6 R' b5 j) Q) M. N6 Y - ;--------------------------------------------------4 ^: p8 ~: B) A: e0 C
- ;调色板数据
$ P! p; x2 D2 u# r) q% a - Palette_Data
7 |# T& ?' u4 a8 g - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
, g; W- j+ h" B- y - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F, U" n* A* \+ u, J- T
- 8 s7 S0 B2 U8 `
- ;==================================================
8 t+ q! y2 ^2 F8 b Y. }% c - ;命名表初始化3 }9 ~; c! s- T- L
- Init_Name_Table
9 Y; c ]3 L7 U: S7 L; w2 } - LDA #$20# G/ N2 D% |: m% U7 n
- STA PPU_ADDRESS
$ T) I/ J+ ~6 w6 i' x4 f- W - LDA #$00
* {7 P) P5 f5 [' s# | - STA PPU_ADDRESS4 n) {, I0 J/ o2 u4 ^! @0 G
- LDA #$00
; s; \0 q8 B3 x' g* |4 J; S - LDY #$00( y. ]) D: d7 v( Y
- LDX #$10
# |( o, `. X8 ?+ I M p - Init_Name_Table_Write0 y: y2 p) j9 l1 P
- STA PPU_DATA( p" @* j# h5 q/ O; S
- INY/ y$ c$ T" p/ ?$ H( f4 H2 s4 K
- BNE Init_Name_Table_Write
' f3 ^, S! i( O2 u' I9 ?3 ^ - DEX& U" U& f; H- v4 N9 v, E8 d
- BNE Init_Name_Table_Write
/ @7 Q& d& y6 ]5 H: h! c! A - RTS& z" v9 s' Y6 V
- 5 i% c+ ]2 E3 K \- n" x
- ;==================================================
, r! A: Y4 W- v% [9 ^2 J X - ;调色板初始化
/ e( y8 P; H* a4 x3 J# h& t - Init_Palette t$ A$ o* k$ w' D
- BIT PPU_STATUS! p" e3 K3 v7 S, j5 q
- LDA #$3F+ \- X+ Y8 q& Y* Y/ G
- STA PPU_ADDRESS' E0 t7 W& t# i- ^6 L0 k1 E, v
- LDA #$001 i" _9 J. {% F; |1 G
- STA PPU_ADDRESS- Z' h9 Q, } y; G
- LDX #$00" J" S& S& \& i' O
- Init_Palette_Write. {8 |% z4 v# L# d1 X2 u( x
- LDA Palette_Data,X
5 y8 l1 Q9 B* v4 }! f - STA PPU_DATA
! T _5 a6 i) ~. A: p - INX
1 J1 ~( X+ U- M% b - CPX #$20
0 X6 T- ]. Q2 K - BCC Init_Palette_Write
, ~) b' |# o+ g) u - RTS
' L) W4 w, ?1 Q; O4 [ -
& `9 T) e- ~+ | - ;==================================================
9 Z8 y, ]/ b/ p) K" I, M* r - ;设置命名表属性
& z. `2 v5 R/ ?- C1 X - Init_NameTable_Attributes& b: ]/ T1 l2 T" o2 _$ Q) Q
- BIT PPU_STATUS; g9 G. I/ Q5 V4 _0 F
- LDA #$23. s s/ t5 U5 ~7 ?" h7 R
- STA PPU_ADDRESS
8 q) a3 i. \* N( Z2 }- g - LDA #$C0. c8 n+ `& r, Z- I3 J+ `
- STA PPU_ADDRESS
4 R; T- K K) p6 {: M( b& X - LDX #$00
) s J3 N/ J' L, q - Init_NameTable_Attributes_Write
4 C9 I1 C4 B& d' h9 \ - LDA Attributes_Data,X
( {3 ~; y! r+ N" n6 O; | - STA PPU_DATA2 t! g& G' K7 c1 C
- INX
& a2 \8 a/ K7 U9 p' y' A) } - CPX #$40
1 I# o& D; e' h - BCC Init_NameTable_Attributes_Write
2 @' R! ^# J0 j8 a8 U6 {' \/ H - RTS
- {( o2 R. C8 k2 |9 u0 ?+ \
0 E, d* b3 j5 n, P1 V: p* A- ;==================================================6 V' ]* R8 `% Y" k+ D# O, v' K: K
- ;初始化命名表文本
% M( Z- E+ P4 f9 U' a - Init_Name_Table_Text8 K& x/ K9 P+ I
- BIT PPU_STATUS
* j- L+ r* {& s0 i+ @$ c# { - LDA #$20
* D1 A$ P3 l% i: a4 F+ U2 z - STA PPU_ADDRESS
/ A1 c9 `' K6 H2 t/ l - LDA #$00( V9 r: ]4 g3 j' T/ Z
- STA PPU_ADDRESS
2 X2 _( r3 z W7 e - LDA #$00
- D$ b; e3 d6 n F. b6 n - STA FC_Data_Buf5 w8 K5 o' L- N/ J {$ Y
- LDY #30$ S/ i% n* w; g- _- O' l+ ?1 P
- Init_Name_Table_Text_Write
' J- p2 ~5 d+ [5 k" J3 s - LDX #32
' B/ c/ J G4 f+ [8 w - Init_Name_Table_Text_Write_Char
9 d5 @" ]" l( J P7 y/ A8 t - LDA #'0'. U7 h2 E6 W z
- CLC
/ v6 k% D( {! F' H& k% p+ V6 l: r - ADC FC_Data_Buf: o: h$ @) @1 ]/ N9 F
- STA PPU_DATA
8 _5 U+ {+ X" n7 @% E8 B e - DEX
$ Y% Z$ x ^$ Y! e8 M* P - LDA #$14
% y7 m5 r' ?% K6 h/ M - STA PPU_DATA2 v7 G! c( B3 Y; f) _; T# |/ m
- DEX
9 T* G$ ~) v& r! R" a5 s! C' d - BNE Init_Name_Table_Text_Write_Char
; V3 M7 w5 l- l1 f5 d. g2 H - INC FC_Data_Buf
) d( a' n1 G/ s5 I - DEY
/ l- X4 \3 ?3 n! I" |0 [5 R - BNE Init_Name_Table_Text_Write
, k' j, A4 f: Q# f0 j - RTS, y, a0 }. A u3 T+ E
- 6 J( `* q9 M; M9 [, b6 ]* f, Y! T
- ;==============================
* M/ w3 q% W) V5 y% K - Init_OAM_Ram;初始化精灵内存
: [8 K& J( R" K- Y F4 F - LDX #$00
5 h1 p, m2 W7 M+ @* C' Y8 P - LDA #$00. ~- Q% I, c8 N S5 Q+ ?4 ~) p! @
- STA PPU_OAM_ADDR H' j# ^& E- ~, i+ g/ _
- LDA #$F81 Z7 N' z0 m3 Y# l! V
- Init_OAM_Ram_Write- L3 M) X8 g) b+ I( t7 K
- STA PPU_OAM_DATA
$ C+ h: [7 a' l1 `! l" S - INX
+ B6 a; k8 `/ y/ ` - BNE Init_OAM_Ram_Write
0 f0 D) ~- c/ z b/ ~' V - RTS
' U1 ]; H8 K+ E6 i9 v& J - $ P4 \) _0 }: }' n9 I2 M8 |9 }) j
- GamepadProcess;手柄处理
* T. ^. Y/ m* C0 k - JSR GamepadDatacan
) m3 W8 h- Y" l0 G - LDA <Gamepad_0_Value
+ p% `2 b, a& t1 N3 V" o - STA <Gamepad_0_State
& D; f7 k! |2 B$ t; K$ d% G2 L) d" s, B - LDA <Gamepad_1_Value
9 q8 _, h, I" c8 v - STA <Gamepad_1_State. r6 U2 [& o: ~
- JSR GamepadDatacan
/ Y7 U5 T2 X1 N' @- G - LDX #$01" i" F. f: k% f& `1 d+ _% K
- GamepadMergeCheck;合并手柄输入检查: p" {! \" q0 \
- LDA <Gamepad_0_Value,X0 b% {6 h# _- `. }% `9 d( y- P( X' o2 F
- CMP <Gamepad_0_State,X+ v3 Z1 m: T3 Z8 w7 a$ ~5 a+ l
- BEQ GamepadMergeInput! {6 }% F0 Q, q4 h0 L4 W5 J# G }# j
- LDA <Gamepad_Temp,X9 H+ I8 E% _ |
- STA <Gamepad_0_Value,X7 p* @+ J' r2 E1 e, k
- GamepadMergeInput;合并手柄输入
1 J# t* a$ ^- O# X* }2 | - DEX8 N/ n# P4 L% q& X* n
- BPL GamepadMergeCheck; }3 t' |" i1 d: D" c9 U4 N
- LDA <Gamepad_Merge
4 U* F2 V* W, s1 C: Z B - AND #GAMEPAD_MERGE_FLAG
$ b V( `0 T* h7 O - BNE GamepadStateProcess
, |2 k. D; b5 @( t6 E; P# | - LDA <Gamepad_0_Value
3 q5 R. b E, s' a: z; t! ~ - ORA <Gamepad_1_Value. t) _( M9 \% {3 n" g1 w0 z) z
- STA <Gamepad_0_Value
) k4 e' n" x, X2 \5 q - GamepadStateProcess;手柄状态处理. G u) g4 i0 @3 A
- LDX #$01
6 D. F3 O+ _" j4 H$ T$ p+ g - GamepadStateSave;手柄状态保存; s! I- W8 c1 V8 [& V; D
- LDA <Gamepad_0_Value,X# f, C B; }" S' P( Q u9 p6 O
- TAY9 H/ G- `8 w3 R
- EOR <Gamepad_Temp,X: x) p8 @7 m! U
- AND <Gamepad_0_Value,X$ J. X! E( Y7 w: e
- STA <Gamepad_Once,X
2 V9 H$ k7 r8 Q" i - STY <Gamepad_Keep,X
, x% n3 t, @% C, k - STY <Gamepad_Temp,X
* ?2 w- q* j$ Y5 N. V - DEX5 H- W* K% F5 W! b4 x7 x- ]
- BPL GamepadStateSave1 Q j- m; L7 ]2 K
- RTS
: n ~5 J0 r5 {" v6 I8 p - 1 U; j3 Z- `2 J& R
- GamepadDatacan;手柄数据扫描
8 p6 @1 X4 j* `7 V3 r4 M - LDX #$01
6 v, W5 J6 a9 F& w7 r - STX $40162 V1 j2 b: B* p
- DEX
* V1 M7 j7 y) i- Z6 J8 P8 P - STX $4016
k8 B) V" F/ i7 J0 {$ Z. O - LDY #$08
- g. I' a: c$ l$ d; s - GamepadPortScan;手柄端口扫描. r z, v5 C7 Y) [
- LDA $4016# m% N: x, w; Y8 M0 T7 v2 s
- STA <Gamepad_Port_Value! k) l# k* s3 p4 q
- LSR A! D8 @( \+ B/ l& X) ^
- ORA <Gamepad_Port_Value! v$ _/ U: W* P
- LSR A" Q+ }% _4 }+ W! e9 i q( h( B
- ROL <Gamepad_0_Value
2 C% O3 n, t/ Q% h. b4 k6 x - LDA $40178 `( d. u# G$ g3 q! q
- STA <Gamepad_Port_Value
- x; S# |! b$ @8 s - LSR A6 u" B$ n. S, v( N0 \3 b
- ORA <Gamepad_Port_Value6 d* I/ m* R, u) L# ^
- LSR A! i9 ~; D' V) _ O+ B
- ROL <Gamepad_1_Value
Z0 Q J5 t* r9 B/ T9 H7 F& {0 I - DEY& T" S* J3 D" d
- BNE GamepadPortScan
: J) j: G* b1 h% O - RTS% C b: ^' j* R v
-
! v. }4 D4 l6 u& g: E - ;==================================================
) z6 t; S6 A0 R6 G$ o5 r, k+ w - ;PPU处理& P1 V* u. C% b, X2 {* s4 g
- PPU_Process
9 k" o: b- a0 h. w2 b2 z' d - LDA #$00
5 n) x6 A7 |3 O+ e# u - STA PPU_MASK
2 m' ^5 N1 G \; {# |& z( c" k -
2 |& R+ d+ g9 [ - BIT PPU_STATUS
3 _- o5 i0 T8 e/ ~4 D$ @ - LDA #$203 q* N0 n- g- A0 d
- STA PPU_ADDRESS
r" i& w3 Z/ c# y$ i - LDA #$00
8 u7 T; A/ k v+ ?$ J3 q- @6 S- K. b - STA PPU_ADDRESS8 ]5 R+ ~# K. U3 X8 M8 x0 ^
- % z% m6 c1 R) P
- STA PPU_SCROLL; o2 k! @# @. q) }8 r% O& M7 `- ^3 b" N
- STA PPU_SCROLL6 Z' p8 R2 L' a& y' A6 [
- 3 X4 h4 ]- M5 q7 R: w6 M
- LDA PPU_Msak_Buf
' e- q1 i2 U) {& K8 L5 q - STA PPU_MASK ^* x9 Z/ Q7 H3 e/ C2 s7 N+ W( \
- ' W! @: ?' z% f* O1 U5 {
- RTS- a: f# h5 a' A5 h
-
9 Z! \+ F4 q+ ~; S- ]. d1 i) S - ;==============================
% b* t$ ]% a# W0 w; Z* c5 \/ o. U - Time_For_Vblank;延时等待
1 |4 c' j: x" m& \, L' t - LDA PPU_STATUS5 J, F& {& j8 q
- BPL Time_For_Vblank
% t' R. k# u2 m" A" N2 ]& x - RTS
5 n# ^7 H5 i* a- c* c1 s7 o/ E -
. w% k1 M: }7 ^9 K3 ?! A$ l - ;==================================================
5 i2 r* R# H9 Y/ w L [! a" V - ;初始化MMC3# {5 b X* \/ ~) T$ s
- Init_MMC3: W1 G. V% H2 R# s) a
- STA MMC3_IRQ_DISABLE# w* ^/ ]6 x9 b8 r$ P
- 4 g0 ^- m$ ]/ K" z; x
- ;设置MMC3水平镜像1 d2 l5 z9 L |% h
- LDA #$01: M; j* N1 Y1 ^6 q
- STA MMC3_MIRRORING8 @ y& E A! m! l8 w
-
2 b: w# K, B0 S0 R - LDX #$05; H, ^$ F/ x- d3 i
- Init_MMC3_Chr_Bank_Write# p: p% ^ ]8 I; l7 W$ L
- STX MMC3_BANK_CTRL
& k1 X: T7 |- d - LDA MMC3_Chr_Bank_Data,X
m( L$ R/ J2 \) X, K, ^& n - STA MMC3_BANK_DATA
2 w7 g6 D! Q5 P2 r5 ~3 X; Q - DEX% o9 E) N! G* I: I9 Z4 v7 _) A
- BPL Init_MMC3_Chr_Bank_Write4 @3 z& H1 x; F: I
- RTS# r: U( M7 N( A2 p+ f. |- Z0 m1 [+ e
- ;--------------------------------------------------
3 z" j6 x( T) Q4 t6 H' E( I& S - MMC3_Chr_Bank_Data3 M; Q- i5 R" S1 K; d- V
- .DB $00,$02,$04,$05,$06,$07 L! X7 H+ ^# X3 i8 Q- U- M# O
& l% v% |6 S7 B1 f- @- ;==================================================( i, W5 L, R9 l& D- i0 ^" O
- ;重置中断处理
7 E& m8 C% E% k, ], F - ResetProgram2 s% K3 M7 M5 O5 |, X; N
- SEI3 c5 U8 D6 G7 f5 L
- CLD
! O! e9 j3 z' v1 C7 |4 P4 q- L - LDA #$00. n: \3 j4 r% f* ^' W/ V- p
- STA PPU_CTRL
" a. t: a2 R' w3 S - STA PPU_MASK/ Y B$ T2 O/ O. n2 Y* R3 p/ ~
- STA PPU_STATUS4 x6 [; K0 j1 |9 D
- STA JOY2_FRAME
" L3 R+ G" y4 P( M! D+ g5 Z' H - STA APU_STATUS- S$ }" d) H) h) j3 Y' A
-
6 F+ }8 E8 v. z( M8 s- G) e% e - LDA #$C0& Z, F1 w8 c5 j* P7 H1 ]9 t0 O$ _& e
- STA JOY2_FRAME
$ V1 [) O7 i# h6 H' n -
7 N( \ e+ {5 L! f - ;等待vblank
P8 O- u* V3 X( f: b9 N/ w& B- @% P$ B - LDX #$02
4 G4 B f- ^3 q+ S- }; R* g - Vblank_Wait_1 ]0 Q$ u7 G0 H( a; m! q; }
- BIT PPU_STATUS
& G" x, P- @: ]1 }( p( N - BPL Vblank_Wait_1
6 x1 o, p7 M! N1 A - Vblank_Wait_2% v8 J/ j3 ^, @ N! S0 _
- BIT PPU_STATUS
2 q. L$ U+ Q+ p5 j: j s7 { - BMI Vblank_Wait_2
5 v8 {5 x3 O6 U. w - DEX N% E6 @* G( ?8 b! V% S; Y9 c
- BNE Vblank_Wait_1
' R8 K% q0 r6 q- L4 \8 }3 \ - ; G0 d. E; k# G) s6 U& I
- LDX #$FF1 S/ h8 D" m; c/ x% x
- TXS) |! V* d- I F0 M+ `2 X
-
% G+ f2 ]' @% Q S2 L% a - ;初始化MMC33 e4 }- E* p" g( E* Z
- JSR Init_MMC3 |, U/ l& e+ a/ E( Y1 v
-
% k! L' h9 _: Y - ;==============================8 N2 I6 P1 m* j( G
- ;RAM初始化( |; w- [; d4 a/ n5 _
- Nes_Ram_Init
- E( ^9 l& d: g8 y# {0 K' X - LDY #$00
: z( M/ R# f# z& g3 F6 _ - LDX #$08
, B; k( v9 t) H! @ - LDA #$004 I$ [# b" }% A6 E# y
- STA <$00+ u/ J* c1 c6 T A
- STA <$01
* d7 S6 g4 I' f9 g& G - Nes_Ram_Init_Write$ ]* Q& {0 v+ W' k' i. P6 _ t, p3 J9 l
- STA [$00],Y
+ ^0 _6 ?+ A2 J: N9 y; H - INY1 Y& X; p5 Y1 F$ f9 K
- BNE Nes_Ram_Init_Write) a5 R/ ]% C; w4 R3 ~& M
- INC <$01
$ K; p4 W+ p8 R# E/ r( F2 J - DEX
8 Y" k: u: T4 U" h( z) u# B - BNE Nes_Ram_Init_Write2 f' W* L9 g" F: E, q% K
-
; R+ b2 ~4 z& t. R - ;初始化命名表
- Y) m2 P& C) V) d; ~8 w - JSR Init_Name_Table$ z0 q0 @% P. {8 p
-
: _4 h( |; D9 L, Z( p# D4 o( V1 M - ;初始化调色板
7 f m$ y0 w, x: B4 a# i$ ~) P8 h - JSR Init_Palette; s5 K' b4 A4 P
-
. y) r8 b' z9 O1 Y+ ] - ;初始化命名表属性9 U3 u# o' |7 G3 @8 W5 c0 P
- JSR Init_NameTable_Attributes2 q: d" a5 O( x) M0 C9 [
- * f5 U0 h# y9 v* R
- ;初始化精灵内存
# @6 l; ^9 R9 X. @) ~9 O - JSR Init_OAM_Ram4 ?3 u! f+ s3 S9 \- p3 f+ L$ e
-
2 [; H' e9 W& c' |7 w3 U$ w6 D1 D - ;在屏幕上写点东西
# {% |0 B% `2 q. u/ M1 t1 w - JSR Init_Name_Table_Text% Z K! `1 y+ C' c& c3 a
-
) b4 d! c! S% d5 s4 ` - JSR Time_For_Vblank9 k; X/ _7 h2 I
- ;开启PPU控制
/ c8 m1 y8 x- R, W9 ~& L - LDA #$809 W) P6 e) I8 K6 g5 U( x
- STA PPU_Ctrl_Buf
; N' b8 D2 ?5 Y* D - STA PPU_CTRL
* h( t. m7 Z. B, p7 {/ i! g9 T2 b# Q - ( F8 \* S& h- ~" z# P
- ;开启PPU显示
4 s, s# l1 S( Z& s# r- Z - LDA #$1E
. V5 _# p: _" }" G" B - STA PPU_Msak_Buf
' c6 N3 B0 p* v9 g) M -
$ J( w# {! l- t4 L - LDA #77
w, ]6 q4 |4 C# Y; \ - STA Sprite_0_Y
( z( B1 w3 e& q6 e - LDA #$1E
0 N' o2 }, f5 t" t; p: f - STA Sprite_0_Tile
3 A5 m/ E/ E5 `; ?' N7 p1 {4 c - LDA #$20- z `7 i* S9 t1 [# |' O
- STA Sprite_0_Mode
: F- A! x- o, u+ a' U% H; Z; h - LDA #$00
g& I, M1 _! c - STA Sprite_0_X. ]8 `% w5 X _* L. I3 l9 T. c
- ! j* d' N" C% J8 s
- CLI
/ o+ F1 W3 d# e$ \8 I - JMP Loop
0 I' N' _; I) ~9 G" Y5 O; a& k' N - 6 v! E. {0 h3 T$ G
- ;==============================6 C) o( H4 x4 t) b
- ;死循环, 等待NMI中断
2 s6 L4 v- H4 s - Loop
j# c. O6 F+ V8 C4 U' I, } - JMP Loop/ Y0 d% g: l; T! n
- 9 q# v; a3 G- n
- ;==================================================4 I) J* [3 |0 P5 P5 D+ |
- ;NMI中断处理& k) [$ a4 u+ A6 `
- NmiProgram
- K0 b' X1 q+ M/ P* L - PHA* |: k! K9 i# G/ p H+ H+ i4 L
- TXA7 K; |8 q9 n$ O4 I' \) k( d
- PHA
' q' {) Q4 t$ |: y1 z - TYA& v8 C+ L" g( f3 G
- PHA; i. I& E# M9 m- v
-
: Q" e' ^. o% u, y. n9 s - BIT PPU_STATUS
' j: ]% [% r5 d# U1 H) q - 9 c: v8 V7 i: ^! a3 M
- ;关闭PPU控制3 d; Z) z* H5 U9 Y3 z0 X/ U
- LDA #$00
; F, B0 D; ^: q& |0 k0 C - STA PPU_CTRL
; O W1 g- P5 T( u" p - $ R0 b# p% i! `9 X8 {+ |$ @
- ;处理PPU
. `0 a! ^$ A; Z7 ^- E - JSR PPU_Process
/ z) B0 _4 \& b! o/ }( l- \" L - ( G) H) n% C g5 X
- LDA #$002 F, f1 O$ `. E5 ?$ i
- STA PPU_OAM_ADDR
/ ^: Q9 c' X2 A* u8 x - LDA <Sprite_0_Y- B- T+ ~) F/ Y7 Y/ _3 O1 x5 B5 n
- STA PPU_OAM_DATA
: D! j# ~7 ]! i - LDA <Sprite_0_Tile5 _* r `/ G T. Q0 g
- STA PPU_OAM_DATA& G; h3 x8 q, y" }
- LDA <Sprite_0_Mode* f: ^' p9 n+ e; E, t# W0 U
- STA PPU_OAM_DATA
; V' J# R7 K1 d% O - LDA <Sprite_0_X
4 \. l5 k& u9 S/ I- x - STA PPU_OAM_DATA1 \1 z& u! x0 y& }! x
- . m# ?- q+ j5 f5 }% r
- ;开启PPU控制: u2 `& y' I) j( X
- LDA PPU_Ctrl_Buf) r+ h- H* w- `4 \
- STA PPU_CTRL2 H; N) ?8 B8 o6 t. j% l3 b& ^
-
{5 D, ~4 c& X - ;屏幕滚动
, s! K. T% m" M4 Q; W& i/ O - LDA <PPU_Scroll_H
0 V$ s: N6 ?) T8 p/ g - STA PPU_SCROLL) p/ u, {1 ?) n( l
- LDA #$00
! R$ v% Q6 x- a! J - STA PPU_SCROLL4 Y' ~$ o* U5 I
- 3 q; g, E. J1 L) B
- ;手柄处理4 ]3 ` v$ Z2 o- |9 M& s( v, l
- JSR GamepadProcess
2 H$ H" I3 n8 c -
; m1 ^+ o( W3 C. w9 v - INC <PPU_Scroll_H4 `6 [4 j' ^6 M. K" U6 @
-
6 Y8 \" b$ L: G! ?9 k8 p3 p3 o: t - ;启动0号精灵碰撞检测
% r- _7 S/ F( { s4 Q) t; S - LDA #$01
6 K: ?6 V* j% s* ^7 k/ N' r - STA Sprite_0_Hit_Move_Direction
4 }# t% K8 ?5 x$ `- h; j; ] - JSR Sprite_Hit_Test% p0 a6 N0 m. }0 f) ] W
-
* H4 L8 f q0 t0 Z8 ^ - PLA8 } G( f+ b3 j# t& K
- TAY
: b& q/ G0 n* C. m5 @: u - PLA( X7 ~% K% Y+ N) K G
- TAX) S! R4 q- R" h! }
- PLA
/ j' b+ L7 |7 k2 w: Q - RTI! @* o) G3 C, C1 _5 W( K9 ]
- , f% Q% H+ b% L, [0 R+ x' @; E
- ;==============================4 Q( Y9 c) }3 p$ \' J% X
- ;0号精灵碰撞测试
' J3 G* ^6 w6 `% Z! p+ l - Sprite_Hit_Test
6 I2 K4 j o9 s6 T% I
$ b4 O+ g, |" _7 X( {# W/ ~; m- ;------------------------------/ y F) {. S" U7 t
- ;等待0号精灵碰撞状态取消# g( X* M( t9 V0 |: P8 P
- LDA PPU_STATUS1 S" t4 ]3 ~$ |" }
- ASL A/ d; J Q" n. k+ T
- BMI * - 4# k; C% u9 |+ `$ X' i
- + N, ~' }% z) Z: f8 i
- ;------------------------------
! Z2 y5 s( u9 a- I5 t - ;等待0号精灵碰撞发生 k5 b& P& d& ~6 ?' v
- LDA PPU_STATUS
6 L1 h/ f9 E9 z7 t( R3 U! T0 w - ASl A
Q$ {8 }9 l' b) `9 T( p - BPL * - 4% k/ i7 o1 e/ c& c, o6 ] @
- 6 Z1 c; r- G" w
- ;------------------------------" j& w$ X& b( E; a `& z
- ;行消隐等待
+ f( h$ }4 R3 ] - Sprite_Hit_Scroll_Wait
- u- ^1 \0 V6 t8 u& z# q1 X - LDX #$28
6 n% `: b8 w( e* ]$ a. X; [ |- i! x - DEX
9 y! q8 G6 U4 r% V - BNE * - 12 w$ @8 k* Z u1 k) h0 v- Y7 [3 [
-
9 B: P/ L/ l9 B! w4 b - LDA Sprite_0_Hit_Move_Direction
3 b# O! w1 Q6 E* Z3 t - AND #$011 A9 G, C. }* c; Q+ I
- BNE Sprite_Hit_Scroll_Set_Right
- H, E2 T7 n% G2 m
) g$ L. `5 ^: n0 W- ;------------------------------+ I6 {" n& @0 h# i
- ;分割画面向左滚动" l. L6 i5 l) |" ]: s
- Sprite_Hit_Scroll_Set_Left# t- q2 z9 \' l9 L
- LDA PPU_STATUS
/ V9 F! v; V* M - LDA <PPU_Scroll_H- f9 H, [+ f# _- V
- STA PPU_SCROLL7 j& S+ c j7 m! w( M
- LDA #$00
2 h4 B" e& Y, _2 r - STA PPU_SCROLL& I% t; @/ g2 C
- RTS+ g8 T$ T, l' U. N$ K
- . q$ j, b0 h% w# Y4 c
- ;------------------------------
2 k3 d# X7 L3 G9 ?9 X- M - ;分割画面向右滚动' E! U: ~ ?& [& H4 d6 ]
- Sprite_Hit_Scroll_Set_Right. [, a& r5 T3 Q! {3 z
- LDA PPU_STATUS
" W$ z. y& q" C1 F - LDA #$00' J. X8 v' q4 E4 E/ j; f6 Z
- SEC
. H. D2 Z E5 w7 @0 O+ U9 I - SBC <PPU_Scroll_H
9 \7 i* X: _0 `3 m1 G+ r8 y& X+ ]; q - STA PPU_SCROLL
0 ~- g7 w# F8 t* o* J/ q+ U4 n - LDA #$007 w: J) _* E3 x3 R/ q6 O
- STA PPU_SCROLL
& M! x) p+ r$ i3 W/ l7 {. z - RTS
2 Y- a. o" U4 E2 j - 8 H; ]9 n, _) m. {
- ;==================================================
; _( J$ H+ b4 d4 i' e c' f$ t" ` - ;IRQ中断处理
" L: @5 D6 C, x; \; m% w - IrqProgram
. V; z S+ L0 t9 ^& K- k3 P - PHA `! f/ x% ^; a- @* |$ W
- TXA8 _$ H' b0 K4 X' m& b4 o
- PHA1 Y) Y! G. m% _% H
- TYA0 u: [( A1 B$ E$ o; k8 Q& I
- PHA
7 m8 M& x$ C+ v' y+ [7 D2 e - 7 d i& {" Q* V8 A/ o8 k
- ;关闭IRQ! s+ d1 C7 m1 f9 T( g& b
- STA MMC3_IRQ_DISABLE
5 H+ I9 I9 \$ T) E( N0 ]/ i - # C3 }8 m; |6 y7 l7 p# R) }- E n
- ;允许下个IRQ触发
8 f+ ~8 w7 F c- p - STA MMC3_IRQ_ENABLE8 ^" ^ I; e+ O
-
$ p% I4 {2 N7 P+ ]5 h1 E - ;IRQ处理, 15线后继续触发
3 t- T! G$ {' A8 o- q" z - LDA #15/ V+ c" x# X! h4 u3 J3 k( w
- STA MMC3_IRQ_LATCH
7 I9 Z$ F: i8 w* e9 D2 X: m - 4 p4 W! W& S& U' }
- LDA <IRQ_Index" }: V$ L/ N3 n# n/ {0 _
- BNE * + 4 |0 L0 P* r' @0 O6 o
- INC <PPU_Scroll_H. U& j. j: d9 v% E3 G9 M; l% r1 ^! {" ?
- 6 e; m6 Q. _* f/ [& s) ~, P, m& W
- ;设置屏幕滚动, b% _' I1 \5 f- k' i5 I
- LDA <IRQ_Index. p+ Y6 a; J8 d9 [9 Z+ m# k, e
- AND #$01
% j" m" {( F2 C* s: G/ O - BEQ Irq_Scroll_Right# ~8 O* ~3 T4 R. ^- j9 \6 ]8 _
- Q' M, z; g; m! W- Irq_Scroll_Left0 N. |, s+ ]; c) w0 l+ U+ Z
- BIT PPU_STATUS
5 V k7 \ }, f" P - LDA <PPU_Scroll_H
( s4 I2 T# V4 s/ f) \- e - STA PPU_SCROLL; W( T* N+ X4 L* v5 F9 x& o5 D
- STA PPU_SCROLL
0 r8 T4 q7 z: q( I! @% S( P9 T - JMP Irq_Scroll_Over
4 B: b" W5 b' f1 B# i9 M -
3 a/ O6 y3 n9 X( G/ V - Irq_Scroll_Right
5 s/ J4 B/ g( ?* Z% Z! Y: Y - SEC
3 p6 U: p" {/ \# ]1 x - SBC <PPU_Scroll_H
9 Z" ~& i& T5 n$ f9 l - STA PPU_SCROLL
* u. t' O: D( h: f# [* K - STA PPU_SCROLL8 i+ t# T, V5 W X' \
- Irq_Scroll_Over% T' c$ X2 h2 `
- 8 ]. ~3 P* ~- N7 ?( j, x3 _
- INC <IRQ_Index
6 D+ E# h3 q. q* J9 k -
8 N, ?. w- q8 B( r' V0 }' t - LDA <IRQ_Index
. E" l/ L5 L) ]0 Z3 D1 e - CMP #14
" ^8 Y3 U3 e! V! k! ?- o n) o. B - BCC * + 5 w8 g8 P" a6 }/ w& y3 n
- ;关闭IRQ& v X* ^5 S: Q' \4 i* C, Y5 }
- STA MMC3_IRQ_DISABLE8 i4 E/ K$ k2 A: h, s
-
2 Q7 Z2 t: Y" y& ^( D9 d! B: [ - IrqProgramEnd
: G/ R5 @2 p( _5 h+ Y - PLA
' a/ l) V& g* P+ ?$ z0 H1 X# p - TAY1 S+ R# E4 z: p% S7 T# r
- PLA
9 |/ X! _0 C2 @0 _# \- M3 e( e2 r - TAX; }) H% h9 T/ d0 N! c/ G
- PLA
& e: E3 e; Z% w+ \+ u, o. ^8 [ - RTI: s ^4 j. o7 f6 B, Y. a L
-
6 ]$ b% E7 F1 W. v9 H% i - ;==================================================: o& B; a! v5 H
- ;中断表, T- X( _* H9 U# s: Z* t4 s
- .ORG $FFFA
- R' G2 y& s9 D/ b$ { - .WORD NmiProgram8 U( B7 r5 {9 b' I$ z& ^ w+ y' l) }
- .WORD ResetProgram$ ~6 S% u" \/ i7 R5 {- n
- .WORD IrqProgram
复制代码
/ k5 E8 h# U# T% I$ X0 t3 h |
评分
-
1
查看全部评分
-
|