|
- [code];[FC音乐][MMC3 IRQ]$ e2 z" q8 T& c0 W! w
- ;FlameCyclone 20230710! |/ o9 ~9 c* k8 n# f1 @( v
- - r9 Y j" K9 y9 i
- ;文件头
' U- W8 e" G: g - ;======================================================================
9 a& ]0 s+ |4 ^! l$ U - .INESPRG 4 ;16KB PRG 数量* T0 J) z: J2 _& N
- .INESCHR 1 ;8KB CHR 数量
+ |. Q8 M8 U7 k: T5 I - .INESMAP 4 ;mapper 4
, ~. u% u" O8 r+ c8 t - .INESMIR 1 ;命名表镜像 0水平 1垂直
' S' S: {# K1 y5 g$ T
, Q7 {6 p6 o3 I T V" A% h- ;必要条件1 T Y* p5 z9 A; T g% g! I& ~
- ;1.持有CHR ROM
O! Q6 l' m' R) V2 U8 R - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
! r3 i# f% Q+ B! } W - ;3.精灵内存(OAM)不为空" s- O" |; ^) p% H: U
9 z" K) @& Z, B7 F9 z# {3 S5 S- ;==================================================9 t, w1 B3 N$ C- i5 H x" B
- ;NES端口常量
; i8 J6 t4 z0 F* y' o - PPU_CTRL = $2000 ;PPU控制寄存器
2 V2 O3 c+ v$ Z& }; F: ~) r - PPU_MASK = $2001 ;PPU掩码寄存器
" K% v. U! Q! V - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
, h/ m9 r- p8 V' D; ] - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加19 m3 b7 f: a/ Z4 O
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加12 {. B" _5 e0 @3 k" Q4 b8 ^0 ~+ Q- W
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
) \0 b3 `9 V" p - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
% N `( G7 A" o+ X) C" j }7 s - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 / x& h, }: l/ }9 r. u1 }: Z
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存* ^& W8 V$ S- P; g W
- APU_STATUS = $4015 ;声音通道切换
; M3 K; S+ R( B8 t. O$ O1 C( r - JOY1_FRAME = $4016 ;手柄1 + 选通. v+ r6 Q, n7 g8 U$ S$ D
- JOY2_FRAME = $4017 ;手柄2 + 选通
1 x5 T# y8 e2 [
& U6 e8 A8 x# S- ;==================================================
. N8 e4 j! `$ M% ?" x3 P9 Q. y - ;MMC3端口常量$ I% i d4 K8 j# ^5 Q% O9 A
- MMC3_BANK_CTRL = $8000, x; B# q( D0 y) J/ l8 I7 D+ {
- MMC3_BANK_DATA = $8001$ w3 Z0 \& w; K
- MMC3_MIRRORING = $A000
5 T" X. c3 ]" f/ I - MMC3_PRG_RAM_PROTECT = $A001
* ]) f; g B8 ?* x3 F - MMC3_IRQ_LATCH = $C000
+ g+ U d: n9 d% m* ~ - MMC3_IRQ_RELOAD = $C0018 V( L* O6 x$ {/ W6 L, F
- MMC3_IRQ_DISABLE = $E000 V1 D) b7 C# ^/ Q+ }: b2 }% J
- MMC3_IRQ_ENABLE = $E001
5 E1 C5 w+ a; u- f/ \
8 X# G: i2 r+ J5 ?* X, Z* f) K- ;==================================================9 [) _, C$ c& L" j. s
- ;程序块配置6 O# I$ W: a! }7 p
- BANK_DATA_MASK = $07$ L5 N) [3 t8 [$ |: G1 m! n; @
- ;--------------------------------------------------
7 o# |" g2 V; w b) k; V - RESET_BANK = $079 t+ B9 u; ]0 `3 V
- RESET_ADDR = $FC00
7 ~4 L+ L7 V( A2 T* Y; x W
7 ?- ^" ~0 `. M* T- ;==================================================! A) }: m& c) d; p7 o% t
- ;图像块配置+ a5 ?+ h) w6 Z/ J& G, G
- CHR_DATA_BANK = $082 H1 {0 {+ D, N* }7 X9 b
; a/ |1 M1 r$ c/ K- ;==================================================% |' j, c$ F8 ~9 u# I; I, R* I
- ;零页内存地址配置
7 w# U; F4 e' H - Use_Ram_Addr = $80( h( r% U D# ^
- PPU_Ctrl_Buf = Use_Ram_Addr
" J* ^1 {0 w; n: C; o - PPU_Msak_Buf = PPU_Ctrl_Buf + $01. W T+ P- B4 P" n) e! S
- PPU_Scroll_H = PPU_Msak_Buf + $01* z6 H2 A) q; r# J
- PPU_Scroll_V = PPU_Scroll_H + $01
3 P$ W4 G. z% V; t) D) U - FC_Data_L = PPU_Scroll_V + $01# H) `# f* T5 V. n) C' L* k
- FC_Data_H = FC_Data_L + $01
p2 B. h0 x( N: F: F2 ]# t+ C1 ` - FC_Data_Buf = FC_Data_H + $01
`( c1 i9 U+ p. ?; X - ;==================================================
- b% t7 Q1 d. r; b' M d: X
6 I) R% U4 M# b8 w+ W- GAMEPAD_MERGE_FLAG = $04
0 ]0 \9 j# [% K: p0 B* d
+ K3 w: F$ S" }' g# u+ X' \& E- Gamepad_Keep = FC_Data_Buf + 1" N& T. R! u; ?% p* q' k) {/ S
- Gamepad_Once = Gamepad_Keep + 2
! @, D _* U! H# u6 J ` - Gamepad_Temp = Gamepad_Once + 2
, r: s& c: b3 l$ m8 |7 j6 u# G - 6 W. |2 q0 q! T" w. f! l1 \: o
- Gamepad_0_State = Gamepad_Temp + 2+ k# e( ^9 W5 h( W
- Gamepad_1_State = Gamepad_0_State + 1
8 T/ X* J4 a5 ]+ @6 h) Q( r* c* p - Gamepad_0_Value = Gamepad_1_State + 1
/ H, r5 M6 T+ k- x' E" t. E - Gamepad_1_Value = Gamepad_0_Value + 1
) x: Z/ R& L8 L - Gamepad_Port_Value = Gamepad_1_Value + 1
/ Y$ [) M+ ~5 N4 z# H8 B! V1 p Y - Gamepad_Merge = Gamepad_Port_Value + 1
7 A: h# ]5 U6 A H
0 t( J: N; d" v3 a) |- ;==================================================
$ L C4 E. `* l/ H6 ~$ N - IRQ_Index = Gamepad_Merge + $01
: o* L9 n0 C* {4 j, p5 a6 A - ;==================================================
+ S0 Q5 Y& V% |* j3 e8 H) L
0 ~0 d L) s) ~: M+ J$ u- ;CHR图形数据: Q7 {* y- W6 E) R
- ;==================================================/ i5 w% z. L* c# W
- .BANK CHR_DATA_BANK
- Z3 [' {" I: R( s5 c) @, L, c0 z - .INCBIN "chr_bank/chr_data.chr"
5 |7 U' r% k6 H' w- ` - 9 O# a2 |. F$ D c
- .BANK RESET_BANK & BANK_DATA_MASK
! u' J$ x# `0 Y: G; {( G. h# \ - .ORG RESET_ADDR' Q. Z. L) w$ h k# H
-
3 m7 C' A+ e2 q% j - ;--------------------------------------------------
) V6 l* h$ x7 O) d - Attributes_Data# V" `. S/ M/ D* k
- ;命名表属性
3 O' h0 J( i) [: I, |( d& i0 c) X6 P7 _4 G - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$000 h5 |& b: o7 D" @" }9 [3 a
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
* Y( N$ P7 H4 s2 n; [- P; G - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA/ |% F2 F! ^) h& E, k# p' T# E0 O
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$553 `4 G# X( i. M+ V6 G
- ;--------------------------------------------------- Y5 \0 ^) U |3 y6 b1 q: J
- ;调色板数据( B, a9 \) Q' b# P$ G
- Palette_Data
8 [3 k5 j3 e+ a6 }: V2 M# M - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F. l0 S. B1 h9 L" a3 B3 q& ?5 P
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
* n% e2 B- W! C* L4 I4 @# D. k
4 w" {# C8 F( ~: O- ;==================================================/ K$ N: H( i1 G; \# h* R
- ;命名表初始化
* T0 i- j" d2 Z' Q! C' I% @ - Init_Name_Table
' G' g3 r1 O3 Q+ K0 [1 [ - LDA #$20; Z+ O. O' A5 Z, Y j9 W
- STA PPU_ADDRESS" C6 _8 B9 N8 \
- LDA #$00
8 ]; o. y$ W) Y q! y - STA PPU_ADDRESS
: F6 H) O- O2 m - LDA #$00
7 X5 R* I' ^2 Q: B0 a - LDY #$00
( _* q! [! ?% n# k - LDX #$10+ q; ^9 _0 b4 r9 W) K. b
- Init_Name_Table_Write1 }" Y( f/ n* _# ^. a7 g2 u
- STA PPU_DATA
, a+ Z' ~- w X% }( w: M6 S - INY
. l$ U+ O" R$ D& c9 j - BNE Init_Name_Table_Write
4 F6 n' u6 F$ c2 V) [/ f - DEX
" |! L+ ~3 Z, F: H3 }3 a - BNE Init_Name_Table_Write
3 Y+ H h( K2 L0 E - RTS
$ I' K" {5 U9 o" r -
8 J$ Y4 f5 x5 X. b9 K, x - ;==================================================3 Q [' ?. V1 [5 i& A$ Z4 e
- ;调色板初始化1 q9 `. g1 A) u5 }
- Init_Palette
6 I/ M* l$ X! Q4 m% M B: x - BIT PPU_STATUS# K% A0 q; I- ^
- LDA #$3F
# X# S/ c- ^0 \" J4 r - STA PPU_ADDRESS6 _: q$ F/ j$ |1 H
- LDA #$00* [& Y0 Z/ [( V" U
- STA PPU_ADDRESS
$ L ]1 e$ D2 w/ k; S" { } - LDX #$000 n3 m6 f9 `$ q
- Init_Palette_Write2 v: K: `$ s$ t- G `% |
- LDA Palette_Data,X
' ?/ E5 {6 }* V" c4 _4 A2 E - STA PPU_DATA& Q- H+ Z9 y0 e9 g j
- INX4 }8 U- J$ G b& n" Q. Q( A' o
- CPX #$20
& j3 V6 {6 D% ]* W! w$ X - BCC Init_Palette_Write
! |) h5 O- `% M$ C$ `4 M6 b - RTS
5 b" H& T$ R, F3 g - ! P+ k$ |$ n' G# W" Z9 o; R) F$ h
- ;==================================================3 l2 i! Y' P! e
- ;设置命名表属性
5 [% |) a# L9 u" x - Init_NameTable_Attributes
4 b: o1 h* c6 u9 ]$ ?& w0 F - BIT PPU_STATUS
8 H5 s4 P9 K& v% W - LDA #$23
5 T0 D, n. @8 Z - STA PPU_ADDRESS2 n7 q# C( \8 k7 k/ O& J9 k% @
- LDA #$C0
?( C% k. U5 Q% V* m - STA PPU_ADDRESS( w( f7 {9 V4 j
- LDX #$00
9 I1 Y K3 \ R& M) }5 d0 x - Init_NameTable_Attributes_Write
4 P7 E# S; v5 S - LDA Attributes_Data,X9 Q& l2 h6 i+ F
- STA PPU_DATA
5 `8 V( H; H2 ?) ?; I - INX+ E& ?, J& @ X1 n! Y
- CPX #$403 \6 a" N5 M: J! s6 f, J/ F
- BCC Init_NameTable_Attributes_Write1 N6 \5 T$ J! X) [3 i! u
- RTS
9 U5 F2 b, s9 p; } - 7 k- m6 D4 r7 p0 z: z' R
- ;==================================================
: W4 |2 x( G" I; v! c7 u4 w5 p - ;初始化命名表文本' ^0 w3 B: D( q. q+ [* _# S
- Init_Name_Table_Text8 N: m7 |: j, W. m& b2 v
- BIT PPU_STATUS
, H! @$ G2 i z - LDA #$20
0 {4 Q5 ?3 e# R8 l - STA PPU_ADDRESS; X \' a$ g. W" s
- LDA #$00& A2 V! J$ |7 X- ]* K0 L0 `
- STA PPU_ADDRESS1 f) p2 n7 k* {2 @1 n F
- LDA #$00
t4 h) k7 |% P, K% P1 A7 @5 ]- S0 M) o - STA FC_Data_Buf
" U$ Y4 \9 v, C4 b2 g - LDY #30
7 W1 L" m& f0 E3 x+ ^! ^3 g3 w - Init_Name_Table_Text_Write) ?+ B |7 h1 w) u4 W' `
- LDX #32
) K0 K* Z: z& i8 W' G2 q - Init_Name_Table_Text_Write_Char7 U: A5 W& g$ U8 H
- LDA #'0'
- T O: l0 E0 y2 O6 Y+ X - CLC; Y% U1 L' n/ X' R
- ADC FC_Data_Buf
. `# J# B; W3 i2 F - STA PPU_DATA& r& O5 g4 ~9 z
- DEX
# y' Z; x4 j; P4 e% X1 W - LDA #$14. [0 t. e% K6 V
- STA PPU_DATA2 L5 \7 ^: @5 N- r: R% g
- DEX( F' w, v0 p" |! p
- BNE Init_Name_Table_Text_Write_Char' @( r6 X6 J+ U. Z' C
- INC FC_Data_Buf
! ^4 A! }- W+ x8 B5 T' ` - DEY
7 T# m2 m1 J2 H4 F - BNE Init_Name_Table_Text_Write
9 ^( n/ d2 @' M x9 _: ?& K% X+ h. I - RTS
) E; b. {9 @3 k- E+ i" e* z, {/ j# o1 _ - ( e, n7 b7 l' R2 b# U; g6 P
- ;==============================2 r7 |3 \+ e i4 b' O
- Init_OAM_Ram;初始化精灵内存
* }) t4 c& C; j: i ~7 q - LDX #$00
1 R, u7 Q0 N/ ?% `9 Y1 a7 ?" O* z& D w - LDA #$00
9 R8 V. c' o0 F/ R: m) s - STA PPU_OAM_ADDR
+ o9 \' `9 C4 h) a+ z; _ - LDA #$F8 u+ R1 p: [% b- E0 v- }, S
- Init_OAM_Ram_Write
- u+ B& C7 t) @' G/ _* j - STA PPU_OAM_DATA0 z# v1 Y* A6 D& L8 i+ R) H
- INX, i1 D. U# d* U
- BNE Init_OAM_Ram_Write
! T( Y5 O# u0 b5 l& d8 I - RTS
# }0 B1 ?2 d; }' s% } - 5 c; R1 v& A7 z
- GamepadProcess;手柄处理. P. }( I* _5 z
- JSR GamepadDatacan. L# Q9 l: V" [/ j/ ]4 K( H
- LDA <Gamepad_0_Value0 |3 y; B0 I7 o" ~# d& r
- STA <Gamepad_0_State
E c8 W' c4 \: G - LDA <Gamepad_1_Value
/ E! i. v5 x! U: l- X+ u( [ - STA <Gamepad_1_State
# M# e2 {$ G1 N - JSR GamepadDatacan7 a' O9 Q- y3 k. J: f$ B
- LDX #$01
! d, m6 ?. b- i' p3 [# S/ _! ?; l - GamepadMergeCheck;合并手柄输入检查$ x5 ]/ V6 j8 k. Y
- LDA <Gamepad_0_Value,X
( F8 q! w! B% N8 v D - CMP <Gamepad_0_State,X7 ~4 X9 a, [* F* e7 W
- BEQ GamepadMergeInput
. W6 L9 o8 [, c - LDA <Gamepad_Temp,X# m* _# q" ^% c* u& R
- STA <Gamepad_0_Value,X7 ]6 N/ |' c P, M4 K# P4 B4 i' m
- GamepadMergeInput;合并手柄输入
! w* T9 s: J( Z$ {7 m& A# _ - DEX0 a, q$ Q7 u0 f% Y
- BPL GamepadMergeCheck0 A- k& P6 ~4 u3 K1 l7 I8 H) x
- LDA <Gamepad_Merge
& y# o# N3 V O - AND #GAMEPAD_MERGE_FLAG
" q6 h. C* V! }! L C - BNE GamepadStateProcess1 M2 o+ L4 m" w' S. M3 G+ I& k
- LDA <Gamepad_0_Value
# P3 d4 {2 {# H* F5 _. X! N c - ORA <Gamepad_1_Value4 E& ?5 h# a- |- Q$ b- F; D
- STA <Gamepad_0_Value/ t) J! W# y9 v- a& k
- GamepadStateProcess;手柄状态处理
- @ V, h3 V8 L! v# k - LDX #$018 ?5 R% V3 E1 t8 }7 n
- GamepadStateSave;手柄状态保存
# J0 a9 B% \0 u - LDA <Gamepad_0_Value,X1 | ^- D l' Q; n" H8 d% q7 `( Q: w
- TAY0 g' i3 B: H: Z
- EOR <Gamepad_Temp,X/ C! S' k" [) r
- AND <Gamepad_0_Value,X
7 s+ }. D, C# H - STA <Gamepad_Once,X; O: j" @$ V$ u1 C! ?3 I
- STY <Gamepad_Keep,X
+ z3 s! n$ I' x& U+ z! _2 @ - STY <Gamepad_Temp,X
! O C9 z( x( P/ {9 A, x4 J9 @$ N - DEX; O5 o7 f( K# q* x; B/ U
- BPL GamepadStateSave+ |- x* ?; C( l" W- F! ]
- RTS! L. i' b6 z5 @: m1 b3 l- W
0 n- ^' h$ _- g/ z$ o' m- GamepadDatacan;手柄数据扫描
" z+ E7 j) O- v K" O# X, [ - LDX #$01
: |# p/ x, R8 J h- A1 R5 V - STX $4016" e/ }8 b! S% T3 f b3 R& p
- DEX
3 K2 \1 U5 ]; u+ r - STX $4016
$ m- l7 |, Y6 M$ p+ @8 p" |4 n - LDY #$08
2 i( `, h/ k+ ] - GamepadPortScan;手柄端口扫描% i! C k- [1 m& { p, x' L, i
- LDA $4016
7 f1 O1 @/ k0 B- k1 m7 f - STA <Gamepad_Port_Value
, p L3 _8 o& M# Q+ B - LSR A
9 `: i" R* Y4 x3 Q# E2 [ - ORA <Gamepad_Port_Value
8 f; ^" d- Y$ A8 Y8 q4 X - LSR A5 n( H! B8 o8 P. p3 W. X
- ROL <Gamepad_0_Value
/ A/ T' ~ R8 f- J8 J - LDA $4017
1 D( d: s8 n) w5 `. A' J& a - STA <Gamepad_Port_Value
4 c# }$ s. L f" ]9 }. t# h - LSR A
9 S( P: C& _ E( T! W$ @8 y( s9 T - ORA <Gamepad_Port_Value
' d" S- ^: ?# R! l, V8 [6 S. F - LSR A9 n% \2 S7 y% s$ i$ H5 |
- ROL <Gamepad_1_Value9 e$ Q+ S/ P% J3 h4 a' _" |2 \3 } Y6 O
- DEY) C ^( w1 w: t+ j
- BNE GamepadPortScan; T# A, f, B4 o( L
- RTS
& l; a; ^7 n/ d. W9 B - 0 C4 ?! l4 O( b' I6 m
- ;==================================================3 p. S2 Z! z' f; v
- ;PPU处理7 x) @4 ^+ d& W2 }4 j
- PPU_Process
! v7 O) o7 p% D2 a+ X# R: Z - LDA #$00
2 K* [& L5 W& g0 D f" W - STA PPU_MASK. T# N8 j# ^$ C! B& H; `
- : w* |6 }& V/ F! Y, G& J
- BIT PPU_STATUS9 D+ k% @3 A: l: P7 V8 ^( f: T* Y
- LDA #$20
5 z3 a& D/ L9 p8 s! [2 X - STA PPU_ADDRESS8 D; n7 L/ t/ P
- LDA #$00/ Y! _. {5 p: V. a8 Y* g0 {2 H; t% j
- STA PPU_ADDRESS
0 g, g3 n# g* T. r) B9 a1 Z' L2 R - 3 @7 p3 Z% ?# u( o
- STA PPU_SCROLL
: K5 o4 k% w- h - STA PPU_SCROLL
: ?( m5 r9 J( @0 t - / j {6 O4 z: R( J/ |- J* c
- LDA PPU_Msak_Buf! d+ L0 p% L+ ^: {! k% D, M! `2 {
- STA PPU_MASK2 K' j; {" G, \
0 S) Z' {; x; P& E. e1 ]( D- RTS( c u2 p. N1 t1 Y3 _, k
-
; t0 F Y8 {, O - ;==============================
, T6 z7 X2 n$ ^+ {: I& S, ^ - Time_For_Vblank;延时等待% Q: X5 x- J$ w5 @
- LDA PPU_STATUS
1 H( E/ E" I$ x& s - BPL Time_For_Vblank
+ w* c( B& B7 [- u - RTS B" W8 b- w0 b
- % W* |8 W1 t" K& t( W9 k
- ;==================================================. S& o* g4 J O0 M$ w1 k
- ;初始化MMC32 B: Z* K5 U2 f f+ T4 {4 E
- Init_MMC3
( a1 C% t0 ?# ~0 ]$ }' v& e- n - STA MMC3_IRQ_DISABLE
- I/ C7 O# O9 a( Z - $ Y8 z- Z" }/ _
- ;设置MMC3水平镜像
9 G+ g3 ], h0 S4 d/ }! B - LDA #$01% l" q8 h8 c" b1 t6 ^
- STA MMC3_MIRRORING5 R. M i# K9 z
-
- m- j2 u- T! y. ]9 J( M - LDX #$05
2 Y# I" w; T$ \2 L$ m - Init_MMC3_Chr_Bank_Write$ Y" \1 ~ Y, q v4 I
- STX MMC3_BANK_CTRL' c2 l' q! E/ @) f
- LDA MMC3_Chr_Bank_Data,X4 [; X( x3 V$ `3 q# @! X# C2 Q
- STA MMC3_BANK_DATA% z, m3 n0 z0 I1 W' @
- DEX
" o, ?) j/ h) G9 t" A2 U - BPL Init_MMC3_Chr_Bank_Write
7 H, T4 |: r7 q5 } - RTS
$ J/ d; w5 A( a - ;--------------------------------------------------6 k& [9 [0 n: ^/ V+ x
- MMC3_Chr_Bank_Data
7 Z9 f8 v+ R M& @* s - .DB $00,$02,$04,$05,$06,$07
4 x; I3 e0 Q S# b" S - ; |8 F; W9 D) D8 J! Q" j+ K* n9 T
- ;==================================================
% I) y7 a+ P! J. n - ;重置中断处理/ t+ w9 {0 G0 z9 v4 _5 ^
- ResetProgram
4 }1 \4 d$ ~0 @) T: g: q - SEI
, S5 m! u5 f [+ A" \, g5 { - CLD
# P6 ?& E( E8 G% B - LDA #$00) D v' C/ r; {- S/ s2 r
- STA PPU_CTRL" r$ Q; t0 l* y7 w% G) Q
- STA PPU_MASK
% C5 [- w! z; T' t - STA PPU_STATUS# m l$ w! g0 w4 l9 R& q2 E- P
- STA JOY2_FRAME
, S4 j3 C P4 w - STA APU_STATUS
; R, W6 g/ O: I) K: k" X* F - . U4 T) L- W7 m1 h# ?
- LDA #$C0+ V6 q" {2 c- A" D2 S: ^) k4 |
- STA JOY2_FRAME, ]! A/ C' L) T3 }! a' c$ h! R- e
- , `) S$ {1 X. Z5 m: u" I
- ;等待vblank# y$ _. v8 ~6 ?# H4 {; {7 i
- LDX #$02& c, O# K7 _& m$ I) O
- Vblank_Wait_12 c/ J8 N% L: N% P4 J
- BIT PPU_STATUS
2 w) d3 ?* I8 Q. D. M' ~# w# y - BPL Vblank_Wait_1
. \6 R: S/ M4 _; Y$ V$ V - Vblank_Wait_2; U1 S5 \+ `6 G( |! H6 F3 A: h8 J- i
- BIT PPU_STATUS& U9 h: g: K! @/ H* s* B
- BMI Vblank_Wait_2
; _7 F, y) V- b. f: R. y6 Y1 U - DEX
; `$ x8 F* I3 g/ U - BNE Vblank_Wait_1; o5 [5 [3 l% a; ]& O# |! v! W, C; b
-
- q7 @. K6 T% J2 m/ O# I7 M1 O5 ?0 y - LDX #$FF8 c9 U6 D0 h S. p1 _
- TXS9 i! l: e, y0 k* A
-
5 P- A4 o% b: B; U# X - ;初始化MMC3. ~7 Z/ M5 k# \- I K6 a* ?
- JSR Init_MMC3; L& D# r! I" S* V2 T- B! N
-
! {+ j# f2 Q/ o c4 l: i - ;==============================
8 y) `1 G6 I3 q3 D8 D" X - ;RAM初始化8 d# d7 B% P0 d$ d
- Nes_Ram_Init
6 l- l3 E2 B( _+ F! z# b - LDY #$00) F$ y2 X4 u" H" G) J% d
- LDX #$08
+ s$ U3 o+ ~; s - LDA #$004 ]) y4 y' s' U1 k! H0 N
- STA <$00
0 y% S5 u* x$ D8 a/ ?# Y9 b% f) K9 ^ - STA <$01( g# ]' R( h* o) H7 I' j5 U
- Nes_Ram_Init_Write
2 z$ _3 t# @+ h - STA [$00],Y! @# c* `. J. A$ A
- INY
, h+ G; |3 C$ v6 k8 h# O - BNE Nes_Ram_Init_Write# _. t7 Y3 Q3 X5 ^- G$ ` J
- INC <$01: G9 @ M2 X( C: c8 M' u$ U- Q. M
- DEX
9 x0 y/ [8 q0 N6 e, _8 y - BNE Nes_Ram_Init_Write/ C% a: b/ ]4 X0 O+ m
- ' z7 k B4 W0 p7 G3 f
- ;初始化命名表
N0 a+ I7 u+ c - JSR Init_Name_Table% b/ p2 n9 f+ F0 j
- 3 N0 R+ e; f2 z/ B2 \8 R! ^
- ;初始化调色板5 E8 r2 E( t p( z' u. d! \
- JSR Init_Palette6 ?6 E2 b# }0 R, J2 A
-
5 a) n; L q' _) `5 _ - ;初始化命名表属性
4 @& P: _9 j( O5 ^- d7 P/ A) m8 { - JSR Init_NameTable_Attributes
* `2 b/ @& E5 Q2 X/ Y -
, q C7 ~; m4 T" H5 k4 ^* p! q g - ;初始化精灵内存% G5 c& R* f0 O8 V5 n w% L
- JSR Init_OAM_Ram
0 c$ J" t( P/ |" O) A1 {$ | - 6 u% z5 y$ Q+ C- \8 O2 H' J
- ;在屏幕上写点东西
* G" E% x, L3 w$ S; [. P - JSR Init_Name_Table_Text
; i5 ^; @9 [0 N2 w7 O8 n2 R - 6 C* C9 Z4 ], n* `8 n1 j
- JSR Time_For_Vblank( A7 I, R: ?0 D9 u9 e
- ;开启PPU控制
% D+ A. p$ K7 Q: G. m; J* v1 O - LDA #$A8
" w3 p9 Z/ l+ N3 [$ B2 r - STA PPU_Ctrl_Buf
0 C$ M2 ]. J% X7 Q - STA PPU_CTRL6 U) w8 g4 P/ c f% S
-
/ s/ D( x& k) @! Q5 T7 J/ u - ;开启PPU显示
( T6 ]1 A" q: N6 u' i - LDA #$1E4 e* M: j: e2 ]% V
- STA PPU_Msak_Buf
; l% s1 f) u7 v5 d! V - " a! N7 W2 y j5 I
- CLI
" Y: h; R5 ]* z/ @ - JMP Loop- h9 G. M4 t- g* n) p
-
3 }- @; _+ | s/ {% v$ D+ h - ;==============================
: c* c4 g4 n+ ]" V8 [/ d# u - ;死循环, 等待NMI中断
$ t& q2 I* p: P3 T7 K/ {. M - Loop
0 y% \8 X; ^! f6 w* w7 { - JMP Loop8 F5 Z* z. A) `) f8 z4 x) I* N
* ^( r: l; o2 C+ W) ~5 f2 z/ C. d- ;==================================================7 N8 m4 j+ g; _/ s, N3 k0 \
- ;NMI中断处理
# e. H( v9 k4 M- x+ o1 @ - NmiProgram r5 N# F* h9 w! q+ i3 D/ {
- PHA- z) ^- t5 n. W3 z4 n8 `
- TXA
" I/ j: ~ Y! S) s - PHA
0 U Q2 I! v/ s) t: w3 P - TYA
4 P+ a( }6 u) O5 m' `: H8 c - PHA
) E8 `6 M" {. z% i4 \ - ! s+ o, ?* i& E3 Q/ `& k) P" z
- BIT PPU_STATUS
7 H0 R2 q3 M* r8 y1 W -
7 B& N/ U1 }0 e! Z ^5 _* P - ;关闭PPU控制8 X4 T* w) F' ?
- LDA #$009 I9 E( I9 i( n- O* F
- STA PPU_CTRL8 {0 {! { g1 A" `; a) ?
-
$ `8 _4 }. U5 c9 H6 d0 I - ;处理PPU: S9 Z0 f( B6 [
- JSR PPU_Process# L# P+ v$ g% T, u) K) d
- : B& H& O* @) H9 J I
- ;开启PPU控制
1 F, M. Y3 S! E9 w' H# L6 D9 w - LDA PPU_Ctrl_Buf
0 v% U# T4 Q# s+ O, u' i - STA PPU_CTRL) }$ s3 D" `, \9 A2 e. K, W: b
- + H( H/ u, a% c1 n" ?- M9 S0 n2 x
- ;手柄处理& ]2 [7 d9 }2 D2 k
- JSR GamepadProcess
; ^' e* B! R1 R; V* d# i7 r -
3 B( _; L5 H: V6 R5 d( |! ^ - LDA #$00: \& l2 b# K- n4 ~- t8 ^8 g
- STA IRQ_Index
T9 Y8 z* f+ I - ' y9 i! A& o7 ]/ j+ e
- ;启动IRQ中断, 第15条扫描线触发: O2 w3 X+ e8 k% I# n. l- {
- LDA #15 + 1: C V" J/ L7 U2 K
- STA MMC3_IRQ_LATCH
1 o2 ^0 ~# n6 p* F' v4 \7 C: G - STA MMC3_IRQ_RELOAD
) u! F2 j$ x. g - STA MMC3_IRQ_ENABLE% G) p) N6 a* |# ^
- CLI
4 j$ [. V+ z) i Z* ~1 O9 v' Q - 7 p0 w. j j v4 i
- PLA0 J* [ y" u& z" l! A/ }
- TAY
. ^+ y/ i7 ]) t8 F/ [, u - PLA* X( T; H; g) W8 J; V5 j% ^+ O: ~
- TAX+ v4 q Q( n0 n9 n- s( A8 a
- PLA
# _" U: K9 p0 E5 M - RTI
; S: f: P$ n3 S5 t E6 Y
% a; v" L/ D/ x8 v" ?1 ?- ;==================================================
! y& }# }% A r9 T& v E0 h6 C1 c - ;IRQ中断处理
* E& J( z$ v8 z' {- M - IrqProgram
9 |" I+ m9 j7 G. I; Z: p - PHA
/ \" ?0 r- \, Y4 ]0 N0 \/ F# ^: w - TXA: P, Q* i9 b7 E7 K
- PHA7 q) p% s1 q* |4 M
- TYA
- g8 k' V9 M u/ f% d6 T# c - PHA0 y5 {' ^3 \$ X- H
- 2 V* D+ G( R+ ?0 r. Z4 n
- ;关闭IRQ
( ]# x6 z- n: L( ` - STA MMC3_IRQ_DISABLE a6 x% E- w: i. D5 w. G
-
/ Y6 o# J1 w1 m3 N - ;允许下个IRQ触发
7 O& i% H; B1 ]% R1 l- } - STA MMC3_IRQ_ENABLE
4 [4 m* {% Q" h% |2 C; D' @% w - j& y, Q0 S; I- u3 I6 q$ @) A
- ;IRQ处理, 15线后继续触发: _8 o% g# j. e1 f7 J8 H
- LDA #15& r/ f+ W5 K+ ~* W
- STA MMC3_IRQ_LATCH
M# i, [) I- w7 Y2 Y B$ M - ! u, H, i# ]# P% |: j
- LDA <IRQ_Index* d* L6 c0 x, W9 B! B# ]* I
- BNE * + 4
4 m% X7 c& I, @/ q# y* U" b - INC <PPU_Scroll_H
4 \, m- `. G4 U* M8 K$ y1 F -
T) y8 G* D p; z/ a$ t' g, A - ;设置屏幕滚动* v v# ^% V3 q4 J6 v: Z
- LDA <IRQ_Index
* M/ }3 T# |1 {4 ^5 Q& _ - AND #$01% F9 }9 e) T9 b& X3 f( G1 R' Q$ W
- BEQ Irq_Scroll_Right
* @) |; u% Z6 b1 Q2 o7 @ - : R: T: n J3 W$ W0 C- I
- Irq_Scroll_Left
- D6 X9 h& n4 `/ i" ` - BIT PPU_STATUS; R1 Z+ }: A9 W) Q/ L4 |9 Q
- LDA <PPU_Scroll_H+ ]- k! e. G0 ?1 B
- STA PPU_SCROLL9 {- h7 {4 K# b# [' p% T8 v% {
- STA PPU_SCROLL
0 F' V1 N* C9 {8 C0 ?$ Y - JMP Irq_Scroll_Over% F6 i* h) E% q
- & L2 C3 N" B4 F/ B* k! Z* z! K
- Irq_Scroll_Right) b. j P7 s. m2 \$ y6 W
- SEC
& A4 b" E3 }7 D$ D' u- o9 V/ V! F - SBC <PPU_Scroll_H6 O6 \$ v0 E2 D9 K. y V
- STA PPU_SCROLL' w$ L+ i5 O1 m8 D: j' V
- STA PPU_SCROLL
' C/ ]$ {; v+ @ - Irq_Scroll_Over
0 _: r2 [9 B2 m0 G; |( `. `4 x - 0 I' U& F& K- D" \
- INC <IRQ_Index: l1 c* W& m4 L. s1 @3 ^
-
9 f$ u$ [3 U* n7 w2 } - LDA <IRQ_Index
) q* l. s! r+ Y. B - CMP #14
5 U0 y# O* M" O* V2 L, n3 P+ C( S. s - BCC * + 5- F% w( F5 y7 |$ {
- ;关闭IRQ
& |2 N& w- t9 Y. m' E - STA MMC3_IRQ_DISABLE# {6 [1 t, j s" J
-
2 q- Y k0 S: o" S - IrqProgramEnd5 t6 }2 f- i, N0 {/ w# I
- PLA( M5 a2 T) k3 ?+ l' k+ _9 Z$ {
- TAY
9 U% m8 p) t3 _, i - PLA
4 y3 K/ U! N* ]2 z- K% O - TAX' j( d4 ]$ S4 W0 [9 [- y5 _8 y
- PLA
' h( T$ ^* }; m2 @. H - RTI; e7 s/ A$ |# c6 x9 B' Y. y4 |
-
+ g* |9 `1 _2 E) u. v1 \3 ~ - ;==================================================
5 Q8 y1 J& ~5 P; z( r4 ~ - ;中断表; P+ [3 K8 v* X1 B6 J2 a
- .ORG $FFFA! v2 {6 e- t4 R
- .WORD NmiProgram/ o/ ]. P5 S8 B) K+ G' m! r) o
- .WORD ResetProgram
% q" D6 ]0 J. F7 t - .WORD IrqProgram
复制代码 [/code]
1 X( g9 l3 D! f1 q9 ? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|