|
|
- ;[FC音乐][MMC5 IRQ]
: A0 i: W! S& v5 F0 U. ? - ;FlameCyclone 20230710/ X* Y/ p) j" `8 c+ ?
- 7 R7 @0 ]6 o2 Y9 W) H F5 Q
- ;文件头) z) o6 [- c% n' Y& H x( H
- ;======================================================================/ z2 G9 R- |- f* P
- .INESPRG 4 ;16KB PRG 数量
* U0 c$ x3 h0 o: P$ A1 p) T - .INESCHR 1 ;8KB CHR 数量
1 ^( Y' i1 u h) A5 }# J# ] - .INESMAP 5 ;mapper 5. L: i2 m# \8 o
- .INESMIR 1 ;命名表镜像 0水平 1垂直
# }. V2 t) V. G# m" p) e: O
! {! a: O, s0 g, ~% g& a; p- ;必要条件
2 J$ r; l* v; y) j8 \( j' X- T - ;1.持有CHR ROM
2 P. v8 j8 _& o- i - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
% b4 i4 ?$ T. W" z9 y! y - ;3.精灵内存(OAM)不为空
7 n+ J! P# e, k8 _, P - ' s8 g; f! G+ j4 _- A$ }3 y# V
- ;==================================================0 D" G) [1 c, `3 R& v
- ;NES端口常量
% L: [0 G6 m5 @. F v( b - PPU_CTRL = $2000 ;PPU控制寄存器
2 W7 K0 v g7 A - PPU_MASK = $2001 ;PPU掩码寄存器
' r- S" R( ^' Y3 R6 ^4 S - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
* Z+ W$ W3 m! O- D- V) S z - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加12 x q8 m$ Q' G8 E$ t
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
1 m1 m! H9 j4 k, a - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 2 G- \: j2 [6 {- z1 a
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
% G) f$ o3 Z; }4 _7 \ - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 . Y$ O" G. f' [
- OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
$ }, k# }+ i+ i6 J: I& K! N - APU_STATUS = $4015 ;声音通道切换5 k9 `/ [% @3 I# ]0 s' c" L' x7 A
- JOY1_FRAME = $4016 ;手柄1 + 选通
6 M6 @* Z0 ^9 M4 G$ p - JOY2_FRAME = $4017 ;手柄2 + 选通
) v" |( ~3 @9 `7 ]! c% p - 3 M4 F+ c+ J1 ~" ?- T
- ;==================================================' e$ t7 e" C3 s8 o/ f
- ;MMC5端口常量! t% A0 U8 u4 ]( G8 ]- P- ^
- MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4, S. o9 L& j5 M
- MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8" q ^# k& u; r+ Y
- MMC5_PRG_RAM_PROTECT_1 = $5102;
* a8 e8 s: U1 Z6 R, c: l i1 k - MMC5_PRG_RAM_PROTECT_2 = $5103;
; W3 O% S$ R+ j9 j - MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R
1 e8 |' M' ]2 w1 {+ s& K! p) ?' r - MMC5_NT_MAPPING = $5105;
/ w l# L) {* K" h3 O# K% S$ ^! c& O - MMC5_FILL_MODE_TILE = $51069 g0 g, ^5 u- t# y! [! Z
- MMC5_FILL_MODE_COLOR = $5107! Y% j4 u" ^' ^2 w4 \4 v
- 6 W z$ ^3 m) P; U( A: O+ K
- MMC5_PRG_BANK_6000 = $5113+ t/ d& Z! Z% c9 d: j( B. L
- MMC5_PRG_BANK_8000 = $51140 o) p1 ]: l2 b4 X+ M* h0 U
- MMC5_PRG_BANK_A000 = $5115
# g- f8 u) g* e7 e6 |$ | a$ V - MMC5_PRG_BANK_C000 = $51164 M7 V0 B! j* {! s8 V3 X Q' j- {! }
- MMC5_PRG_BANK_E000 = $5117
+ t7 p1 K0 f7 a8 N - 7 Y+ o& w: j6 } ^0 u. R/ b
- MMC5_CHR_BANK_0000 = $5120
& j2 Y( ~5 X& J! Y. s: K! W$ N8 I$ s - MMC5_CHR_BANK_0400 = $51215 E9 l/ V) g4 c8 J' D- R) W
- MMC5_CHR_BANK_0800 = $5122, E7 h/ T$ u) _
- MMC5_CHR_BANK_0C00 = $5123+ _1 Z0 J# j: j
- MMC5_CHR_BANK_1000 = $5124
/ h8 O `+ V) w/ s/ D - MMC5_CHR_BANK_1400 = $5125" t: B1 [$ Y5 g: U
- MMC5_CHR_BANK_1800 = $5126! n0 k! J; J/ {/ b2 p. |
- MMC5_CHR_BANK_1C00 = $51275 c0 I' x$ i1 ]
- 8 n, S6 S) Z( |2 k
- MMC5_CHR_BANK_0000_1000 = $5128
" @% B2 c( P% B3 v* X3 H' `7 @9 w, _ - MMC5_CHR_BANK_0400_1400 = $5129. I) C4 w& H& \2 k
- MMC5_CHR_BANK_0800_1800 = $512A& K2 s0 b. `1 m9 s5 I6 b2 q
- MMC5_CHR_BANK_0C00_1C00 = $512B
# F, F" e- G; e' x- [9 D+ u, G4 b1 h" N - / P% `3 h9 p* t" Y8 y( o. j% R
- MMC5_CHR_BANK_UPPER = $51301 s. C6 O9 c% E% i8 `5 }
- MMC5_V_SPLIT_MODE = $52002 O8 S! M/ A; }% m
- MMC5_V_SPLIT_SCROLL = $52011 R0 T6 y4 X: F5 N0 g
- MMC5_V_SPLIT_BANK = $5202/ T7 W- V, m: X1 p
- 8 j8 w0 S$ O! ~0 q
- MMC5_IRQ_SCAN_CMP = $5203" b5 T* E! h( F' C6 R- a: A
- MMC5_IRQ_STATUS = $5204
; h3 ?$ r8 r* Q1 v! R( A7 Q; V( i6 H - MMC5_MULTIPLIER_A = $5205) w8 E- [) p9 f6 {) [: ^
- MMC5_MULTIPLIER_B = $5206" r$ u0 k) C* R7 C) ?7 e4 z9 J
- + x) F" }. P e7 J3 N, r8 i
- MMC5A_CL3_SL3_DATA = $5207( z/ P* Y- I) _. p
- MMC5A_CL3_SL3_STATUS = $5208& i% C& r- S9 R, d& e R o
- MMC5A_IRQ_TIMER_LSB = $5209
& z9 n9 o0 M6 P - MMC5A_IRQ_TIMER_MSB = $520A+ e% z$ r" t' J* q
& I# A) `$ S w9 Z# a$ e# x- ;==================================================& {% p/ B# p; a0 a3 a, G
- ;程序块配置. w" g* h. m% V% L; i
- BANK_DATA_MASK = $07# N& i+ v7 f: @
- ;--------------------------------------------------
8 R' u) a7 ?. e) F) q - RESET_BANK = $07+ Y) l- K: x1 a
- RESET_ADDR = $FC00- ] f0 }! L* R7 p8 {1 D
- ) M, V/ z8 k' h( a; `5 O ~
- ;==================================================
6 R# Q; ]* l/ z; J, L) T' o - ;图像块配置/ J, R% ?; c1 Y( L1 o% O4 R
- CHR_DATA_BANK = $08% ?5 q1 l" Z5 r) Q* [) K1 N
$ @5 m; Q" s4 o: |* e* q S- ;==================================================
0 M$ W5 K/ V1 Y E- L9 m - ;零页内存地址配置
9 y( X* [) T; F) ^, m, y# ] - Use_Ram_Addr = $80
9 v: h+ v0 k& g* Z! W8 o2 h - PPU_Ctrl_Buf = Use_Ram_Addr# y) a* Z; I0 ` H; i: k- E2 x
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01( o" U; _) k! M
- PPU_Scroll_H = PPU_Msak_Buf + $01! v! i, O, \8 a; @8 z/ Z# r2 {
- PPU_Scroll_V = PPU_Scroll_H + $01! X% _8 x0 N$ b8 w( s7 e
- FC_Data_L = PPU_Scroll_V + $012 e& g- Y' n1 l. ` j- E3 ?
- FC_Data_H = FC_Data_L + $01
+ R* e# a0 n8 A5 W+ y - FC_Data_Buf = FC_Data_H + $01
7 v- ^7 s3 X# e5 S& ^7 ~! P8 o - ;==================================================
% m& h z# B) `, ? - 7 K. v3 `* c4 y
- GAMEPAD_MERGE_FLAG = $04! V: w) m$ A' Y# U8 G. A' x
( l2 Q& P9 X( f$ X; c- Gamepad_Keep = FC_Data_Buf + 1
) M3 [! ?8 l7 i/ R+ N3 x - Gamepad_Once = Gamepad_Keep + 2
, [! [) E1 F& T! Q. A - Gamepad_Temp = Gamepad_Once + 2
) k7 n) \! f' p. \2 l8 V - # C5 G1 s, l. Q/ S6 R2 P! b
- Gamepad_0_State = Gamepad_Temp + 2
t* N- l7 |9 H: n. t+ q" f0 r' \ - Gamepad_1_State = Gamepad_0_State + 1
% O9 E/ l3 B( Y: _$ B0 ]; L - Gamepad_0_Value = Gamepad_1_State + 15 D5 t8 C' F6 S) y1 A8 C# E) K7 }
- Gamepad_1_Value = Gamepad_0_Value + 1$ X2 [, s$ _; J/ H9 P
- Gamepad_Port_Value = Gamepad_1_Value + 1
" n& w) w3 {# @0 Z6 k - Gamepad_Merge = Gamepad_Port_Value + 1
9 u. A! z$ J% y; s! A* K9 |
; d' F4 M, W6 l& h/ K- D' F5 n- ;==================================================# M, H/ G& m8 p+ m" s1 k
- IRQ_Index = Gamepad_Merge + $012 h* a1 g w% [& I# f& y
- ;==================================================4 @1 F& ?6 @% V4 \* v
! a: F. T* ]# M" h8 X8 ]- u& Z- ;CHR图形数据1 ~$ R) |$ q! |% Q' X
- ;==================================================9 ^1 k1 s, }3 | t5 c' Y
- .BANK CHR_DATA_BANK
& r( Y3 B. m5 a# m! ^ - .INCBIN "chr_bank/chr_data.chr"& M7 ^* \' w8 P5 S8 F% d7 m& ^+ D
-
2 d# }3 F% D: ?. i; R( c - .BANK RESET_BANK & BANK_DATA_MASK7 a7 G6 p& g- p7 p8 W
- .ORG RESET_ADDR
+ K, \, X* T: P" ?) y - ( e- A1 m% ~, B/ `. m4 a' _- E
- ;--------------------------------------------------
6 d* ~8 {7 {' I9 K5 ^ - Attributes_Data- C3 ` i3 H2 Y
- ;命名表属性, L& \. _! u2 i2 S/ Q0 S% d
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
2 A1 H6 T( {$ W5 w# ^ - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA, u* b4 @) q( z* l Y9 o' V/ s* U
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
/ O! r& ]' Q; m - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
1 K9 h8 O0 c* g9 R$ [. Y - ;--------------------------------------------------) M) G1 |" j1 u4 h: u" ^: u1 v
- ;调色板数据
9 {& \$ m: g2 Y2 G2 G( m9 C - Palette_Data+ Y, K4 r2 Q- K$ G8 T4 ~% j
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F' \( E, d8 c' y6 h* `- G c
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
+ N8 E# c$ z5 h) {3 k4 J! L - 1 v9 w% ~' r; j- ^& t( u
- ;==================================================
/ A3 B* k( |/ n* D& @7 ?" a - ;命名表初始化
! ~9 R X* I) r8 K( r! h! ? - Init_Name_Table2 N& e' t; C4 c/ S# d- ^* k' |
- LDA #$20
) J" `' J) D e$ v9 @- a - STA PPU_ADDRESS
9 O3 R. S) E# I1 r8 G! G( G - LDA #$00( P% [7 X* k5 L. I, [9 E! I
- STA PPU_ADDRESS3 [6 ?+ A3 {1 G9 z
- LDA #$00
. u9 T9 W- P" |- ?2 z* B6 y - LDY #$008 b9 U9 G3 ~& E: r' V6 [
- LDX #$10
/ x/ o5 X5 L- ^1 y5 o C - Init_Name_Table_Write
6 @8 I" i& W& J5 o% m/ ]& V - STA PPU_DATA+ o0 t+ j* N# e& U$ O; A! Z
- INY
- @8 d. }* q' A2 j# _ - BNE Init_Name_Table_Write7 Q/ c1 u8 X& V% W
- DEX
4 Z: K7 k$ w# P: o - BNE Init_Name_Table_Write
+ W, x# i* D" ^# Y, {' d6 d - RTS
) B, q+ t% [5 ~# ?: J* a - 9 F; F; g) W3 N
- ;==================================================
2 o* ^' X5 `/ N3 r) u7 p - ;调色板初始化* G4 l- O' S L
- Init_Palette+ u, E( o0 Q3 ]8 c0 N) K
- BIT PPU_STATUS% u0 w! v, l& }' `/ k8 V8 n
- LDA #$3F
# A f: Y+ z9 C( p5 \* v - STA PPU_ADDRESS0 l N u0 d1 A4 W2 G6 _% b) ?7 e
- LDA #$00& R2 c- q+ d! a
- STA PPU_ADDRESS) q4 D3 |- q) W# v
- LDX #$00! \+ A! L, M, B$ |
- Init_Palette_Write2 k/ P3 C$ T# L+ z
- LDA Palette_Data,X
9 [2 J) @& H' y% E9 t% i - STA PPU_DATA3 C* B* a. N. X& i. X+ X
- INX
: E% Y( e/ O$ L, [' B- X7 l1 x - CPX #$20
/ X! P- D9 G1 H- O% a - BCC Init_Palette_Write
4 A0 _; ^6 F$ d - RTS
7 M5 u r: {% Z0 b - # X* X% a' V5 J- F6 O7 m7 K* ?2 B
- ;==================================================4 E3 j* Q; D' U( I5 L, Z( |7 b0 X
- ;设置命名表属性
" W$ |" [+ b" q$ P& L- T5 u% @ - Init_NameTable_Attributes5 a" `5 d9 E. e+ r& F' O
- BIT PPU_STATUS
w2 N0 H s1 l `0 V* D - LDA #$23
% B! P& o! {$ g# Y ?! [ l9 M - STA PPU_ADDRESS
" B+ r3 M* O2 J6 [4 o - LDA #$C06 q8 z/ Y5 `+ o! R
- STA PPU_ADDRESS& D( I8 ^; m7 S
- LDX #$007 o. f/ b: {4 p. P
- Init_NameTable_Attributes_Write0 ]( z2 p7 F# `6 {
- LDA Attributes_Data,X3 c" \7 ?9 |5 k4 T2 A+ a e Z
- STA PPU_DATA
% ?3 x1 k: b! q - INX0 u% _7 K* s/ t- e' Y
- CPX #$401 g8 _& g" K5 U$ Q6 ]6 t, L
- BCC Init_NameTable_Attributes_Write
( R( Q7 g" N" A" Z3 T - RTS- H$ l0 D V* _
* y# ^& O _, f& F" \- ;==================================================/ y4 g; G" I6 Y7 m, v
- ;初始化命名表文本
h: X8 P# c# K& J8 J - Init_Name_Table_Text1 \8 w% p3 X: k/ n9 R- R! {/ H7 x# p* \ R
- BIT PPU_STATUS- ^& x. a8 i! B
- LDA #$20
; e) @6 }3 m$ a1 t1 M - STA PPU_ADDRESS
, b; A" f% D( }) H; x2 F0 ?5 w - LDA #$005 `$ K( {) Z% B( [2 _
- STA PPU_ADDRESS, q7 F& D6 k" ^& Z+ N& G1 g0 V0 N
- LDA #$00# r! K$ @" j) C+ F: _7 W
- STA FC_Data_Buf" f+ F/ A0 O! p5 d! @
- LDY #30' X4 v4 M+ T) e$ U! }& h2 w' N: m
- Init_Name_Table_Text_Write6 ]2 r' }8 c6 _8 c3 p ^' Q
- LDX #32
$ g) x M( Z7 | P" ?# m4 k - Init_Name_Table_Text_Write_Char
( k# ~4 D% ~# V- {; T- ~8 [ - LDA #'0'6 V$ B$ X9 V0 C/ E
- CLC5 y' x( i8 ]% y# [! z
- ADC FC_Data_Buf# {+ E+ N9 p2 `
- STA PPU_DATA
' R! K0 \0 q0 } - DEX3 [. j7 m, c9 N1 |" d1 |
- LDA #$14. k1 H: d( ~ I U l& `
- STA PPU_DATA
1 { |* V" g, f: i9 ^ - DEX- K; X7 V" H3 l" J+ R4 I6 ~
- BNE Init_Name_Table_Text_Write_Char* _2 m7 I* U% ~$ f: [! b
- INC FC_Data_Buf
K- S% b, S2 w+ u - DEY
. t7 f7 {' o6 B1 A* p+ Y4 D0 J - BNE Init_Name_Table_Text_Write
, _- L9 \; _8 d7 N; d4 _ - RTS1 X1 D, I" D2 t7 y
% V u& |+ V7 v5 p, y# E) J( g- ;==============================
% G' h, l6 r9 l! d& V - Init_OAM_Ram;初始化精灵内存. s' |2 H2 j9 H6 t5 l
- LDX #$00
$ q, {8 i0 G; [' ]/ H7 y/ k - LDA #$00
/ w( K8 E7 M; I: s' B - STA PPU_OAM_ADDR
; O5 o% P5 y o' t- O: l' z( { - LDA #$F8! ]! Y6 z- I3 O7 n
- Init_OAM_Ram_Write
& m- B) w: `! R5 m1 d6 G - STA PPU_OAM_DATA
" D" v! g) p* n: t - INX- [+ `6 h/ a2 f( [
- BNE Init_OAM_Ram_Write& Z* ?* Z) }0 n& r a
- RTS
4 P/ m- ~1 A# h! Z -
6 X1 D7 A1 S0 j1 y! N6 s - GamepadProcess;手柄处理7 H; s3 B' `* O5 |/ H! B
- JSR GamepadDatacan
0 O+ f) ? ~) G( {1 ^ - LDA <Gamepad_0_Value
/ z( Q# X: ?7 [4 U8 @6 v# c+ N - STA <Gamepad_0_State
! T9 Z& {2 m$ J; ?, N: i - LDA <Gamepad_1_Value' r) t: c; N8 ^! {" E- G+ w
- STA <Gamepad_1_State* C i7 t" O4 ^
- JSR GamepadDatacan6 A4 o9 O& v' j" _4 ^7 C
- LDX #$01* V4 |" n! w1 R; [ M* f. l
- GamepadMergeCheck;合并手柄输入检查 ]/ T( S1 {$ ]) t" \3 x7 B7 R: d' J
- LDA <Gamepad_0_Value,X
8 z# j" d+ t B+ X' R) C$ z0 y - CMP <Gamepad_0_State,X
! T7 B( S; Y$ f- Z - BEQ GamepadMergeInput
% l$ }0 |+ q. L9 }. e# i - LDA <Gamepad_Temp,X! \- `9 h1 |' \
- STA <Gamepad_0_Value,X
& s1 `6 i* ]( M1 e" | M% Q5 c4 N - GamepadMergeInput;合并手柄输入
" D8 c1 m/ k6 h# ~5 M - DEX1 g, c9 L( L1 j! ^
- BPL GamepadMergeCheck6 J! r6 i) T" E/ X$ r& N
- LDA <Gamepad_Merge
h2 {* W$ d& w' _) l - AND #GAMEPAD_MERGE_FLAG
, p( v9 f4 O/ H6 [8 p8 V1 u - BNE GamepadStateProcess
& Q$ n9 a. x2 \ - LDA <Gamepad_0_Value5 c T8 B; ^/ }8 J3 q2 J1 a3 W/ S
- ORA <Gamepad_1_Value6 w: C0 ~, ]2 {+ L& _& t/ _
- STA <Gamepad_0_Value1 C6 B* k! E9 j( w( ~1 G
- GamepadStateProcess;手柄状态处理! X3 f- @. A+ v' s
- LDX #$01
0 _5 K( Z# R* `" `3 L& S+ q - GamepadStateSave;手柄状态保存
6 d7 q7 {9 V5 o5 p - LDA <Gamepad_0_Value,X/ z" z9 n# e- m1 w
- TAY/ q* Z( e: a4 v+ [
- EOR <Gamepad_Temp,X3 U, z" P4 {1 j$ X! ]
- AND <Gamepad_0_Value,X
6 P2 w; g# t4 l J - STA <Gamepad_Once,X, C8 g, v+ Y; C6 c- T: A
- STY <Gamepad_Keep,X9 a7 h0 s7 A$ i/ m0 Y- i
- STY <Gamepad_Temp,X9 [+ q( y0 i. q( E0 }9 {8 l- B
- DEX' z( ^. E9 f) C, d9 L
- BPL GamepadStateSave9 P7 s7 b8 G$ k, Y7 `# Z
- RTS
) N/ k$ b$ R" ?# |: @ - : _" R. a& e8 [. @8 v/ t" C5 G
- GamepadDatacan;手柄数据扫描( N5 x- z `9 o1 W3 y- D) }
- LDX #$01/ A$ b# d- g" j; A7 t/ n! b
- STX $4016; n f0 m0 R+ E K" c* }
- DEX3 c- Y1 d1 ]8 w8 ^, S
- STX $4016: Q* Z% g9 B" V
- LDY #$08
' \) P( ~" S1 B& K0 E - GamepadPortScan;手柄端口扫描1 Y% Z5 Z& `) V
- LDA $4016. b/ @" n& m- b- m/ x* x
- STA <Gamepad_Port_Value( l/ W7 d2 b/ l
- LSR A
% V6 [: }8 t6 X" N# w - ORA <Gamepad_Port_Value
" ^' J( p7 k* L% b$ D - LSR A& q% n& C9 Y1 [$ K L$ A
- ROL <Gamepad_0_Value6 q1 ^' ^& ^# k9 c* |9 }4 T
- LDA $4017
7 ~. T# S/ B' J6 y( \& k - STA <Gamepad_Port_Value
# I, g6 l0 r4 J - LSR A* E$ p9 V+ f0 z# k
- ORA <Gamepad_Port_Value
" K1 y9 z; o' O7 S - LSR A0 S- V! G4 P( c+ \$ s4 G4 y7 N2 _+ T
- ROL <Gamepad_1_Value& w' I7 k- D) O3 [. B6 F0 Z+ i
- DEY2 ~( ]& M# n7 a1 P/ T
- BNE GamepadPortScan
) ]2 U( b/ R0 u/ g - RTS
# m- \8 B, T* O: |$ m - - k; L( Q! j1 r8 _
- ;==================================================& B. X1 X7 e# s5 H5 K/ s2 Z, i6 L- y
- ;PPU处理" y( {! f' W$ l5 G
- PPU_Process
7 p, W8 l/ k! Q8 |$ O Q0 F8 V H - LDA #$006 k H/ a3 c: n8 r6 e
- STA PPU_MASK
7 p9 l3 v" d+ M% u- N1 D9 @ - ) Z4 {: U- j4 y5 T" t% L& p) a
- BIT PPU_STATUS
. ?, d, T! o0 V0 P$ H( S" y - LDA #$20
) }9 B3 P0 k: _6 L1 `7 { m5 P - STA PPU_ADDRESS
" m& i' E( ?; T; R - LDA #$00, M* X L) f* c6 F7 `( p
- STA PPU_ADDRESS. d, S- t2 J2 y: b
-
) U9 U K2 W* ]& l+ Q: ]) R# Y% b) E - STA PPU_SCROLL8 s- p4 Q7 g/ A! u! E% V/ N
- STA PPU_SCROLL
- y8 J P% {3 i" t+ L1 E. k -
& X/ U+ A7 F3 Q; d& `; F - LDA PPU_Msak_Buf6 M9 o- l( y0 w2 e
- STA PPU_MASK
; B2 S& Q1 S l
0 ?5 Y3 |3 P" `/ t7 |4 W% G( `- RTS
( e' F4 T. T, G; }* \) E - ) v2 k6 M+ K2 X$ \
- ;==============================3 A0 S+ N: Y+ K% W0 g# E/ e
- Time_For_Vblank;延时等待0 ]6 h: J: o+ p4 {8 E5 g
- LDA PPU_STATUS3 L* [. ?4 M7 r
- BPL Time_For_Vblank! y- j7 D4 ^8 X- ^
- RTS
~2 A% E% \1 h1 Z9 M4 t0 B5 v$ j' h - 4 F" s9 U" l1 g( y
- ;==================================================- g9 l8 `9 S- s* [, I* i% l3 I
- ;初始化MMC5
% E$ N$ n# F5 L' T1 F- [4 M9 A; {# Q0 S# j - Init_MMC5* M7 L4 ~6 E2 _7 }
- Y# z9 w4 f% O3 h- ;设置一下6000-7FFF的RAM/ X, `9 U, E' ?
- LDA #$002 |% j% v1 A! `
- STA MMC5_PRG_BANK_6000
% k# g1 ?: Y6 a7 U+ D - : L, g: e0 B: \1 R6 F
- ;开启 PRG RAM 写入
1 X; u. Y" ]+ p2 B4 S7 U- _# F - LDA #$02
' j" h$ N# K; X - STA MMC5_PRG_RAM_PROTECT_1, `; X5 y3 Z. U8 D) \, y/ p
- LDA #$01; |$ x; x0 Q' K5 W
- STA MMC5_PRG_RAM_PROTECT_25 T/ w ^3 G, q+ H3 }
- " O! k% A5 ]7 i) S" e* Y
- ;启用 1KB 扩展RAM ($5C00-$5FFF)
6 O' ~8 R( c% d" D5 I - LDA #$02
/ Q3 B6 {+ i) d! R2 S - STA MMC5_EX_RAM_MODE. h& @: m# `- U- E: G6 z R
-
3 n$ r4 z4 G t$ y6 v1 m$ Y - ;设置 CHR( b- B3 H' t4 R1 h* K9 @! ?* I8 x) b
- LDA #$00& r6 R# C' Q9 B3 \
- STA MMC5_CHR_BANK_0000
1 K' Z( M. G; T/ L) a - LDA #$01; C- z b. w. f4 P
- STA MMC5_CHR_BANK_0400
% D9 S2 ?* s+ A' t - LDA #$02+ ^8 j9 {1 J" I7 b; I5 ?# ?# U
- STA MMC5_CHR_BANK_0800
$ J0 i) T/ v: I3 N - LDA #$03
% }9 t& D3 b0 @" r6 ?" {9 } B- P - STA MMC5_CHR_BANK_0C00
+ [1 Y6 j# m" y/ R# K3 e5 k, ?. p - LDA #$04
' H5 {* }7 Z, @. O+ [2 t - STA MMC5_CHR_BANK_1000
0 C! q7 P1 Q0 f4 E - LDA #$05
& ]+ i; L- @, B) V" b8 t - STA MMC5_CHR_BANK_1400
2 {$ [! m _& f+ { - LDA #$069 s# K5 R2 j9 ~# ^3 ]
- STA MMC5_CHR_BANK_18001 Z( j* R4 C8 X$ N+ t0 ^. w
- LDA #$075 W' U! ]0 I& S( o" X
- STA MMC5_CHR_BANK_1C00
2 {: u; W0 W0 v% @9 E -
a3 H9 G, V. b: i: i - ;设置屏幕镜像/ Z! Q, ^' S6 g6 `
- LDA #$50
6 J# M3 M% _9 h* `& T - STA MMC5_NT_MAPPING, G# \5 F3 M1 r! D& S1 N, k
- 2 b0 N/ m% r0 ^; z: b
- ;禁用IRQ3 a, i w# j: Q' K9 l- q
- LDA #$00 _' x. \( n; ]! M; g/ M- p
- STA MMC5_IRQ_SCAN_CMP
( Z9 Q9 ?! }4 X9 h* p* I1 e - STA MMC5_IRQ_STATUS
( T4 g" R- m% u0 I3 h; k( W - + G/ K' O6 }5 \9 W- w8 _( l
- RTS
m( \5 }( w; V -
# Y5 `; g& _3 N8 V1 {* q - ;==================================================
' | M. E J- g& A/ A# T! `6 U& F( A - ;重置中断处理6 _5 h0 e( [. V
- ResetProgram4 n! l4 _$ |* u& ]3 z; d) x
- SEI
* d' n* f& y( B - CLD: W2 N: i$ j/ I
- LDA #$00/ ?7 ~1 `( n- Y; ]" r
- STA PPU_CTRL8 j, V7 ^6 j1 J+ I- ` t
- STA PPU_MASK# e- _5 e3 n$ F: E5 E: u
- STA PPU_STATUS
( s. P( ]3 M% y; f5 l/ \9 A4 f - STA JOY2_FRAME. F" s2 `/ o, ?4 q
- STA APU_STATUS
$ j# A3 q! z0 `+ |, j -
! p* } _" P( {" t0 L4 g1 {; i - LDA #$C07 N* s% Y5 E1 t& c
- STA JOY2_FRAME
2 `6 o$ r# ~# y: O) v4 y -
. k; y) \: p+ r. z4 [; I - ;等待vblank4 G4 r, G( F1 I
- LDX #$02
2 r1 b7 l; U% x: j" ~ - Vblank_Wait_1
1 L# r& v0 M3 v - BIT PPU_STATUS% \6 f4 ~) Q& F4 j7 N3 _2 k
- BPL Vblank_Wait_1/ v! a) o9 w" b- y( a2 ^2 D7 k
- Vblank_Wait_2( e( ?: l |( Z3 s+ i3 G' X0 _
- BIT PPU_STATUS; u6 A3 T/ ]$ `
- BMI Vblank_Wait_28 A. S- J& O; Y4 H& L& D
- DEX
& _; p2 g* | Y f) H3 a+ p - BNE Vblank_Wait_1
; h1 l3 {7 p5 i( D- X; G -
4 L1 [; d& y, N5 t; n: n - LDX #$FF4 T* Z" `. R$ W% ]
- TXS
7 ]( W) M$ K, `3 A# z! L- ] -
) G; b2 A: S- i6 R - ;初始化MMC5
2 a+ d+ X& q4 T- w& f1 ~ - JSR Init_MMC59 |3 H6 Q4 I. K" w F1 h
-
3 F6 J7 g5 Q u; t ? - ;==============================% Z& D$ c" C6 [8 ]8 ]
- ;RAM初始化9 ^7 I- ]6 i* t( S
- Nes_Ram_Init* L9 b: ?; j% M( R" i) M4 s
- LDY #$00
8 G( H7 `$ v" O% O9 B8 T: \ - LDX #$08) L' c# B% L( Y, A
- LDA #$00; E, U$ J7 T5 W6 t- m
- STA <$00
+ H( r3 ^4 Z+ X - STA <$01
' h8 [5 i# Q- f. l# Y/ \: L8 U( I4 ~ - Nes_Ram_Init_Write
7 U+ }! e2 U r! I4 e; V5 u7 @2 [ - STA [$00],Y/ F Y3 C% F( q
- INY
2 K" H5 h6 x$ P5 T - BNE Nes_Ram_Init_Write
/ ~# u+ ?4 f7 @. r% ^4 U8 R - INC <$01
3 t9 s( `1 P$ w$ ^( h+ { - DEX
- t6 g2 w/ Z: Y" G2 B - BNE Nes_Ram_Init_Write
# K3 \* J+ s U/ A; n2 d) N" X -
4 ?! V2 G3 r0 f' w+ j; x$ h - ;初始化命名表
& J, _5 G: E$ |; L( n' v - JSR Init_Name_Table+ U: v. s2 Y3 G, @0 y+ k
-
( X# K' n; l+ i: F# A - ;初始化调色板2 U1 ^) F: p. y& w9 B' _$ H
- JSR Init_Palette& e# y7 |: S* F4 {
- 8 ]; b/ |, H( G1 ~3 i
- ;初始化命名表属性0 y5 P* k% y2 G( L7 q4 T
- JSR Init_NameTable_Attributes, K) Y3 E1 Y7 v, U' k) D
- " r( z G- N( w/ p4 e
- ;初始化精灵内存2 H- h9 U6 V) Y: |
- JSR Init_OAM_Ram. s) S/ H- K q, l3 A9 N j
-
3 K2 s! r* k& k, z" Z - ;在屏幕上写点东西
' |- h2 }9 G3 ^ - JSR Init_Name_Table_Text
% ~5 t: x3 T& g) E - & _+ p( h& I3 Q( o6 Y1 A5 |
- JSR Time_For_Vblank
9 t& @2 D* a; s5 E; U+ a - ;开启PPU控制
, p1 b; j) ?- q - LDA #$88* {& t9 J% r- c x; r0 j- n
- STA PPU_Ctrl_Buf8 e: z" _! R% @6 }6 U1 ~8 R9 U
- STA PPU_CTRL& X$ o% C9 a# B* K) Z5 ?
- ! a8 s8 R% c# V
- ;开启PPU显示+ o* Y" M0 `% ~. K+ S; o5 d% S- k& ]; h
- LDA #$1E* K! ?, C" h5 l1 f' x
- STA PPU_Msak_Buf
/ p" d* p+ N6 X9 v, e( h - ) i3 R+ K0 p8 q
- CLI) |9 h. g, e; r# y, L& J
- JMP Loop
9 E& U$ E1 T5 P$ }; M -
- V" j% B% C5 I1 p0 ~ - ;==============================( r: q4 v( N; |' }' ` o0 g( \
- ;死循环, 等待NMI中断
) c! g8 W1 g, l: x& ` - Loop
* [2 I' B- s9 Y6 g8 A; i9 t - JMP Loop
' y T2 G0 E" a* O! u3 O6 F" u - 9 S) b4 q% G1 Y1 _
- ;==================================================
9 I; _: s6 A" g) W5 a) d6 Z. f1 F - ;NMI中断处理
! d- h- M& p! K/ I5 a - NmiProgram
S" A3 P9 m% q' a - PHA
7 B9 R/ A( k& ~+ U+ V8 J - TXA8 r, K% e) v/ Q8 v& }
- PHA
# x0 ~% m9 F5 E! d$ o - TYA3 a2 N# |% `0 E% c
- PHA; i, y* [8 K- W3 {/ D. _5 ?' K
-
# x# c! W( N! d& J - BIT PPU_STATUS
+ Y2 `8 Y' W/ z% K$ I& A0 ]% o - : }0 X4 Z! [# X6 r) i
- ;启动IRQ中断, 第16条扫描线触发
) n1 Z% m$ ^' ^/ v - LDA #16
6 _: a3 r) q( v0 t% ]# N - STA MMC5_IRQ_SCAN_CMP; H1 k" b: K3 k
- LDA #$80
. z8 v& V: ~0 X2 l - STA MMC5_IRQ_STATUS
' r# J* u2 Q0 s$ R& }5 S - CLI" X8 ^( { L ]: C
-
, ~+ U5 v; c( g9 T - ;关闭PPU控制
* j% _/ @. l' d; i: ~2 f# T# [ - LDA #$005 ^+ Z; c, B. e5 ~3 ?) J
- STA PPU_CTRL+ A7 n+ v. v' V) q; @# `# C
- $ g* D9 y3 p d0 O0 W
- ;处理PPU7 `; w& i$ P9 O" [8 s* p6 h
- JSR PPU_Process- d9 K8 x9 c3 `( C. w4 E$ o5 h
- ' V; R- X; B H% ?2 o, ?
- ;开启PPU控制
+ r! L& w) ^; F+ h2 K2 Q! ^) k - LDA PPU_Ctrl_Buf
8 q6 g0 a. V! M: L" W - STA PPU_CTRL( w8 \9 ~5 r; v0 Y0 S3 A
-
9 `# M4 O: J8 K - ;手柄处理
9 w/ z R2 L( Z& @' Y - JSR GamepadProcess t0 Y& a3 X8 ?2 B9 q p) L
- * q- {3 P, B% I8 q# P; h
- LDA #$00
5 t5 u; a0 |$ t" ^& b0 N8 d; C - STA IRQ_Index7 `6 R) i% [& B0 E3 \
- * b. O7 W% Y# t/ F
- PLA7 O1 c+ T+ {$ ]! d8 n6 v; `8 ^
- TAY4 A R4 e% A& }! j9 n
- PLA$ ~% X+ _$ [6 L! t1 r
- TAX
! E) O- H8 {( X( u# [ - PLA: `, u+ P# J$ G1 {" N, c& {
- RTI
; Y! l- p8 \( L" P
# n+ [" I' T& S: M- ;==================================================' U$ Q/ d# m6 ^. U! ]' v
- ;IRQ中断处理* i5 c8 e( ^' l4 }2 A
- IrqProgram
" k; H$ C, \! \: h. `" Y7 q& ^ - PHA
6 X: d8 H7 P! y6 L& ] - TXA" X$ g+ `4 B1 @' R
- PHA
0 z1 @; `0 c7 t' h, }1 n - TYA
1 p- ^1 q( C8 q$ K. v; T" X - PHA# Q# V) C( v- K& n
-
7 @$ p4 q9 s. L# b: [6 t6 ? - ;确认IRQ
9 N5 `, l7 C* C4 a3 m$ ~5 q$ I - LDA MMC5_IRQ_STATUS
3 Z1 t& O2 k$ d/ J -
m/ G$ U: v8 o/ J7 M9 x - ;允许下个IRQ触发9 h0 [+ O* Y8 M+ X; ~8 d( `( {
- LDA #$80
: u9 S9 _3 W9 S' | - STA MMC5_IRQ_STATUS# k, F2 S1 P) t7 I: \7 W x5 Q
-
7 Z. }2 S2 B/ }; @: ~% T - ;IRQ处理, 每隔16条扫描线触发
& o3 _+ C! [$ I( Y9 c. ` - LDA <IRQ_Index6 V/ i( ]9 W8 {8 v6 S- }
- CLC" s2 q5 |" C3 T7 G% ^7 u ]
- ADC #$02
! p5 v& u5 `6 @: b- {) M: b, V - ASL A4 z( W( J1 y. T A0 |/ E0 V8 Q
- ASL A
; Z3 T c/ K! Q% v - ASL A
- x' p- R* c) i! M - ASL A) l) Z0 q) T1 {
- STA MMC5_IRQ_SCAN_CMP, x4 O1 Q7 o: U& S
- " K; k; I2 P" W1 [
- LDA <IRQ_Index: i5 e* ~! E, `) o8 x' |
- BNE * + 4; ^/ b) t4 U9 J8 F
- INC <PPU_Scroll_H
; X% b& m; X* i* ` - 3 B& U. A0 |" W0 o
- ;设置屏幕滚动
& y! d+ q* }, R- e' N/ [3 D% A1 ~ - LDA <IRQ_Index
- o. z( l2 x! V8 H* f9 n2 q- H - AND #$01
" m; y4 V: V( T8 x. _& | - BEQ Irq_Scroll_Right B$ j- V% N1 F8 H5 M
& S9 I3 a, H& C5 P; D5 M- Irq_Scroll_Left, P7 ^- {/ X F( b7 u
- BIT PPU_STATUS
" `& j* k+ f9 t! Y; T - LDA <PPU_Scroll_H
) {- k% d; @' H( ~ - STA PPU_SCROLL8 c! z, f3 o7 H8 i
- STA PPU_SCROLL
/ p6 ]$ |9 q/ b7 I - JMP Irq_Scroll_Over
: B7 S# r4 l. S& w -
& Y& x' m+ N: h- N - Irq_Scroll_Right
7 p: e3 T4 g- I5 g* F+ f$ X - SEC
% i, m; B6 [) F. \0 H - SBC <PPU_Scroll_H1 \9 Z8 J- p& n) ~0 V
- STA PPU_SCROLL
& I0 {& e: V+ g* ` - STA PPU_SCROLL+ d. Y3 q# E2 f- [) Q9 u
- Irq_Scroll_Over
8 V. s; I, K4 k! I& V; W' z - - U. {! G% h0 O; B* G. A; O
- INC <IRQ_Index
! @; t" d% r: n* s$ N2 {+ r% { -
$ l8 v2 j) \( `/ Q+ K - LDA <IRQ_Index# v1 a& L+ ~0 t' [' E0 j9 W: e
- CMP #148 B( P% @. a/ A4 R4 A
- BCC * + 52 N) z3 K0 G: G
- ;关闭IRQ
5 [8 P' |) F5 S" x- F - LDA #$00
9 X$ C$ p5 @1 n2 O9 W Z- y - STA MMC5_IRQ_STATUS! R1 J* K, z8 F; i Z' |
-
! x% N% R9 H1 _, H4 X0 A2 ^ - IrqProgramEnd; E- h2 T1 F" ^5 n- @9 l" h$ `$ [
- PLA
/ W; Q! j) O$ S- C) h3 q6 h - TAY
* v% ~3 e% o+ o: i: ?: I - PLA! t7 S0 Z; w; Q3 q2 C& X
- TAX
! O) J. m+ L2 E8 m4 X; u1 l. ` - PLA& v* j+ o0 i8 b, k$ w
- RTI
C1 }$ ]6 L9 @4 q" T* @) { - 0 x2 `+ ~9 T. u. d) n; W7 X' A
- ;==================================================' u+ s. W- z# Y! m5 g. y
- ;中断表
4 z. k1 A$ b: a& [# h( R - .ORG $FFFA
0 p+ z& Q2 a) T. M5 I - .WORD NmiProgram
4 R. e' k/ [) a: }4 W - .WORD ResetProgram' f9 F2 T) T' b) U: j7 A- N3 Z6 _- |% S! ~
- .WORD IrqProgram
复制代码 ! f( Q5 g5 ~+ ]( n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|