<!DOCTYPE html>
<!-- ========================================== kroc camen of camen design ============================================= -->
<title>writing · Kroc Camen Writes: #1</title>
<link rel="stylesheet" type="text/css" href="/design/design.css" />
<meta name="viewport" content="width=device-width, maximum-scale=1.0, user-scalable=no" />
<link rel="alternate" type="application/rss+xml" href="/writing/rss" title="Just writing" />
<link rel="canonical" href="/writing/kroc_writes_1" />
<!-- =================================================================================================================== -->
<header>
	<h1><a href="/" rel="index">
		Camen Design
	</a></h1>
	<nav><ul>
		<li><a href="/">all</a></li>
		<li><a href="/projects">projects</a></li>
		<li><a href="http://forum.camendesign.com">forum</a></li>
	</ul><ul>
		<li><a href="/quote/">quote</a></li>
		<li><a href="/writing/" rel="tag">writing</a></li>
		<li><a href="/blog/">blog</a></li>
		<li><a href="/photo/">photo</a></li>
		<li><a href="/code/">code</a></li>
		<li><a href="/art/">art</a></li>
		<li><a href="/link/">link</a></li>
		<li><a href="/poem/">poem</a></li>
		<li><a href="/audio/">audio</a></li>
	</ul><ul>
		<li><a href="/web-dev/">web-dev</a></li>
		<li><a href="/annoyances/">annoyances</a></li>
		<li><a href="/eve/">eve</a></li>
		<li><a href="/code-is-art/">code-is-art</a></li>
		<li><a href="/inspiration/">inspiration</a></li>
		<li><a href="/windows/">windows</a></li>
		<li><a href="/gift/">gift</a></li>
		<li><a href="/gaming/">gaming</a></li>
		<li><a href="/mac/">mac</a></li>
		<li><a href="/osnews/">osnews</a></li>
		<li><a href="/c64/">c64</a></li>
		<li><a href="/linux/">linux</a></li>
	</ul>
	<a rel="previous" href="/writing/tanner_writes_1">
		older article →
	</a><a rel="next" href="/writing/tanner_writes_2">
		← newer article
	</a></nav>
</header>
<!-- =================================================================================================================== -->
<article><header>
	<!-- date published or updated -->
	<time pubdate datetime="2003-04-22T18:57:00+01:00">
		<sup>6:57<abbr>pm</abbr> • 2003</sup>
		<abbr title="April">Apr</abbr> 22
	</time>
	<!-- categories -->
	<ul>
		<li><a href="/writing/kroc_writes_1" rel="bookmark tag">writing</a></li>
	</ul>
	<!-- licence -->
	<small>
		<abbr title="copyright">©</abbr>
		copyright
	</small>
</header>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<h1>Kroc Camen Writes: #1</h1>
<p>
	This is one of <a href="/writing/kroc_writes">a series of personal letters</a> written to / from
	<a href="/writing/kroc_writes#tanner">Tanner Helland</a> during 2003–2005. These letters cover—in immense
	detail—events in my life during that period, including many unfinished and aspiring designs and creations. As a
	person however, I have changed from the inexperienced, often immature person I was and my skills in programming and
	web-design have changed just as radically.
</p><p>
	These letters have been republished to give deep insight into the way I tick, and to show a lot of background work
	that lead up to the concepts and skills needed to produce this website, which ultimately I failed to do so back
	then.
</p>


<h2>About the Letter</h2>
<p>
	This, my first letter <a href="/writing/tanner_writes_1">in reply</a> to Tanner catches up on a few questions he
	had posed and mainly discusses <a href="/writing/kroc_writes#bda">Badly Drawn Adventure</a>, a computer game
	programming project I had started creating earlier in the year and that Tanner had knowledge of via online exchanges
	before his offline excursion began.
</p><p>
	Whilst you will be left lacking basic background knowledge about Badly Drawn Adventure at this stage, my later
	letters cover it in great detail and provide all the background design.
</p><p>
	You can tell I’ve never written a letter before, it’s extremely idiotic. I was more used to
	<abbr title="instant messaging">IM</abbr>. Note that throughout all my letters emoticons are used that were lifted
	from <a href="http://en.wikipedia.org/wiki/Ezboard" rel="external">ezBoard</a>, the forum system we all used on
	<a href="/writing/kroc_writes#tgp">TGP</a> and other sites (it was the
	<a href="http://en.wikipedia.org/wiki/Geocities" rel="external">GeoCities</a> of forums at the time, before
	<a href="http://en.wikipedia.org/wiki/PhpBB" rel="external">phpBB</a> became popular).
