aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.nasm/memory.txt5
-rw-r--r--.nasm/segments.txt2
-rw-r--r--assets/jetpac.chrbin8192 -> 8192 bytes
-rw-r--r--assets/session.nss58
-rw-r--r--include/globals.s4
-rw-r--r--src/driver.s104
-rw-r--r--src/interrupts.s13
7 files changed, 151 insertions, 35 deletions
diff --git a/.nasm/memory.txt b/.nasm/memory.txt
index 129737f..3367185 100644
--- a/.nasm/memory.txt
+++ b/.nasm/memory.txt
@@ -2,6 +2,7 @@ $00: zp_arg0
$01: zp_arg1
$02: zp_arg2
$03: zp_arg3
+$04: zp_nmi_reserved
$05: zp_tmp0
$06: zp_tmp1
$07: zp_tmp2
@@ -21,6 +22,8 @@ $22: zp_buttons
$24: zp_level
$25: zp_level_kind
$26: zp_multiplayer
+$2E: zp_blink_status
+$2F: zp_blink_timer
$30: zp_title_timer
$32: zp_pause_timer
$33: zp_next_bullet_cycle
@@ -69,4 +72,4 @@ $4016: m_joypad
$4017: m_frame_counter
--- Summary (in bytes) ---
-- Internal RAM: 390/2048 (19.04%)
+- Internal RAM: 393/2048 (19.19%)
diff --git a/.nasm/segments.txt b/.nasm/segments.txt
index 0b837c2..8849458 100644
--- a/.nasm/segments.txt
+++ b/.nasm/segments.txt
@@ -1,4 +1,4 @@
- HEADER: 16/16 (100%)
-- ROM0: 6671/32762 (20.36%)
+- ROM0: 6772/32762 (20.67%)
- ROMV: 6/6 (100%)
- ROM2: 8192/8192 (100%)
diff --git a/assets/jetpac.chr b/assets/jetpac.chr
index e50b3fe..f5d271c 100644
--- a/assets/jetpac.chr
+++ b/assets/jetpac.chr
Binary files differ
diff --git a/assets/session.nss b/assets/session.nss
index a8197ef..7a510af 100644
--- a/assets/session.nss
+++ b/assets/session.nss
@@ -54,8 +54,8 @@ VarPalBank_mapBuffer=0
VarPalBank_msprBuffer=0
VarTileViewTagBuf=0
VarBgPalCur=0
-VarPalActive=1
-VarTileActive=48
+VarPalActive=3
+VarTileActive=129
VarBankActive=0
VarPPUMask=0
VarPPUMaskSet0=0
@@ -75,18 +75,18 @@ VarNameViewX=0
VarNameViewY=0
VarNameViewX2=0
VarNameViewY2=0
-VarNameSelectionL=12
+VarNameSelectionL=-1
VarNameSelectionR=21
-VarNameSelectionT=11
+VarNameSelectionT=-1
VarNameSelectionB=12
VarNameCopyW=17
VarNameCopyH=3
-VarCHRSelectionL=0
-VarCHRSelectionR=1
-VarCHRSelectionT=3
-VarCHRSelectionB=4
-VarCHRCopyW=2
-VarCHRCopyH=2
+VarCHRSelectionL=1
+VarCHRSelectionR=3
+VarCHRSelectionT=8
+VarCHRSelectionB=9
+VarCHRCopyW=1
+VarCHRCopyH=1
VarCHRCopyRect=1
VarCHRSelectRect=1
VarCHRBanks=4
@@ -160,7 +160,7 @@ RadioAutoexport_UseSubDir_NEXXT=0
CheckAutoexport_MetatileAsBMP=0
-VarCHRSelected=00[30]0100[cf]
+VarCHRSelected=00[81]0100[7e]
Palette=0f302c280f16101b0f1610300f1630000f302c280f1122330f282c160f1324350f1324360f1526370f1627370f1928380f1829380f1b2a390f1b2b3c0f1c2c3b
@@ -169,13 +169,13 @@ Palette=0f302c280f16101b0f1610300f1630000f302c280f1122330f282c160f1324350f132436
PalUndo=0f302c280f16101b0f1610300f1630000f302c280f1122330f282c160f1324350f1324360f1526370f1627370f1928380f1829380f1b2a390f1b2b3c0f1c2c3b
-CHRMain=00[10]2f7fffddfb7b71212f7fffddfb7b7121bdff[2]f7ebddad04bdff[2]f7ebddad044cfeff3efffe9c084cfeff3efffe9c0800[8]01[2]02[2]05[2]090800[8]80[2]c0[2]e0[2]f01000[8]09[8]00[8]f0[5]50[3]00[8]09[5]19[2]2900[8]10f0b030b018f8fc00[8]2959[2]89b9[4]00[8]fcf4f6[2]f1f7[3]00[8]b9[3]f9a9[2]f4f500[8]f7[2]fff5[3]6fef00[8]555289b9b800[b]eacb91971700[4]3c464a52623c00[a]182808[3]3e00[a]3c42023c407e00[a]3c420c02423c00[a]081828487e0800[a]7e407c02423c00[a]3e407c42[2]3c00[a]3e02040810[2]00[a]3c423c42[2]3c00[a]3c42[2]3e023c00[9]3c4299a1[2]99423c00[9]3c42[2]7e42[2]00[a]7c427c42[2]3c00[a]3c4240[2]423c00[a]7c42[4]7c00[a]7c407040[2]7c00[a]3c40[2]7040[2]00[a]3c42404e423c00[a]42[3]7e42[2]00[a]3e08[4]3e00[a]02[3]42[2]3c00[a]44487048444200[a]40[5]7e00[a]42665a42[3]00[a]4262524a464200[a]3c42[4]3c00[a]7c42[2]7c40[2]00[a]3c42[3]3c0600[a]3c42[2]7c444200[a]3e403c02[2]7c00[a]3e08[5]00[a]42[5]3c00[a]22[4]140800[a]42[3]5a664200[a]422418[2]244200[a]41221408[3]00[a]7e040810207e00[9]18243c7e5a3c[2]6600[10]0810[2]20e0c000[2]30d0f0[6]30d0f0[7]fefffcfeff[3]f0fefffcfeff[3]00[a]01030206[2]0c00[8]0fffbf3f7f[2]ff[2]4f50607f00[4]4f50607f00[4]ff00[2]ff00[4]ff00[2]ff00[4]f90503ff00[4]f90503ff00[4]30ff[3]f0207f[2]30ff[3]f0207f[2]8f80407f00[4]8f80407f00[4]ff[8]00[8]ff[4]00[14]077f4f8f[5]00[8]ff[8]00[2]c06030188cc400[2]c06030188cc400[8]f8fce6[2]e7[4]00[8]071f3f5f9f[4]00[8]ff[6]fe[2]00[8]f8c6c182[2]04[2]0800[8]3f7fffdf9f[4]860488f800[4]860488f800[c]fe[2]c1a190fffcd800[8]e0f0b89c[2]8c[3]0c0919[2]3b33276f0c0919[2]3b33276fff[10]fcfbf8f0f1e1[2]c3fcfbf8f0f1e1[2]c300[4]ff[4]00[8]9fa0c0ff00[4]9fa0c0ff00[c]8f[2]cf77340f00[a]ff[5]7fbf00[9]ff[4]fe[2]fd00[9]e7f7fe1e3cf800[a]9f[5]bfff7f00[8]fe[2]c1a190fffcdf00[8]0810[2]20e0c0fc0200[8]9f[5]a0ff4000[8]ff0f[3]ff00ff00[9]ff[5]00ff00[9]8c[4]ccf8[3]fcf8c06030188cc4fcf8c06030188cc44f48f0ff00[4]4f48f0ff00[4]e6160cf800[4]e6160cf800[c]f1[5]f9fdff00[8]f8f6f1[6]00ff[3]00[2]ff[2]00ff[3]00[2]ff[2]7fbf5f9f[5]7fbf5f9f[5]fefdfaf9[5]fefdfaf9[5]00[8]0d191b3337674fff807fff[3]bf9f[2]807fff[3]bf9f[2]3fdff0ff[4]f03fdff0ff[4]f0e4fa0cfafcfafc0ee4fa0cfafcfafc0e78bf5f9f[5]78bf5f9f[5]fefdfbfdf9[4]fefdfbfdf9[4]7ffffc00[5]7ffffc00[5]f1c00103[2]06[2]0cf1c00103[2]06[2]0cf3ff[2]fcfeff[3]f3ff[2]fcfeff[3]1f7f9f[6]1f7f9f[6]ff0100ff00[4]ff0100ff00[c]ff[4]0f[3]ff01fdfefd1e0dfefb01fdfefd1e0dfefb3f2f4f[6]3f2f4f[6]9f3fff[6]9f3fff[6]f9[10]00[8]ff[5]fe[2]ff9f[10]00[891]03071617[2]33300003071617[2]333000c000[4]e000[2]c000f070[2]e0002b3f01[2]03[3]002b3f01[2]03[3]00e0[2]d0a030b8fc00e0[2]d0a030b8fc0001[2]02[2]05[2]090801[2]02[2]05[2]090880[2]c0[2]e0[2]f01080[2]c0[2]e0[2]f01009[5]19[2]2909[5]19[2]2910f0b030b018f8fc10f0b030b018f8fcb9[3]f9a9[2]f4f5b9[3]f9a9[2]f4f5f7[2]fff5[3]6feff7[2]fff5[3]6fef00[2]3c3f7f7c7d[2]071f3f7ffffcfd[2]00[3]e0f038[2]bce0f8fcfeff3fbf[2]00[4]18ff[2]8a00[c]18ff[2]8b00[8]ff[2]00[16]ff[2]00[6]2b3a2a3a2d3d1f152b3a2a3a2d3d1f15c068[2]1ce0[4]c068[2]1ce0[4]2a3d070f667038002a3d070f66703800e060[3]70787c00e060[3]70787c0009[10]f0[5]50[3]f0[5]50[3]2959[2]89b9[4]2959[2]89b9[4]fcf4f6[2]f1f7[3]fcf4f6[2]f1f7[3]555289b9b800[3]555289b9b800[3]eacb91971700[3]eacb91971700[3]7c7f[2]3f[3]00[2]fcfff17c7f[2]3f073efef8fcf0e000[2]3fffe71efc[2]f8e0ba8abab8ff[2]1800[9]bb9bbb89ff[2]1800[9]ff[2]00[6]ff[2]00[16]2a3e00[6]2a3e00[6]e0[2]c000c0e0f000e0[2]c000c0e0f0002a3e00281c206c102a3e00[6]f0[2]3000383c00[2]f0[2]3000383c00[3]071f3f7f[2]ff[2]00071f3f7f[2]ff[2]00e0f89c8ec6e7[2]00e0f89c8ec6e7[2]00[2]092e4f33f1fc00[2]092e4f33f1fc00[3]2080e4f07400[3]2080e4f07400121a6b5f3ff93600121a6b5f3ff936004094eafffe9f6c004094eafffe9f6c00[3]031ffcff0300[3]031ffcff0308[2]7cfe8301ff5108[2]7cfe8301ff51030607[2]047b94d5030607[2]047b94d58040[2]c040bc525a8040[2]c040bc525a0c1f13[2]3f4cd0df0c1f13[2]3f4cd0df60f098[2]f46e9fff60f098[2]f46e9fff18243c7e5a3c[2]6600[b]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f3ffdfe3f800[10]ff[2]7f[2]3f1f0700ff[2]7f[2]3f1f0700ff[2]fe[2]fcf8e000ff[2]fe[2]fcf8e000f1c7797531190e00f1c7797531190e00d6e1e4f2b8402000d6e1e4f2b8402000f6793f4d0f160a00f6793f4d0f160a006e9ffefdf4e844006e9ffefdf4e8440003fffc1f0300[3]03fffc1f0300[3]51ff0183fe7c08[2]51ff0183fe7c08[2]f47b040704070300f47b0407040703005ebc40c040[2]80005ebc40c040[2]8000df7f3f130c00[3]df7f3f130c00[3]fffefcc83000[3]fffefcc83000[3]01070d3f7fd97f3f01070d3f7fd97f3f80e0b0fcfe9bfefc80e0b0fcfe9bfefc00[20]071f3f7f[2]ff[3]071f3f7f[2]ff[3]e0f8fc9e8ec7e7[2]e0f8fc9e8ec7e7[2]00[2]082e4f33f1fc00[2]082e4f33f1fc00[2]801088e2f07600[2]801088e2f07600022957ff7ff93600022957ff7ff936004858d6fafc9f6c004858d6fafc9f6c00[3]031ffcff0f00[3]031ffcff0b08[2]7cfe8331ff4508[2]7cfe8331ff4503040507047b94b503040507047b94b580c0[3]40bc525680c0[3]40bc5256060f19[2]2f76f9ff060f19[2]2f76f9ff30f8c8[2]fc320bfb30f8c8[2]fc320bfb01070d3f7fce7f3f01070d3f7fce7f3f80e0b0fcfe73fefc80e0b0fcfe73fefc00[20]ff[3]7f[2]3f1f07ff[3]7f[2]3f1f07ff[3]fe[2]fcf8e0ff[3]fe[2]fcf8e0f1c7797531190e00f1c7797531190e00d2e0e4f2b900a410d2e0e4f2b900a41076f97fbf2f17220076f97fbf2f1722006f9efcb2f06850006f9efcb2f06850000ffffc1f0300[3]0bfffc1f0300[3]45ff3183fe7c08[2]45ff3183fe7c08[2]f47b040704050300f47b0407040503005ebc40c040c080005ebc40c040c08000ff7f3f130c00[3]ff7f3f130c00[3]fbfefcc83000[3]fbfefcc83000[6]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f2fcdce2f800[e3]03050b1f1e00[3]100204000100[3]c0e0f0f878002000[2]0400[2]8000[e0]1e1f0f070300[3]0100[2]080400[3]78f8f0e0c000[3]8000[5]2000[e3]070f1d3b3e3c0004080022044000[3]e0f0f8bc5c3c0008040200402000[e1]3c3a3d1f0f0700[3]040220100800[2]3c5c1cf8f0e000[3]20e000[2]020600[e3]071c30206040081000408000[2]0600[2]e0380c04060204080100[4]6000[e0]406020301c0700[2]01000200[3]50200206040c38e000[2]8000[3]0100080400[23e0]
+CHRMain=00[10]2f7fffddfb7b71212f7fffddfb7b7121bdff[2]f7ebddad04bdff[2]f7ebddad044cfeff3efffe9c084cfeff3efffe9c0800[8]01[2]02[2]05[2]090800[8]80[2]c0[2]e0[2]f01000[8]09[8]00[8]f0[5]50[3]00[8]09[5]19[2]2900[8]10f0b030b018f8fc00[8]2959[2]89b9[4]00[8]fcf4f6[2]f1f7[3]00[8]b9[3]f9a9[2]f4f500[8]f7[2]fff5[3]6fef00[8]555289b9b800[b]eacb91971700[4]3c464a52623c00[a]182808[3]3e00[a]3c42023c407e00[a]3c420c02423c00[a]081828487e0800[a]7e407c02423c00[a]3e407c42[2]3c00[a]3e02040810[2]00[a]3c423c42[2]3c00[a]3c42[2]3e023c00[9]3c4299a1[2]99423c00[9]3c42[2]7e42[2]00[a]7c427c42[2]3c00[a]3c4240[2]423c00[a]7c42[4]7c00[a]7c407040[2]7c00[a]3c40[2]7040[2]00[a]3c42404e423c00[a]42[3]7e42[2]00[a]3e08[4]3e00[a]02[3]42[2]3c00[a]44487048444200[a]40[5]7e00[a]42665a42[3]00[a]4262524a464200[a]3c42[4]3c00[a]7c42[2]7c40[2]00[a]3c42[3]3c0600[a]3c42[2]7c444200[a]3e403c02[2]7c00[a]3e08[5]00[a]42[5]3c00[a]22[4]140800[a]42[3]5a664200[a]422418[2]244200[a]41221408[3]00[a]7e040810207e00[9]18243c7e5a3c[2]6600[10]0810[2]20e0c000[2]30d0f0[6]30d0f0[7]fefffcfeff[3]f0fefffcfeff[3]00[a]01030206[2]0c00[8]0fffbf3f7f[2]ff[2]4f50607f00[4]4f50607f00[4]ff00[2]ff00[4]ff00[2]ff00[4]f90503ff00[4]f90503ff00[4]30ff[3]f0207f[2]30ff[3]f0207f[2]8f80407f00[4]8f80407f00[4]ff[8]00[8]ff[4]00[14]077f4f8f[5]00[8]ff[8]00[2]c06030188cc400[2]c06030188cc400[8]f8fce6[2]e7[4]00[8]071f3f5f9f[4]00[8]ff[6]fe[2]00[8]f8c6c182[2]04[2]0800[8]3f7fffdf9f[4]860488f800[4]860488f800[c]fe[2]c1a190fffcd800[8]e0f0b89c[2]8c[3]0c0919[2]3b33276f0c0919[2]3b33276fff[10]fcfbf8f0f1e1[2]c3fcfbf8f0f1e1[2]c300[4]ff[4]00[8]9fa0c0ff00[4]9fa0c0ff00[c]8f[2]cf77340f00[a]ff[5]7fbf00[9]ff[4]fe[2]fd00[9]e7f7fe1e3cf800[a]9f[5]bfff7f00[8]fe[2]c1a190fffcdf00[8]0810[2]20e0c0fc0200[8]9f[5]a0ff4000[8]ff0f[3]ff00ff00[9]ff[5]00ff00[9]8c[4]ccf8[3]fcf8c06030188cc4fcf8c06030188cc44f48f0ff00[4]4f48f0ff00[4]e6160cf800[4]e6160cf800[c]f1[5]f9fdff00[8]f8f6f1[6]00ff[3]00[2]ff[2]00ff[3]00[2]ff[2]7fbf5f9f[5]7fbf5f9f[5]fefdfaf9[5]fefdfaf9[5]00[8]0d191b3337674fff807fff[3]bf9f[2]807fff[3]bf9f[2]3fdff0ff[4]f03fdff0ff[4]f0e4fa0cfafcfafc0ee4fa0cfafcfafc0e78bf5f9f[5]78bf5f9f[5]fefdfbfdf9[4]fefdfbfdf9[4]7ffffc00[5]7ffffc00[5]f1c00103[2]06[2]0cf1c00103[2]06[2]0cf3ff[2]fcfeff[3]f3ff[2]fcfeff[3]1f7f9f[6]1f7f9f[6]ff0100ff00[4]ff0100ff00[c]ff[4]0f[3]ff01fdfefd1e0dfefb01fdfefd1e0dfefb3f2f4f[6]3f2f4f[6]9f3fff[6]9f3fff[6]f9[10]00[8]ff[5]fe[2]ff9f[10]00[a0]ffe7d7f7[3]c1ff00[8]ffc3bdfdc3bf81ff00[178]ff83bd[2]83bf[2]ff00[48]ffbd[5]c3ff00[609]03071617[2]33300003071617[2]333000c000[4]e000[2]c000f070[2]e0002b3f01[2]03[3]002b3f01[2]03[3]00e0[2]d0a030b8fc00e0[2]d0a030b8fc0001[2]02[2]05[2]090801[2]02[2]05[2]090880[2]c0[2]e0[2]f01080[2]c0[2]e0[2]f01009[5]19[2]2909[5]19[2]2910f0b030b018f8fc10f0b030b018f8fcb9[3]f9a9[2]f4f5b9[3]f9a9[2]f4f5f7[2]fff5[3]6feff7[2]fff5[3]6fef00[2]3c3f7f7c7d[2]071f3f7ffffcfd[2]00[3]e0f038[2]bce0f8fcfeff3fbf[2]00[4]18ff[2]8a00[c]18ff[2]8b00[8]ff[2]00[16]ff[2]00[6]2b3a2a3a2d3d1f152b3a2a3a2d3d1f15c068[2]1ce0[4]c068[2]1ce0[4]2a3d070f667038002a3d070f66703800e060[3]70787c00e060[3]70787c0009[10]f0[5]50[3]f0[5]50[3]2959[2]89b9[4]2959[2]89b9[4]fcf4f6[2]f1f7[3]fcf4f6[2]f1f7[3]555289b9b800[3]555289b9b800[3]eacb91971700[3]eacb91971700[3]7c7f[2]3f[3]00[2]fcfff17c7f[2]3f073efef8fcf0e000[2]3fffe71efc[2]f8e0ba8abab8ff[2]1800[9]bb9bbb89ff[2]1800[9]ff[2]00[6]ff[2]00[16]2a3e00[6]2a3e00[6]e0[2]c000c0e0f000e0[2]c000c0e0f0002a3e00281c206c102a3e00[6]f0[2]3000383c00[2]f0[2]3000383c00[3]071f3f7f[2]ff[2]00071f3f7f[2]ff[2]00e0f89c8ec6e7[2]00e0f89c8ec6e7[2]00[2]092e4f33f1fc00[2]092e4f33f1fc00[3]2080e4f07400[3]2080e4f07400121a6b5f3ff93600121a6b5f3ff936004094eafffe9f6c004094eafffe9f6c00[3]031ffcff0300[3]031ffcff0308[2]7cfe8301ff5108[2]7cfe8301ff51030607[2]047b94d5030607[2]047b94d58040[2]c040bc525a8040[2]c040bc525a0c1f13[2]3f4cd0df0c1f13[2]3f4cd0df60f098[2]f46e9fff60f098[2]f46e9fff18243c7e5a3c[2]6600[b]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f3ffdfe3f800[10]ff[2]7f[2]3f1f0700ff[2]7f[2]3f1f0700ff[2]fe[2]fcf8e000ff[2]fe[2]fcf8e000f1c7797531190e00f1c7797531190e00d6e1e4f2b8402000d6e1e4f2b8402000f6793f4d0f160a00f6793f4d0f160a006e9ffefdf4e844006e9ffefdf4e8440003fffc1f0300[3]03fffc1f0300[3]51ff0183fe7c08[2]51ff0183fe7c08[2]f47b040704070300f47b0407040703005ebc40c040[2]80005ebc40c040[2]8000df7f3f130c00[3]df7f3f130c00[3]fffefcc83000[3]fffefcc83000[3]01070d3f7fd97f3f01070d3f7fd97f3f80e0b0fcfe9bfefc80e0b0fcfe9bfefc00[20]071f3f7f[2]ff[3]071f3f7f[2]ff[3]e0f8fc9e8ec7e7[2]e0f8fc9e8ec7e7[2]00[2]082e4f33f1fc00[2]082e4f33f1fc00[2]801088e2f07600[2]801088e2f07600022957ff7ff93600022957ff7ff936004858d6fafc9f6c004858d6fafc9f6c00[3]031ffcff0f00[3]031ffcff0b08[2]7cfe8331ff4508[2]7cfe8331ff4503040507047b94b503040507047b94b580c0[3]40bc525680c0[3]40bc5256060f19[2]2f76f9ff060f19[2]2f76f9ff30f8c8[2]fc320bfb30f8c8[2]fc320bfb01070d3f7fce7f3f01070d3f7fce7f3f80e0b0fcfe73fefc80e0b0fcfe73fefc00[20]ff[3]7f[2]3f1f07ff[3]7f[2]3f1f07ff[3]fe[2]fcf8e0ff[3]fe[2]fcf8e0f1c7797531190e00f1c7797531190e00d2e0e4f2b900a410d2e0e4f2b900a41076f97fbf2f17220076f97fbf2f1722006f9efcb2f06850006f9efcb2f06850000ffffc1f0300[3]0bfffc1f0300[3]45ff3183fe7c08[2]45ff3183fe7c08[2]f47b040704050300f47b0407040503005ebc40c040c080005ebc40c040c08000ff7f3f130c00[3]ff7f3f130c00[3]fbfefcc83000[3]fbfefcc83000[6]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f2fcdce2f800[e3]03050b1f1e00[3]100204000100[3]c0e0f0f878002000[2]0400[2]8000[e0]1e1f0f070300[3]0100[2]080400[3]78f8f0e0c000[3]8000[5]2000[e3]070f1d3b3e3c0004080022044000[3]e0f0f8bc5c3c0008040200402000[e1]3c3a3d1f0f0700[3]040220100800[2]3c5c1cf8f0e000[3]20e000[2]020600[e3]071c30206040081000408000[2]0600[2]e0380c04060204080100[4]6000[e0]406020301c0700[2]01000200[3]50200206040c38e000[2]8000[3]0100080400[23e0]
-CHRUndo=00[10]2f7fffddfb7b71212f7fffddfb7b7121bdff[2]f7ebddad04bdff[2]f7ebddad044cfeff3efffe9c084cfeff3efffe9c0800[8]01[2]02[2]05[2]090800[8]80[2]c0[2]e0[2]f01000[8]09[8]00[8]f0[5]50[3]00[8]09[5]19[2]2900[8]10f0b030b018f8fc00[8]2959[2]89b9[4]00[8]fcf4f6[2]f1f7[3]00[8]b9[3]f9a9[2]f4f500[8]f7[2]fff5[3]6fef00[8]555289b9b800[b]eacb91971700[4]3c464a52623c00[a]182808[3]3e00[a]3c42023c407e00[a]3c420c02423c00[a]081828487e0800[a]7e407c02423c00[a]3e407c42[2]3c00[a]3e02040810[2]00[a]3c423c42[2]3c00[a]3c42[2]3e023c00[9]3c4299a1[2]99423c00[9]3c42[2]7e42[2]00[a]7c427c42[2]3c00[a]3c4240[2]423c00[a]7c42[4]7c00[a]7c407040[2]7c00[a]3c40[2]7040[2]00[a]3c42404e423c00[a]42[3]7e42[2]00[a]3e08[4]3e00[a]02[3]42[2]3c00[a]44487048444200[a]40[5]7e00[a]42665a42[3]00[a]4262524a464200[a]3c42[4]3c00[a]7c42[2]7c40[2]00[a]3c42[3]3c0600[a]3c42[2]7c444200[a]3e403c02[2]7c00[a]3e08[5]00[a]42[5]3c00[a]22[4]140800[a]42[3]5a664200[a]422418[2]244200[a]41221408[3]00[a]7e040810207e00[9]18243c7e5a3c[2]6600[10]0810[2]20e0c000[2]30d0f0[6]30d0f0[7]fefffcfeff[3]f0fefffcfeff[3]00[a]01030206[2]0c00[8]0fffbf3f7f[2]ff[2]4f50607f00[4]4f50607f00[4]ff00[2]ff00[4]ff00[2]ff00[4]f90503ff00[4]f90503ff00[4]30ff[3]f0207f[2]30ff[3]f0207f[2]8f80407f00[4]8f80407f00[4]ff[8]00[8]ff[4]00[14]077f4f8f[5]00[8]ff[8]00[2]c06030188cc400[2]c06030188cc400[8]f8fce6[2]e7[4]00[8]071f3f5f9f[4]00[8]ff[6]fe[2]00[8]f8c6c182[2]04[2]0800[8]3f7fffdf9f[4]860488f800[4]860488f800[c]fe[2]c1a190fffcd800[8]e0f0b89c[2]8c[3]0c0919[2]3b33276f0c0919[2]3b33276fff[10]fcfbf8f0f1e1[2]c3fcfbf8f0f1e1[2]c300[4]ff[4]00[8]9fa0c0ff00[4]9fa0c0ff00[c]8f[2]cf77340f00[a]ff[5]7fbf00[9]ff[4]fe[2]fd00[9]e7f7fe1e3cf800[a]9f[5]bfff7f00[8]fe[2]c1a190fffcdf00[8]0810[2]20e0c0fc0200[8]9f[5]a0ff4000[8]ff0f[3]ff00ff00[9]ff[5]00ff00[9]8c[4]ccf8[3]fcf8c06030188cc4fcf8c06030188cc44f48f0ff00[4]4f48f0ff00[4]e6160cf800[4]e6160cf800[c]f1[5]f9fdff00[8]f8f6f1[6]00ff[3]00[2]ff[2]00ff[3]00[2]ff[2]7fbf5f9f[5]7fbf5f9f[5]fefdfaf9[5]fefdfaf9[5]00[8]0d191b3337674fff807fff[3]bf9f[2]807fff[3]bf9f[2]3fdff0ff[4]f03fdff0ff[4]f0e4fa0cfafcfafc0ee4fa0cfafcfafc0e78bf5f9f[5]78bf5f9f[5]fefdfbfdf9[4]fefdfbfdf9[4]7ffffc00[5]7ffffc00[5]f1c00103[2]06[2]0cf1c00103[2]06[2]0cf3ff[2]fcfeff[3]f3ff[2]fcfeff[3]1f7f9f[6]1f7f9f[6]ff0100ff00[4]ff0100ff00[c]ff[4]0f[3]ff01fdfefd1e0dfefb01fdfefd1e0dfefb3f2f4f[6]3f2f4f[6]9f3fff[6]9f3fff[6]f9[10]00[8]ff[5]fe[2]ff9f[10]00[891]03071617[2]33300003071617[2]333000c000[4]e000[2]c000f070[2]e0002b3f01[2]03[3]002b3f01[2]03[3]00e0[2]d0a030b8fc00e0[2]d0a030b8fc0001[2]02[2]05[2]090801[2]02[2]05[2]090880[2]c0[2]e0[2]f01080[2]c0[2]e0[2]f01009[5]19[2]2909[5]19[2]2910f0b030b018f8fc10f0b030b018f8fcb9[3]f9a9[2]f4f5b9[3]f9a9[2]f4f5f7[2]fff5[3]6feff7[2]fff5[3]6fef00[2]3c3f7f7c7d[2]071f3f7ffffcfd[2]00[3]e0f038[2]bce0f8fcfeff3fbf[2]00[4]18ff[2]8a00[c]18ff[2]8b00[8]ff[2]00[16]ff[2]00[6]2b3a2a3a2d3d1f152b3a2a3a2d3d1f15c068[2]1ce0[4]c068[2]1ce0[4]2a3d070f667038002a3d070f66703800e060[3]70787c00e060[3]70787c0009[10]f0[5]50[3]f0[5]50[3]2959[2]89b9[4]2959[2]89b9[4]fcf4f6[2]f1f7[3]fcf4f6[2]f1f7[3]555289b9b800[3]555289b9b800[3]eacb91971700[3]eacb91971700[3]7c7f[2]3f[3]00[2]fcfff17c7f[2]3f073efef8fcf0e000[2]3fffe71efc[2]f8e0ba8abab8ff[2]1800[9]bb9bbb89ff[2]1800[9]ff[2]00[6]ff[2]00[16]2a3e00[6]2a3e00[6]e0[2]c000c0e0f000e0[2]c000c0e0f0002a3e00281c206c102a3e00[6]f0[2]3000383c00[2]f0[2]3000383c00[3]071f3f7f[2]ff[2]00071f3f7f[2]ff[2]00e0f89c8ec6e7[2]00e0f89c8ec6e7[2]00[2]092e4f33f1fc00[2]092e4f33f1fc00[3]2080e4f07400[3]2080e4f07400121a6b5f3ff93600121a6b5f3ff936004094eafffe9f6c004094eafffe9f6c00[3]031ffcff0300[3]031ffcff0308[2]7cfe8301ff5108[2]7cfe8301ff51030607[2]047b94d5030607[2]047b94d58040[2]c040bc525a8040[2]c040bc525a0c1f13[2]3f4cd0df0c1f13[2]3f4cd0df60f098[2]f46e9fff60f098[2]f46e9fff18243c7e5a3c[2]6600[b]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f3ffdfe3f800[10]ff[2]7f[2]3f1f0700ff[2]7f[2]3f1f0700ff[2]fe[2]fcf8e000ff[2]fe[2]fcf8e000f1c7797531190e00f1c7797531190e00d6e1e4f2b8402000d6e1e4f2b8402000f6793f4d0f160a00f6793f4d0f160a006e9ffefdf4e844006e9ffefdf4e8440003fffc1f0300[3]03fffc1f0300[3]51ff0183fe7c08[2]51ff0183fe7c08[2]f47b040704070300f47b0407040703005ebc40c040[2]80005ebc40c040[2]8000df7f3f130c00[3]df7f3f130c00[3]fffefcc83000[3]fffefcc83000[3]01070d3f7fd97f3f01070d3f7fd97f3f80e0b0fcfe9bfefc80e0b0fcfe9bfefc00[20]071f3f7f[2]ff[3]071f3f7f[2]ff[3]e0f8fc9e8ec7e7[2]e0f8fc9e8ec7e7[2]00[2]082e4f33f1fc00[2]082e4f33f1fc00[2]801088e2f07600[2]801088e2f07600022957ff7ff93600022957ff7ff936004858d6fafc9f6c004858d6fafc9f6c00[3]031ffcff0f00[3]031ffcff0b08[2]7cfe8331ff4508[2]7cfe8331ff4503040507047b94b503040507047b94b580c0[3]40bc525680c0[3]40bc5256060f19[2]2f76f9ff060f19[2]2f76f9ff30f8c8[2]fc320bfb30f8c8[2]fc320bfb01070d3f7fce7f3f01070d3f7fce7f3f80e0b0fcfe73fefc80e0b0fcfe73fefc00[20]ff[3]7f[2]3f1f07ff[3]7f[2]3f1f07ff[3]fe[2]fcf8e0ff[3]fe[2]fcf8e0f1c7797531190e00f1c7797531190e00d2e0e4f2b900a410d2e0e4f2b900a41076f97fbf2f17220076f97fbf2f1722006f9efcb2f06850006f9efcb2f06850000ffffc1f0300[3]0bfffc1f0300[3]45ff3183fe7c08[2]45ff3183fe7c08[2]f47b040704050300f47b0407040503005ebc40c040c080005ebc40c040c08000ff7f3f130c00[3]ff7f3f130c00[3]fbfefcc83000[3]fbfefcc83000[6]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f2fcdce2f800[e3]03050b1f1e00[3]100204000100[3]c0e0f0f878002000[2]0400[2]8000[e0]1e1f0f070300[3]0100[2]080400[3]78f8f0e0c000[3]8000[5]2000[e3]070f1d3b3e3c0004080022044000[3]e0f0f8bc5c3c0008040200402000[e1]3c3a3d1f0f0700[3]040220100800[2]3c5c1cf8f0e000[3]20e000[2]020600[e3]071c30206040081000408000[2]0600[2]e0380c04060204080100[4]6000[e0]406020301c0700[2]01000200[3]50200206040c38e000[2]8000[3]0100080400[23e0]
+CHRUndo=00[10]2f7fffddfb7b71212f7fffddfb7b7121bdff[2]f7ebddad04bdff[2]f7ebddad044cfeff3efffe9c084cfeff3efffe9c0800[8]01[2]02[2]05[2]090800[8]80[2]c0[2]e0[2]f01000[8]09[8]00[8]f0[5]50[3]00[8]09[5]19[2]2900[8]10f0b030b018f8fc00[8]2959[2]89b9[4]00[8]fcf4f6[2]f1f7[3]00[8]b9[3]f9a9[2]f4f500[8]f7[2]fff5[3]6fef00[8]555289b9b800[b]eacb91971700[4]3c464a52623c00[a]182808[3]3e00[a]3c42023c407e00[a]3c420c02423c00[a]081828487e0800[a]7e407c02423c00[a]3e407c42[2]3c00[a]3e02040810[2]00[a]3c423c42[2]3c00[a]3c42[2]3e023c00[9]3c4299a1[2]99423c00[9]3c42[2]7e42[2]00[a]7c427c42[2]3c00[a]3c4240[2]423c00[a]7c42[4]7c00[a]7c407040[2]7c00[a]3c40[2]7040[2]00[a]3c42404e423c00[a]42[3]7e42[2]00[a]3e08[4]3e00[a]02[3]42[2]3c00[a]44487048444200[a]40[5]7e00[a]42665a42[3]00[a]4262524a464200[a]3c42[4]3c00[a]7c42[2]7c40[2]00[a]3c42[3]3c0600[a]3c42[2]7c444200[a]3e403c02[2]7c00[a]3e08[5]00[a]42[5]3c00[a]22[4]140800[a]42[3]5a664200[a]422418[2]244200[a]41221408[3]00[a]7e040810207e00[9]18243c7e5a3c[2]6600[10]0810[2]20e0c000[2]30d0f0[6]30d0f0[7]fefffcfeff[3]f0fefffcfeff[3]00[a]01030206[2]0c00[8]0fffbf3f7f[2]ff[2]4f50607f00[4]4f50607f00[4]ff00[2]ff00[4]ff00[2]ff00[4]f90503ff00[4]f90503ff00[4]30ff[3]f0207f[2]30ff[3]f0207f[2]8f80407f00[4]8f80407f00[4]ff[8]00[8]ff[4]00[14]077f4f8f[5]00[8]ff[8]00[2]c06030188cc400[2]c06030188cc400[8]f8fce6[2]e7[4]00[8]071f3f5f9f[4]00[8]ff[6]fe[2]00[8]f8c6c182[2]04[2]0800[8]3f7fffdf9f[4]860488f800[4]860488f800[c]fe[2]c1a190fffcd800[8]e0f0b89c[2]8c[3]0c0919[2]3b33276f0c0919[2]3b33276fff[10]fcfbf8f0f1e1[2]c3fcfbf8f0f1e1[2]c300[4]ff[4]00[8]9fa0c0ff00[4]9fa0c0ff00[c]8f[2]cf77340f00[a]ff[5]7fbf00[9]ff[4]fe[2]fd00[9]e7f7fe1e3cf800[a]9f[5]bfff7f00[8]fe[2]c1a190fffcdf00[8]0810[2]20e0c0fc0200[8]9f[5]a0ff4000[8]ff0f[3]ff00ff00[9]ff[5]00ff00[9]8c[4]ccf8[3]fcf8c06030188cc4fcf8c06030188cc44f48f0ff00[4]4f48f0ff00[4]e6160cf800[4]e6160cf800[c]f1[5]f9fdff00[8]f8f6f1[6]00ff[3]00[2]ff[2]00ff[3]00[2]ff[2]7fbf5f9f[5]7fbf5f9f[5]fefdfaf9[5]fefdfaf9[5]00[8]0d191b3337674fff807fff[3]bf9f[2]807fff[3]bf9f[2]3fdff0ff[4]f03fdff0ff[4]f0e4fa0cfafcfafc0ee4fa0cfafcfafc0e78bf5f9f[5]78bf5f9f[5]fefdfbfdf9[4]fefdfbfdf9[4]7ffffc00[5]7ffffc00[5]f1c00103[2]06[2]0cf1c00103[2]06[2]0cf3ff[2]fcfeff[3]f3ff[2]fcfeff[3]1f7f9f[6]1f7f9f[6]ff0100ff00[4]ff0100ff00[c]ff[4]0f[3]ff01fdfefd1e0dfefb01fdfefd1e0dfefb3f2f4f[6]3f2f4f[6]9f3fff[6]9f3fff[6]f9[10]00[8]ff[5]fe[2]ff9f[10]00[90]ffe7d7f7[3]c1ff00[8]ffc3bdfdc3bf81ff00[188]ff83bd[2]83bf[2]ff00[48]ffbd[5]c3ff00[609]03071617[2]33300003071617[2]333000c000[4]e000[2]c000f070[2]e0002b3f01[2]03[3]002b3f01[2]03[3]00e0[2]d0a030b8fc00e0[2]d0a030b8fc0001[2]02[2]05[2]090801[2]02[2]05[2]090880[2]c0[2]e0[2]f01080[2]c0[2]e0[2]f01009[5]19[2]2909[5]19[2]2910f0b030b018f8fc10f0b030b018f8fcb9[3]f9a9[2]f4f5b9[3]f9a9[2]f4f5f7[2]fff5[3]6feff7[2]fff5[3]6fef00[2]3c3f7f7c7d[2]071f3f7ffffcfd[2]00[3]e0f038[2]bce0f8fcfeff3fbf[2]00[4]18ff[2]8a00[c]18ff[2]8b00[8]ff[2]00[16]ff[2]00[6]2b3a2a3a2d3d1f152b3a2a3a2d3d1f15c068[2]1ce0[4]c068[2]1ce0[4]2a3d070f667038002a3d070f66703800e060[3]70787c00e060[3]70787c0009[10]f0[5]50[3]f0[5]50[3]2959[2]89b9[4]2959[2]89b9[4]fcf4f6[2]f1f7[3]fcf4f6[2]f1f7[3]555289b9b800[3]555289b9b800[3]eacb91971700[3]eacb91971700[3]7c7f[2]3f[3]00[2]fcfff17c7f[2]3f073efef8fcf0e000[2]3fffe71efc[2]f8e0ba8abab8ff[2]1800[9]bb9bbb89ff[2]1800[9]ff[2]00[6]ff[2]00[16]2a3e00[6]2a3e00[6]e0[2]c000c0e0f000e0[2]c000c0e0f0002a3e00281c206c102a3e00[6]f0[2]3000383c00[2]f0[2]3000383c00[3]071f3f7f[2]ff[2]00071f3f7f[2]ff[2]00e0f89c8ec6e7[2]00e0f89c8ec6e7[2]00[2]092e4f33f1fc00[2]092e4f33f1fc00[3]2080e4f07400[3]2080e4f07400121a6b5f3ff93600121a6b5f3ff936004094eafffe9f6c004094eafffe9f6c00[3]031ffcff0300[3]031ffcff0308[2]7cfe8301ff5108[2]7cfe8301ff51030607[2]047b94d5030607[2]047b94d58040[2]c040bc525a8040[2]c040bc525a0c1f13[2]3f4cd0df0c1f13[2]3f4cd0df60f098[2]f46e9fff60f098[2]f46e9fff18243c7e5a3c[2]6600[b]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f3ffdfe3f800[10]ff[2]7f[2]3f1f0700ff[2]7f[2]3f1f0700ff[2]fe[2]fcf8e000ff[2]fe[2]fcf8e000f1c7797531190e00f1c7797531190e00d6e1e4f2b8402000d6e1e4f2b8402000f6793f4d0f160a00f6793f4d0f160a006e9ffefdf4e844006e9ffefdf4e8440003fffc1f0300[3]03fffc1f0300[3]51ff0183fe7c08[2]51ff0183fe7c08[2]f47b040704070300f47b0407040703005ebc40c040[2]80005ebc40c040[2]8000df7f3f130c00[3]df7f3f130c00[3]fffefcc83000[3]fffefcc83000[3]01070d3f7fd97f3f01070d3f7fd97f3f80e0b0fcfe9bfefc80e0b0fcfe9bfefc00[20]071f3f7f[2]ff[3]071f3f7f[2]ff[3]e0f8fc9e8ec7e7[2]e0f8fc9e8ec7e7[2]00[2]082e4f33f1fc00[2]082e4f33f1fc00[2]801088e2f07600[2]801088e2f07600022957ff7ff93600022957ff7ff936004858d6fafc9f6c004858d6fafc9f6c00[3]031ffcff0f00[3]031ffcff0b08[2]7cfe8331ff4508[2]7cfe8331ff4503040507047b94b503040507047b94b580c0[3]40bc525680c0[3]40bc5256060f19[2]2f76f9ff060f19[2]2f76f9ff30f8c8[2]fc320bfb30f8c8[2]fc320bfb01070d3f7fce7f3f01070d3f7fce7f3f80e0b0fcfe73fefc80e0b0fcfe73fefc00[20]ff[3]7f[2]3f1f07ff[3]7f[2]3f1f07ff[3]fe[2]fcf8e0ff[3]fe[2]fcf8e0f1c7797531190e00f1c7797531190e00d2e0e4f2b900a410d2e0e4f2b900a41076f97fbf2f17220076f97fbf2f1722006f9efcb2f06850006f9efcb2f06850000ffffc1f0300[3]0bfffc1f0300[3]45ff3183fe7c08[2]45ff3183fe7c08[2]f47b040704050300f47b0407040503005ebc40c040c080005ebc40c040c08000ff7f3f130c00[3]ff7f3f130c00[3]fbfefcc83000[3]fbfefcc83000[6]1f6ff7031f00[3]1f6ff7031f003ef8f3ffdfe3f8003ef8f2fcdce2f800[e3]03050b1f1e00[3]100204000100[3]c0e0f0f878002000[2]0400[2]8000[e0]1e1f0f070300[3]0100[2]080400[3]78f8f0e0c000[3]8000[5]2000[e3]070f1d3b3e3c0004080022044000[3]e0f0f8bc5c3c0008040200402000[e1]3c3a3d1f0f0700[3]040220100800[2]3c5c1cf8f0e000[3]20e000[2]020600[e3]071c30206040081000408000[2]0600[2]e0380c04060204080100[4]6000[e0]406020301c0700[2]01000200[3]50200206040c38e000[2]8000[3]0100080400[23e0]
-CHRCopy=00[2]092e4f33f1fc00[2]092e4f33f1fc00[3]2080e4f07400[3]2080e4f074f1c7797531190e00f1c7797531190e00d6e1e4f2b8402000d6e1e4f2b84020009fa0c0ff00[4]9fa0c0ff00[4]f90503ff00[4]f90503ff00[4]807fff[3]bf9f[2]807fff[3]bf9f[2]30d0f0[6]30d0f0[6]00[10]9f[10]f0fefffcfeff[3]f0fefffcfeff[3]00[2]c06030188cc400[2]c06030188cc48f80407f00[4]8f80407f00[4]ff00[2]ff00[4]ff00[2]ff00[4]e6160cf800[4]e6160cf800[24]9fa0c0ff00[4]9fa0c0ff00[4]f90503ff00[4]f90503ff00[1c]4f48f0ff00[c]ff0100ff00[c]860488f800[c]9fa0c0ff00[c]f90503ff00[c]ff[8]00[8]fcfbf8f0f1e1[2]c300[8]1f7f9f[6]00[8]f9[8]00[8]9f[8]00[8]f0fefffcfeff[3]00[a]c06030188cc400[8]4f48f0ff00[c]ff0100ff00[c]860488f800[c]9fa0c0ff00[c]f90503ff00[c]8f80601f00[c]ff00[2]ff00[c]e4140cfc00[a]44aa00[6]993380[6]558880[6]991180[6]44aa00[6]881100[5]0145a800[6]88132040[2]80[2]00548a200040008000893300[6]44aa000200040008993300[6]558800[6]991114[4]10[2]44aa04[3]00[2]01881100[6]45a800[6]881304000201[2]00548a040002000100893300[5]2a44aa00[5]44993300[3cd0]
+CHRCopy=ff83bd[2]83bf[2]ff00[b]2080e4f07400[3]2080e4f074f1c7797531190e00f1c7797531190e00d6e1e4f2b8402000d6e1e4f2b84020009fa0c0ff00[4]9fa0c0ff00[4]f90503ff00[4]f90503ff00[4]807fff[3]bf9f[2]807fff[3]bf9f[2]30d0f0[6]30d0f0[6]00[10]9f[10]f0fefffcfeff[3]f0fefffcfeff[3]00[2]c06030188cc400[2]c06030188cc48f80407f00[4]8f80407f00[4]ff00[2]ff00[4]ff00[2]ff00[4]e6160cf800[4]e6160cf800[24]9fa0c0ff00[4]9fa0c0ff00[4]f90503ff00[4]f90503ff00[1c]4f48f0ff00[c]ff0100ff00[c]860488f800[c]9fa0c0ff00[c]f90503ff00[c]ff[8]00[8]fcfbf8f0f1e1[2]c300[8]1f7f9f[6]00[8]f9[8]00[8]9f[8]00[8]f0fefffcfeff[3]00[a]c06030188cc400[8]4f48f0ff00[c]ff0100ff00[c]860488f800[c]9fa0c0ff00[c]f90503ff00[c]8f80601f00[c]ff00[2]ff00[c]e4140cfc00[a]44aa00[6]993380[6]558880[6]991180[6]44aa00[6]881100[5]0145a800[6]88132040[2]80[2]00548a200040008000893300[6]44aa000200040008993300[6]558800[6]991114[4]10[2]44aa04[3]00[2]01881100[6]45a800[6]881304000201[2]00548a040002000100893300[5]2a44aa00[5]44993300[3cd0]
NameTable=00[44]112f2a00[3]3500[4]222300[6]3500[2]122f2a00[30]2a1b2f2d1f1e00[a5]0103[4]020300[2d]211b271f0029301f2c00[e]0103[4]020300[65]0103[2]020300[4b]aa00[1f]ba00[c0]0103[1e]0200[c4]112f4000[8]222300[9]122f4000[43]36[20]26[21]27[1e]26[2]00[1e]26[2]00[2]2829[2]250044452a002829[2]25002b29[2]4c535029610044452a00[2]26[2]00[2]383934350054553a0038393435003b3c3d5c657570600054325800[2]26[2]00[3]636400[2]66676800[2]636400[2]696a6b6c3e62[2]7100665900[3]26[2]00[2]72737400[2]766d5d00[2]767400[2]7674004d4e4f6e740076522400[2]26[2]00[2]51565700[2]3f565f00[2]375700[2]3757005e6f313757003f565f00[2]26[2]00[1e]26[41]00[8a]110040481b2c1f4600211b491f00[53]120040481b2c1f4600211b491f00[a9]
@@ -184,7 +184,7 @@ NameTable=00[44]112f2a00[3]3500[4]222300[6]3500[2]122f2a00[30]2a1b2f2d1f1e00[a5]
NameCopy=7172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d858e8f909192939495969798999a9b9c9d9e9fa0a1a200[74d]
-NameUndo=00[44]112f2a00[3]3500[4]222300[6]3500[2]122f2a00[30]2a1b2f2d1f1e00[a5]0103[4]020300[2e]211b271f0029301f2c00[d]0103[4]020300[65]0103[2]020300[4b]aa00[1f]ba00[c0]0103[1e]0200[c4]112f4000[8]222300[9]122f4000[43]36[20]26[21]27[1e]26[2]00[1e]26[2]00[2]2829[2]250044452a002829[2]25002b29[2]4c535029610044452a00[2]26[2]00[2]383934350054553a0038393435003b3c3d5c657570600054325800[2]26[2]00[3]636400[2]66676800[2]636400[2]696a6b6c3e62[2]7100665900[3]26[2]00[2]72737400[2]766d5d00[2]767400[2]7674004d4e4f6e740076522400[2]26[2]00[2]51565700[2]3f565f00[2]375700[2]3757005e6f313757003f565f00[2]26[2]00[1e]26[41]00[8a]110040481b2c1f4600211b491f00[53]120040481b2c1f4600211b491f00[a9]
+NameUndo=00[44]112f2a00[3]3500[4]222300[6]3500[2]122f2a00[30]2a1b2f2d1f1e00[a5]0103[4]020300[2d]211b271f0029301f2c00[e]0103[4]020300[65]0103[2]020300[4b]aa00[1f]ba00[c0]0103[1e]0200[c4]112f4000[8]222300[9]122f4000[43]36[20]26[21]27[1e]26[2]00[1e]26[2]00[2]2829[2]250044452a002829[2]25002b29[2]4c535029610044452a00[2]26[2]00[2]383934350054553a0038393435003b3c3d5c657570600054325800[2]26[2]00[3]636400[2]66676800[2]636400[2]696a6b6c3e62[2]7100665900[3]26[2]00[2]72737400[2]766d5d00[2]767400[2]7674004d4e4f6e740076522400[2]26[2]00[2]51565700[2]3f565f00[2]375700[2]3757005e6f313757003f565f00[2]26[2]00[1e]26[41]00[8a]110040481b2c1f4600211b491f00[53]120040481b2c1f4600211b491f00[a9]
AttrTable=0300[15]85150405c1515000[2]c000010005[2]00[2]4400[18]a0[8]aa[18]00[18]
@@ -331,14 +331,14 @@ MetatileSet_8x8_props=00[2000]
MetatileSet_8x8_propsUndo=00[2000]
-MetatileSetLabels_2x2=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-MetatileSetLabels_2x2Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+MetatileSetLabels_2x2=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+MetatileSetLabels_2x2Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-MetatileSetLabels_4x4=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-MetatileSetLabels_4x4Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+MetatileSetLabels_4x4=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+MetatileSetLabels_4x4Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-MetatileSetLabels_8x8=Unlabeled,Unlabeled
-MetatileSetLabels_8x8Undo=Unlabeled,Unlabeled
+MetatileSetLabels_8x8=Unlabeled,Unlabeled
+MetatileSetLabels_8x8Undo=Unlabeled,Unlabeled
CHRBankLabels=Unlabeled,Unlabeled,Unlabeled,Unlabeled
@@ -503,18 +503,18 @@ Checkpoint_MetatileSet_8x8_props=00[2000]
Checkpoint_MetatileSet_8x8_propsUndo=00[2000]
-Checkpoint_MetatileSetLabels_2x2=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-Checkpoint_MetatileSetLabels_2x2Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+Checkpoint_MetatileSetLabels_2x2=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+Checkpoint_MetatileSetLabels_2x2Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-Checkpoint_MetatileSetLabels_4x4=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-Checkpoint_MetatileSetLabels_4x4Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+Checkpoint_MetatileSetLabels_4x4=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+Checkpoint_MetatileSetLabels_4x4Undo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-Checkpoint_MetatileSetLabels_8x8=Unlabeled,Unlabeled
-Checkpoint_MetatileSetLabels_8x8Undo=Unlabeled,Unlabeled
+Checkpoint_MetatileSetLabels_8x8=Unlabeled,Unlabeled
+Checkpoint_MetatileSetLabels_8x8Undo=Unlabeled,Unlabeled
-Checkpoint_CHRBankLabels=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+Checkpoint_CHRBankLabels=Unlabeled,Unlabeled,Unlabeled,Unlabeled
-Checkpoint_CHRBankLabelsUndo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
+Checkpoint_CHRBankLabelsUndo=Unlabeled,Unlabeled,Unlabeled,Unlabeled
Checkpoint_32_NTSC_MsprDuration=00000006[100]
diff --git a/include/globals.s b/include/globals.s
index f6021b4..ac79f28 100644
--- a/include/globals.s
+++ b/include/globals.s
@@ -8,7 +8,9 @@
zp_arg1 = $01
zp_arg2 = $02
zp_arg3 = $03
- ;; zp_arg4 = $04
+
+ ;; Argument reserved _only_ for NMI code.
+ zp_nmi_reserved = $04
;;;
;; Random values that can be used inside of functions for temporary values
diff --git a/src/driver.s b/src/driver.s
index 942bf82..4f0e501 100644
--- a/src/driver.s
+++ b/src/driver.s
@@ -2,7 +2,7 @@
.scope Driver
;; Timer for the player to be able to pick up the joypad upon entering the
- ;; game (either when transitioning from the title or when losing a life).
+ ;; game (either when transitioning from the title or after losing a life).
;;
;; NOTE: this memory address is shared with `zp_title_timer`, as they can
;; never conflict with each other.
@@ -15,6 +15,23 @@
PLAYER_TIMER_VALUE = PLAYER_TIMER_FULL_VALUE
.endif
+ ;; The amount of time it's allowed to pass before changing the blinking
+ ;; animation for the "1UP"/"2UP" strings from the HUD.
+ ;;
+ ;; NOTE: this only applies to the real game (i.e. we don't care about
+ ;; 'PLAYER_TIMER_DEV_VALUE').
+ BLINKING_TIME = PLAYER_TIMER_FULL_VALUE / 8
+
+ ;; Bitmap containing how NMI code should proceed with the blinking
+ ;; animation. Only two bits are used:
+ ;; - 7: whether the blinking animation should even be considered.
+ ;; - 6: the blinking phase.
+ zp_blink_status = $2E
+
+ ;; The timer for the blinking animation. Initialized to 'BLINKING_TIME', the
+ ;; blinking phase is changed whenever it reaches zero.
+ zp_blink_timer = $2F
+
.ifdef PAL
;; Frame counter which resets every 5 frames.
zp_pal_counter = $31
@@ -54,6 +71,7 @@
.proc init_before_nmi
lda #0
sta Driver::zp_pause_toggle
+ sta Driver::zp_blink_status
rts
.endproc
@@ -92,7 +110,13 @@
;; Setup the player timer.
lda #PLAYER_TIMER_VALUE
- sta zp_player_timer
+ sta Driver::zp_player_timer
+
+ ;; Initialize the blinking animation.
+ lda #BLINKING_TIME
+ sta Driver::zp_blink_timer
+ lda #0
+ sta Driver::zp_blink_status
;; Initialize lifes for both players.
lda #4
@@ -151,12 +175,34 @@
dec zp_player_timer
beq @load_player
+ ;; Decrement the blinking timer. If it reaches zero, then it's time to
+ ;; change its phase.
+ dec Driver::zp_blink_timer
+ bne @no_update
+
+ ;; Tell NMI code to change the blinking animation, and flip the bit
+ ;; regulating which phase.
+ lda Driver::zp_blink_status
+ eor #%01000000
+ ora #%10000000
+ sta Driver::zp_blink_status
+
+ ;; And initialize again the blinking timer.
+ lda #BLINKING_TIME
+ sta Driver::zp_blink_timer
+
;; TODO: items falling down.
- ;; TODO: blinking of the selected player (every HZ count?).
+ @no_update:
rts
@load_player:
+ ;; Clear out any leftovers from the blinking animation.
+ lda #%10000000
+ sta Driver::zp_blink_status
+ lda #0
+ sta Driver::zp_blink_timer
+
jsr Player::init
jsr Bullets::init
jsr Enemies::init
@@ -583,4 +629,56 @@
rts
.endproc
+
+ ;; Toggle the blinking animations from the "1UP"/"2UP" strings on the HUD
+ ;; depending on the currently selected player.
+ ;;
+ ;; This function expects the 'Globals::zp_nmi_reserved' to be set with the
+ ;; addition to be performed on each base character in order to set the
+ ;; proper animation phase (i.e. either "#$00" or "#$70").
+ ;;
+ ;; NOTE: only call this function from NMI code.
+ .proc blink_player_selection
+ bit PPU::m_status
+
+ ;; Which player are we talking about?
+ lda Globals::zp_multiplayer
+ and #$01
+ bne @player_2
+
+ ;; Player 1.
+ lda #$28
+ sta PPU::m_address
+ lda #$44
+ sta PPU::m_address
+ lda #$11
+ bne @set_data
+ @player_2:
+ ldx #$12
+ lda #$28
+ sta PPU::m_address
+ lda #$5A
+ sta PPU::m_address
+ lda #$12
+
+ @set_data:
+ ;; 1/2
+ clc
+ adc Globals::zp_nmi_reserved
+ sta PPU::m_data
+
+ ;; 'U'
+ lda #$2F
+ clc
+ adc Globals::zp_nmi_reserved
+ sta PPU::m_data
+
+ ;; 'P'
+ lda #$2A
+ clc
+ adc Globals::zp_nmi_reserved
+ sta PPU::m_data
+
+ rts
+ .endproc
.endscope
diff --git a/src/interrupts.s b/src/interrupts.s
index 775834a..c5eb306 100644
--- a/src/interrupts.s
+++ b/src/interrupts.s
@@ -46,6 +46,19 @@
jsr Driver::pal_handler
.endif
+ ;; Handle player selection blinking.
+ bit Driver::zp_blink_status
+ bpl @update_lifes
+
+ ;; Sprinkle, sprinkle!
+ lda #0
+ bvc @set_blinking
+ lda #$70
+@set_blinking:
+ sta Globals::zp_nmi_reserved
+ jsr Driver::blink_player_selection
+
+@update_lifes:
;; Do we need to update the lifes from players on the HUD?
lda Player::zp_state
and #%00001000