<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>snarfblam.com</title>
	<atom:link href="http://snarfblam.com/words/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://snarfblam.com/words</link>
	<description></description>
	<lastBuildDate>Tue, 15 May 2012 00:12:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MaruMari: Project Outline</title>
		<link>http://snarfblam.com/words/?p=376</link>
		<comments>http://snarfblam.com/words/?p=376#comments</comments>
		<pubDate>Tue, 08 May 2012 23:29:25 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[front]]></category>
		<category><![CDATA[Homebrew]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[6502]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[homebrew]]></category>
		<category><![CDATA[MaruMari]]></category>
		<category><![CDATA[metroid]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=376</guid>
		<description><![CDATA[This is an outline for the MaruMari homebrew project I'm working on for NES. As of posting this outline, the game is very incomplete. Things are subject to change, and suggestions are welcome.]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>This is an outline for the MaruMari homebrew project I&#8217;m working on for NES. As of posting this outline, the game is very incomplete. Things are subject to change, and suggestions are welcome.</p>
<p>Neither the outline nor the spec are complete, but if you think I&#8217;ve overlooked something essential, please say so.</p>
<p>&nbsp;</p>
<h2>Things I Would Love To Have Help With</h2>
<ul>
<li>Artwork. Can be shamelessly plundered from metroid games, but some unique artwork might be nice, too.</li>
<li>Music. Famitone/Famitracker is probably the easiest and best approach, but music needs to be composed/extracted, and I have no experience with this toolset. I&#8217;ve already written a utility that can extract music data from Metroid.</li>
</ul>
<p>&nbsp;</p>
<h2>Gameplay Outline</h2>
<p>General Outline:</p>
<ul>
<li>Game takes original metroid as its primary inspiration, with each level based on a level from the original game.</li>
<li>Player will play as samus in ball form.</li>
<li>Game will used forced downward scrolling.</li>
<li>The player loses by running out of health or getting crushed at the top.</li>
<ul>
<li>It won&#8217;t be that hard to avoid getting crushed. The forced scrolling is to motivate the player to keep moving rather than taking a slow cautious approach at the game.</li>
</ul>
<li>The game will include powerups and enemies inspired by other metroid games.</li>
<ul>
<li>Enemies will probably be based strongly on enemies from the same level of the original game.</li>
<li>Powerups will be somewhat different from original game (outlined below)</li>
</ul>
<li>Each level will end with a door bubble in the floor (as in Super Metroid)</li>
<ul>
<li>Player will transition to next level with super-metroid style screen transition</li>
<ul>
<li>When player enters door, music stops and screen fades to black, except for doorway and bubble.</li>
<li>Doorway scrolls to top, next level fades in, bubble opens, and player is dropped down</li>
</ul>
</ul>
<li>The game will not be overly difficult.</li>
<ul>
<li>The player should not beat in on first couple tries, but:</li>
<ul>
<li>The goal is to complete the game with the highest score possible</li>
<li>Maybe I can work a &#8220;completion percentage&#8221; type scoring system in for metroid-y goodness</li>
<li>Different difficulty settings are a possibility</li>
<li>Different endings!</li>
</ul>
</ul>
</ul>
<p>Power-ups:</p>
<ul>
<li>Bombs</li>
<ul>
<li>Limited quantity.</li>
<li>Enemies may drop pickups, or they may be placed or randomly placed in levels, or both</li>
<ul>
<li>A pickup will reward five bombs, player can carry max of eight.</li>
<ul>
<li>Rational: This will create a situation where you can&#8217;t completely neglect collecting bombs, but you don&#8217;t have to hoard them and seek them out obsessively.</li>
</ul>
</ul>
<li>Varia</li>
<ul>
<li>Temporary, reduces damage</li>
</ul>
<li>Health</li>
<ul>
<li>Exactly what it sounds like</li>
</ul>
<li>Energy Tank</li>
<ul>
<li>Permanently increases health capacity</li>
</ul>
<li>Spring ball</li>
<ul>
<li>Can work one of two ways:</li>
<ul>
<li>Temporary. Lasts a certain amount of time, or jump height decreases gradually.</li>
<li>Cumulative. Each spring ball pickup increases player&#8217;s height</li>
</ul>
</ul>
<li>Charge bomb</li>
<ul>
<li>Not really sure about this one</li>
<li>Player would be able to hold limit quantity (or they could be very rare)</li>
<li>Would be switched on with select like missiles in &#8220;Metroid&#8221;</li>
<li>A longer hold produces a larger blast and bounces player higher</li>
</ul>
<li>Space Jump</li>
<ul>
<li>Temporary. Allows player to jump from the air anytime he is falling downward.</li>
<li>Spring ball may or may not be prerequisite</li>
</ul>
<li>Screw Attack</li>
<ul>
<li>Temporary. Player in invincible and kills enemies on contact while moving upward from a jump.</li>
<li>Player does not have invincibility while falling down. He still needs to be careful.</li>
</ul>
<li>Thoughts</li>
<ul>
<li>It might be a good idea to have a plain-old invincibility power up.</li>
<li>It would be cool to have power bombs instead of/in addition to charge bombs, but how would these work on NES?</li>
</ul>
</ul>
</ul>
<p>Enemies:</p>
<ul>
<li>To be determined. Enemy lineup will probably be strongly based on Metroid.</li>
</ul>
<p>&nbsp;</p>
<h2>Specifications</h2>
<p>Scrolling:</p>
<ul>
<li>The game will use a slow forced scrolling to motivate the player to keep moving, to emphasize this is an action game, not an exploration game.</li>
<li>Scrolling speed will increase with each level to marginal difficulty. Death-by-scroll-pinch isn&#8217;t meant to be the primary hazard.</li>
<ul>
<li>If the game has difficulty levels, the scrolling could a much more serious hazard in hard difficulty.</li>
</ul>
<li>There will be a &#8220;scroll line&#8221; about halfway down the screen.</li>
<ul>
<li>When the player falls past this line, the screen will scroll more quickly to keep the player visually at or above this line.</li>
<li>This is so the player can proceed at his own pace, and so he can see what&#8217;s ahead (he will always be able to see at least 1/2 a screen ahead of the samus)</li>
<li>The engine will be limited to scrolling at 8 px per frame, so this is the maximum fall speed</li>
</ul>
</ul>
<p>Player physics: Movement</p>
<ul>
<li>The player has 16-bit speed variables, and <del>8-bit position variables</del>. Speed is a fixed-point number (i.e. [-]##.##, e.g. -01.C0)</li>
<ul>
<li>Position will be stored as a 16-bit value as well.</li>
</ul>
<li><del>The low bytes (fractional part) of speed are not applied to position, they are used only for gradual acceleration</del></li>
<li><del>When the player presses left or right</del></li>
<ul>
<li><del>If his speed is 00.00, he assumes a speed of 01.00 in the pressed direction so there is no lag before movement.</del></li>
<ul>
<li><del>For a speed of &#8220;01.00&#8243; to the left, we&#8217;ll use FF.C0 (-00.40). This is because we always round DOWN rather than toward zero.</del></li>
</ul>
</ul>
<li>While the player continues to hold left or right</li>
<ul>
<li>He accelerates at a rate of 00.40 in the appropriate direction, to a maximum of +/- 2 (FE.C0 to 02.00)</li>
<ul>
<li>Note: the speed limit (2) might be a little low.</li>
</ul>
</ul>
<li>If the player exceeds a speed of 2 to the left or right from any yet unplanned mechanism (boost tile or something)</li>
<ul>
<li>He decelerates at a rate of 00.40 until he reaches the normal max speed</li>
</ul>
<li>If the player is not holding left or right</li>
<ul>
<li>He decelerates at a rate of 00.40 until he stops</li>
</ul>
<li>When the player jumps</li>
<ul>
<li>His upward velocity is set based on current equipment, but assumes full speed instantly. There is no &#8220;bounce&#8221;.</li>
</ul>
<li>When the player is &#8220;In-air&#8221;</li>
<ul>
<li>His downward velocity increases at a constant speed (00.80?) until terminal velocity is reached (06?)</li>
</ul>
<li>The player&#8217;s sprite should rotate in the direction he most recently moved (left or right)</li>
</ul>
<p>Player physics: Collision</p>
<ul>
<li>Player&#8217;s speed will be added to his position (movement) immediately before processing collision</li>
<ul>
<li>Tiles with same physics will be stored in groups (consecutive indecies). Groups will appear in the following order.</li>
<ul>
<li>Air</li>
<li>Damage: air-like (tile can be passed through)</li>
<li>Damage: solid-like (tile can not be passed through)</li>
<li>Solid</li>
</ul>
</ul>
<li>Vertical Collision</li>
<ul>
<li>At any point the player will be in one of two modes. Each will have a different handler.</li>
<ul>
<li>&#8220;On-ground&#8221;</li>
<ul>
<li>If the player touches the top of the screen in the on-ground state, he loses (he has been pinched).</li>
<li>Each frame test ground below player, @ $4,$16 and C,$16. If neither one hits a solid tile, player transitions to in-air state with an initial veloctiy of 01.00</li>
<li>If the player jumps, he transitions to an in-air state with a negative velocity based on his equipment</li>
</ul>
<li>&#8220;In-air&#8221;</li>
<ul>
<li>Checks for collision above or below player, depending on the direction of his motion</li>
<li>Upward:</li>
<ul>
<li>Test for collision at $4,-0 and $4C, -0.</li>
<li>Player will collide with top of screen</li>
<li>Upon collision with top, test collision beneath player. If player is touching ground, he loses (he has been pinched)</li>
<li>Upon collision, player is placed directly beneath the collided-with tile: playerY = (playerY + $F) &amp; $F0</li>
<li>Player &#8220;bounces&#8221; downward by assuming a downward velocity that is a fraction of the previous upward velocity</li>
</ul>
<li>Downward:</li>
<ul>
<li>Test for collision at same points as &#8216;on-ground&#8217;. If a collision occurs:</li>
<ul>
<li>Position player onto tile (this can be done by taking the players position, relative to the level grid, and ANDing Y-position with $F0)</li>
<li>Behavior depends on player&#8217;s downward velocity</li>
<ul>
<li>If the player has sufficient velocity, &#8220;bounce&#8221; the player upward (remain in &#8220;In-air&#8221; mode) at a fraction of his previous speed</li>
<li>Otherwise, Transition to on-ground state</li>
</ul>
</ul>
</ul>
</ul>
</ul>
</ul>
<li>Sideways Collision</li>
<ul>
<li>Collision is tested in the direction the player is moving (left/right). If the player has no sideways motion, no collision testing is needed.</li>
<li>Leftward collision points  are $4,0 and $4,$F. If the player collides:</li>
<ul>
<li>place him $C pixels to the right of the tile that his left side occupies (playerX = (playerX &amp; $F0) + $C)</li>
<li>Set horizontal speed to zero</li>
</ul>
<li>Rightward collision points are $C,0 and $C,$F. If the player collides:</li>
<ul>
<li>place him $4 pixels to the right of the tile that his left edge occupies (playerX = (playerX &amp; $F0) + $4)</li>
<li>set horizontal speed to zero</li>
</ul>
</ul>
<li>Other</li>
<ul>
<li>Background-based hazard detection (spikes, lava, etc) should be included in above collision logic.</li>
<li>Sprite-based objects (enemies, items) will be processed separately using a collision rectangle created by the collision points detailed above</li>
</ul>
</ul>
<p>&nbsp;</p>
<p>Level Data Format/Compression:</p>
<ul>
<li>Level data will be stored in the following format:</li>
<ul>
<li>The data stream will alternate between attribute entries and pairs of row entries.</li>
<li>After every eighth attribute entry, there will be only one row entry instead of two.</li>
<li>An attribute entry will consist of eight bytes of raw attribute table (palette) data, enough to define palettes for two rows of 16&#215;16 tiles.</li>
<li>A row entry will define sixteen tile numbers, using an RLE encoding scheme, where each byte in the stream has the format ATTT BTTT</li>
<ul>
<li>The tile number is the value with bits A and B cleared (value AND $EE)</li>
<li>A and B make up a two-bit number (&#8216;A&#8217; being the low bit) which yields a number 0 to 3. Add 1 to this value to get the run length, in the range of 1 to 4.</li>
</ul>
</ul>
</ul>
<p>Sprite animation data</p>
<ul>
<li>Sprite animation data is stored in the form of &#8220;sprite layouts&#8221;, &#8220;sprite tile lists&#8221;, and &#8220;sprite animations&#8221;.</li>
<li>For each type of data (layouts, tile lists, and animations), there will be a pointer table that references each entry.</li>
<li>The index of the pointer to a piece of data will be referred to as that data&#8217;s ID.</li>
<li>Sprite Layout:</li>
<ul>
<li>Contains a sequence of pairs of bytes that specify X and Y coordinates as signed bytes.</li>
<li>FF terminated.</li>
</ul>
<li>Sprite Tile List:</li>
<ul>
<li>Contains a sequence of non-zero tile numbers intermixed with &#8220;attribute modifications&#8221;</li>
<li>An attribute modification is a zero byte followed by a byte containing the following bit flags:</li>
<ul>
<li>$01 &#8211; Add 1 to palette number</li>
<li>$02 &#8211; Add 2 to palette number</li>
<li>$40 &#8211; Toggle horizontal tile flip</li>
<li>$80 &#8211; Toggle vertical tile flip</li>
</ul>
<li>FF terminated</li>
</ul>
<li>Sprite Animation:</li>
<ul>
<li>Contains a sequence of frame entries (3 bytes ea):</li>
<ul>
<li>Layout ID</li>
<li>Tile list ID</li>
<li>Screen frames for this animation frame</li>
</ul>
<li>FF terminated</li>
</ul>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=376</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Suite-NES 101</title>
		<link>http://snarfblam.com/words/?p=348</link>
		<comments>http://snarfblam.com/words/?p=348#comments</comments>
		<pubDate>Sat, 07 Apr 2012 23:01:53 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[ASM]]></category>
		<category><![CDATA[front]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[SuiteNES]]></category>
		<category><![CDATA[6502]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[fceux]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>
		<category><![CDATA[romulus]]></category>
		<category><![CDATA[snarfblasm]]></category>
		<category><![CDATA[suitenes]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=348</guid>
		<description><![CDATA[Since it seems like this project is never going to get finished, I'm going to release what I have so far. Maybe input from others will help me focus and get things done. Worst case, if I never finish the project, at least I'll have released something. So, here's a quick guide to Suite-NES.]]></description>
			<content:encoded><![CDATA[<p>Since it seems like this project is never going to get finished, I&#8217;m going to release what I have so far. Maybe input from others will help me focus and get things done. Worst case, if I never finish the project, at least I&#8217;ll have released <em>something</em>. So, here&#8217;s a quick guide to Suite-NES.</p>
<p>Keep in mind that this project is incomplete. Comments, suggestions, and criticism are appreciated.</p>
<h2>1. Projects</h2>
<p>SuiteNES doesn&#8217;t work with plain ol&#8217; ROMs. SuiteNES works with projects. A project consists of a ROM, project settings, and project files. <em>But&#8230;</em> if you&#8217;re doing something simple and don&#8217;t want to bother with a project, things are set up so you can basically ignore the whole project aspect of the program.</p>
<p>When you open a ROM, SuiteNES will create a new temporary project for you. You can use the various editors, modify the ROM, and save back to the ROM file without saving the whole project to disk. On the other hand, when you save your project, SuiteNES will remember which editors you have open and their settings. This means that when you open the project back up, it will remember how you had tiles organized in the arranger, how you had the table set up in the hex editor, and so on.</p>
<p>You can open more than one project at a time. Each project opens in its own window (MDI), and each project&#8217;s editors are shown within a tabbed interface. This can be handy for copying and pasting tiles or hex between two ROMs, or comparing them side-by-side. Rather than using a &#8220;Window&#8221; menu, when more than one project is opened, a document list appears at the bottom of the window.</p>
<h2>2. Help</h2>
<p>To see basic help for the active editor click <code>SuiteNES-&gt;Editor Help</code> in the menu. This menu option will be grayed out if help is not available for the current editor.</p>
<h2>3. Files</h2>
<p>Besides the ROM, a project can contain additional files. On the left side of a project window is a file manager with the files shown on top, and the properties of the selected file shown beneath. Click on the divider bar to collapse the file browser, and click again to show the file manager.</p>
<p>SuiteNES currently only has built-in support for editing and processing .ASM (assembly) and .GFX (graphic tile) files, but any file can be included in the project.</p>
<h2>4. Building</h2>
<p>SuiteNES uses a build system. Each time you build the project, SuiteNES will process your project files and patch them into a copy of your ROM (found in the \bin directory of the project).</p>
<p>.GFX and .BIN files are patched directly to the ROM. For the file properties, <span style="color: #0000ff;"><strong>Action</strong></span> should be set to <code>Embed</code>, and <strong><span style="color: #0000ff;">Patch offset</span></strong> specifies where the data will be patched (in the <code>0x00000</code> hex format).</p>
<p>.ASM files are assembled and patched to the ROM. For assemblers, SuiteNES comes with ASM6 and snarfblASM built-in. To specify which assembler you would like to use, go to the file&#8217;s properties and specify <code>ASM6</code> or <code>snarfblasm</code> as the <span style="color: #0000ff;"><strong>Command</strong></span>.</p>
<h3>External Programs</h3>
<p>You can also use an external program to build a file. Suppose you prefer the Foobaz assembler over ASM6. Outside SuiteNES you would run Foobaz with the command <code>Foobaz myfile.asm</code> which will produce a file called <code>myfile.bin</code>.</p>
<p>To configure SuiteNES to use Foobaz to build the file, go to the file&#8217;s properties and change <span style="color: #0000ff;"><strong>Action</strong></span> from <code>Native build</code> to <code>Command line</code>. Set <span style="color: #0000ff;"><strong>Command</strong></span> appropriately to run Foobaz. For example: <code>Foobaz %FILE%</code>. (You will need to type the full path to Foobaz unless you add the directory that contains Foobaz.exe to the PATH includes in SuiteNES settings.) <span style="color: #0000ff;"><strong>Build output file</strong></span> should be the name of the output file that Foobaz creates: <code>%FILENAME%.bin</code>. <span style="color: #0000ff;"><strong>Patch offset</strong></span> specifies the location in the ROM to patch the assembled file (in hex).</p>
<h2>5. Debugging</h2>
<p>When you build and launch for project (<code>Project-&gt;Launch</code> in the menu, or <code>F5</code>), the result ROM is written in the <code>\BIN</code> folder, and then launched with the <em>default .NES file launcher</em>. If you use snarfblASM as your assembler, it will output files for FCEUX&#8217;s symbolic debugging. That means code like this:</p>
<pre>; Save map data
; -------------
.PATCH 02:B000
SaveMapData:

    JSR PrepLoadSaveIndexers

*   LDA MapRam,X
    STA MapSaveRam,Y

    DEY
    DEX
    BPL -

    JMP SaveHijackReturn

; Load map data
; -------------
LoadMapData:
    JSR PrepLoadSaveIndexers

*   LDA MapSaveRam,Y
    STA MapRam,X

    DEY
    DEX
    BPL -

    JMP LoadHijackReturn

    ; Delete routines
; ---------------
DeleteMap_RegisterName:
    JSR DeleteMap
    JMP $A764       ; Return from hijack

DeleteMap_SecondQuest:
    JSR DeleteMap
    JMP $AF5A       ; Return from hijack</pre>
<p>will look like this in the debugger:</p>
<pre>02:B000:20 37 B0  JSR PrepLoadSaveIndexers
02:B003:BD 50 7F  LDA MapRam,X @ $804F = #$8D
02:B006:99 60 7F  STA MapSaveRam,Y @ $7F61 = #$FF
02:B009:88        DEY
02:B00A:CA        DEX
02:B00B:10 F6     BPL $B003
02:B00D:4C 2A 9D  JMP $9D2A
02:B010:20 37 B0  JSR PrepLoadSaveIndexers
02:B013:B9 60 7F  LDA MapSaveRam,Y @ $7F61 = #$FF
02:B016:9D 50 7F  STA MapRam,X @ $804F = #$8D
02:B019:88        DEY
02:B01A:CA        DEX
02:B01B:10 F6     BPL $B013
02:B01D:4C 25 E6  JMP $E625
02:B020:20 2C B0  JSR DeleteMap
02:B023:4C 64 A7  JMP $A764
02:B026:20 2C B0  JSR DeleteMap
02:B029:4C 5A AF  JMP $AF5A</pre>
<h2> 6. Plugins</h2>
<p>The plugin system is not complete, and there really aren&#8217;t any plugins to use with the plugin system. The eventual goal of the plugin system is to allow new file editors and ROM data editors to be integrated into SuiteNES as well as file builders such as assemblers, text inserters, and anything else you can think of. Most of the plumbing is in place. What really needs work is the plugin <em>managing</em> part of the program.</p>
<h2>7. Revisions</h2>
<p>Ignore this.</p>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=348</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FCEUX Debug File Format</title>
		<link>http://snarfblam.com/words/?p=342</link>
		<comments>http://snarfblam.com/words/?p=342#comments</comments>
		<pubDate>Mon, 26 Mar 2012 16:36:46 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[ASM]]></category>
		<category><![CDATA[front]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[6502]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[fceux]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[nes]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=342</guid>
		<description><![CDATA[Just in case anybody else ever needs to know the format for FCEUX's debugger's config files (.deb), here it is, based on the source code for version 2.1.5 (found in \src\drivers\win\pref.cpp) and the contents of actual .deb files.]]></description>
			<content:encoded><![CDATA[<p>Just in case anybody else ever needs to know the format for FCEUX&#8217;s debugger&#8217;s config files (.deb), here it is, based on the source code for version 2.1.5 (found in \src\drivers\win\pref.cpp) and the contents of actual .deb files.<span id="more-342"></span></p>
<p>This is not an open or publicly documented format and may be different for different versions. Some of the data types used in the source code are platform-dependant. <code>int</code>, <code>uint</code>, and <code>ushort</code> are implementation-defined and may vary in size. Types with an asterix (*) appended are not confirmed, and are listed as the type they appear to be on a 32-bit platform.</p>
<pre>// FCEUX 2.1.5 .DEB FILE FORMAT

// For x86, int is 32 bits, short is 16 bits, byte is 8 bits.
// uint = unsigned int
// ushort = unsigned short
// uint16 = 16-bit unsigned integer
// byte = 8-bit integer

// Debugger Window
byte*           SymbolicDebugEnabled
uint            BookmarkCount
ushort[]        Bookmarks

BreakPoint[65] {
    uint16*         AddressStart
    uint16*         AddressEnd
    byte*           Flags

    uint            ConditionLen
    char[]          Condition
    uint            DescripLen
    char[]          Descrip
}

// Hex Editor Window
int*            HexBookmarkCount
HexBookmark[] {
    uint*           Address
    uint            DescripLen
    char[]          Descrip
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=342</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Editroid 3.0</title>
		<link>http://snarfblam.com/words/?p=331</link>
		<comments>http://snarfblam.com/words/?p=331#comments</comments>
		<pubDate>Thu, 22 Mar 2012 21:57:03 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[Editroid]]></category>
		<category><![CDATA[front]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[editroid]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[level editor]]></category>
		<category><![CDATA[metroid]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[rom]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=331</guid>
		<description><![CDATA[Editroid 3.0 (beta) is ready and willing to satisfy all your Metroid hacking desires! You can download the editor or the source code.]]></description>
			<content:encoded><![CDATA[<p>Editroid 3.0 (beta) is ready and willing to satisfy all your Metroid hacking desires! You can download the <a href="http://snarfblam.com/files/Editroid_3.0a.zip" target="_blank">editor</a> or the <a href="http://snarfblam.com/files/PublicSource_3.0a.zip" target="_blank">source code</a>.</p>
<ul>
<li>Expands ROMs further
<ul>
<li>Converts to CHR ROM &#8211; allows animated background tiles</li>
<li>15 KB per level for screens and structures (vs. about 3KB in the original game)</li>
<li>256 combos</li>
<li>Up to 32 rooms per level with item-room-music (vs. 7 in the original game)</li>
<li>More space for item data than you can use</li>
</ul>
</li>
<li>Added &#8220;NARPASSWORD&#8221; (invincibility/all equipment) to room testing feature</li>
<li>Improved map is larger and auto-hides</li>
<li>New &#8220;Screen Browser&#8221; and &#8220;Structure Browser&#8221; make it easy to find what you&#8217;re looking for</li>
</ul>
<div id="attachment_335" class="wp-caption aligncenter" style="width: 310px"><a href="http://snarfblam.com/words/wp-content/uploads/2012/03/Editroid3.png"><img class="size-medium wp-image-335" title="Editroid 3.0" src="http://snarfblam.com/words/wp-content/uploads/2012/03/Editroid3-300x278.png" alt="Editroid 3.0 Screenshot" width="300" height="278" /></a><p class="wp-caption-text">Editroid 3.0 with the structure browser</p></div>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=331</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zelda Tech 3.4</title>
		<link>http://snarfblam.com/words/?p=327</link>
		<comments>http://snarfblam.com/words/?p=327#comments</comments>
		<pubDate>Thu, 15 Mar 2012 23:00:34 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[Zelda Tech]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[level editor]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>
		<category><![CDATA[zelda]]></category>
		<category><![CDATA[zelda tech]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=327</guid>
		<description><![CDATA[Since the Zelda Tech section of the website is defunct and disused, and this part of the site is a lot easier to update, I&#8217;ll go ahead and put this here. A minor update of Zelda Tech with two fewer bugs. :/ Zelda Tech 3.4 For completeness, I&#8217;ll link to the other downloads here as [...]]]></description>
			<content:encoded><![CDATA[<p>Since the Zelda Tech section of the website is defunct and disused, and this part of the site is a lot easier to update, I&#8217;ll go ahead and put this here.</p>
<p>A minor update of Zelda Tech with two fewer bugs. :/</p>
<ul>
<li><a href="http://snarfblam.com/ztechhome/zeldatech3.4.zip">Zelda Tech 3.4</a></li>
</ul>
<p>For completeness, I&#8217;ll link to the other downloads here as well.</p>
<ul>
<li><a href="http://snarfblam.com/ztechhome/DungeonMaster0.1.zip">Dungeon Master 0.1</a></li>
<li><a href="http://snarfblam.com/ztechhome/ZTechCombo2.zip">Combo</a>: Zelda Tech 3.4 and Dungeon Master 0.1</li>
</ul>
<p>In the unlikely event that you do not have the .NET Framework installed, you&#8217;ll need to get it to run these programs.</p>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=327</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Metroid: Wavy-Ice</title>
		<link>http://snarfblam.com/words/?p=315</link>
		<comments>http://snarfblam.com/words/?p=315#comments</comments>
		<pubDate>Mon, 20 Feb 2012 16:32:31 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[ASM]]></category>
		<category><![CDATA[Editroid]]></category>
		<category><![CDATA[front]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[6502]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[editroid]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[metroid]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>
		<category><![CDATA[snarfblasm]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=315</guid>
		<description><![CDATA[I've decided to share my simple Wavy-Ice hack. It allows the player to combine the wave beam and ice beam in Metroid. Note that this only works on a ROM expanded by Editroid 2.1.]]></description>
			<content:encoded><![CDATA[<div id="attachment_320" class="wp-caption alignleft" style="width: 266px"><a href="http://snarfblam.com/words/wp-content/uploads/2012/02/autodrop37.png"><img class="size-full wp-image-320" title="Wavy-Ice" src="http://snarfblam.com/words/wp-content/uploads/2012/02/autodrop37.png" alt="Wavy-Ice screenshot" width="256" height="224" /></a><p class="wp-caption-text">Shootin&#39; through stuff. Freezing stuff. Wavy-Ice can do it all!</p></div>
<p>I&#8217;ve decided to share my simple Wavy-Ice hack. It allows the player to combine the wave beam and ice beam in Metroid. <strong><em>Note</em></strong> that this only works on a ROM expanded by Editroid 2.1. It will not work on an unexpanded ROM or an Editroid 3.0 ROM (I&#8217;ll release an updated patch for Editroid 3.0).</p>
<p>I&#8217;ve put together <a href="http://snarfblam.com/files/wavyice.zip">a zip</a> containing the code, an assembler, and a ready-to-go IPS patch. The code should be assembled with snarfblASM to produce an IPS file:</p>
<pre>&gt;snarfblasm wavyice.asm wavyice.ips -IPS:ON</pre>
<p><span id="more-315"></span>For your viewing pleasure:</p>
<pre>;     .           . · .
;       .       ·       ·       O
;         · . ·           · . ·
;
; Wavy-Ice hack for Metroid
; -------- ---- --- -------
;             by snarfblam
;             (at gmail.com)
;
; Allows combining of wave beam and ice beam.
; Also increases strength of ice, wavy-ice, and
; bombs.
;
; WARNING: THIS CODE IS NOT COMPATIBLE WITH
;          AND UNEXPANDED ROM!
; WARNING: THIS CODE IS NOT COMPATIBLE WITH
;          EDITROID 3.0. If you want to use
;          wavy-ice with a super-expanded
;          ROM, wait until Editroid 3.0 comes
;          out. I'll provide a compatible
;          wavy-ice hack.
;
; Things I Felt Like Saying
; ------ - ---- ---- ------
; - This code is designed to be assembled with
;   snarfblASM. If you want to use another assembler,
;   feel free to break the code up into several files,
;   assemble them separately, and insert them
;   individually.
; - This code is designed to work with an expanded
;   metroid ROM. If you want to use it with an un-
;   expanded ROM you need to:
;     - Move the NEW code to a different location where
;       there is free memory
;     - Change all .PATCH directives to use bank 07
;       instead of 0F.

;===========================================
; Allow weapon combining
; ----- ------ ---------
; NOPs out the code that removes one beam
; when the play aquires another.
;===========================================
.PATCH 0F:DBD2

        NOP ; LDA $6878
        NOP
        NOP

        NOP ; AND #$3F
        NOP

        NOP ; STA $6878
        NOP
        NOP

;===========================================
; New Behavior
; --- --------
; Calls the appropriate routine to update
; beam projectiles.
;===========================================

; Hijack
; ------
.PATCH 0F:D5C5
        JMP $C6B9

; New code
; --- ----
; Updates ice with wave behavior if the player has ice+wave, otherwise
; updates with normal ice behavior

.PATCH 0F:C6B9
        LDA $6878    ; Check equipment
        AND #$40     ; Has wave?
        BEQ NoWave
        JMP $D52C    ; Yes: UpdateWaveBullet
        ;(normally UpdateWaveBullet isn't called when you have ice, even if you do have wave)

    NoWave:
        JMP $D4EB    ; No: UpdateBullet

;===========================================
; New Damage
; --- ------
; Specifies damage amount for wave+ice. Also
; increases damage dealt by bombs and
; vanilla ice. Heh.
;===========================================

; Hijack
; ------
.PATCH 0F:F5EE
        JMP $C6C6

; New Code
; --- ----

.PATCH 0F:C6C6
        ; Y: Weapon type
        ;   1 = Normal
        ;   2 = Wave
        ;   3 = Ice or Wavy-ice
        ;   A = Bomb
        ;   B = Missile (I think)
        ; X: Enemy index
        ; 40B,X: enemy health

        LDY $040E,X        ; Get projectile that hit enemy
        LDA $6878          ; Get current equipment

        CPY #$03           ; If Ice...
        BNE NotIce

    Ice:
        AND #$C0           ;     Does the player have wave and ice beams?
        BNE Damage4        ;     If so, 4 damage
        BEQ Damage2        ;     Else, 2 damage

    NotIce:
    ; Includes vanilla-beam, bomb, wave, and missile
        CPY #$0A           ; Bomb = 4 Damage
        BEQ Damage4
        CPY #$02           ; Wave = 2 Damage
        BEQ Damage2

        BIT $0A            ; Not-a-boss = 1 Damage
        BVC Damage1

    IsABoss:
        CPY #$0B           ; Vanilla-beam = 1 damage
        BNE Damage1        ; (missile will fall thru and do 4 damage)

    Damage4:
        DEC $040B,X
        BEQ exitRoutine
    Damage3:
        DEC $040B,X
        BEQ exitRoutine
    Damage2:
        DEC $040B,X
        BEQ exitRoutine
    Damage1:
        DEC $040B,X

    exitRoutine:
        ; Return to F60F (this is the code that checks if enemies has
        ; 0 HP and if so, kills him)
        JMP $F60F

; Original code
; -------- ----
; Included for comparison
;    cpy #$02                ; Was enemy hit by wave?
;    beq +
;    bit $0A                 ; ?? (Might be a check for boss)
;    bvc ++                  ; If not, do 1 damage
;    ldy $040E,x

;    cpy #$0B                ; Was enemy hit by missile?
;    bne ++                  ; If not, do 1 damage

;    dec EnHitPoints,x       ; Do 4 damage
;    beq +++
;    dec EnHitPoints,x
;    beq +++
;*      dec EnHitPoints,x       ; Do 2 damage
;    beq ++
;*    dec EnHitPoints,x       ; Do 1 damage</pre>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=315</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metroid Tuner</title>
		<link>http://snarfblam.com/words/?p=282</link>
		<comments>http://snarfblam.com/words/?p=282#comments</comments>
		<pubDate>Wed, 01 Feb 2012 01:07:29 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[Editroid]]></category>
		<category><![CDATA[front]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[dumper]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[metroid]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=282</guid>
		<description><![CDATA[So I made this thing to edit Metroid (NES) music data, and I named it "Metroid Tuner," because I didn't feel like trying very hard to come up with a good name. Metroid Tuner dumps and inserts music using a relatively simple text-based format.]]></description>
			<content:encoded><![CDATA[<p>So I made this thing to edit Metroid (NES) music data, and I named it &#8220;Metroid Tuner,&#8221; because I didn&#8217;t feel like trying very hard to come up with a good name. Here is a <a href="http://snarfblam.com/files/MetroidTuner%201.0.zip">download link</a> to an alpha version of the utility that will crash and melt your computer and blow up your house and punch a kitten in the face.  <span id="more-282"></span>Metroid Tuner dumps and inserts music using a relatively simple text-based format. It can not currently be used from the command line, and it will probably stay that way unless somebody requests the feature (they wont). So here&#8217;s how it works:</p>
<div id="attachment_283" class="wp-caption alignright" style="width: 310px"><a href="http://snarfblam.com/words/wp-content/uploads/2012/01/MetTunerUI.png"><img class="size-medium wp-image-283 " title="Metroid Tuner" src="http://snarfblam.com/words/wp-content/uploads/2012/01/MetTunerUI-300x204.png" alt="Metroid Tuner UI" width="300" height="204" /></a><p class="wp-caption-text">&quot;ROM&quot; and &quot;Presets&quot; inputs</p></div>
<h2>Dumper</h2>
<p>When you first open the dumper, you&#8217;ll get a window with a bunch of confusing check-boxes and hexadecimals. It&#8217;s cool, though, you only need to worry about the two things highlighted in red (unless you&#8217;re doing something tricky).</p>
<p>Click the button next to the &#8220;Rom File&#8221; input to browse for a ROM to dump (or just type in the full path). Then select what you want to dump from the &#8220;Presets&#8221; list.  If you want to get tricky, you can select individual songs, or even individual tracks from songs, in the tree to the left (be warned, only one track specifies how long the song should be, and if this track isn&#8217;t dumped, the dumper will have a hard time figuring out when to stop dumping music data). There are also a couple of other song-related bits of data you can dump.</p>
<p>The input boxes below the presets are mostly there in case you&#8217;ve moved around important data that you&#8217;ll probably never move around.  Once you&#8217;ve picked your ROM and what you want to dump, click &#8220;Dump&#8221; in the lower-left corner.</p>
<h2>
<p><div id="attachment_288" class="wp-caption alignright" style="width: 340px"><a href="http://snarfblam.com/words/wp-content/uploads/2012/01/MetTunerCode1.png"><img class="size-full wp-image-288 " title="Metroid Tuner Dump" src="http://snarfblam.com/words/wp-content/uploads/2012/01/MetTunerCode1.png" alt="Metroid Tuner Dump" width="330" height="504" /></a><p class="wp-caption-text">Song dump</p></div></h2>
<h2>Editor</h2>
<p>When you dump the ROM, the dump is displayed in a text editor in a new tab. There&#8217;s lots of confusing stuff in there, which warrants some explanation. The good news is that you can freely ignore a lot of it. Skip down to &#8220;&lt;Track&gt; Section&#8221; if you don&#8217;t like reading. One thing I&#8217;ll point out is that comments begin with a double slash, <code>// Like so</code>.</p>
<h3>&lt;Context&gt; Section</h3>
<p>The &lt;Context&gt; section simply contains all the pointers you were instructed to ignore in the &#8220;Dumper&#8221; tab (in the form of [Fancy: Tags]). Continue ignoring these. The only tag worth mentioning is the [Bank] tag, which says which ROM bank we are dealing with.</p>
<p>Each level&#8217;s data resides in a separate, self-contained bank, and for some songs, there is a separate copy in each bank (for example, the item room music). Each dump file only deals with one bank (you can dump separate banks to separate tabs, however). Changing music data in one bank will never affect music in another bank.</p>
<h3>&lt;Song&gt; Section</h3>
<p>The &lt;Song&gt; section(s) are optional. They specify properties of the song. [Song] specifies the index of the song we are dealing with (look at the &#8220;Dumper&#8221; tab to see the list of songs and indecies). [Repeat] specifies whether the song loops.</p>
<p>As a form of compression, the game stores a few lists of pre-defined note lengths that you can use. [NoteLengthTable] specifies which note length table to use (00, 0B, and 17 identify the note length tables used in the game).</p>
<p>[TriangleLength] affects how long notes play on the Triangle song track. 00, 0F, and F0 are the only meaningful values here. I wish I could tell you exactly what they mean.  [Sq1VolumeTable] and [Sq2VolumeTable] specify which &#8220;volume table&#8221; each of the Square song tracks use. This affects the sound of the track&#8217;s &#8220;instrument.&#8221;</p>
<h3>&lt;Track&gt; Section</h3>
<p>The &lt;Track&gt; section is the good stuff. This is where the music data is actually stored. The [Song] and [Track] tags identify which track of which song the data pertains to. [MaxSize] specifies the largest data size we want to insert. You know, cause we don&#8217;t want to overflow into the game&#8217;s program and ruin everything. If you need more space for music data, find a large enough unused space for the data, and update [Address] and [MaxSize] accordingly.  As far as the actual music data, well, we&#8217;ll cover that below.</p>
<h3>Other Sections</h3>
<p>&lt;NoteTable&gt; defines the pitch of each note. If you change this, the notes shown in Metroid Tuner wont match those heard in the game. &lt;NoteLengthTable&gt; specifies the pre-defined note lengths used in the songs. If you change the note length table, be careful. Some tables affect multiple songs. Each &lt;VolumeTable&gt; helps define one of the game&#8217;s instruments. (The other aspect of the instruments is the game&#8217;s &#8220;duty-cycle and volume&#8221; data. If you want to change these values, you&#8217;ll need to dig around in Dirty McDingus&#8217; Metroid disassembly.)</p>
<h2>Music Data Format</h2>
<p>Music data is represented as a list of notes, using the note&#8217;s letter, followed by a # for sharp or lowercase &#8220;B&#8221; for flat, followed by the octave. For example, a middle C would be written as &#8220;C4.&#8221; The next half-note up would be &#8220;C#4&#8243; or &#8220;Db4&#8243;.  Before any notes are listed, a note length must be specified.</p>
<p>Note lengths are specified by the number of frames a note will play. Since the game runs at sixty frames per second, a note length of 60 will play for one second, a note length of 30 will play for half a second, and so on. A note length is written as a colon, followed by a <em>hexadecimal</em> number. For example, &#8220;:40&#8243; specifies a note length of 64 frames ($40 in hex = 64 in decimal), or roughly one second. After a note length is specified, all following notes will have that length until a different note length is specified. A dash (&#8220;-&#8221;) represents a rest (the duration of a rest is specified the same way as any other note).</p>
<pre>// Example: first four notes of "When the Saints Go Marching In"
:20   // 0.5 second notes
  C3 E3 F3
:60   // 1.5 second note
  G3</pre>
<p>For the &#8220;Noise&#8221; track, instead of dealing with notes, we deal with sound effects identified by a number in the hex format &#8220;$XX&#8221;. These numbers are preceded by a dollar sign. $01 is a rest. $02-$05 are meant to be used as drum sounds. Values $06 and up are not meant to be used, but they certainly do seem to produce some sounds. $00 should not be used, but if you insist on using it, it will behave like a song terminator.</p>
<p>Loops are enclosed in {curly braces}, with the number of times the loop will run before the braces. Nested loops are not supported.</p>
<pre>// Example: first eight notes of "When the Saints Go Marching In"
2 { // Play these notes twice
    :20   // 0.5 second notes
      C3 E3 F3
    :60   // 1.5 second note
      G3
}</pre>
<p>Note that the layout of the music data is completely up to you. The above listing could also be written as the more compact and harder-to-read <code>2{:20 C3 E3 F3 :60 G3}</code>.</p>
<p>At least one track should have a &#8220;song terminator&#8221; at the end. This is represented by a double-zero (&#8220;00&#8243;), <em>without</em> a dollar sign. As the game plays the music, if a song terminator is encountered, all tracks will stop, and playback will begin at the beginning of the song if song is set to repeat. If you forget to include the terminator when you insert, and you try to re-dump the song, the dumper wont know where the end of the song is, and you&#8217;ll end up with extra garbage.</p>
<p>One important thing to know is that you are restricted in what note lengths you can use (see &lt;Song&gt; Section). If you want to know which note lengths are allowed, check the check-box labelled &#8220;Note Length Table&#8221; in the dumper tab (you may have to scroll down). At the end of the dump there will be a list of note lengths.</p>
<h2>Inserting</h2>
<p>In the toolbar in the text editor window, there is a button with a green arrow. If you hover your mouse over it, a tool-tip appears with the text &#8220;Insert&#8221;. Click this button. Beware: this is when Metroid Tuner is most prone to violence toward domesticated animals. If everything goes well, it will appear as though nothing has happened. Play the ROM and you&#8217;ll find, however, that something has indeed happened.  If there are errors, they will be listed at the bottom of the text editor. Right-click the error list to hide it.</p>
<p>Tip: if you want to insert into a ROM without dumping anything first, using the &#8220;Dumper&#8221; tab, select your ROM, and use the &#8220;None&#8221; preset. It will bring up a text editor for the ROM with a blank slate where you can paste in your data-to-be-inserted.</p>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=282</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zelda Automap 0.2 Source</title>
		<link>http://snarfblam.com/words/?p=260</link>
		<comments>http://snarfblam.com/words/?p=260#comments</comments>
		<pubDate>Fri, 19 Aug 2011 01:17:16 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[SuiteNES]]></category>
		<category><![CDATA[6502]]></category>
		<category><![CDATA[asm]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>
		<category><![CDATA[romulus]]></category>
		<category><![CDATA[snarfblasm]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=260</guid>
		<description><![CDATA[Below is the source for the Zelda Automap hack (0.2). You can also download the source with the needed GFX file. The code should be assembled with snarfblASM. The resulting IPS file should be applied to the PRG0 version of the ROM (PRG1 appears to work as well, but the hack was created and tested [...]]]></description>
			<content:encoded><![CDATA[<p>Below is the source for the Zelda Automap hack (0.2). You can also <a href="http://snarfblam.com/files/Automap_0.2.zip">download the source</a> with the needed GFX file. The code should be assembled with snarfblASM. The resulting IPS file should be applied to the PRG0 version of the ROM (PRG1 appears to work as well, but the hack was created and tested on PRG0). Comments are welcome.</p>
<p><span id="more-260"></span><br />
<HR></p>
<div id="code_frame">
<style type="text/css">/**
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 */
._6502tasm .de1, ._6502tasm .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
._6502tasm  {font-family:monospace;}
._6502tasm .imp {font-weight: bold; color: red;}
._6502tasm li, ._6502tasm .li1 {background: #ffffff;}
._6502tasm .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
._6502tasm .li2 {background: #f8f8f8;}
._6502tasm .kw1 {color: #00f; font-weight:bold;}
._6502tasm .kw2 {color: #00f; font-weight:bold;}
._6502tasm .kw3 {color: #080; font-weight:bold;}
._6502tasm .kw4 {color: #f00; font-weight:bold;}
._6502tasm .kw5 {color: #80f; font-weight:bold;}
._6502tasm .kw6 {color: #f08; font-weight:bold;}
._6502tasm .kw7 {color: #a04; font-weight:bold; font-style: italic;}
._6502tasm .co1 {color: #999; font-style: italic;}
._6502tasm .es0 {color: #009; font-weight: bold;}
._6502tasm .br0 {color: #000;}
._6502tasm .sy0 {color: #080;}
._6502tasm .st0 {color: #080;}
._6502tasm .nu0 {color: #f00;}
._6502tasm .nu5 {color: #f00;}
._6502tasm .nu13 {color: #f00;}
._6502tasm span.xtra { display:block; }</p>
</style>
<div class="_6502tasm">
<ol>
<li class="li1">
<div class="de1"><span class="co1">; Zelda auto-map Patch </span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; 0.2</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; By snarfblam</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Includes:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; -Auto-map</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; -1/8 heart increments</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; -Faster potion/fairy refill</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; -Changed magic key count from &quot;A&quot; to &quot;infinity&quot; symbol</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; snarfblASM</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; This code should be assembled with snarfblASM. snarfblASM was</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; used for two reasons: </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; -The PATCH directive </span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; -I authored snarfblASM and I look for every opportunity to test it.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; PATCH directive</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; The .PATCH directive specifies a ROM offset for the code that</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; follows. This is good for hacks that need to insert code at</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; many locations. Syntax is as follows:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; .PATCH offset &nbsp; &nbsp; ; decimal</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; .PATCH $offset &nbsp; &nbsp;; hex</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; .PATCH 0xoffset &nbsp; ; hex</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; .PATCH BB:AAAA &nbsp; &nbsp;; B = bank, A = address (both hex). Assumes 16kb banks. Header is accounted for.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; CODE!!!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;-</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Map image</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH <span class="nu13">$16D10</span></div>
</li>
<li class="li2">
<div class="de2">.incbin <span class="st0">&quot;MapTiles.gfx&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Variable declarations</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;========================================================</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Game variables</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li1">
<div class="de1">LevelNumber &nbsp; &nbsp; &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$10</span></div>
</li>
<li class="li2">
<div class="de2">SaveSlot &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$16</span></div>
</li>
<li class="li1">
<div class="de1">PendingPpuMacro &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$14</span></div>
</li>
<li class="li2">
<div class="de2">CurrentMapLocation &nbsp;:<span class="sy0">=</span> <span class="nu13">$EB</span></div>
</li>
<li class="li1">
<div class="de1">NewMapLocation &nbsp; &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$EC</span></div>
</li>
<li class="li2">
<div class="de2">OAM_MapBlipY &nbsp; &nbsp; &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$0254</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Game routines</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1">BankSwap &nbsp; &nbsp; &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$FFAC</span></div>
</li>
<li class="li2">
<div class="de2">SendPpuMacro &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$A0F6</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Our addresses</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1">MapTiles &nbsp; &nbsp;<span class="sy0">=</span> <span class="nu13">$AD00</span> <span class="co1">; 06:AD00</span></div>
</li>
<li class="li2">
<div class="de2">VRAM_MapTiles <span class="sy0">=</span> <span class="nu13">$1300</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Our variables</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li1">
<div class="de1">.enum <span class="nu13">$6C00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; tileFlag: &nbsp; .dsb <span class="nu0">1</span> &nbsp;<span class="co1">; Used to indicate that there is a pending PPU macro for the map</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mapVar: &nbsp; &nbsp; .dsb <span class="nu0">1</span> &nbsp;<span class="co1">; Temporary storage variable</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; mapVar_X: &nbsp; .dsb <span class="nu0">1</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mapVar_Y: &nbsp; .dsb <span class="nu0">1</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; mapLoop_X: &nbsp;.dsb <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mapLoop_Y: &nbsp;.dsb <span class="nu0">1</span></div>
</li>
<li class="li2">
<div class="de2">.endenum</div>
</li>
<li class="li1">
<div class="de1">.enum <span class="nu13">$7F10</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; SecondPpuStringIndex: .DSB <span class="nu0">1</span> &nbsp; &nbsp;<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; MapBits_Left: &nbsp; .DSB <span class="nu0">1</span> &nbsp; &nbsp; &nbsp;<span class="co1">; Stores flags for whether the two screens in the left/right side</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; MapBits_Right: &nbsp;.DSB <span class="nu0">1</span> &nbsp; &nbsp; &nbsp;<span class="co1">; of the current map tile have been visited, in lower 2 bits</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; MapFilter_Top: &nbsp; &nbsp;.DSB <span class="nu0">1</span> &nbsp; &nbsp;<span class="co1">; Stores a value to be ANDed with the bytes of a map tile to black out unvisited screens</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; MapFilter_Bottom: .DSB <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; MapTileMacro: &nbsp; .DSB <span class="nu13">$14</span> &nbsp; &nbsp;<span class="co1">; 10 bytes of tile data, 2 byte pointer, 1 byte len specifier, 1 byte FF terminator</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;TempAddress: &nbsp; &nbsp;.DW 1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; MapBlipY: &nbsp; &nbsp; &nbsp; .DSB <span class="nu13">$1</span> &nbsp; &nbsp; <span class="co1">; Stores the y-coordinate of the map blip</span></div>
</li>
<li class="li1">
<div class="de1">.ende</div>
</li>
<li class="li2">
<div class="de2">.enum <span class="nu13">$7F50</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; MapRam: &nbsp; &nbsp; .DSB <span class="nu13">$10</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; MapSaveRam: .DSB <span class="nu13">$30</span></div>
</li>
<li class="li1">
<div class="de1">.ende</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Registers</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">PpuControl1 &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$2000</span></div>
</li>
<li class="li1">
<div class="de1">PpuControl2 &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$2001</span></div>
</li>
<li class="li2">
<div class="de2">PpuStatus &nbsp; &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$2002</span></div>
</li>
<li class="li1">
<div class="de1">OamAddress &nbsp; &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$2003</span></div>
</li>
<li class="li2">
<div class="de2">OamData &nbsp; &nbsp; &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$2004</span></div>
</li>
<li class="li1">
<div class="de1">PpuScroll &nbsp; &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$2005</span></div>
</li>
<li class="li2">
<div class="de2">PpuAddress &nbsp; &nbsp; &nbsp;:<span class="sy0">=</span> <span class="nu13">$2006</span></div>
</li>
<li class="li1">
<div class="de1">PpuData &nbsp; &nbsp; &nbsp; &nbsp; :<span class="sy0">=</span> <span class="nu13">$2007</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;&quot;AUTOMAP BY SNARF&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Adds by-line to title screen</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">.PATCH <span class="nu13">$1A8C5</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$0A</span>, <span class="nu13">$1E</span>, <span class="nu13">$1D</span>, <span class="nu13">$18</span>, <span class="nu13">$16</span>, <span class="nu13">$0A</span>, <span class="nu13">$19</span>, <span class="nu13">$24</span>, <span class="nu13">$00</span>, <span class="nu13">$2C</span>, <span class="nu13">$02</span>, <span class="nu13">$24</span>, <span class="nu13">$0B</span>, <span class="nu13">$22</span>, <span class="nu13">$24</span>, <span class="nu13">$1C</span>, <span class="nu13">$17</span>, <span class="nu13">$0A</span>, <span class="nu13">$1B</span>, <span class="nu13">$0F</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;A &nbsp; &nbsp;U &nbsp; &nbsp;T &nbsp; &nbsp;O &nbsp; &nbsp;M &nbsp; &nbsp;A &nbsp; &nbsp;P &nbsp; &nbsp; &nbsp; &nbsp; 0 &nbsp; &nbsp;. &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; B &nbsp; &nbsp;Y &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp;N &nbsp; &nbsp;A &nbsp; &nbsp;R &nbsp; &nbsp;F </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Map blip blinking</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; New blip pattern</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH <span class="nu13">$846F</span></div>
</li>
<li class="li1">
<div class="de1">.HEX e0 e0 e0 00 00 00 00 00 e0 a0 e0 00 00 00 00 00 </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Corrects positioning of map blip</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; :71F7: &nbsp; &nbsp; LDA #$11 &nbsp; &nbsp; &nbsp; ; A = left edge of map</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Blip update routine</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH 05:BC00</div>
</li>
<li class="li1">
<div class="de1">BlipUpdate:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">PHA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Exit if in a dungeon</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> LevelNumber</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BNE</span> exitHijack</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Grab the current blip position if it is on-screen</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> OAM_MapBlipY</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$FF</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BEQ</span> <span class="sy0">+</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">STA</span> MapBlipY</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">OW_BlipUpdate:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$15</span> <span class="co1">; Get frame counter</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Blink every 32 frames</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BCC</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Show blip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> MapBlipY</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> OAM_MApBlipY</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> exitHijack</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Hide blip</span></div>
</li>
<li class="li2">
<div class="de2"><span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$FF</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> OAM_MapBlipY</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">exitHijack:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> <span class="nu13">$77E7</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Hijack </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH 07:F322 <span class="co1">; Per-frame update hijack &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> SafeBlipUpdate </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; SafeBlipUpdate</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;This routine is placed after DoWholeMapHijack (under &quot;Draw whole map -HIJACK-&quot;) below</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;because these two functions must be placed in the fixed bank, together in the small available space.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;New heart data</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; New heart PPU macros</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; The PPU addresses of these macros have been swapped so that the hearts fill the top row before the bottom row.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH <span class="nu13">$6517</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; First row of hearts</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$20</span>, <span class="nu13">$D6</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$08</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Second row of hearts</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$20</span>, <span class="nu13">$B6</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$08</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &quot;-LIFE-&quot; (unchanged)</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH <span class="nu13">$1bF1E</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$62</span>, <span class="nu13">$15</span>, <span class="nu13">$12</span>, <span class="nu13">$0F</span>, <span class="nu13">$0E</span>, <span class="nu13">$62</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; New heart tiles</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH <span class="nu13">$8C8F</span></div>
</li>
<li class="li2">
<div class="de2">.HEX 6c ee ee ee fe 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e de fe fe 7c <span class="nu0">38</span> <span class="nu0">10</span> <span class="co1">; Partial hearts</span></div>
</li>
<li class="li1">
<div class="de1">.HEX 6c ee ee ee fe 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9e 9e fe 7c <span class="nu0">38</span> <span class="nu0">10</span> </div>
</li>
<li class="li2">
<div class="de2">.HEX 6c ee ee ee ee 5c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9e 9e 9e 7c <span class="nu0">38</span> <span class="nu0">10</span> </div>
</li>
<li class="li1">
<div class="de1">.HEX 6c ee ee ee ee 6c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9e 9e 9e 5c <span class="nu0">28</span> <span class="nu0">10</span> </div>
</li>
<li class="li2">
<div class="de2">.HEX 6c fe ee ee f6 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9e 9e 8e <span class="nu0">44</span> <span class="nu0">28</span> <span class="nu0">10</span> </div>
</li>
<li class="li1">
<div class="de1">.HEX 6c fe ee fe fe 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9e <span class="nu0">82</span> <span class="nu0">82</span> <span class="nu0">44</span> <span class="nu0">28</span> <span class="nu0">10</span> </div>
</li>
<li class="li2">
<div class="de2">.HEX 6c fa e6 fe fe 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9a <span class="nu0">82</span> <span class="nu0">82</span> <span class="nu0">44</span> <span class="nu0">28</span> <span class="nu0">10</span> </div>
</li>
<li class="li1">
<div class="de1">.HEX 6c fa e6 fe fe 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c 9e 9a <span class="nu0">82</span> <span class="nu0">82</span> <span class="nu0">44</span> <span class="nu0">28</span> <span class="nu0">10</span> </div>
</li>
<li class="li2">
<div class="de2">.HEX 6c 9e 9a b2 f2 6c 00 00 00 00 00 00 00 00 00 00 </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">.PATCH <span class="nu13">$8E8F</span></div>
</li>
<li class="li1">
<div class="de1">.HEX 6c fe fe fe fe 7c <span class="nu0">38</span> <span class="nu0">10</span> 6c <span class="nu0">92</span> <span class="nu0">82</span> <span class="nu0">82</span> <span class="nu0">82</span> <span class="nu0">44</span> <span class="nu0">28</span> <span class="nu0">10</span> <span class="co1">; Whole heart</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Magic key tile index</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; This byte specifies the tile index to use for the key count when player has the magic key</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH <span class="nu13">$65b2</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$58</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp;Map PPU macros</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; New tilemap for the map to allow each tile to be unique.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH <span class="nu13">$1935F</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Whole overworld map</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$20</span>, <span class="nu13">$62</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$08</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;.db $30,$30,$30,$30,$30,$30,$30,$30</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$30</span>, <span class="nu13">$31</span>, <span class="nu13">$32</span>, <span class="nu13">$33</span>, <span class="nu13">$34</span>, <span class="nu13">$35</span>, <span class="nu13">$36</span>, <span class="nu13">$37</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$20</span>, <span class="nu13">$82</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$08</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;.db $30,$30,$30,$30,$30,$30,$30,$30</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$38</span>, <span class="nu13">$39</span>, <span class="nu13">$3A</span>, <span class="nu13">$3B</span>, <span class="nu13">$3C</span>, <span class="nu13">$3D</span>, <span class="nu13">$3E</span>, <span class="nu13">$3F</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$20</span>, <span class="nu13">$A2</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$08</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;.db $30,$30,$30,$30,$30,$30,$30,$30</span></div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$40</span>, <span class="nu13">$41</span>, <span class="nu13">$42</span>, <span class="nu13">$43</span>, <span class="nu13">$44</span>, <span class="nu13">$45</span>, <span class="nu13">$46</span>, <span class="nu13">$47</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">.db <span class="nu13">$20</span>, <span class="nu13">$C2</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$08</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;.db $30,$30,$30,$30,$30,$30,$30,$30</span></div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$48</span>, <span class="nu13">$49</span>, <span class="nu13">$4A</span>, <span class="nu13">$4B</span>, <span class="nu13">$4C</span>, <span class="nu13">$4D</span>, <span class="nu13">$4E</span>, <span class="nu13">$4F</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.db <span class="nu13">$FF</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp;New Map Attribute</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Used to apply the proper palette for the overworld map.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; This is the original routine that queues the PPU macro that sets HUD palettes</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;05:B005:A9 18 &nbsp; &nbsp; LDA #$18</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;05:B007:D0 0F &nbsp; &nbsp; BNE $B018</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;05:B009:A9 D0 &nbsp; &nbsp; LDA #$D0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;05:B00B:A0 17 &nbsp; &nbsp; LDY #$17</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;05:B00D:4C 01 85 &nbsp;JMP $8501</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;05:B010:A9 E8 &nbsp; &nbsp; LDA #$E8</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;05:B012:A0 2F &nbsp; &nbsp; LDY #$2F</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;05:B014:D0 F7 &nbsp; &nbsp; BNE $B00D</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;05:B016:A9 0E &nbsp; &nbsp; LDA #$0E</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;05:B018:85 14 &nbsp; &nbsp; STA $0014 = #$00</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;05:B01A:E6 13 &nbsp; &nbsp; INC $0013 = #$05</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;05:B01C:60 &nbsp; &nbsp; &nbsp; &nbsp;RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">OriginalHudAttributeMacro <span class="sy0">=</span> <span class="nu13">$A2D3</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH 05:B01A</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Hijack the routine that queues the attribute macro</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> NewHudMacroSelector</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">.PATCH 05:AF20</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Map palette selection routine</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; If the overworld map attribute macro is queued in a level, we swap in the</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; dungeon map attribute macro (since we&#8217;ve changed the overworld map macro)</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">NewHudMacroSelector:</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Skip this routine for overworld</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> LevelNumber</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BEQ</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Only run this routine if the pending macro is the HUD attribute macro</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> PendingPpuMacro</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$0E</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">+</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Change 0E to 7E to load dungeon hud attributes &nbsp; &nbsp;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$7E</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> PendingPpuMacro</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">INC</span> <span class="nu13">$13</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Modifications to PPU macro pointer table</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Pointer to below attributes (new overworld attribute macro)</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 06:A00E </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; .DW OverworldAttributeData &nbsp; &nbsp; &nbsp;<span class="co1">; New overworld map attribute macro</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 06:A07E</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; .DW OriginalHudAttributeMacro &nbsp; <span class="co1">; Original attribute macro to be used for dungeons</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; New attribute data &nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH 06:BEF0</div>
</li>
<li class="li1">
<div class="de1">OverworldAttributeData:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; New data to change map colors</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; .DB <span class="nu13">$23</span>, <span class="nu13">$C0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .DB <span class="nu13">$10</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; .DB <span class="nu13">$C0</span>, <span class="nu13">$FF</span>, <span class="nu13">$70</span>, <span class="nu13">$00</span>, <span class="nu13">$00</span>, <span class="nu13">$44</span>, <span class="nu13">$55</span>, <span class="nu13">$55</span>, <span class="nu13">$FF</span>, <span class="nu13">$FF</span>, <span class="nu13">$37</span>, <span class="nu13">$00</span>, <span class="nu13">$00</span>, <span class="nu13">$44</span>, <span class="nu13">$55</span>, <span class="nu13">$55</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; This is additional macros from the original data. It needs to be part of the same PPU macro string.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .DB <span class="nu13">$20</span>, <span class="nu13">$6F</span>, <span class="nu13">$0E</span>, <span class="nu13">$69</span>, <span class="nu13">$0B</span>, <span class="nu13">$6B</span>, <span class="nu13">$69</span>, <span class="nu13">$0A</span>, <span class="nu13">$6B</span>, <span class="nu13">$24</span>, <span class="nu13">$24</span>, <span class="nu13">$62</span>, <span class="nu13">$15</span>, <span class="nu13">$12</span>, <span class="nu13">$0F</span>, <span class="nu13">$0E</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; .DB <span class="nu13">$62</span>, <span class="nu13">$20</span>, <span class="nu13">$CF</span>, <span class="nu13">$06</span>, <span class="nu13">$6E</span>, <span class="nu13">$6A</span>, <span class="nu13">$6D</span>, <span class="nu13">$6E</span>, <span class="nu13">$6A</span>, <span class="nu13">$6D</span>, <span class="nu13">$20</span>, <span class="nu13">$8F</span>, <span class="nu13">$C2</span>, <span class="nu13">$6C</span>, <span class="nu13">$20</span>, <span class="nu13">$91</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .DB <span class="nu13">$C2</span>, <span class="nu13">$6C</span>, <span class="nu13">$20</span>, <span class="nu13">$92</span>, <span class="nu13">$C2</span>, <span class="nu13">$6C</span>, <span class="nu13">$20</span>, <span class="nu13">$94</span>, <span class="nu13">$C2</span>, <span class="nu13">$6C</span>, <span class="nu13">$20</span>, <span class="nu13">$6B</span>, <span class="nu13">$84</span>, <span class="nu13">$F7</span>, <span class="nu13">$24</span>, <span class="nu13">$F9</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; .DB <span class="nu13">$61</span>, <span class="nu13">$FF</span>, <span class="nu13">$29</span>, <span class="nu13">$84</span>, <span class="nu13">$09</span>, <span class="nu13">$12</span>, <span class="nu13">$17</span>, <span class="nu13">$1F</span>, <span class="nu13">$0E</span>, <span class="nu13">$17</span>, <span class="nu13">$1D</span>, <span class="nu13">$18</span>, <span class="nu13">$1B</span>, <span class="nu13">$22</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Terminator</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; .DB <span class="nu13">$FF</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Save/Load/Delete Hijacks</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;========================================================</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Save Hijack</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; 02:A77A: &nbsp; &nbsp;JSR $9D2A </span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 02:A77A</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> SaveMapData</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SaveHijackReturn <span class="sy0">=</span> <span class="nu13">$9D2A</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Load Hijack</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; 02:A5FE: &nbsp; &nbsp;JSR $E625</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 02:A5FE</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> LoadMapData</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; LoadHijackReturn <span class="sy0">=</span> <span class="nu13">$E625</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Delete Map Hijack &#8211; Register Name</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="co1">;02:A2C7: &nbsp;JSR $A764 = File creation hijack</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 02:A2C7</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> DeleteMap_RegisterName</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Delete Map Hijack 2 &#8211; Second Quest </span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="co1">;02:ABB5: &nbsp;JMP $AF5A = Second quest hijack </span></div>
</li>
<li class="li2">
<div class="de2">.PATCH 02:ABB5</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> DeleteMap_SecondQuest</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Save/Load/Delete routines</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Save map data</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 02:B000</div>
</li>
<li class="li2">
<div class="de2">SaveMapData:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> PrepLoadSaveIndexers</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> MapRam,<span class="kw2">X</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> MapSaveRam,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">DEX</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BPL</span> <span class="sy0">-</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> SaveHijackReturn</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Load map data</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li2">
<div class="de2">LoadMapData:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> PrepLoadSaveIndexers</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> MapSaveRam,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> MapRam,<span class="kw2">X</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">DEX</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BPL</span> <span class="sy0">-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JMP</span> LoadHijackReturn</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Delete routines</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li1">
<div class="de1">DeleteMap_RegisterName:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> DeleteMap</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> <span class="nu13">$A764</span> &nbsp; &nbsp; &nbsp; <span class="co1">; Return from hijack</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">DeleteMap_SecondQuest:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> DeleteMap</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> <span class="nu13">$AF5A</span> &nbsp; &nbsp; &nbsp; <span class="co1">; Return from hijack</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Delete map data</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">DeleteMap:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDX</span> <span class="sy0">#</span><span class="nu13">$0F</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">STA</span> MapRam,<span class="kw2">X</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">DEX</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BPL</span> <span class="sy0">-</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span> &nbsp; &nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Common routines</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">PrepLoadSaveIndexers:</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Sets the Y register to point to the end of the player&#8217;s map save data (MapSaveRam,Y),</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; and sets X to point to the end of map data ram.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$0F</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDX</span> SaveSlot &nbsp; &nbsp;<span class="co1">; Save slot 1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BEQ</span> <span class="sy0">+</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$1F</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Save slot 2</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">DEX</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BEQ</span> <span class="sy0">+</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$2F</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Save slot 3</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">LDX</span> <span class="sy0">#</span><span class="nu13">$0F</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Updating map spot</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Updates a single tile on the map as the player walks around</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Hijack</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 05:A8BE</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">;05:A8BE:20 F4 A9 &nbsp;JSR $A9F4</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; UpdateMapSpotReturn <span class="sy0">=</span> <span class="nu13">$A9F4</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> UpdateMapSpot <span class="co1">;$85A0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Update routine</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 05:85A0</div>
</li>
<li class="li2">
<div class="de2">UpdateMapSpot:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">;JSR $752F &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Displaced code</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Update map data</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> CurrentMapLocation</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">AND</span> <span class="sy0">#</span><span class="nu13">$0F</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Get X-coordinate</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TAX</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Used to index into map data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Push tile-X onto stack</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">PHA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> CurrentMapLocation</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; A /= 16 (get map Y)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TAY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">PHA</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Push Tile-Y onto stack</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Set bit for y location</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$01</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">CPY</span> <span class="sy0">#</span><span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BEQ</span> <span class="sy0">++</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="sy0">*</span> &nbsp; <span class="kw1">ASL</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ORA</span> MapRam,<span class="kw2">X</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> MapRam,<span class="kw2">X</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Pull tile index into registers</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TAY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TAX</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> UpdateMapTile</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">;RTS</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> UpdateMapSpotReturn</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;Update map tile</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; =========================================================== &nbsp; &nbsp;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;Processes map data and invokes the rendering routine.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp;Used by &quot;Update map spot&quot; and &quot;draw whole map&quot; code</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;PlayerMapData = $7F50</span></div>
</li>
<li class="li2">
<div class="de2">PpuMapMacroBase <span class="sy0">=</span> <span class="nu13">$6BCD</span> &nbsp; &nbsp; <span class="co1">; Map macros</span></div>
</li>
<li class="li1">
<div class="de1">SingleTileMacro <span class="sy0">=</span> <span class="nu13">$6BFA</span> &nbsp; &nbsp; <span class="co1">; Single map tile macro</span></div>
</li>
<li class="li2">
<div class="de2">SingleTileMacroByte <span class="sy0">=</span> <span class="nu13">$6BFD</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">PpuMapMacroLen <span class="sy0">=</span> <span class="nu13">$B</span> &nbsp; &nbsp; <span class="co1">; 11 Bytes: 8 tiles + 3-byte header</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">MapTiles <span class="sy0">=</span> <span class="nu13">$30</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH 05:BC30</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">UpdateMapTile:</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; A &#8211; Unused</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; X &#8211; Tile X</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Y &#8211; Tile Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STX</span> mapVar_X</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STY</span> mapVar_Y</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TXA</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; X = X * 2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ASL</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TAX</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; We need to extract four bits out of the player&#8217;s &quot;explored map data&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; and use them as a tile index</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> MapRam,<span class="kw2">X</span> &nbsp; &nbsp; <span class="co1">; Load map byte</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> ProcessMapByte &nbsp; &nbsp; &nbsp;<span class="co1">; Get relevant two bits</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> mapVar &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Store semi-calculated tile value</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> MapBits_Left</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDY</span> mapVar_Y</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> MapRam <span class="sy0">+</span> <span class="nu0">1</span>,<span class="kw2">X</span> <span class="co1">; Get next map byte</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> ProcessMapByte &nbsp; &nbsp; &nbsp;<span class="co1">; Get relevant two bits</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> MapBits_Right</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Set flag to update single tile on screen</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$01</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> tileFlag</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> RenderMapTile</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">ProcessMapByte:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Takes a player-map data byte and gets the relevant two bits out of it</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; A &#8211; Map byte</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Y &#8211; Map Tile Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Return via A</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; A = A &gt;&gt; (Y * 2) | 3</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">CPY</span> <span class="sy0">#</span><span class="nu13">$00</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; While Y != 0</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BEQ</span> <span class="sy0">++</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">LSR</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; &nbsp; A &gt;&gt; 2</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">DEY</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; &nbsp; Y&#8211;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="sy0">*</span> &nbsp; <span class="kw1">AND</span> <span class="sy0">#</span><span class="nu13">$03</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; A</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;Draw whole map</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; =========================================================== &nbsp; &nbsp;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">DrawWholeMap:</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Prepare PPU to write map data</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$2002</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#&gt;</span>VRAM_MapTiles <span class="co1">; Set PPU address</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$2006</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#&lt;</span>VRAM_MapTiles</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$2006</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$00</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Loop over Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> mapLoop_Y</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$00</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; &nbsp; Loop over X</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">STA</span> mapLoop_X</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LDX</span> mapLoop_X &nbsp; &nbsp; &nbsp; <span class="co1">; &nbsp; &nbsp; &nbsp; Render one map tile</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">LDY</span> mapLoop_Y</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">JSR</span> UpdateMapTile</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">;TYA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">;PHA </span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">TXA</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; &nbsp; &nbsp; &nbsp; Send to PPU (preserve registers)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">PHA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">JSR</span> SendTileToPPU</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">TAX</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">;PLA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">;TAY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">INC</span> mapLoop_X</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">LDA</span> mapLoop_X</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$08</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">INC</span> mapLoop_Y</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">LDA</span> mapLoop_Y</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$04</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">&#8211;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SendTileToPPU:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDX</span> <span class="sy0">#</span><span class="nu13">$00</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> MapTileMacro<span class="sy0">+</span><span class="nu0">3</span>,<span class="kw2">X</span> &nbsp; &nbsp;<span class="co1">; Load tile data byte</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$2007</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Write to PPU</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">INX</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CPX</span> <span class="sy0">#</span><span class="nu13">$10</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp;Map tile rendering</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; =========================================================== &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">RenderMapTile:</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Parameters</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &#8211; mapVar_X : &nbsp; &nbsp; Tile X</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &#8211; mapVar_Y : &nbsp; &nbsp; Tile Y</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &#8211; mapBits_Left: &nbsp;Bit-0 = TL screen discovered, Bit-1 = BL screen discovered</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &#8211; mapBits_Right: Bit-0 = TR screen discovered, Bit-1 = BR &nbsp;screen discovered</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Preserve zp variables</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">PHA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$01</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">PHA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Calculate the source address of tile data, to copy to macro</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; and the PPU dest address to write to the macro.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Address = BaseAddress + tileX * $10 + tileY * $80</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Y = tileY / 2</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Set x to low byte of pointer (will be 00 or 80)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDX</span> <span class="sy0">#</span><span class="nu13">$00</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Low byte of src/dest pointers</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> mapVar_Y</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TAY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BCC</span> <span class="sy0">+</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; If carry was set (Y was odd), add 80 to low byte of pointers</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDX</span> <span class="sy0">#</span><span class="nu13">$80</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="sy0">*</span> &nbsp; <span class="kw1">STX</span> <span class="nu13">$00</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Write low byte of pointer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> mapVar_X &nbsp; &nbsp;<span class="co1">; Add mapVar_X * #$10 to $00</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ASL</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">ASL</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ASL</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">ASL</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">CLC</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">ADC</span> <span class="nu13">$00</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Write low byte of ROM source and PPU dest (low byte will be same on both)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Calculate high byte of src pointer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">TYA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">ADC</span> <span class="sy0">#</span><span class="nu13">$AD</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$01</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Calculate high byte of dest pointer</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">TYA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ADC</span> <span class="sy0">#</span><span class="nu13">$13</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Write macro-length</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$10</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Run this code twice to create two bit filters (to be ANDed) for tile data, one for top half, one for bottom</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; This &quot;blacks out&quot; map areas that have not been visited.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$00</span> &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">MapBitLoop:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$FF</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">LSR</span> MapBits_Left &nbsp; &nbsp;<span class="co1">; Grab low bit (for top-left or bottom-left)</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BCS</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AND</span> <span class="sy0">#</span><span class="nu13">$0F</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; If clear, AND out high nibble</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LSR</span> MapBits_Right &nbsp; <span class="co1">; Grab low bit (for top-right or bottom-right)</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BCS</span> <span class="sy0">+</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AND</span> <span class="sy0">#</span><span class="nu13">$F0</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; If clear, AND out low nibble</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">STA</span> MapFilter_Top,<span class="kw2">Y</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">INY</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CPY</span> <span class="sy0">#</span><span class="nu13">$02</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> MapBitLoop</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Copy 10 bytes of tile data</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; We use four loops:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; &nbsp; -Top half, first plane</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; &nbsp; -Bottom half, first plane</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; &nbsp; -Top half, second plane</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; &nbsp; -Bottom half, second plane</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$03</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="br0">&#40;</span><span class="nu13">$00</span><span class="br0">&#41;</span>,<span class="kw2">Y</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AND</span> MapFilter_Top</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu0">3</span>,<span class="kw2">Y</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BPL</span> <span class="sy0">-</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$07</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="br0">&#40;</span><span class="nu13">$00</span><span class="br0">&#41;</span>,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AND</span> MapFilter_Bottom</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu0">3</span>,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">CPY</span> <span class="sy0">#</span><span class="nu13">$03</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$0B</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="br0">&#40;</span><span class="nu13">$00</span><span class="br0">&#41;</span>,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AND</span> MapFilter_Top</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu0">3</span>,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">CPY</span> <span class="sy0">#</span><span class="nu13">$07</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span> &nbsp; &nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDY</span> <span class="sy0">#</span><span class="nu13">$0F</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="br0">&#40;</span><span class="nu13">$00</span><span class="br0">&#41;</span>,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">AND</span> MapFilter_Bottom</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu0">3</span>,<span class="kw2">Y</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">DEY</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">CPY</span> <span class="sy0">#</span><span class="nu13">$0B</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">-</span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Write terminator to end of macro</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$FF</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> MapTileMacro <span class="sy0">+</span> <span class="nu13">$13</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Restore zero-page</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">PLA</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$01</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp;Partial heart routine</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; =========================================================== &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Partial heart routine</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">PartialHeartRoutine:</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; Returns appropriate tile index in A</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$0F</span> &nbsp; &nbsp; <span class="co1">; Load partial-heart value</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Divide by $20 (into a range of 0-7)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LSR</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CLC</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ADC</span> <span class="sy0">#</span><span class="nu13">$50</span> &nbsp; &nbsp;<span class="co1">; Partial-heart tiles are # 50-57</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> <span class="nu13">$6ED7</span> &nbsp; <span class="co1">; Return from hijack</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Hijack</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Original code</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; (1):6EC8:C9 80 &nbsp; &nbsp; CMP #$80 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; If partial-heart-value &gt;= #$80, load full-heart-tile</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;:6ECA:B0 F4 &nbsp; &nbsp; BCS $6EC0 &nbsp; &nbsp; &nbsp; &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;:6ECC:A9 00 &nbsp; &nbsp; LDA #$00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; ??????????????</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;:6ECE:8D 29 05 &nbsp;STA $0529 &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; (2):6ED1:A9 65 &nbsp; &nbsp; LDA #$65 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Load half-full heart tile</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;:6ED3:D0 02 &nbsp; &nbsp; BNE $6ED7 &nbsp; &nbsp; &nbsp; &nbsp; ; Branch always &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; (1) &#8211; Update value of CMP #$80 to run our partial heart routine for smaller increments</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; (2) &#8211; Hijack goes here</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH <span class="nu13">$6748</span></div>
</li>
<li class="li2">
<div class="de2">.BASE &nbsp;<span class="nu13">$6EC8</span> &nbsp; &nbsp;<span class="co1">; This code is run from RAM</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$F8</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BCS</span> <span class="nu13">$6EC0</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">*</span> &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$0529</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JMP</span> PartialHeartRoutine</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;Draw whole map -HIJACK-</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; =========================================================== &nbsp;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Original code</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp; &nbsp; Displaced code is called at end of DoWholeMapHijack routine</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp; &nbsp; &nbsp;-06:8089:E6 11 &nbsp; &nbsp; INC $0011 = #$00</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp; &nbsp; &nbsp; 06:808B:60 &nbsp; &nbsp; &nbsp; &nbsp;RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Hijack</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH 06:<span class="nu0">8089</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> DoWholeMapHijack</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Hijack code</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; This routine must go in the fixed bank because bank-swapping is </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; needed to run the desired code.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH &nbsp;07:FFC0</div>
</li>
<li class="li2">
<div class="de2">DoWholeMapHijack: &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> LevelNumber <span class="co1">; Only run this routine for the overworld</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> Exit</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Load bank 5</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$05</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; The code we want to run is in a different bank than is currently loaded</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> BankSwap</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> DrawWholeMap</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">; Load bank 6 &nbsp; &nbsp;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="sy0">#</span><span class="nu13">$06</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; This is the bank that was previously loaded</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> BankSwap</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">Exit:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Displaced code</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">INC</span> <span class="nu13">$11</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Safe blip update</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;-</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; This code really &nbsp;belongs under the &quot;Map blip blinking&quot; section, but is placed with DoWholeMapHijack, because</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; they need to be placed together in the tiny bit of free space in the fixed bank.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">.PATCH 07:FFD6</div>
</li>
<li class="li2">
<div class="de2">SafeBlipUpdate:</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; Only runs the blip-flashing code when it is banked in.</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">PHA</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Need to preserve A</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$8000</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$20</span> &nbsp; &nbsp;<span class="co1">; Is this bank 5? (checking for a known value)</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">BNE</span> <span class="sy0">+</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JMP</span> BlipUpdate</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2"><span class="sy0">*</span> &nbsp; <span class="kw1">PLA</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JMP</span> <span class="nu13">$77E7</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp;PPU Transfers</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;WholeMapMacro = $6BCD</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; PPU update hijack </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp; &nbsp; 07:E4C1: &nbsp; &nbsp; &nbsp;JSR $A080</span></div>
</li>
<li class="li1">
<div class="de1">.Patch 07:E4C1</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> <span class="nu13">$9D70</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; PPU Trasnfer </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &#8212;&#8212;&#8212;&#8212;</span></div>
</li>
<li class="li2">
<div class="de2">.PATCH 06:9D70</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; Call displaced code</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">JSR</span> <span class="nu13">$A080</span> &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">lda</span> LevelNumber &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; If we aren&#8217;t in overworld, clear flag and return</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">bne</span> ClearAndReturn</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">; this bit is from the old automap (without an actual image of overworld)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ldx</span> tileFlag &nbsp; &nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">beq</span> return &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; If there is no pending tile, return</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;dex</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;beq UpdateOneTile &nbsp; &nbsp; &nbsp; ; A value of 1 indicates one tile will be updated</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;dex</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;beq UpdateAllTiles &nbsp; &nbsp; &nbsp;; A value of 2 indicates whole map will be updated</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;rts &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Invalid value &nbsp; &nbsp;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">UpdateOneTile:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">lda</span> <span class="sy0">#&lt;</span>MapTileMacro</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">sta</span> <span class="nu13">$00</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">lda</span> <span class="sy0">#&gt;</span>MapTileMacro</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">sta</span> <span class="nu13">$01</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">JSR</span> SendPpuMacro</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">ClearAndReturn:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">lda</span> <span class="sy0">#</span><span class="nu13">$00</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Clear tile flag</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">sta</span> TileFlag</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; return:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; from old map</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;UpdateAllTiles:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;lda #&lt;WholeMapMacro</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;sta $00</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;lda #&gt;WholeMapMacro</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;sta $01</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;JSR SendPpuMacro</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp;JMP ClearAndReturn</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp;Fast life fill</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; ===========================================================</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; Causes life to fill faster with potion/fairy</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; ORIGINAL CODE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; 05:B1EF &nbsp; LDA $0670 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; If current heart &gt; #$F8 (out of #$100):</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; 05:B1F2 &nbsp; CMP #$F8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; 05:B1F4 &nbsp; BCS $B1FD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; &nbsp; Jump to routine to set current heart to 0 and increment full-heart count</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; 05:B1F6 &nbsp; CLC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Add #$06 to current heart value (out of #$100), and return</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; 05:B1F7 &nbsp; ADC #$06 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; 05:B1F9 &nbsp; STA $0670 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; &nbsp; 05:B1FC &nbsp; RTS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">;.ORG $B1EF</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;.PATCH $171FF</span></div>
</li>
<li class="li1">
<div class="de1">.PATCH 05:B1EF</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">LDA</span> <span class="nu13">$0670</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">CMP</span> <span class="sy0">#</span><span class="nu13">$D7</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; </span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">BCS</span> <span class="nu13">$B1FD</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; &nbsp; Jump to routine to set current heart to 0 and increment full-heart count</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">CLC</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Add #$06 to current heart value (out of #$100), and return</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">ADC</span> <span class="sy0">#</span><span class="nu13">$18</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">STA</span> <span class="nu13">$0670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">RTS</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">;</span></div>
</li>
</ol>
</div></div>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=260</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ReMaster: Editing Doors</title>
		<link>http://snarfblam.com/words/?p=246</link>
		<comments>http://snarfblam.com/words/?p=246#comments</comments>
		<pubDate>Mon, 08 Aug 2011 22:19:43 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[Blaster Master]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[level editor]]></category>
		<category><![CDATA[nes]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=246</guid>
		<description><![CDATA[It looks like there may be some confusion as to how door editing works in ReMaster, so here's the how. The very first thing you'll want to do is select "Doors" as the editing mode in the top-right corner of the window.]]></description>
			<content:encoded><![CDATA[<p>It looks like there may be some confusion as to how door editing works in ReMaster, so here&#8217;s the how. (We&#8217;re referring to doors that bring the player from one level to the next, or from tank areas to overhead areas and vice-versa.) The very first thing you&#8217;ll want to do is select &#8220;Doors&#8221; as the editing mode in the top-right corner of the window. In the editor area on the left, doors are shown in yellow. On the right is a list of all the doorways in the game.</p>
<p><span id="more-246"></span>Doorways work in pairs. If you look in the door list, two adjacent doors connect together. The level each door appears in is listed, and the arrows show which doors connect to which. Once you understand the controls, it shouldn&#8217;t be too tough:</p>
<ul>
<li><span style="color: #0000ff;"><strong>Left-Click</strong></span> a door in the editor area (on the left) to select it. It will also be highlighted in the door list on the right. Alternatively,</li>
<li><strong><span style="color: #0000ff;">Click</span></strong> a door in the door list on the right to select it. When you click the door, it will be shown in the editor area on the left.</li>
<li><strong><span style="color: #0000ff;">Right-Click</span></strong> in the editor area to move the selected door.</li>
</ul>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_248" class="wp-caption aligncenter" style="width: 314px"><a href="http://snarfblam.com/words/wp-content/uploads/2011/08/remaster2.png"><img class="size-full wp-image-248 " style="border: 1px solid black;" title="Doorways" src="http://snarfblam.com/words/wp-content/uploads/2011/08/remaster2.png" alt="" width="304" height="158" /></a><p class="wp-caption-text">Large and small doorways</p></div>
<p>Note that the yellow door outline has a smaller yellow rectangle in the center. For larger doorways, those that connect levels, the whole yellow rectangle should overlap the doorway. For smaller doorways, those that connect the tank areas to overhead areas, only the smaller inner rectangle should overlap the doorway. (When editing overhead areas, there is only one type of doorway, so we don&#8217;t have to deal with this silliness.)</p>
<p>So how do you change the destination of a door? Remember that doors come in pairs. To change where a door leads, simply move the other door in the pair. One thing that might be easy to overlook is that doors can be moved from area to area. For example, take the door that leads from Level 1 to Level 2. If you select the doorway on the Level 2 side, then open Level 5 in the level editor, and right-click to place the doorway, when the player enters the door in Level 1, he will now appear in Level 5 instead of Level 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=246</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ReMaster: Better Late Than Never</title>
		<link>http://snarfblam.com/words/?p=236</link>
		<comments>http://snarfblam.com/words/?p=236#comments</comments>
		<pubDate>Mon, 08 Aug 2011 21:20:31 +0000</pubDate>
		<dc:creator>snarfblam</dc:creator>
				<category><![CDATA[front]]></category>
		<category><![CDATA[Rom Hacking]]></category>
		<category><![CDATA[Blaster Master]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[nes]]></category>
		<category><![CDATA[rom]]></category>
		<category><![CDATA[romulus]]></category>

		<guid isPermaLink="false">http://snarfblam.com/words/?p=236</guid>
		<description><![CDATA[The Blaster Master level editor, ReMaster, has been shared with some communities, but has yet to see a proper release until now.]]></description>
			<content:encoded><![CDATA[<p>The Blaster Master level editor, ReMaster, has been shared with some communities, but has yet to see a proper release until now.</p>
<h2><a href="http://snarfblam.com/files/Remaster_1.0.zip">DOWNLOAD IT</a></h2>
<p><a href="http://snarfblam.com/files/Remaster_1.0.zip"></a><span id="more-236"></span></p>
<div id="attachment_237" class="wp-caption aligncenter" style="width: 361px"><a href="http://snarfblam.com/words/wp-content/uploads/2011/08/remaster.png"><img class="size-full wp-image-237 " title="ReMaster Screenshot" src="http://snarfblam.com/words/wp-content/uploads/2011/08/remaster.png" alt="" width="351" height="226" /></a><p class="wp-caption-text">ReMaster</p></div>
<p>The version posted here beforehand was an early build and lacked certain handy features such as undo and stats on building blocks (primarily to inform the user of which level data isn&#8217;t being used). The finished version makes good use of all the features of the <a href="http://snarfblam.com/words/?p=117">Romulus level-editor framework</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://snarfblam.com/words/?feed=rss2&#038;p=236</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