</p>
<section id="p1"><!-- ==================================== page 1 ============================================ -->
<h1>Kroc Camen Writes</h1>
<p>
	<strong>Whoa that’s a lot of questions!</strong> Obviously you’re eager to know every tiny detail of what’s
	been happening since leaving, and of course I’m here to inform. So let’s get down to business.
</p>
<aside>
	* <a href="/writing/tanner_writes_1#p1">Tanner’s letter these quotes are from</a>.
</aside>
<blockquote>
	<p>
		1. What up friend?*
	</p>
</blockquote>
<p>
	The sky.
</p>
<blockquote>
	<p>
		2. What’s new in England?
	</p>
</blockquote>
<p>
	Nought, diddly-squat, nadda. Nothing ever happens here
	<img src="/writing/kroc_writes_1/tongue.png" alt=":P" width="14" height="14" />
</p>
<blockquote>
	<p>
		3. Anything Cool?
	</p>
</blockquote>
<p>
	Re-read answer two. <img src="/writing/kroc_writes_1/smile.png" alt=":D" width="14" height="14" />
</p>
<blockquote>
	<p>
		4. How’s <a href="/writing/kroc_writes#cbuk"><dfn title="ComputerBitsUK">CBUK</dfn></a>?
	</p>
</blockquote>
<p>
	The story here isn’t so good. The two friends helping me to build
	<a href="/writing/kroc_writes#cbuk"><dfn title="ComputerBitsUK">CBUK</dfn></a> are currently very tied up at the
	moment so, so far this month no work has been done on it. I hope to get back to it soon since we only really need to
	finish off the web-design section.
</p>


<h3>Badly Drawn Map Editor:</h3>
<aside>
	<sup>1</sup> Badly Drawn was project ‘Y’ because project ‘X’ was an idea to create an <dfn title="first person shooter">FPS</dfn> based on
	<a href="http://www.newgrounds.com/collection/xiaoxiao" rel="external">XaioXaio</a>
</aside>
<p>
	When I sent it to you I had hurriedly zipped it up and forgotten to include the
	<a href="http://www.vbaccelerator.com" rel="external"><dfn title="Visual Basic Accelerator">VBA</dfn></a> hook
	control. You only needed to remove the reference and delete any code referencing it since all it controlled was the
	custom shortcuts. Since the <a href="/writing/kroc_writes#hotmeal">HoTMeaL</a> common DLL is stored elsewhere I
	had also forgotten to include that, the <abbr>GUI</abbr> would’ve looked better because the gradient command was
	used to spruce up the blue bars, but I’m sure you saw those in the screen-shot. Oh and about obscurity—because I
	have so much stuff on my hard disk the only way to get it tidy is to have b’zillions of folders
	<img src="/writing/kroc_writes_1/smile.png" alt=":D" width="14" height="14" /> Badly Drawn Map Editor is stored in
	“C:\Documents and Settings\Kroc Camen\My Documents\VBProjects\Games\Y\_Dev\Map”<sup>1</sup> which is only 7
	deep, I have some stuff 12 folders deep!
</p>
<aside>
	<sup>2</sup> No screenshot was included in the original letter, so I must have been referring to an e-mail we had had earlier.
</aside>
<p>
	The background paper texture is completely digital, it’s created using the XenoFX ‘crumple’ plugin on a plain
	white background, the crumpled edges where done on a separate layer so that they can blend with the edge of the
	paper background. The only thing that is real is the tea-stain which I scanned in!<sup>2</sup>
</p>


<h3><dfn title="Music Sample Pack 5">MSP5</dfn>:</h3>
<aside>
	<sup>3</sup> DemonSpectre (“DS”) is Tanner’s old handle.
	<br /><br />
	<sup>4</sup> A selection of Tanner’s music presented to <a href="/writing/kroc_writes#tgp">the Lost Alliance</a> team.
	This is described in the <a href="/writing/tanner_writes_1">previous letter</a>.
