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