</aside>
<p>
	Yes, I kinda got side tracked on this one, well actually <abbr title="DragonFyre">DF</abbr> got me side tracked on
	this one. He said he had some songs and I said that <dfn title="DemonSpectre">DS</dfn><sup>3</sup> had
	<dfn title="Music Sample Pack 5">MSP5</dfn><sup>4</sup> and I asked him to send me what he had. That thread was soon
	forgotten; but just recently he asked me where <dfn title="Music Sample Pack 5">MSP5</dfn> was and that reminded me
	so I asked again for him to send me his stuff…
	<img src="/writing/kroc_writes_1/tongue.png" alt=":P" width="14" height="14" />
</p>
<blockquote>
	<p>
		5. So how is everybody now that <a href="/writing/kroc_writes#clint">Clint</a> is back?
	</p>
</blockquote>
<p>
	Clint just walked back in and everybody was like he never left, he just gelled right back into the team as if had
	never left. Those who posted were glad to see him again. Problem is that his return was badly timed as the team has
	recently fallen into one of those periods where nobody is around and nothing happens at all, most likely due to
	everybody suddenly hitting a busy point in their lives.
</p>
<blockquote>
	<p>
		6. Hear anything from <a href="/writing/kroc_writes#wuta">Wuta</a> or
		<a href="/writing/kroc_writes#intrest">Interest</a> since they left?
	</p>
</blockquote>
<aside>
	<sup>5</sup> This is an incredibly nasty and thoughtless comment to make and I apologise, I wouldn’t do that today.
</aside>
<p>
	Zero, haven’t heard a peep from both of them. Wuta I’m sure is working his socks off and Interest is probably
	lounging around somewhere at somebody else’s expense<sup>5</sup>
	<img src="/writing/kroc_writes_1/lol.png" alt="lol" width="14" height="14" />
</p>
<blockquote>
	<p>
		7. Has <a href="/writing/kroc_writes#dragonfyre"><dfn title="DragonFyre">DF</dfn></a> given you any good
		music yet?
	</p>
</blockquote>
<p>
	As you know, when he gets ‘round to sending it to me.
</p>
</section><!-- =========================================== page 2 ===================================== --><section id="p2">
<header>2</header>
<blockquote>
	<p>
		8. See anything more from <a href="/writing/kroc_writes#asuka">Asuka</a> since I last checked?
	</p>
</blockquote>
<p>
	Nope, because of this horribly slow period the team’s going through right at the moment.
</p>
<blockquote>
	<p>
		9. How about <a href="/writing/kroc_writes#vegeta">Vegeta</a>—gotten some 3D models yet?
	</p>
</blockquote>
<p>
	Clint was talking about modelling so I asked samples from him and Vegeta, Clint got back quick but Vegeta must’ve
	forgotten about that post, guess I’ll have to post again.
</p><p>
	Things may have been pretty uneventful so far – but due to my over-pessimistic view there might well have been
	something half-decent that I might have overlooked. I did have a spurt of enthusiasm about a week ago; do you
	remember the picture of Clint I drew when he left the team? Well I eventually managed to find the strength to have
	another attempt at colouring it in. Resulting in: (see the <a href="#p6">back page</a>)
</p><p>
	It’s not finished obviously but it’s something, I finally managed to work out how to do an effective metal, err,
	effect. Maybe I’ll get the picture finished one day; the next hurdle to get over is realistic clothing effect,
	gah!
</p><p>
	Now what? The fact I’ve run out of stuff to say certainly shows how little has happened, and I’m so well known
	for writing great huge lengthy posts <img src="/writing/kroc_writes_1/lol.png" alt="lol" width="14" height="14" />
</p><p>
	<em><strong>Kroc goes off to play Sonic and Knuckles, manages to get to the last boss and dies only a couple of hits
	away from completing the game, Damn you Robotnik! I’ll get you next time</strong></em>
</p><p>
	Ah well s’pose I can gap fill by going into a bit more detail about Badly Drawn:<br />
	I intend to basically produce this game in two side-by-side steps. First create the level editor so that I can
	create and save object files and level files <abbr title="et cetera">etc</abbr>, then program support for the files
	into the game itself. At the moment I’ve almost finished the object editor, which outputs the objects that make up
	the world, once complete I can then program the game itself to load the object files and display/animate/move them
	<abbr title="et cetera">etc</abbr>.
</p><p>
	It’s a lot of work to get little visible evidence afterward because you have to spend plenty of time back coding
	the data structure and animation support <abbr title="et cetera">etc</abbr>, so after months of coding all I’ve
	got is a stick-man walking back and forth
	<img src="/writing/kroc_writes_1/tongue.png" alt=":P" width="14" height="14" /> But the important thing is that the
	structure is behind it so that any object can be used, <abbr title="et cetera">etc</abbr>.
</p><p>
	I’m hoping to make the game code itself as open plan as possible so that the scripting engine handles how an
	object interacts entirely which is less restrictive than hard coding object interactivity into the game. For this to
	work a very, very fast scripting engine is needed—but hark, I’ve thought about that also!
</p><p>
	As far as I know, only <a href="/writing/kroc_writes#asuka">Asuka</a> and I know about machine language
	programming (possibly Vegeta101 also), but anyway Machine Code (MC or ASM) is the ultra-low level programming
	language that flows directly through the CPU. Therefore MC commands are broken down to tiny, tiny little steps so
	that each can be processed as a single instruction. Now I’m familiar with Commodore64’s 6502 processor machine
	code and here’s a brief crash course in machine code:
</p><p>
	Say you want to execute “<samp>MyVar = 6 + 5</samp>”, now you’d think that, that is a single instruction, but
	it can be broken down even further;
</p>

<pre>LDA #05		;Load the ‘A’ registry with 5
ADD #06		;Adds the ‘A’ registry to 6
STA MyVar	;Stores ‘A’ in MyVar</pre>

<p>
	Because machine code can only consist of single commands, you cannot have multiple parameters so the CPU has 3
	registers that store numbers used in functions. Because these registers are automatically used in functions, you do
	not need to pass a function any parameters because the values can be loaded into the registers beforehand.
</p>
</section><!-- =========================================== page 3 ===================================== --><section id="p3">
<header>3</header>
<p>
	And it’s because of the low-level simplicity of Machine Code that it makes a great scripting language (or at least
	the compiled version of a scripting language). Your program is not slowed down by trying to read parameters; the
	function just goes straight to the registers to get the parameters. In Badly Drawn the kernel commands use this to
	the full, i.e.:
</p>

<pre>LDA #01    ;Load ‘A’ register with 1 – the index of the object
LDX #02    ;Load ‘X’ with the index of one of the object’s animations
KRN ANIM   ;Starts an anim, it uses ‘A’ as the object and ‘X’ as the anim</pre>

<p>
	The 6510 was the C64’s 6502 based 1 MHz (Wow, speedy!) CPU and I’ve basically ‘borrowed’ the
	<dfn title="machine code">MC</dfn> command set from there and added my own improvements so hopefully this should
	simplify scripting and keep the speed up. I do intend to have a higher level language and use the MC as the compiled
	script because writing MC is difficult and time consuming. I had an idea of using something based on XML i.e.:
</p>

<pre>&lt;if expr=[v1+v2] result=[true]&gt;
	This text will display in debug output if v1+v2 is equal to 3.
&lt;else/&gt;
	&lt;!-- Else is optional --&gt;
&lt;/if&gt;</pre>

<p>
	Which would compile to:
</p>

<pre>LDA v1			;Load A with the value of v1
LDX v2			;Load X with the value of v2
CAX			;Compare A with X
BNE #02			;Branch if Not Equal – Move down 2 lines
DBG "This text..."	;Print Debug Output
BRK			;Stop (break)</pre>

<p>
	As you can see, something like that would require minimal processing because things like the compare function
	doesn’t handle the redirection, it just returns if it was equal, not equal, greater than,
	<abbr title="et cetera">etc</abbr> and then you decide afterward with
	<strong>B</strong>ranchIf<strong>EQ</strong>ual,
	<strong>B</strong>ranchIf<strong>N</strong>ot<strong>E</strong>qual,
	<strong>B</strong>ranchIf<strong>G</strong>reater<strong>T</strong>han,
	<strong>B</strong>ranchIf<strong>G</strong>reaterThanOr<strong>E</strong>qualTo,
	<strong>B</strong>ranchIf<strong>L</strong>ess<strong>T</strong>han and
	<strong>B</strong>ranchIf<strong>L</strong>essThanOr<strong>E</strong>qualTo—thus the branch command doesn’t
	need to redo the ‘if’ command, its result would’ve already been stored by the compare command (which requires
	no parameters saving shed-loads of time).
</p><p>
	The limitations are that you only have 3 registers, so if you want ‘if’ commands inside each other, the computer
	needs somewhere to temporarily store values whilst it uses the registers for something else. Therefore you can use
	something you’ll be familiar with—a stack. You just use simple command like <samp>PHA</samp> (Push ‘A’ to
	stack) and <samp>PLA</samp> (Pull ‘A’ from stack) <abbr title="et cetera">etc</abbr>.
</p><p>
	And since the <dfn title="machine code">MC</dfn> will be compiled it’ll be stored as binary tokens and not as the
	3 letter codes. Each instruction is 5 bytes—one for the instruction and a 4 byte long value for the parameter.
	Thus to run a script all it involves is skipping through a string 5 bytes at a time and executing very, very short
	routines for each, i.e.: Genius!!! <img src="/writing/kroc_writes_1/tongue.png" alt=":P" width="14" height="14" />
</p>

<pre>Public Sub S6502e_LDA_VALUE(lValue as long)
	S6502e_CPU_A = lValue 'Set the A-register to the value
End Sub</pre>

<p>
	On the next page are the token byte values for all commands, excluding the kernel commands since I haven’t thought
	of them all yet.
</p><p>
	The kernel commands are <dfn title="machine code">MC</dfn> commands specific to the particular program, whereas the
	others would apply regardless of the program they were in, thus Badly Drawn’s Kernel MC commands are used to
	interface with Badly Drawn’s own variables—i.e. request the X, Y position of an object, start an object
	animation <abbr title="et cetera">etc</abbr>.
</p>
</section><!-- =========================================== page 4 ===================================== --><section id="p4">
<header>4</header>
<p>
	This means that the scripting engine, once written, could easily be ported to any other application. The only
	changes would be to write a set of appropriate kernel commands for that app. All the other commands would run
	through the script engine fine.
</p>

<pre>'Scripting_6502_Enhanced
'--------------------------------------------------------------------------------
'Load Commands - Load register with given value / variable
'--------------------------------------------------------------------------------
S6502e_LDA_VALUE = &amp;H0      'Load Accumulator with value
S6502e_LDX_VALUE = &amp;H1      'Load X-Register with value
S6502e_LDY_VALUE = &amp;H2      'Load Y-Register with value
S6502e_LDA_VARIABLE = &amp;H8   'Load Accumulator with value of variable
S6502e_LDX_VARIABLE = &amp;H9   'Load X-Register with value of variable
S6502e_LDY_VARIABLE = &amp;HA   'Load Y-Register with value of variable
'--------------------------------------------------------------------------------
'Store commands - put register into a variable
'--------------------------------------------------------------------------------
S6502e_STA = &amp;H10           'Store the Accumulator in variable
S6502e_STX = &amp;H11           'Store the X-Register in variable
S6502e_STY = &amp;H12           'Store the Y-Register in variable
'--------------------------------------------------------------------------------
'Transfer Commands - copy one register to another
'--------------------------------------------------------------------------------
S6502e_TAX = &amp;H20           'Transfer Accumulator to X-Register
S6502e_TAY = &amp;H21           'Transfer Accumulator to Y-Register
S6502e_TXA = &amp;H22           'Transfer X-Register to Accumulator
S6502e_TXY = &amp;H23           'Transfer X-Register to Y-Register
S6502e_TYA = &amp;H24           'Transfer Y-Register to Accumulator
S6502e_TYX = &amp;H25           'Transfer Y-Register to X-Register
'--------------------------------------------------------------------------------
'Increment Commands - add to a register
'--------------------------------------------------------------------------------
S6502e_INC = &amp;H30           'Increment Accumulator by value
S6502e_INX = &amp;H31           'Increment X-Register by value
S6502e_INY = &amp;H32           'Increment Y-Register by value
'--------------------------------------------------------------------------------
'Decrement Commands - subtract from a register
'--------------------------------------------------------------------------------
S6502e_DEC = &amp;H40           'Decrement Accumulator by value
S6502e_DEX = &amp;H41           'Decrement X-Register by value
S6502e_DEY = &amp;H42           'Decrement Y-Register by value
'--------------------------------------------------------------------------------
'Push/Pull Commands - Copy registers on and off the stack
'--------------------------------------------------------------------------------
S6502e_PHA = &amp;H50           'Push Accumulator onto stack
S6502e_PHX = &amp;H51           'Push X-Register onto stack
S6502e_PHY = &amp;H52           'Push Y-Register onto stack
S6502e_PLA = &amp;H58           'Pull Accumulator from stack
S6502e_PLX = &amp;H59           'Pull X-Register from stack
S6502e_PLY = &amp;H5A           'Pull Y-Register from stack
'--------------------------------------------------------------------------------
'Flow Control Commands - For moving around
'--------------------------------------------------------------------------------
S6502e_JMP = &amp;H60           'Jump relative
S6502e_JSR = &amp;H61           'Jump to subroutine saving return address
S6502e_RTS = &amp;H68           'Return from subroutine
S6502e_BRK = &amp;H69           'Stop script
'--------------------------------------------------------------------------------
'Comparison Commands - For comparing values
'--------------------------------------------------------------------------------
S6502e_CMP = &amp;H70           'Compare Accumulator with value
S6502e_CPX = &amp;H71           'Compare X-Register with value
S6502e_CPY = &amp;H72           'Compare Y-Register with value
S6502e_CAX = &amp;H78           'Compare Accumulator with X-Register
S6502e_CAY = &amp;H79           'Compare Accumulator with Y-Register
S6502e_CXY = &amp;H7A           'Compare X-Register with Y-Register
'--------------------------------------------------------------------------------
'Branch Controls - Similar to flow controls but based on prior comparison
'--------------------------------------------------------------------------------
S6502e_BEQ = &amp;H80           'JMP relative if parameters matched
S6502e_BNE = &amp;H81           'JMP relative if parameters did not match
S6502e_BGT = &amp;H82           'JMP relative if 1st was greater than 2nd
S6502e_BGE = &amp;H83           'JMP relative if 1st was greater than or equal to 2nd
S6502e_BLT = &amp;H84           'JMP relative if 1st was less than 2nd
S6502e_BLE = &amp;H85           'JMP relative if 1st was less than or equal to 2nd</pre>

</section><!-- =========================================== page 5 ===================================== --><section id="p5">
<header>5</header>
<p>
	Ok, that’s enough about that <img src="/writing/kroc_writes_1/smile.png" alt=":D" width="14" height="14" /> I
	don’t want to fry your mind with machine code, especially when you’ve got more important things to think of!
</p><p>
	<em><strong>Kroc attempts to print letter, but realises is out of ink, cannot buy any because the shops are shut for
	Easter, two days later he finally gets a damned ink cartridge</strong></em>
</p><p>
	Time to wrap up now I suppose, I hope you’re going well despite your busy schedule and all that. Oh and sorry
	about the ridiculous length of this letter, but this me we’re talking about. But what’s a letter without a
	goodbye?
</p><p>
	Until Later,
	<br /><br />
	<em>Kroc Camen</em>
</p>
</section>
<aside><br />
	An early version of an art piece of Clint V Franklin, the finished version of this picture can be viewed
	<a href="/art/clint_v_franklin">here</a>.<br />
	I believe this was originally printed in black and white because of said ink problem above
</aside>
<figure id="p6">
	<a href="/writing/kroc_writes_1/clintvfranklin.png" type="image/png"><img src="/writing/kroc_writes_1/clintvfranklin.jpg" alt="An early version of an art piece of Clint V Franklin" width="640" height="589" /></a>
</figure>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
</article>
<footer>
	<nav><a href="http://forum.camendesign.com">‹ Discuss this in the Forum ›</a></nav>
		
	<a href="mailto:kroc@camendesign.com">kroc@camendesign.com</a>
	<nav>view-source:
		<a href="/writing/kroc_writes_1.rem">Rem</a> •
		<a href="/writing/kroc_writes_1.html">HTML</a> •
		<a href="/design/">CSS</a> •
		<a href="/.system/">PHP</a> •
		<a href="/.htaccess">.htaccess</a>
	</nav>
	<form method="get" action="https://duckduckgo.com">
		<input type="hidden" name="sites" value="camendesign.com" />
		<input type="search" name="q" placeholder="search…" />
		<input type="submit" value="Go" />
	</form>
</footer>
<!-- =================================================================================================== code is art === -->