<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <title>frakendirary</title>
    <link href="https://tlindner.macmess.org/feed.xml" rel="self" />
    <link href="https://tlindner.macmess.org" />
    <updated>2026-11-10T10:34:51-08:00</updated>
    <author>
        <name>tlindner</name>
    </author>
    <id>https://tlindner.macmess.org</id>

    <entry>
        <title>Ensoniq Mirage: Measurements Wanted</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/ensoniq-mirage-measurements-wanted/"/>
        <id>https://tlindner.macmess.org/ensoniq-mirage-measurements-wanted/</id>

        <updated>2026-11-09T21:53:38-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Ensoniq Mirage: Measurements Wanted Why these measurements MAME’s Ensoniq Mirage emulation (ensoniq/enmirage.cpp, sound/cem3328.cpp) works, but several of its numbers are estimates from the schematic and datasheets. Each measurement below replaces one of those estimates with a real value. The most valuable are marked priority. Part&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <h1 id="ensoniq-mirage-measurements-wanted">Ensoniq Mirage: Measurements Wanted</h1>
<h2 id="why-these-measurements">Why these measurements</h2>
<p>MAME’s Ensoniq Mirage emulation (<code>ensoniq/enmirage.cpp</code>, <code>sound/cem3328.cpp</code>) works, but several of its numbers are estimates from the schematic and datasheets. Each measurement below replaces one of those estimates with a real value. The most valuable are marked <strong>priority</strong>.</p>
<p>Part numbers and pins refer to the DSK-8 main board schematic, drawing 4010003401, sheets 1 (analog, rev G, 1985) and 2 (digital). Please note your board’s revision if it differs.</p>
<p><strong>Equipment:</strong> a two-channel oscilloscope (20 MHz or better), a multimeter, a MIDI interface, and a Mirage OS boot disk. A frequency counter or a scope with a frequency readout saves time.</p>
<p><strong>Safety:</strong> the power supply carries mains voltage. Everything here is on the main board’s low-voltage side (+5 V, +12 V, ?8 V). Clip the scope ground to board ground, never to a supply rail.</p>
<h2 id="via-and-midi-clocks-priority">1. VIA and MIDI clocks (priority)</h2>
<p>These confirm that the 6522 VIA runs at 2 MHz and that its PB7 output makes the 500 kHz MIDI clock. MAME’s change to the 6522 core rests on this. Measure after the OS has loaded from disk.</p>
<table><colgroup> <col style="width: 25%;"> <col style="width: 25%;"> <col style="width: 25%;"> <col style="width: 25%;"> </colgroup>
<thead>
<tr>
<th>Signal</th>
<th>Where</th>
<th>Record</th>
<th>Expected</th>
</tr>
</thead>
<tbody>
<tr>
<td>CAS (VIA ?2)</td>
<td>U9 pin 25, also U12 pin 14</td>
<td>Frequency, duty cycle</td>
<td>2 MHz</td>
</tr>
<tr>
<td>CPU E (ED)</td>
<td>U15 pin 34</td>
<td>Frequency, phase relative to CAS</td>
<td>2 MHz</td>
</tr>
<tr>
<td>SERCLK (VIA PB7)</td>
<td>U9 pin 17, also U12 pins 3 and 4</td>
<td>Frequency, duty cycle</td>
<td>500 kHz square wave</td>
</tr>
<tr>
<td>CA3 (to VIA PB5)</td>
<td>U9 pin 15</td>
<td>Frequency</td>
<td>500 kHz (8 MHz ÷ 16)</td>
</tr>
<tr>
<td>8 MHz master</td>
<td>U11 or U13 clock input</td>
<td>Frequency</td>
<td>8 MHz</td>
</tr>
</tbody>
</table>
<p>Also useful: whether SERCLK is present before the disk loads, and when it first starts.</p>
<h2 id="filter-control-voltages">2. Filter control voltages</h2>
<p>These check the chain from the CV DAC (U41, AD7524) to each filter’s control pins. The emulation assumes the DAC spans 0 to +5.08 V (about 19.9 mV per step) and that the hold buffers have unity gain.</p>
<table><colgroup> <col style="width: 25%;"> <col style="width: 25%;"> <col style="width: 25%;"> <col style="width: 25%;"> </colgroup>
<thead>
<tr>
<th>Signal</th>
<th>Where</th>
<th>Record</th>
<th>Expected</th>
</tr>
</thead>
<tbody>
<tr>
<td>DAC reference (CVREF)</td>
<td>U41 pin 15</td>
<td>DC voltage</td>
<td>?5.1 V (zener CR4)</td>
</tr>
<tr>
<td>CV I/V output</td>
<td>U56 pin 14</td>
<td>Waveform: the DAC steps as each voice is refreshed</td>
<td>0 to +5.08 V</td>
</tr>
<tr>
<td>Held cutoff, voice 1 (VF1)</td>
<td>U61 pin 8</td>
<td>DC level and droop between refreshes (AC-coupled)</td>
<td>Steady; droop under 1 step</td>
</tr>
<tr>
<td>Held resonance, voice 1 (VQ1)</td>
<td>U66 pin 8</td>
<td>DC level</td>
<td>0 to +5.08 V</td>
</tr>
<tr>
<td>CEM3328 pin 2, voice 1</td>
<td>U67 pin 2</td>
<td>DC level, with VF1 measured at the same moment</td>
<td>0.0355 × VF1 ? 0.048 V</td>
</tr>
<tr>
<td>CEM3328 pin 3 (I_REF), voice 1</td>
<td>U67 pin 3</td>
<td>DC level</td>
<td>About ?7.3 V</td>
</tr>
</tbody>
</table>
<p>The pin 2 line is the most useful: three or four readings of VF1 against pin 2 confirm the 27K / 160K / 1K network.</p>
<h2 id="cem3328-filter-response-priority">3. CEM3328 filter response (priority)</h2>
<p>The filter model uses the datasheet’s typical figures: 20 mV per octave, and about 105 Hz at 0 V on pin 2 with the Mirage’s parts. A self-oscillating filter makes a clean sine at its cutoff, so its frequency can be read straight off the output.</p>
<ol type="1">
<li><strong>Cutoff curve.</strong> Set a sound’s resonance to maximum so voice 1 oscillates. Step the filter cutoff parameter through five or more values from low to high. At each step record U67 pin 2 (DC) and the frequency at U67 pin 9 (output). This gives the real scale factor and base frequency.</li>
<li><strong>Oscillation threshold.</strong> With the cutoff mid-range, raise resonance one step at a time. Record U67 pin 10 at the first step that oscillates. Datasheet: 2.7 to 3.7 V, typically 3.2 V.</li>
<li><strong>Oscillation level.</strong> At maximum resonance, record the peak-to-peak voltage at U67 pin 9. Datasheet: about 2.3 V.</li>
<li><strong>Resonance curve.</strong> At three or four resonance settings below oscillation, play a note and record the output level relative to resonance off. The datasheet only calls this a “reverse audio taper”, and the model’s curve is a guess.</li>
<li><strong>Voice-to-voice spread.</strong> With all voices at the same cutoff and maximum resonance, record each voice’s oscillation frequency (VCF1–8: U67, U68, U62, U63, U57, U58, U52, U53, pin 9). This shows how far real chips differ.</li>
</ol>
<h2 id="audio-levels-priority">4. Audio levels (priority)</h2>
<p>The emulation assumes a full-scale voice drives the CEM3328 to its rated 6.5 V p-p, because the DOC’s output current isn’t on the schematic. Measuring the real levels replaces that assumption.</p>
<p>Use one sustained note at maximum velocity, with the filter fully open and resonance off. Record peak-to-peak voltage at each point, then repeat with eight notes held.</p>
<table>
<thead>
<tr>
<th>Point</th>
<th>Where</th>
<th>1 note (V p-p)</th>
<th>8 notes (V p-p)</th>
</tr>
</thead>
<tbody>
<tr>
<td>DOC difference amp output</td>
<td>U46 pin 6 (U47 pin 3)</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Voice 1 audio line (AF1)</td>
<td>U47 pin 13</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>CEM3328 signal input, voice 1</td>
<td>U67 pin 6</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>CEM3328 output, voice 1</td>
<td>U67 pin 9</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Summer output</td>
<td>U56 pin 7</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Audio out jack, volume at maximum</td>
<td>J12</td>
<td> </td>
<td> </td>
</tr>
</tbody>
</table>
<p>Please note the volume knob position and the sound used.</p>
<h2 id="filter-calibration-at-boot">5. Filter calibration at boot</h2>
<p>Right after the OS loads, the firmware tunes each filter: it makes the filter oscillate, counts the cycles through the ADC, and adjusts the cutoff until 4 periods take about 130 ADC reads. MAME has no way to feed real filter output to its ADC, so it substitutes a modeled sine for each oscillating filter.</p>
<ol type="1">
<li>Trigger on the disk motor stopping after the OS load. Capture the summer output (U56 pin 7) and the ADC input path (U45 pin 13, COM X) for the next second.</li>
<li>Record the waveform’s amplitude and frequency at the ADC input. The firmware’s thresholds are $90 and $70, so the signal must swing well past both.</li>
<li>Record whether all eight voices oscillate together, or one at a time. The firmware leaves earlier voices at full resonance while tuning later ones, which suggests all together.</li>
<li>Record each voice’s final oscillation frequency once calibration ends, from its pin 9.</li>
</ol>
<h2 id="keyboard-controller-link">6. Keyboard controller link</h2>
<p>The keyboard’s R6500/11 has an undumped internal ROM, so MAME imitates it from the main CPU’s side. Each key sends three bytes ($90 down or $80 up, key number 0–60, velocity) into the VIA shift register. The CPU acknowledges each byte with a low pulse on CA2. The timing and the velocity values are guesses.</p>
<p>Capture SCLK (U9 pin 18, CB1) and SDATA (U9 pin 19, CB2) on the two channels, then SCLK and SACK (U9 pin 39, CA2).</p>
<ol type="1">
<li>Shift clock rate, and the gap between bytes within one message.</li>
<li>Whether the controller waits for each CA2 pulse before sending the next byte, and the pulse’s width.</li>
<li>The velocity byte for a very soft, a medium and a very hard press of the same key. Decode it from SDATA, most significant bit first.</li>
<li>What the sustain pedal sends when pressed and released. The OS understands $B8 and $B9.</li>
<li>Any bytes sent at power-on, before a key is pressed, and the state of VIA PB4 (U9 pin 14, which also resets the controller) during boot.</li>
</ol>
<h2 id="sending-results">Sending results</h2>
<p>Partial results help: sections 1, 3 and 4 alone would settle the biggest open questions.</p>
<ul>
<li>Contact me with your readings.</li>
<li>Attach scope screenshots with the timebase and volts per division visible.</li>
<li>Note your model (DSK-8 or DSK-1), board revision, OS disk version, and the date codes printed on the CEM3328 chips.</li>
<li>If you measure several voices, say which VCF each reading came from.</li>
</ul>
            ]]>
        </content>
    </entry>
    <entry>
        <title>One True Sprite Proposal</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/one-true-sprite-proposal/"/>
        <id>https://tlindner.macmess.org/one-true-sprite-proposal/</id>

        <updated>2026-08-08T10:42:05-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Here is my second proposal for the authors of GIME FPGA/CPLD devices: here As a reminder the first one was: here This proposes adding a single hardware graphic cursor avaiable in both text and graphics modes. An emulated example is avaiable in this Mame feature&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p>Here is my second proposal for the authors of GIME FPGA/CPLD devices: <a href="https://tlindner.macmess.org/?p=1103">here</a></p>
<p>As a reminder the first one was: <a href="https://tlindner.macmess.org/?p=977">here</a></p>
<p>This proposes adding a single hardware graphic cursor avaiable in both text and graphics modes. An emulated example is avaiable in this Mame feature branch in my fork: https://github.com/tlindner/mame/tree/ots</p>
<p>Here is an example program in BASIC to demo the feature:</p>
<pre class="basic"><code>10 WIDTH 40
15 ATTR 4,3
17 CLS
20 POKE &amp;HFF97,2                 ' SYNC=1: begin shape upload
30 FOR X=0 TO 15
40 READ A
50 POKE &amp;HFF96,A
60 NEXT X                        ' after 16 bytes, $FF96 auto-reverts to position mode
70 CTRL = &amp;HB1                   ' EN=1, FG=palette1, BG=palette2, SIZE=1, (bit 2 now reserved)
80 POKE &amp;HFF97,CTRL              ' one-time setup - no need to repeat per move
81 ? "Hello World!"
86 PALETTE 1,RND(63)
87 PALETTE 2,RND(63)
88 X = JOYSTK(0)*9:LOCATE0,0
90 POKE &amp;HFF96,X/255             ' X high bits (0-3)
100 POKE &amp;HFF96,X AND 255        ' X low byte - smooth left/right
110 POKE &amp;HFF96,JOYSTK(1)*3      ' Y position
120 GOTO 85
1000 DATA &amp;H80,&amp;H80,&amp;H40,&amp;H80,&amp;H60,&amp;H80,&amp;H70,&amp;H80,&amp;H78
1010 DATA &amp;H80,&amp;H7C,&amp;H80,&amp;H7E,&amp;H80,&amp;H00,&amp;HFF</code></pre>
<p>And here is a minty fresh quicktime showing it off:</p>
<figure class="post__video"><video loading="lazy" width="" height="" controls="controls" poster="">
<source src="http://tlindner.macmess.org/wp-content/uploads/2026/08/ots.mp4" type="video/mp4" data-mce-fragment="1"></video></figure>
<p>[video width=“960” height=“716” src=“http://tlindner.macmess.org/wp-content/uploads/2026/08/ots.mp4”]</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>One True Sprite</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/one-true-sprite/"/>
        <id>https://tlindner.macmess.org/one-true-sprite/</id>

        <updated>2026-08-08T10:23:52-07:00</updated>
            <summary type="html">
                <![CDATA[
                    GIME Hardware Cursor Extension Proposal Overview The GIME video system can provide a hardware mouse cursor by adding a small independent cursor overlay. The cursor is not stored in normal CoCo memory and does not require software to modify the display memory. The cursor is&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <h1 id="gime-hardware-cursor-extension-proposal">GIME Hardware Cursor Extension Proposal</h1>
<h2 id="overview">Overview</h2>
<p>The GIME video system can provide a hardware mouse cursor by adding a small independent cursor overlay. The cursor is not stored in normal CoCo memory and does not require software to modify the display memory.</p>
<p>The cursor is drawn after the normal video image is generated. Software only needs to provide:</p>
<ul>
<li>A cursor shape.</li>
<li>A cursor position.</li>
<li>Two palette selections.</li>
<li>Enable/disable control.</li>
</ul>
<p>This provides a fast, flicker-free cursor suitable for graphical user interfaces while requiring very little programming overhead.</p>
<p>The hardware cursor is especially useful for GUI applications because moving the mouse pointer no longer requires saving the background, drawing the cursor, restoring the background, or modifying screen memory.</p>
<hr>
<h1 id="registers">Registers</h1>
<p>The cursor uses two memory-mapped registers.</p>
<table><colgroup> <col style="width: 10%;"> <col style="width: 21%;"> <col style="width: 67%;"> </colgroup>
<thead>
<tr>
<th>Address</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>$FF96</td>
<td>Cursor Data</td>
<td>Cursor shape upload or cursor position data</td>
</tr>
<tr>
<td>$FF97</td>
<td>Cursor Control</td>
<td>Cursor enable, colors, and data mode control</td>
</tr>
</tbody>
</table>
<hr>
<h1 id="cursor-control-register-ff97">Cursor Control Register ($FF97)</h1>
<pre><code>Bit  7   6   5   4   3   2   1   0
    EN  W1  W0  B1  B0  --  SYNC SIZE</code></pre>
<h2 id="bit-7-en---cursor-enable">Bit 7: EN - Cursor Enable</h2>
<pre><code>0 = Cursor disabled
1 = Cursor displayed</code></pre>
<hr>
<h2 id="bits-6-5-w1w0---foreground-palette-slot">Bits 6-5: W1:W0 - Foreground Palette Slot</h2>
<p>Selects the GIME palette entry used for foreground cursor pixels.</p>
<p>Valid values:</p>
<pre><code>00 = palette entry 0
01 = palette entry 1
10 = palette entry 2
11 = palette entry 3</code></pre>
<hr>
<h2 id="bits-4-3-b1b0---background-palette-slot">Bits 4-3: B1:B0 - Background Palette Slot</h2>
<p>Selects the GIME palette entry used for background cursor pixels.</p>
<p>Valid values:</p>
<pre><code>00 = palette entry 0
01 = palette entry 1
10 = palette entry 2
11 = palette entry 3</code></pre>
<hr>
<h2 id="bit-2-reserved">Bit 2: Reserved</h2>
<p>Unused. Reads back as 0. Reserved for future expansion.</p>
<hr>
<h2 id="bit-1-sync---enter-shape-upload-mode-upload-status">Bit 1: SYNC - Enter Shape Upload Mode / Upload Status</h2>
<p>SYNC is both readable and writable, and its meaning differs by direction.</p>
<h3 id="writing-sync">Writing SYNC</h3>
<p>Writing a one switches the Cursor Data register ($FF96) into shape-upload mode for the next sixteen writes, and resets the upload pointer to zero.</p>
<pre><code>Write 0 = no action
Write 1 = begin (or restart) a 16-byte cursor shape upload</code></pre>
<p>This is the <em>only</em> way $FF96 enters shape-upload mode. At all other times - including immediately after power-on, and immediately after the 16th shape byte is written - $FF96 is in <strong>position mode</strong> (see below). Software never needs to write SYNC to move the cursor; it is only needed when replacing the cursor’s image.</p>
<h3 id="reading-sync">Reading SYNC</h3>
<pre><code>0 = A shape upload is in progress and not yet at byte zero
1 = $FF96 is ready for a fresh shape upload</code></pre>
<p>In practice this reads as 1 essentially all the time, since $FF96 sits in position mode - upload pointer parked at zero - except for the brief window during an actual upload.</p>
<hr>
<h2 id="position-mode-default-state-of-ff96">Position Mode (default state of $FF96)</h2>
<p>Unlike shape upload, position mode is not something software enters - it is where $FF96 always is unless a shape upload is in progress. Every write to $FF96 while in position mode is consumed by a free-running, self-aligning 3-byte cycle:</p>
<pre><code>Byte 0: Cursor X high bits
Byte 1: Cursor X low byte
Byte 2: Cursor Y position</code></pre>
<p>…then it repeats: byte 3 is X high again, byte 4 is X low, and so on. No control-register write is needed to start, continue, or reset this cycle - software can simply POKE three bytes per cursor move, forever, with zero per-move overhead beyond the position data itself. This is the expected hot path for mouse polling.</p>
<p>The cursor position range is:</p>
<pre><code>X: 0-639
Y: 0-199</code></pre>
<p>The X high byte only uses the lower two bits:</p>
<pre><code>Bit 1-0 = X bits 9-8</code></pre>
<p>If a shape upload (triggered by SYNC) interrupts a position write partway through its 3-byte cycle, the position pointer is reset to zero as part of entering upload mode, and reset to zero again as part of leaving it. This guarantees the next 3 writes to $FF96 after an upload finishes are always a clean, aligned position triple - a position write can never be left half-consumed by an upload landing in the middle of it.</p>
<hr>
<h2 id="bit-0-size---cursor-size">Bit 0: SIZE - Cursor Size</h2>
<p>Selects cursor rendering size.</p>
<pre><code>0 = 8x8 cursor
1 = 16x16 cursor</code></pre>
<p>When 16x16 mode is selected, each cursor pixel is doubled horizontally and vertically.</p>
<p>The cursor image memory remains the same 8x8 image in both modes.</p>
<hr>
<h1 id="cursor-shape-data-register-ff96">Cursor Shape Data Register ($FF96)</h1>
<p>The cursor image is an 8x8 two-bit-per-pixel image.</p>
<p>The image requires sixteen bytes.</p>
<p>Each row uses two bytes:</p>
<pre><code>Byte 0: Plane 0, Row 0
Byte 1: Plane 1, Row 0

Byte 2: Plane 0, Row 1
Byte 3: Plane 1, Row 1

...

Byte 14: Plane 0, Row 7
Byte 15: Plane 1, Row 7</code></pre>
<p>Bits are arranged:</p>
<pre><code>Bit 7 = leftmost pixel
Bit 0 = rightmost pixel</code></pre>
<p>Each pixel is decoded as:</p>
<table>
<thead>
<tr>
<th>Plane 1</th>
<th>Plane 0</th>
<th>Result</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>Transparent — underlying pixel unchanged</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>Background palette color</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>Foreground palette color</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td><strong>XOR</strong> — underlying pixel value inverted</td>
</tr>
</tbody>
</table>
<h2 id="clarification-xor-mode-semantics">Clarification: XOR Mode Semantics</h2>
<p>The original pixel decode table left the “Foreground XOR Background” result ambiguous — it could be read as either a fixed third color (foreground palette color combined with background palette color), or as a true XOR against whatever is already on screen. Only the latter reading satisfies the stated goal that “the cursor color remains visible over changing backgrounds,” so the specification is clarified as follows:</p>
<h3 id="xor-pixel-behavior">XOR pixel behavior</h3>
<p>For pixels where both bitplanes are set, the cursor does not draw a color at all. Instead, it inverts whatever pixel is already present at that screen location: output_pixel = existing_pixel XOR $FFFFFF This is the same trick used by hardware cursors on other classic platforms (and by early VGA/Mac text cursors): because the operation is applied to the live framebuffer contents rather than to a fixed cursor color, the cursor pixel is guaranteed to differ from its background regardless of what that background is — solid color, photo, or another rapidly animating sprite. Inverting twice restores the original pixel, so no background save/restore buffer is required even in XOR regions.</p>
<p>Foreground and background palette slots (W1:W0 and B1:B0) have no effect on XOR pixels — those bits only apply to the solid-color (10/01) cases. XOR pixels are purely a function of the two bitplane bits and the framebuffer they land on.</p>
<h3 id="practical-implication-for-cursor-art">Practical implication for cursor art</h3>
<p>Because XOR pixels invert rather than paint, they read differently depending on the underlying pixel’s luminance and hue — a common tradeoff for XOR cursors. Designers using XOR pixels (e.g., a thin outline meant to “always show”) should expect variable, not fixed, apparent color, and treat it as a contrast trick rather than a color choice.</p>
<hr>
<h1 id="uploading-a-cursor-shape">Uploading a Cursor Shape</h1>
<p>A cursor shape is uploaded by:</p>
<ol type="1">
<li>Setting SYNC.</li>
<li>Writing sixteen bytes to Cursor Data.</li>
</ol>
<p>After the sixteenth byte, $FF96 automatically reverts to position mode - no further register write is needed before moving the cursor again.</p>
<p>Example 6809 code:</p>
<div id="cb13" class="sourceCode">
<pre class="sourceCode asm"><code class="sourceCode fasm"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a>CURSOR_CTRL  EQU <span class="op">$</span>FF97</span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a>CURSOR_DATA  EQU <span class="op">$</span>FF96</span>
<a href="#cb13-3" aria-hidden="true" tabindex="-1"></a>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a><span class="fu">load_cursor:</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a>        lda   CURSOR_CTRL</span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a>        ora   <span class="op">#%</span><span class="dv">00000010</span>      <span class="co">; SYNC - begin shape upload</span></span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true" tabindex="-1"></a>        sta   CURSOR_CTRL</span>
<a href="#cb13-8" aria-hidden="true" tabindex="-1"></a>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true" tabindex="-1"></a>        ldx   <span class="op">#</span>cursor_shape</span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true" tabindex="-1"></a>        ldb   <span class="op">#</span><span class="dv">16</span></span>
<a href="#cb13-11" aria-hidden="true" tabindex="-1"></a>
<span id="cb13-12"><a href="#cb13-12" aria-hidden="true" tabindex="-1"></a><span class="fu">upload_loop:</span></span>
<span id="cb13-13"><a href="#cb13-13" aria-hidden="true" tabindex="-1"></a>        lda   <span class="op">,</span>x<span class="op">+</span></span>
<span id="cb13-14"><a href="#cb13-14" aria-hidden="true" tabindex="-1"></a>        sta   CURSOR_DATA</span>
<span id="cb13-15"><a href="#cb13-15" aria-hidden="true" tabindex="-1"></a>        decb</span>
<span id="cb13-16"><a href="#cb13-16" aria-hidden="true" tabindex="-1"></a>        bne   upload_loop</span>
<span id="cb13-17"><a href="#cb13-17" aria-hidden="true" tabindex="-1"></a>                               <span class="co">; $FF96 is back in position mode here</span></span>
<span id="cb13-18"><a href="#cb13-18" aria-hidden="true" tabindex="-1"></a>        rts</span></code></pre>
</div>
<hr>
<h1 id="moving-the-cursor">Moving the Cursor</h1>
<p>Cursor position is the default behavior of Cursor Data - no control register write is needed at all. Software simply writes three bytes, high-byte-first, matching the 6809’s natural big-endian storage order:</p>
<div id="cb14" class="sourceCode">
<pre class="sourceCode asm"><code class="sourceCode fasm"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a>CURSOR_DATA  EQU <span class="op">$</span>FF96</span>
<a href="#cb14-2" aria-hidden="true" tabindex="-1"></a>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a><span class="fu">set_cursor_position:</span></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a>        lda   cursor_x         <span class="co">; X high bits (bits 9-8)</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a>        anda  <span class="op">#%</span><span class="dv">00000011</span></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a>        sta   CURSOR_DATA</span>
<a href="#cb14-7" aria-hidden="true" tabindex="-1"></a>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true" tabindex="-1"></a>        lda   cursor_x<span class="op">+</span><span class="dv">1</span>       <span class="co">; X low byte</span></span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true" tabindex="-1"></a>        sta   CURSOR_DATA</span>
<a href="#cb14-10" aria-hidden="true" tabindex="-1"></a>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true" tabindex="-1"></a>        lda   cursor_y</span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true" tabindex="-1"></a>        sta   CURSOR_DATA</span>
<a href="#cb14-13" aria-hidden="true" tabindex="-1"></a>
<span id="cb14-14"><a href="#cb14-14" aria-hidden="true" tabindex="-1"></a>        rts</span></code></pre>
</div>
<p>Because this is the default mode of the register, the same three writes can be issued every frame from a mouse-polling loop with no per-move setup cost. A shape upload landing between two calls to this routine cannot desynchronize it - see <a href="#bit-1-sync---enter-shape-upload-mode--upload-status">SYNC</a> above.</p>
<hr>
<h1 id="example-cursor-shape-black-arrow-with-white-outline">Example Cursor Shape: Black Arrow with White Outline</h1>
<p>The cursor palette selections can be used to create a traditional high-contrast pointer.</p>
<p>For this example:</p>
<ul>
<li>Background palette slot = black</li>
<li>Foreground palette slot = white</li>
<li>Transparent pixels leave the underlying display unchanged.</li>
</ul>
<p>The cursor image:</p>
<pre class="text"><code>W.......
WB......
WBB.....
WBBB....
WBBBB...
WBBBBB..
WBBBBBB.
WWWWWWWW</code></pre>
<p>Where:</p>
<ul>
<li><code>.</code> = transparent</li>
<li><code>B</code> = solid black pixel (background palette color)</li>
<li><code>W</code> = white outline pixel (foreground palette color)</li>
</ul>
<p>The cursor hotspot is always the <strong>top-left corner</strong> of the 8×8 cursor image. In this example, the active pointing location is the upper-left <code>W</code> pixel. Software positions the cursor by writing the desired screen coordinate of this corner.</p>
<p>The two bitplanes are:</p>
<h2 id="plane-0-backgroundblack-pixels">Plane 0 (background/black pixels)</h2>
<pre class="text"><code>Row 0: 10000000  $80
Row 1: 01000000  $40
Row 2: 01100000  $60
Row 3: 01110000  $70
Row 4: 01111000  $78
Row 5: 01111100  $7C
Row 6: 01111110  $7E
Row 7: 00000000  $00</code></pre>
<h2 id="plane-1-foregroundwhite-outline-pixels">Plane 1 (foreground/white outline pixels)</h2>
<pre class="text"><code>Row 0: 10000000  $80
Row 1: 10000000  $80
Row 2: 10000000  $80
Row 3: 10000000  $80
Row 4: 10000000  $80
Row 5: 10000000  $80
Row 6: 10000000  $80
Row 7: 11111111  $FF</code></pre>
<p>The cursor upload data is interleaved by row:</p>
<div id="cb18" class="sourceCode">
<pre class="sourceCode asm"><code class="sourceCode fasm"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="fu">cursor_arrow:</span></span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a>        <span class="co">; Plane 0, Plane 1</span></span>
<a href="#cb18-3" aria-hidden="true" tabindex="-1"></a>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">80</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">40</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">60</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">70</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">78</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-9"><a href="#cb18-9" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">7C</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-10"><a href="#cb18-10" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">7E</span><span class="op">,$</span><span class="bn">80</span></span>
<span id="cb18-11"><a href="#cb18-11" aria-hidden="true" tabindex="-1"></a>        fcb <span class="op">$</span><span class="bn">00</span><span class="op">,$</span>FF</span></code></pre>
</div>
<p>When the SIZE bit is enabled, each cursor pixel is doubled horizontally and vertically, producing a 16×16 cursor while preserving the same top-left hotspot location.</p>
<hr>
<h2 id="crosshair-cursor">Crosshair Cursor</h2>
<p>Useful for drawing programs:</p>
<pre><code>...X....
...X....
...X....
XXXXXXXX
...X....
...X....
...X....
...X....</code></pre>
<hr>
<h2 id="box-cursor">Box Cursor</h2>
<p>Useful for text selection:</p>
<pre><code>XXXXXXXX
X......X
X......X
X......X
X......X
X......X
X......X
XXXXXXXX</code></pre>
<hr>
<h1 id="benefits">Benefits</h1>
<p>A hardware cursor provides several advantages:</p>
<ul>
<li>GUI applications no longer need to redraw the mouse pointer.</li>
<li>Screen memory is never modified by cursor movement.</li>
<li>Cursor movement requires only three writes, with no control-register overhead - position mode is the default state of Cursor Data.</li>
<li>Cursor shape changes require only sixteen writes, plus one SYNC write to begin.</li>
<li>The cursor works in all GIME display modes.</li>
<li>No software background save/restore routines are needed.</li>
<li>Cursor updates are independent of application graphics.</li>
</ul>
<p>The interface requires only two registers while providing a complete programmable cursor system compatible with the GIME design philosophy.</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>CoCo Buttons</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coco-buttons/"/>
        <id>https://tlindner.macmess.org/coco-buttons/</id>

        <updated>2026-07-07T16:19:29-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Reading CoCo Joystick Buttons in Color BASIC The joystick buttons on the TRS-80 Color Computer 1 (CoCo 1) are connected to the PIA (Peripheral Interface Adapter). They can be read from memory location $FF00, which is decimal 65280. In Color BASIC, the value can be&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <h2>Reading CoCo Joystick Buttons in Color BASIC</h2>
<p>The joystick buttons on the TRS-80 Color Computer 1 (CoCo 1) are connected to the PIA (Peripheral Interface Adapter). They can be read from memory location <code>$FF00</code>, which is decimal <code>65280</code>.</p>
<p>In Color BASIC, the value can be read using <code>PEEK</code>:</p>
<pre><code>B=PEEK(65280)</code></pre>
<p>The joystick buttons are <strong>active low</strong>. This means that a button that is not pressed reads as a <code>1</code>, and a pressed button pulls the bit to <code>0</code>.</p>
<p>The button bits are:</p>
<table>
<tbody>
<tr>
<th>Bit</th>
<th>Mask</th>
<th>Button</th>
</tr>
<tr>
<td>0</td>
<td><code>1</code></td>
<td>Right joystick button</td>
</tr>
<tr>
<td>1</td>
<td><code>2</code></td>
<td>Left joystick button</td>
</tr>
</tbody>
</table>
<p>Color BASIC supports bitwise <code>AND</code>, which makes checking the buttons straightforward:</p>
<pre><code>10 B=PEEK(65280)
20 IF (B AND 1)=0 THEN PRINT "RIGHT BUTTON"
30 IF (B AND 2)=0 THEN PRINT "LEFT BUTTON"
40 GOTO 10</code></pre>
<p>The parentheses are important. Color BASIC's operator precedence can produce surprising results if you write:</p>
<pre><code>PEEK(65280) AND 128 = 0</code></pre>
<p>This is not interpreted as:</p>
<pre><code>(PEEK(65280) AND 128) = 0</code></pre>
<p>Instead, the comparison happens first, effectively making it:</p>
<pre><code>PEEK(65280) AND (128 = 0)</code></pre>
<p>Since <code>128 = 0</code> is false, the expression becomes an AND with zero, which will always produce zero.</p>
<p>The correct way to test a bit is to put the bit operation inside parentheses:</p>
<pre><code>(PEEK(65280) AND 128) = 0</code></pre>
<p>The evaluation order is:</p>
<ol>
<li><code>PEEK(65280)</code> reads the hardware register.</li>
<li><code>AND 128</code> masks the desired bit.</li>
<li><code>= 0</code> tests whether that bit is clear.</li>
</ol>
<p>This is a good habit for Color BASIC programming: whenever using bit masks in a comparison, put the masked expression in parentheses.</p>
<p>The CoCo's joystick interface is simple, but remembering that the buttons are active low and that Color BASIC's operator precedence is different from many modern languages will save a lot of debugging time.</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Teaching BBEdit to Know Soft Wrap setting for OCR Text Files</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/teaching-bbedit-to-know-soft-wrap-setting-for-ocr-text-files/"/>
        <id>https://tlindner.macmess.org/teaching-bbedit-to-know-soft-wrap-setting-for-ocr-text-files/</id>

        <updated>2026-07-02T07:54:42-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I recently ran into a problem while processing a large batch of OCR text files. The workflow was simple: scanned PDFs → OCR → text files → BBEdit search. The OCR output was fine structurally, with one line per paragraph, but reading it in BBEdit&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p>I recently ran into a problem while processing a large batch of OCR text files.</p>
<p>The workflow was simple: scanned PDFs → OCR → text files → BBEdit search. The OCR output was fine structurally, with one line per paragraph, but reading it in BBEdit was unpleasant. Long lines ran off the right side of the window. Search still worked, but visual scanning was harder than it should be.</p>
<p>What I wanted was simple. Every OCR text file should open in BBEdit with Soft Wrap enabled.</p>
<p>BBEdit does not provide a setting for this at the file level. There is no xattr or modeline for it.</p>
<h2>Where BBEdit stores document state</h2>
<p>BBEdit stores per-file state in a property list here:</p>
<div style="white-space: pre-wrap; overflow-wrap: anywhere;"><code>~/Library/Containers/com.barebones.bbedit/Data/Library/BBEdit/Document State.plist</code></div>
<p>This file acts like a database. Each entry is keyed by file path, and contains a dictionary of state data for that file.</p>
<p>The setting I cared about is:</p>
<pre><code>&lt;key&gt;SoftWrapText&lt;/key&gt;
&lt;true/&gt;</code></pre>
<p>It lives inside:</p>
<pre><code>StateEntries_v1
    └── file path
        └── BBEditStateData</code></pre>
<p>BBEdit uses this structure to store editor state per file.</p>
<h2>Path matching matters</h2>
<p>My first attempt did not work correctly.</p>
<p>I had entries like:</p>
<pre><code>1981/08_rainbow.txt</code></pre>
<p>But BBEdit was using full paths like:</p>
<pre><code>/Volumes/ARCHIVE/Rainbows/1981/08_rainbow.txt</code></pre>
<p>BBEdit matches state strictly by path. If the key does not match exactly, it is ignored.</p>
<p>The fix was to always normalize paths before writing them.</p>
<p>Files on external volumes stay absolute. Files inside the home directory can use <code>~/</code>.</p>
<p>In Python, this is handled with:</p>
<pre><code>path = path.resolve()</code></pre>
<h2>Automating Soft Wrap for many files</h2>
<p>Once the structure was correct, I wrote a script that:</p>
<ul>
<li>finds all <code>.txt</code> files recursively</li>
<li>computes the correct BBEdit key for each file</li>
<li>sets <code>SoftWrapText = true</code></li>
<li>preserves existing BBEdit metadata</li>
</ul>
<p>The key function is:</p>
<pre><code>def bbedit_key_for(path: Path) -&gt; str:
    path = path.resolve()

    try:
        rel = path.relative_to(Path.home())
        return f"~/{rel}"
    except ValueError:
        return str(path)</code></pre>
<p>Everything else is plist editing.</p>
<h2>Result</h2>
<p>After running this across the OCR archive:</p>
<ul>
<li>all text files open with wrapping enabled</li>
<li>BBEdit search still works normally</li>
<li>no changes to the original files</li>
<li>no need to insert line breaks into OCR output</li>
</ul>
<p>The workflow is now easier to read without affecting how search behaves.</p>
<h2>What this is doing</h2>
<p>BBEdit stores per-file editor state in a plist that behaves like a small database keyed by file path.</p>
<p>Once that is visible, it becomes possible to automate editor behavior for large sets of files instead of adjusting settings manually.</p>
<p>This can be extended beyond Soft Wrap to other per-file state BBEdit tracks.</p>
<p>
<script src="https://gist.github.com/tlindner/7aa72924dbd491aecc707349d81cc19e.js"></script>
</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Refine the SAC</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/refine-the-sac/"/>
        <id>https://tlindner.macmess.org/refine-the-sac/</id>

        <updated>2026-06-29T01:08:23-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Reverse Engineering the CoCo Speech/Sound Cartridge Sound Activity Circuit The Color Computer Speech/Sound Cartridge (S/SC) was one of the more ambitious peripherals Tandy produced for the CoCo line. It packed a TMS-7040 microcontroller, an SPO256-AL2 speech synthesizer, an AY-3-8913 programmable sound generator, and 2K of&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <h1>Reverse Engineering the CoCo Speech/Sound Cartridge Sound Activity Circuit</h1>

<p>The Color Computer Speech/Sound Cartridge (S/SC) was one of the more ambitious peripherals Tandy produced for the CoCo line. It packed a TMS-7040 microcontroller, an SPO256-AL2 speech synthesizer, an AY-3-8913 programmable sound generator, and 2K of RAM into a single cartridge. It was complex enough that most CoCo owners never fully understood what it was doing.</p>

<p>I am a contributor to the Mame emulator project, and I maintain the CoCo SSC slot device. It emulates the TMS-7040, the SPO256, and the AY-3-8913 reasonably well. But there is one small piece of the hardware I had never properly emulated: an analog circuit that generates a single status bit indicating whether the PSG is currently producing sound. The bit is active low, lives at address $FF7E bit 5, and I called it the Sound Activity Circuit.</p>

<p>This is the story of how I figured out what it does, measured it on real hardware, and built a proper emulation of it.</p>

<h2>The Schematic</h2>

<p>The Sound Activity Circuit is a small analog section hanging off the AY-3-8913's audio output. Looking at the schematic, the signal chain goes like this:</p>

<p>The PSG's analog output feeds into an op-amp stage (one section of a quad NJM2058D) through a high-pass filter formed by C9 and R6. This strips the DC component and boosts the AC audio signal. The amplified signal then goes into a precision half-wave rectifier built from D2, D1, R1, and R2. This only passes positive half-cycles, and charges a 15&micro;F tantalum capacitor C25 through the rectifier. C25 charges quickly when audio is present, and drains slowly through R9 (56K) when audio stops. Finally, a comparator stage with hysteresis (formed by R3 and R8) watches the voltage on C25 and snaps a clean digital output when C25 crosses the threshold.</p>

<p>In plain terms: the circuit answers the question "is the PSG making sound right now?" with a deliberate time delay on the answer going from yes to no. C25 stays charged for a while after the PSG goes quiet, so brief silences between sounds don't glitch the status bit.</p>

<p>From the RC values in the schematic, I calculated a charge time constant of about 150ms and a decay time constant of about 840ms. Those were my starting estimates.</p>

<h2>The Initial Emulation</h2>

<p>In Mame, I implemented this as a stacked audio filter device, <code>cocossc_sac_device</code>, inserted between the AY-3-8913's output and the speaker. Every time Mame calls <code>sound_stream_update()</code>, the filter sees the PSG's sample buffer, computes the RMS energy, and stores it in a small circular buffer. The <code>sound_activity_circuit_output()</code> function averages the circular buffer and applies a threshold to decide whether to assert the status bit.</p>

<pre><code>bool cocossc_sac_device::sound_activity_circuit_output()
{
    float sum = std::accumulate(std::begin(m_rms), std::end(m_rms), 0.0f);
    float average = (sum / BUFFER_SIZE);
    return average &lt; 0.317f;
}</code></pre>

<p>This worked, in the sense that it compiled and ran. But the threshold of 0.317 was a magic number with no physical basis, and I had no idea how the decay timing related to real hardware. I was guessing.</p>

<p>I decided to measure the real hardware.</p>

<h2>The Plan</h2>

<p>The Sound Activity Circuit only responds to PSG output. The SP0256 speech chip bypasses it entirely. So the measurement is straightforward: start the PSG playing a tone, measure how long before the status bit asserts, let C25 fully charge, silence the PSG, then measure how long before the status bit deasserts.</p>

<p>Since I don't own an oscilloscope (I know, I know), I decided to use the CoCo itself as the measuring instrument. At 0.89MHz, a tight polling loop runs at roughly one iteration per 11 microseconds. More than enough resolution to measure a decay time in the hundreds of milliseconds.</p>

<p>I wrote a small test program in 6809 assembly, wrapped in a C program using CMOC, that would:</p>

<ol>
    <li>Reset the SSC to a known state</li>
    <li>Put the SSC into PSG register mode</li>
    <li>Program the AY-3-8913 for a 1KHz tone on channel A at maximum volume</li>
    <li>Count polling loop iterations until the sound activity bit asserts (charge time)</li>
    <li>Wait for C25 to fully charge</li>
    <li>Silence the PSG</li>
    <li>Count polling loop iterations until the sound activity bit deasserts (decay time)</li>
    <li>Print the results</li>
</ol>

<p>Simple enough in theory. In practice, it took a while to get right.</p>

<h2>Pitfall One: The Busy Bit Is Active Low. So Is Everything Else.</h2>

<p>The status byte at $FF7E has three active-low bits:</p>

<ul>
    <li>Bit 7 ($80) - busy (low = busy)</li>
    <li>Bit 6 ($40) - speech active (low = speaking)</li>
    <li>Bit 5 ($20) - sound active (low = PSG making sound)</li>
</ul>

<p>I initially wrote the busy-wait loop as:</p>

<pre><code>bw1     lda     $ff7e
        bmi     bw1       ; wait while bit 7 set</code></pre>

<p>But since busy is active low, bit 7 being <em>set</em> means not busy. The loop was waiting for the wrong condition. It would spin forever waiting for not-busy while the SSC was idle. The correct test is <code>bpl</code> (branch while plus), meaning while bit 7 is clear (busy):</p>

<pre><code>bw1     lda     $ff7e
        bpl     bw1       ; wait while bit 7 clear = busy</code></pre>

<h2>Pitfall Two: The TMS-7040 Needs Time</h2>

<p>The SSC uses a TMS-7040 microcontroller as an intermediary between the CoCo and all the other devices in the cartridge. When the CoCo writes a byte to $FF7E, it triggers an interrupt on the TMS-7040, which queues the byte and asserts the busy bit. When in the correct mode, the TMS-7040's main loop then dequeues the byte and writes it to the PSG, then clears busy.</p>

<p>I assumed that the busy bit clearing meant the TMS-7040 was truly ready for the next byte. It is not. The busy bit clears before the microcontroller is fully ready to accept another write. If you send the next byte too quickly, it gets dropped silently.</p>

<p>The BASIC manual's example program inadvertently works around this because the BASIC interpreter is slow. The overhead between a <code>POKE</code> and the next <code>GOSUB</code> is enough dead time that the TMS-7040 catches up. In tight assembly code, you have to add explicit delays.</p>

<p>Thru bisection I found that a delay loop of 49 iterations (at 8 cycles each, about 440 microseconds) was the minimum reliable inter-byte delay. I rounded up to 64 for safety. The WRPSG subroutine ended up looking like this:</p>

<pre><code>WR2PSG
        ldx     #64
wp1lp   leax    -1,x
        bne     wp1lp
        pshs    a
bw1     lda     SSCDAT
        bpl     bw1
        puls    a
        sta     SSCDAT
WR1PSG
        ldx     #64
wp2lp   leax    -1,x
        bne     wp2lp
bw2     lda     SSCDAT
        bpl     bw2
        stb     SSCDAT
        rts</code></pre>

<h2>Pitfall Three: The Audio Is Not Routed Automatically</h2>

<p>The CoCo has a sound multiplexer that selects the audio source for the internal speaker. By default it does not route cartridge audio. Before you can hear anything from the SSC, you need to configure the multiplexer:</p>

<pre>*((unsigned char *)0xff01) = 0x34; // PIA 0 CA2 = 0 \_ Set mixer to CART
*((unsigned char *)0xff03) = 0x3f; // PIA 0 CB2 = 1 /
*((unsigned char *)0xff23) = 0x3c; // PIA 1 CB2 = 1 - Turn on sound</pre>

<p>The BASIC example programs in the SSC manual does this as a matter of course, but it is easy to miss when writing a standalone C program. Without these writes, the PSG produces output that goes nowhere, and you hear nothing.</p>

<h2>The Results</h2>

<p>After working through all of those pitfalls, the test program finally ran correctly. The results from multiple runs on real hardware over a ten-minute thermal soak:</p>

<ul>
    <li><strong>Charge time: 740 iterations (approximately 8ms)</strong>. Rock solid across all runs and the entire thermal soak</li>
    <li><strong>Decay time: 12079-12163 iterations (approximately 133-134ms)</strong>. Slowly increasing as the board warmed up, with ambient temperature affecting the value measurably. Running a fan near the CoCo during testing dropped the value by roughly 55 counts</li>
</ul>

<p>The ratio of decay to charge is about 16:1, which is in the right ballpark compared to the schematic's predicted 6:1. The difference is likely due to component variation in the actual capacitor and resistors on my particular board.</p>

<p>The most interesting finding is that the decay time is <strong>134ms</strong>, not the 840ms predicted by the schematic. Either C25 has drifted significantly from its marked value over 40 years, or the board revision I own uses different component values than the schematic I was working from. Either way, real hardware measurements beat schematic theory every time.</p>

<h2>The Revised Emulation</h2>

<p>Armed with real numbers, I rewrote the Mame emulation. The original RMS circular buffer approach had several problems:</p>

<ul>
    <li>The window size had no relationship to the circuit's actual time constants</li>
    <li>It was sensitive to Mame's buffer update rate</li>
    <li>The AY-3-8913 emulation produces a DC offset at idle which the RMS accumulated, making the circuit appear permanently active</li>
    <li>The threshold of 0.317 had no physical basis</li>
</ul>

<p>The analog circuit is fundamentally asymmetric. C25 charges quickly through the rectifier diode but drains slowly through the resistor network. The correct digital model is an envelope follower with asymmetric attack and decay coefficients, preceded by a high-pass filter to remove the DC offset, matching the real circuit's C9/R6 input filter.</p>

<pre><code>void cocossc_sac_device::sound_stream_update(sound_stream &amp;stream)
{
    int count = stream.samples();

    for (int sampindex = 0; sampindex &lt; count; sampindex++)
    {
        float x = stream.get(0, sampindex);

        // High pass filter to remove DC offset (models C9/R6)
        float y = HPF_ALPHA * (m_hpf_prev_out + x - m_hpf_prev_in);
        m_hpf_prev_in = x;
        m_hpf_prev_out = y;

        // Envelope follower, asymmetric attack/decay (models C25)
        float rect = std::abs(y);
        if (rect > m_envelope)
            m_envelope += (rect - m_envelope) * ATTACK_COEFF;
        else
            m_envelope += (rect - m_envelope) * DECAY_COEFF;

        stream.put(0, sampindex, x);
    }
}

bool cocossc_sac_device::sound_activity_circuit_output()
{
    m_stream->update();

    if (m_sound_active &amp;&amp; m_envelope &lt; THRESH_OFF)
        m_sound_active = false;
    else if (m_envelope > THRESH_ON)
        m_sound_active = true;

    return !m_sound_active;  // active low
}</code></pre>

<p>The attack and decay coefficients were derived from the hardware measurements and tuned against the emulated system:</p>

<pre><code>static constexpr float HPF_ALPHA    = 0.99f;
static constexpr float ATTACK_COEFF = 0.0026f;  // models ~8ms charge time
static constexpr float DECAY_COEFF  = 0.0003f;  // models ~134ms decay time
static constexpr float THRESH_ON    = 0.05f;
static constexpr float THRESH_OFF   = 0.01f;</code></pre>

<p>The envelope follower operates sample by sample, so it produces consistent results regardless of Mame's buffer update rate or the user's configured sample rate.</p>

<h2>Conclusion</h2>

<p>I have never encountered any CoCo software that actually polls the sound activity bit during normal operation. This entire exercise was in the service of correctness. If the hardware has the bit, the emulator should get it right.</p>

<p>The process turned out to be more interesting than I expected. What looked like a simple threshold comparison in the schematic revealed a carefully designed asymmetric envelope detector. And the busy-wait protocol had a hidden timing requirement. One that is documented in the manual, but easy to miss when writing tight assembly code.</p>

<p>If I had an oscilloscope, the waveforms on C25 charging and draining would have made a much better illustration for this post. Maybe next time.</p>

<p>The source code for the test program can be found <a href="https://github.com/tlindner/coco-ssc-probe">here</a>. The pull request for Mame is <a href="https://github.com/mamedev/mame/pull/15611">here</a>.</p>

            ]]>
        </content>
    </entry>
    <entry>
        <title>ToolShed Tap for Homebrew</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/toolshed-tap-for-homebrew/"/>
        <id>https://tlindner.macmess.org/toolshed-tap-for-homebrew/</id>

        <updated>2026-05-04T10:38:01-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I've been a Homebrew users for a long time. Very nice experience. My only complaint is using it with old operating systems is not a thing they optimize for. But with regard to ToolShed, the disk image tool I contribute to, no one has every&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I've been a Homebrew users for a long time. Very nice experience. My only complaint is using it with old operating systems is not a thing they optimize for.
But with regard to <a href="https://github.com/nitros9project/toolshed">ToolShed</a>, the disk image tool I contribute to, no one has every made a recipe for it.
So I put together a <a href="https://github.com/nitros9project/homebrew-toolshed">3rd party tap</a>. Follow instructions there to learn how easy it is to use.
I am choosing not to try to get it mainlined because of how the project includes copyrighted code from others.
            ]]>
        </content>
    </entry>
    <entry>
        <title>SAM/VDG Sizzler</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/samvdg-sizzler/"/>
        <id>https://tlindner.macmess.org/samvdg-sizzler/</id>

        <updated>2024-08-16T09:35:30-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I recently thought it would be nice to have a picture of every video mode a Color Computer could produce. So I wrote a program to make it easy to do that. You can find this program over on github. I have also taken the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I recently thought it would be nice to have a picture of every video mode a Color Computer could produce. So I wrote a program to make it easy to do that.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/174/Sizzle-Screen-Shot.png" alt="Sizzle Screen Shot" width="866" height="652"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/174/responsive/Sizzle-Screen-Shot-xs.png 640w ,https://tlindner.macmess.org/media/posts/174/responsive/Sizzle-Screen-Shot-sm.png 768w ,https://tlindner.macmess.org/media/posts/174/responsive/Sizzle-Screen-Shot-md.png 1024w ,https://tlindner.macmess.org/media/posts/174/responsive/Sizzle-Screen-Shot-lg.png 1366w ,https://tlindner.macmess.org/media/posts/174/responsive/Sizzle-Screen-Shot-xl.png 1600w ,https://tlindner.macmess.org/media/posts/174/responsive/Sizzle-Screen-Shot-2xl.png 1920w"></figure>
You can find this program over on <a href="https://github.com/tlindner/VDGSIZZLE">github</a>.
I have also taken the time to make videos of the four major implementations of the CoCo SAM/VDG:
<code>
<a href="https://archive.org/details/siz-cc-1">https://archive.org/details/siz-cc-1</a>
<a href="https://archive.org/details/siz-cc-2b_202408">https://archive.org/details/siz-cc-2b_202408</a>
<a href="https://archive.org/details/siz-cc-3-86">https://archive.org/details/siz-cc-3-86</a>
<a href="https://archive.org/details/siz-cc-3-87">https://archive.org/details/siz-cc-3-87</a>
</code>

            ]]>
        </content>
    </entry>
    <entry>
        <title>New Disassembler</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/new-disassembler/"/>
        <id>https://tlindner.macmess.org/new-disassembler/</id>

        <updated>2024-06-01T08:54:12-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I wrote a newish 6809 and 6309 disassembler. https://www.macmess.org/follow9.html. Its just two files, an HTML and JavaScript file. Copy them locally, host them on another site, what ever. There is also a git hub so you can do a pull request to help me add&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I wrote a newish 6809 and 6309 disassembler. <a href="https://www.macmess.org/follow9.html">https://www.macmess.org/follow9.html</a>.
Its just two files, an HTML and JavaScript file. Copy them locally, host them on another site, what ever.
There is also a git hub so you can do a pull request to help me add features.
<a href="https://github.com/tlindner/follow9">https://github.com/tlindner/follow9</a>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Demon Attack on a CoCo 3</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/demon-attack-on-a-coco-3/"/>
        <id>https://tlindner.macmess.org/demon-attack-on-a-coco-3/</id>

        <updated>2024-03-17T20:53:10-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Demon Attack cartridge (26-3099) has a small bug when running on a CoCo 3. The Programmer's credit and version information is drawn using garbage rather than the correct data from the ROM. This has to do with setting bit 3 of $FF90 causing RAM to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Demon Attack cartridge (26-3099) has a small bug when running on a CoCo 3. The Programmer's credit and version information is drawn using garbage rather than the correct data from the ROM.

<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/172/capture1.png" alt="capture1" width="1920" height="1080"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/172/responsive/capture1-xs.png 640w ,https://tlindner.macmess.org/media/posts/172/responsive/capture1-sm.png 768w ,https://tlindner.macmess.org/media/posts/172/responsive/capture1-md.png 1024w ,https://tlindner.macmess.org/media/posts/172/responsive/capture1-lg.png 1366w ,https://tlindner.macmess.org/media/posts/172/responsive/capture1-xl.png 1600w ,https://tlindner.macmess.org/media/posts/172/responsive/capture1-2xl.png 1920w"></figure>

This has to do with setting bit 3 of $FF90 causing RAM to appear at $FExx. This does not happen on a CoCo 1 or 2.

<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/172/Capture.png" alt="Capture" width="642" height="512"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/172/responsive/Capture-xs.png 640w ,https://tlindner.macmess.org/media/posts/172/responsive/Capture-sm.png 768w ,https://tlindner.macmess.org/media/posts/172/responsive/Capture-md.png 1024w ,https://tlindner.macmess.org/media/posts/172/responsive/Capture-lg.png 1366w ,https://tlindner.macmess.org/media/posts/172/responsive/Capture-xl.png 1600w ,https://tlindner.macmess.org/media/posts/172/responsive/Capture-2xl.png 1920w"></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>CoCo 3 PIA 2 Mirror</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coco-3-pia-2-mirror/"/>
        <id>https://tlindner.macmess.org/coco-3-pia-2-mirror/</id>

        <updated>2024-02-07T22:51:25-08:00</updated>
            <summary type="html">
                <![CDATA[
                    The second PIA has a smaller mirror in the CoCo 3 than the CoCo 1/2. It goes from $FF20 to $FF2F. The CoCo 1/2 mirror is from $FF20 to $FF3F. Recently I was challenged to find a citation for this information. But I could not.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The second PIA has a smaller mirror in the CoCo 3 than the CoCo 1/2. It goes from $FF20 to $FF2F. The CoCo 1/2 mirror is from $FF20 to $FF3F.

Recently I was challenged to find a citation for this information. But I could not. <a href="https://colorcomputerarchive.com/repo/Documents/Books/Assembly%20Language%20Programming%20for%20the%20CoCo3%20%281987%29%20%28Laurence%20A%20Tepolt%29.pdf" title="Tepolt">Tepolt</a> has this wrong. So I decided to create a test program and accompanying video to document this first hand.

Here is the <a href="https://www.macmess.org/downloads/PIA2Test.zip">test</a> program.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/171/Capture.png" alt="PIA Test Program" width="642" height="512"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/171/responsive/Capture-xs.png 640w ,https://tlindner.macmess.org/media/posts/171/responsive/Capture-sm.png 768w ,https://tlindner.macmess.org/media/posts/171/responsive/Capture-md.png 1024w ,https://tlindner.macmess.org/media/posts/171/responsive/Capture-lg.png 1366w ,https://tlindner.macmess.org/media/posts/171/responsive/Capture-xl.png 1600w ,https://tlindner.macmess.org/media/posts/171/responsive/Capture-2xl.png 1920w"></figure>
It is a menu driven program that allows you to choose a specific mirror address for PIA 2, then allows you to choose one of three tests.

Test 'S' produces a square wave using the CoCo's DAC. This DAC is connect to port A of the PIA.
Test 'B' produces a square wave using the CoCo 1 bit sound source. This is connected to bit 1 of port B of the PIA.
Test 'V' toggles the A/G line of the VDG. This is connected to bit 7 of port B of the PIA.

When using this program on a CoCo 3 you will find the the second PIA only responds from $FF20 to $FF2F. And the VDG test only responds to $FF20 to $FF23, because the GIME only see writes to these specific addresses.

<div class="post__iframe"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/lvSHaDOJJPA?si=IlXvVWg6DP1QEEAv&amp;controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
            ]]>
        </content>
    </entry>
    <entry>
        <title>GIME Horizontal Retrace Register Update Table</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/gime-horizontal-retrace-register-update-table/"/>
        <id>https://tlindner.macmess.org/gime-horizontal-retrace-register-update-table/</id>

        <updated>2023-12-26T16:07:57-08:00</updated>
            <summary type="html">
                <![CDATA[
                    This is a proposal to the people who make FPGA versions of the CoCo 3's GIME chip. I was recently reading about the Amiga's Copper chip. I thought something similar could be added to a GIME implementation. The following is my idea, for what it's&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                This is a proposal to the people who make FPGA versions of the CoCo 3's GIME chip.

I was recently reading about the <a href="https://en.wikipedia.org/wiki/Amiga_Original_Chip_Set#Copper">Amiga's Copper chip</a>. I thought something similar could be added to a GIME implementation. The following is my idea, for what it's worth.
<table><tr><th>Addresses used:</th></tr>
<tr><td>FF99, Bit 7</td><td>Horizontal retrace update enable</td></tr>
<tr><td>FFEA-FFEC</td><td>Address (24 bit) table start</td></tr></table>

<table><tr><th>Table format:</th></tr>
<tr><td>0 byte</td><td>Scan line</td></tr>
<tr><td>1 byte</td><td>GIME register number</td></tr>
<tr><td>2 byte</td><td>New value</td></tr>
<tr><td>Repeating.</td><td></td></tr></table>

<h1>Function</h1>

If enabled, during the vertical retrace, the 24 bit table start address is loaded. Then the first byte of the table is deference. If the scan line value (table byte 0) is $FF, then the new value is written to the register number. The table pointer is advanced (by three bytes) and writes are repeated until the scan line is no longer $FF. This allows you to set any video registers before they are latched for the frame.

During every Horizontal retrace the scan line declared in the table is compared to the current scan line. If there is a match, the table value is written to the specified GIME register. Then the next table entry scan line is loaded.

If the scan line does not match, the process is paused until then next horizontal retrace.

If there is time, multiple GIME registers can be changed during horizontal retrace.

Register number zero refers to $FF90 (Initialization register #0). It goes up from there.

Register numbers $FE will trigger an FIRQ or IRQ. Nothing will be written to an internal register. Bit 6 will determine which interrupt is generated ($FF92 or $FF93).

Register number $FD will cause the GIME to reload the video start address from $FF9D and $FF9E. Nothing will be written to an internal register.

<h1>Example Programs</h1>

I implemented the above in a <a href="https://github.com/tlindner/mame/tree/hst">private MAME branch</a>. I wrote some demos and made these screen captures. All this code can be found <a href="https://www.macmess.org/downloads/hst.zip">here</a>.

<h2>COLOR64/BAS:</h2>

In BASIC, switch to HSCREEN 2 and draw a grid of 64 circles. Eight every row, for 8 rows. Use palette index 1 to 8 for every row. Load in an assembly language program to install a horizontal sync table to update the palette color to show all 64 colors on the screen at the same time.
<video loading="lazy" width="640" height="480" controls><source src="http://tlindner.macmess.org/wp-content/uploads/2023/12/Color64.mp4" type="video/mp4">Your browser does not support the video tag.</video> 
<a href="http://tlindner.macmess.org/wp-content/uploads/2023/12/Color64.mp4">Color64</a>

<h2>JOY/BAS:</h2>

In BASIC, switch to HSCREEN 2, then load a binary file. This file contains:
1. Image data to be loaded in the Hi-res screen memory.
2. The first 52 lines are 128 bytes wide
3. The rest are 256 bytes wide.
4. Hsync table to switch to 256 byte wide video at line 52.
5. Code to install hsync table and turn it on.
Then the BASIC program will update the horizontal scroll register in the table to match the horizontal joystick position.
<video loading="lazy" width="640" height="480" controls><source src="http://tlindner.macmess.org/wp-content/uploads/2023/12/Joy.mp4" type="video/mp4">Your browser does not support the video tag.</video>
<a href="http://tlindner.macmess.org/wp-content/uploads/2023/12/Joy.mp4">Joy</a>

<h2>DUAL/BAS:</h2>

In BASIC switch to HSCREEN 2, Draw random circles. Load hsync table and enable it. Near the bottom of the screen the GIME is instructed to switch to text mode and change the display address to be the bottom of the 40 column text screen.
Repeat drawing circle to the graphics screen and printing text to the 40 column screen.
<video loading="lazy" width="640" height="480" controls><source src="http://tlindner.macmess.org/wp-content/uploads/2023/12/Dual.mp4" type="video/mp4">Your browser does not support the video tag.</video>
<a href="http://tlindner.macmess.org/wp-content/uploads/2023/12/Dual.mp4">Dual</a>

<h2>INT/BAS:</h2>

In BASIC load binary from disk, wait for disk to stop spinning. Switch to HSCREEN 2 and have BASIC draw random circles. Setup horizontal table to trigger IRQ interrupt on scan line 100.

Interrupt service routine quickly sets all palette registers to zero. Then immediately restore RGB palette values. Repeat on next frame.
<video loading="lazy" width="640" height="480" controls><source src="http://tlindner.macmess.org/wp-content/uploads/2023/12/Int.mp4" type="video/mp4">Your browser does not support the video tag.</video>
<a href="http://tlindner.macmess.org/wp-content/uploads/2023/12/Int.mp4">Int</a>

<h2>The Patch</h2>
The Mame patch is here: <a href="https://github.com/mamedev/mame/compare/master...tlindner:mame:hst">https://github.com/mamedev/mame/compare/master...tlindner:mame:hst</a>.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Laurel &amp; Hardy - Commodore 64 Game</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/laurel-hardy-commodore-64-game/"/>
        <id>https://tlindner.macmess.org/laurel-hardy-commodore-64-game/</id>

        <updated>2023-10-28T10:58:03-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I'm not a C64 guy. But I do play their games for a little show I do with my sister. Recently we played this game. https://www.lemon64.com/game/laurel-and-hardy We usually do a poor job of playing complicated game we don't know. But both of us decided to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I'm not a C64 guy. But I do play their games for a little show I do with my sister. Recently we played this game. https://www.lemon64.com/game/laurel-and-hardy

We usually do a poor job of playing complicated game we don't know. But both of us decided to really learn this game and try to play it well. The game has a sprawling world and I quickly decided I needed a map. So I made one. I like to share so here it is.

<a href="http://tlindner.macmess.org/wp-content/uploads/2023/10/Laurel-and-Hardy-Map.pdf">Laurel and Hardy Map</a>.
            ]]>
        </content>
    </entry>
    <entry>
        <title>6809 Exchange and Transfer Opcodes</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/6809-exchange-and-transfer-opcodes/"/>
        <id>https://tlindner.macmess.org/6809-exchange-and-transfer-opcodes/</id>

        <updated>2022-11-18T22:44:30-08:00</updated>
            <summary type="html">
                <![CDATA[
                    It was recently brought to my attention that Darren Atkinson has a really good summary of the invalid register exchange and transfer opcodes in the 6809. So good, that I should use the information to make MAME's 6809 better match real hardware. That will be&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                It was recently brought to my attention that <a href="https://colorcomputerarchive.com/repo/Documents/Books/Motorola%206809%20and%20Hitachi%206309%20Programming%20Reference%20%28Darren%20Atkinson%29.pdf" title="Motorola 6809 and Hitachi 6309 Programming Reference">Darren Atkinson</a> has a really good summary of the invalid register exchange and transfer opcodes in the 6809.

So good, that I should use the information to make MAME's 6809 better match real hardware.

That will be a future post. In the mean time, I wrote a little program to exercise all of the invalid combinations and print results to the CoCo's screen memory. This way I can, eventually, verify the implementation.

The software package is here: <a href="http://tlindner.macmess.org/wp-content/uploads/2022/11/Test-Exg-TFR.zip">Test-Exg-TFR.zip</a>

Here is a screen shot from a real CoCo 2B with a 6809 running my program:
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/168/REAL-coco2b.png" alt="REAL coco2b" width="906" height="512"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/168/responsive/REAL-coco2b-xs.png 640w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-coco2b-sm.png 768w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-coco2b-md.png 1024w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-coco2b-lg.png 1366w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-coco2b-xl.png 1600w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-coco2b-2xl.png 1920w"></figure>

And here is a screen shot form a real CoCo 3 with a 6309 running the same program:
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/168/REAL-CoCo3h.png" alt="REAL CoCo3h" width="956" height="720"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/168/responsive/REAL-CoCo3h-xs.png 640w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-CoCo3h-sm.png 768w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-CoCo3h-md.png 1024w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-CoCo3h-lg.png 1366w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-CoCo3h-xl.png 1600w ,https://tlindner.macmess.org/media/posts/168/responsive/REAL-CoCo3h-2xl.png 1920w"></figure>

By "invalid", I mean the combinations of registers that Motorola didn't document. Combinations like specifying different width registers when exchanging or transferring. Or the use of the register bit patterns not defined by Motorola.
            ]]>
        </content>
    </entry>
    <entry>
        <title>VDG study (July 2022)</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/vdg-study-july-2022/"/>
        <id>https://tlindner.macmess.org/vdg-study-july-2022/</id>

        <updated>2022-07-19T19:54:20-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I was recently informed of some inaccuracies with the various VDG text screens emulated in MAME. I also recently acquired an RGB2HDMI. This device is a very configurable retro computer video to HDMI device. One nice feature it has is to write the frame buffer&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I was recently informed of some inaccuracies with the various VDG text screens emulated in MAME. I also recently acquired an <a href="https://github.com/hoglet67/RGBtoHDMI/wiki">RGB2HDMI</a>. This device is a very configurable retro computer video to HDMI device. One nice feature it has is to write the frame buffer to a PNG file.
Using this device I can capture pixel perfect pictures of my CoCos and compare them to what MAME currently produces.
<h1>First, here is the comparison between a real and MAME emulated CoCo 2.</h1>
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/167/2-and-MAME-2-Normal.gif" alt="2 and MAME 2 Normal" width="3072" height="1728"  ></figure>
The stem of the number '3' is too short in MAME.
The "E" stem is too short.
The "F" stem is too short.
<h1>Next is the CoCo 2B in normal mode.</h1>
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/167/2B-and-MAME-2B-Normal.gif" alt="2B and MAME 2B Normal" width="3624" height="2048"  ></figure>
Over all the characters need to be pushed one pixel to the right and one pixel up to properly fit in their boxes.
The '@' has an extra pixel.
The 'G' is the wrong shape.
The 'J' has an extra pixel.
The pound sign has extra pixels.
The dollar sign has extra pixels.
The apostrophe is missing some pixels.
The comma is missing some pixels.
The period is missing some pixels.
The three is missing a pixel on it's stem.
The '6' is the wrong shape.
The '9' is the wrong shape.
The colon is missing some pixels.
The semi-colon is missing some pixels.
<h1>Next is the CoCo 2B in lowercase mode.</h1>
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/167/2B-and-MAME-2B-Lowercase.gif" alt="2B and MAME 2B Lowercase" width="3624" height="2048"  ></figure>
Over all the characters need to be moved one pixel up and to the right. Except the lowercase J. It only needs to be moved one pixel to the right.
The lowercase letter g is the wrong shape.
The lowercase letter m has an extra pixel.
The lowercase letter p is the wrong shape.
The lowercase letter q is the wrong shape.
The lowercase letter t is the wrong shape.
The lowercase letter w is the wrong shape.
The lowercase letter y is the wrong shape.
The pound sign has extra pixels.
The dollar sign has extra pixels.
The apostrophe is missing some pixels.
The comma is missing some pixels.
The period is missing some pixels.
The '3' is missing a pixel on it's stem.
The '6' is the wrong shape.
The '9' is the wrong shape.
The '@' has an extra pixel.
The colon is missing some pixels.
The semi-colon is missing some pixels.
The 'G' is the wrong shape.
The 'J' has an extra pixel.
<h1>Next is the CoCo 3 in normal mode.</h1>
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/167/3-and-MAME-3-Normal.gif" alt="3 and MAME 3 Normal" width="1434" height="720"  ></figure>
Over all, the characters need to be moved a pixel up.
The comma also needs to be moved one pixel to the right.
The number 9 has an extra pixel.
<h1>Last is the CoCo 3 in lowercase mode.</h1>
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/167/3-and-MAME-3-Lowercase.gif" alt="3 and MAME 3 Lowercase" width="3624" height="2048"  ></figure>
Over all the characters need to be moved one pixel up.
The lowercase letter g is the wrong shape.
The lowercase letter i is the wrong shape.
The lowercase letter j is the wrong shape.
The lowercase letter m has an extra pixel.
The lowercase letter p is the wrong shape.
The lowercase letter q is the wrong shape.
The comma need to be moved to the right one pixel.
The numeral 9 has an extra pixel.

Special thanks to <a href="https://www.youtube.com/user/pedrolpena">Pedro Pena</a> for a screen capture.

MAME 0.246 is the first version to contain the fixes for the above.

            ]]>
        </content>
    </entry>
    <entry>
        <title>The Write Protect Problem</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/the-write-protect-problem/"/>
        <id>https://tlindner.macmess.org/the-write-protect-problem/</id>

        <updated>2022-07-01T10:15:08-07:00</updated>
            <summary type="html">
                <![CDATA[
                    An interesting bug appeared on MAME Testers recently. The bug linked here is really simple. OS-9 wont boot on a copy protected disk image. The solution also was simple: properly emulate the delay between issuing a write command, and the INTRQ that happens when the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                An interesting bug appeared on MAME Testers recently. The <a href="https://mametesters.org/view.php?id=8258">bug linked here</a> is really simple. OS-9 wont boot on a copy protected disk image. The solution also was simple: properly emulate the delay between issuing a write command, and the INTRQ that happens when the write protect notch is covered.
But how long of a delay should it be? The floppy disk controller chip data sheet does not specify what is normal. I wish I had an oscilloscope to measure things like this, but I don't. So I had to get tricky.
I wrote a Color Computer program that writes to a write protected disk on purpose. Normally after you issue the command to write to a sector, you prepare to start writing and then wait until the disk is ready. But if you know the disk write will error becuase of a write protect notch, all you really have to do is count. That is what I did, initiate write and then count forever:


<code>
&nbsp;&nbsp;&nbsp;&nbsp;pragma 6809
&nbsp;&nbsp;&nbsp;&nbsp;opt cd

start
&nbsp;&nbsp;&nbsp;&nbsp;org $6000
count fcb 55
error fcb $55

begin
&nbsp;&nbsp;&nbsp;&nbsp;orcc #$50 turn off interrupts, keep motor spinning
&nbsp;&nbsp;&nbsp;&nbsp;clrb clear counter
&nbsp;&nbsp;&nbsp;&nbsp;ldx #vector_return
&nbsp;&nbsp;&nbsp;&nbsp;stx $0983 load my NMI vector routine
&nbsp;&nbsp;&nbsp;&nbsp;lda #$ff
&nbsp;&nbsp;&nbsp;&nbsp;sta $0982 Enable NMI flag to vector
&nbsp;&nbsp;&nbsp;&nbsp;lda $ff48 reset status of 1793
&nbsp;&nbsp;&nbsp;&nbsp;lda #$A0
&nbsp;&nbsp;&nbsp;&nbsp;sta $FF48 do write sector command

; disk should be write protected.

loop
&nbsp;&nbsp;&nbsp;&nbsp;incb
&nbsp;&nbsp;&nbsp;&nbsp;bra loop

vector_return
&nbsp;&nbsp;&nbsp;&nbsp;stb count
&nbsp;&nbsp;&nbsp;&nbsp;lda $ff48
&nbsp;&nbsp;&nbsp;&nbsp;sta error
&nbsp;&nbsp;&nbsp;&nbsp;andcc #$AF enable interrupts
&nbsp;&nbsp;&nbsp;&nbsp;rts
&nbsp;&nbsp;&nbsp;&nbsp;end begin
</code>


The loop will not actually count forever. When the write fails, the Floppy Disk Controller will produce an Interrupt Request signal. On the Color Computer this is tied to the Non-Maskable Interrupt line. This will stop the loop and run my NMI handler. The records the counter and status to make available to a BASIC program for further processing.

I now have two results from different Floppy Disk Controllers: 20 and 19. With a 5 cycle loop counter, this comes to a delay of about 111 microseconds. I show my work <a href="https://docs.google.com/spreadsheets/d/1yBH18TyhmZBf5OChWvDDq10XLS0sWLBYxzH_vOoiNuo/edit?usp=sharing">here</a>.

            ]]>
        </content>
    </entry>
    <entry>
        <title>CoCo Max III Hi Res interface</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coco-max-iii-hi-res-interface/"/>
        <id>https://tlindner.macmess.org/coco-max-iii-hi-res-interface/</id>

        <updated>2022-05-08T15:57:40-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Thanks to a few friends I've been able to upgrade my hi-res tester to support the CoCo Max III interface. It is a device similar to the Tandy Hi-res interface, but is triggered differently. Here is what MAME is doing as of today for the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Thanks to a few friends I've been able to upgrade my <a href="https://github.com/tlindner/HiRes-Interface-Test">hi-res tester</a> to support the CoCo Max III interface. It is a device similar to the Tandy Hi-res interface, but is triggered differently.
<figure class="post__image"><img src="https://tlindner.macmess.org/media/posts/165/A985155D-394F-459C-B696-E844B0AECB8E.jpg" alt="A985155D-394F-459C-B696-E844B0AECB8E" width="1134" height="851"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/165/responsive/A985155D-394F-459C-B696-E844B0AECB8E-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/165/responsive/A985155D-394F-459C-B696-E844B0AECB8E-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/165/responsive/A985155D-394F-459C-B696-E844B0AECB8E-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/165/responsive/A985155D-394F-459C-B696-E844B0AECB8E-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/165/responsive/A985155D-394F-459C-B696-E844B0AECB8E-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/165/responsive/A985155D-394F-459C-B696-E844B0AECB8E-2xl.jpg 1920w"></figure><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/165/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1.jpg" alt="Screenshot" width="2000" height="1500"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/165/responsive/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/165/responsive/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/165/responsive/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/165/responsive/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/165/responsive/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/165/responsive/BD9AA54A-5172-40DA-A777-5AE01D34BB44-1-2xl.jpg 1920w"></figure><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/165/capture24-1.png" alt="capture24-1" width="956" height="720"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/165/responsive/capture24-1-xs.png 640w ,https://tlindner.macmess.org/media/posts/165/responsive/capture24-1-sm.png 768w ,https://tlindner.macmess.org/media/posts/165/responsive/capture24-1-md.png 1024w ,https://tlindner.macmess.org/media/posts/165/responsive/capture24-1-lg.png 1366w ,https://tlindner.macmess.org/media/posts/165/responsive/capture24-1-xl.png 1600w ,https://tlindner.macmess.org/media/posts/165/responsive/capture24-1-2xl.png 1920w"></figure>
Here is what MAME is doing as of today for the CoCo Max III interface:
<table><tr><td>Speed</td><td>Start Value</td><td>End Value</td><td>Length</td></tr><tr><td>Slow</td><td>67</td><td>483</td><td>416</td></tr><tr><td>Fast</td><td>67</td><td>483</td><td>416</td></tr></table>
After going over the data here is what I am going to change MAME to do:
<table><tr><td>Speed</td><td>Start Value</td><td>End Value</td><td>Length</td></tr><tr><td>Slow</td><td>29</td><td>243</td><td>214</td></tr><tr><td>Fast</td><td>57</td><td>486</td><td>429</td></tr></table>
You can see the new values are nearly the same as the previous values, but I think it is an improvement to use values verified on actual hardware.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Tandy Hi-Res Joystick Interface</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/tandy-hi-res-joystick-interface/"/>
        <id>https://tlindner.macmess.org/tandy-hi-res-joystick-interface/</id>

        <updated>2022-03-27T00:23:01-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I was recently told about a bug in MAME's implementation of the Tandy Hi-Res Joystick interface. The author of C-III Pages (an early desktop publishing application for the Color Computer) discovered the mouse cursor would only go 7/8th across the width of the screen. This&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/164/Screen-Shot-2022-03-27-at-12.20.09-AM.png" alt="Screen Shot 2022-03-27 at 12.20.09 AM" width="1021" height="583"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-27-at-12.20.09-AM-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-27-at-12.20.09-AM-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-27-at-12.20.09-AM-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-27-at-12.20.09-AM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-27-at-12.20.09-AM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-27-at-12.20.09-AM-2xl.png 1920w"></figure>I was recently told about a bug in MAME's implementation of the Tandy Hi-Res Joystick interface. The author of C-III Pages (an early desktop publishing application for the Color Computer) discovered the mouse cursor would only go 7/8th across the width of the screen.
This means it is now time to really try to understand the device. Reading the code in MAME doesn't really tell the whole story, and none of the values that are chosen are explained.
So I did what I always do, I wrote a test program to run on real hardware. <a href="https://github.com/tlindner/HiRes-Interface-Test">https://github.com/tlindner/HiRes-Interface-Test</a>
This program uses a slightly modified version of the sampling code found in most software. It does not do any scaling of the returned values to fit within the screen width or height. It leaves them raw.
I have in my possession four "joysticks" to test. A black beauty, a delux joystick, a C&H joystick, and a Koala Touchpad. The testing procedure was to start the program and wiggle the joystick while looking at the graphic screen (the G command). When I filled in as much as the four rectangles as I could, I returned to the text screen and took a screen shot.
<table><tr><td style="text-align:center;vertical-align: middle">Black Beauty</td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img src="https://tlindner.macmess.org/media/posts/164/Screen-Shot-2022-03-26-at-9.48.38-PM.png" alt="Screen Shot 2022-03-26 at 9.48.38 PM" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.38-PM-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.38-PM-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.38-PM-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.38-PM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.38-PM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.38-PM-2xl.png 1920w"></figure></td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/164/capture17.png" alt="capture17" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/capture17-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/capture17-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/capture17-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/capture17-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/capture17-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/capture17-2xl.png 1920w"></figure></td</tr></table>
<table><tr><td style="text-align:center;vertical-align: middle">Deluxe Joystick</td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img src="https://tlindner.macmess.org/media/posts/164/Screen-Shot-2022-03-26-at-9.48.15-PM.png" alt="Screen Shot 2022-03-26 at 9.48.15 PM" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.15-PM-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.15-PM-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.15-PM-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.15-PM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.15-PM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.48.15-PM-2xl.png 1920w"></figure></td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/164/capture18.png" alt="capture18" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/capture18-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/capture18-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/capture18-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/capture18-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/capture18-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/capture18-2xl.png 1920w"></figure></td</tr></table>
<table><tr><td style="text-align:center;vertical-align: middle">C&H Joystick</td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img src="https://tlindner.macmess.org/media/posts/164/Screen-Shot-2022-03-26-at-9.49.04-PM.png" alt="Screen Shot 2022-03-26 at 9.49.04 PM" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.04-PM-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.04-PM-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.04-PM-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.04-PM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.04-PM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.04-PM-2xl.png 1920w"></figure></td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/164/capture19.png" alt="capture19" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/capture19-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/capture19-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/capture19-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/capture19-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/capture19-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/capture19-2xl.png 1920w"></figure></td</tr></table>
<table><tr><td style="text-align:center;vertical-align: middle">Koala Touch pad</td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img src="https://tlindner.macmess.org/media/posts/164/Screen-Shot-2022-03-26-at-9.49.20-PM.png" alt="Screen Shot 2022-03-26 at 9.49.20 PM" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.20-PM-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.20-PM-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.20-PM-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.20-PM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.20-PM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/Screen-Shot-2022-03-26-at-9.49.20-PM-2xl.png 1920w"></figure></td><td style="text-align:center;vertical-align: middle"><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/164/capture20.png" alt="capture20" width="20" height="20"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/capture20-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/capture20-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/capture20-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/capture20-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/capture20-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/capture20-2xl.png 1920w"></figure></td</tr></table>
The Kola touch pad had the weirdest response to both versions of the sampling routine. See the image below and notice how much noise is in the bitmaps:
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/164/capture21.png" alt="capture21" width="956" height="720"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/164/responsive/capture21-xs.png 640w ,https://tlindner.macmess.org/media/posts/164/responsive/capture21-sm.png 768w ,https://tlindner.macmess.org/media/posts/164/responsive/capture21-md.png 1024w ,https://tlindner.macmess.org/media/posts/164/responsive/capture21-lg.png 1366w ,https://tlindner.macmess.org/media/posts/164/responsive/capture21-xl.png 1600w ,https://tlindner.macmess.org/media/posts/164/responsive/capture21-2xl.png 1920w"></figure>
Here is what MAME is doing as of today:
<table><tr><td>Speed</td><td>Start Value</td><td>End Value</td><td>Length</td></tr><tr><td>Slow</td><td>99</td><td>805</td><td>706</td></tr><tr><td>Fast</td><td>99</td><td>805</td><td>706</td></tr></table>
After going over the data here is what I am going to change MAME to do:
<table><tr><td>Speed</td><td>Start Value</td><td>End Value</td><td>Length</td></tr><tr><td>Slow</td><td>40</td><td>475</td><td>435</td></tr><tr><td>Fast</td><td>80</td><td>950</td><td>870</td></tr></table>
Hopefully this will fix the bug in MAME that affects C-III Pages and not cause any regressions.
If you want to run the program your self with your own interfaces and joystick, I would love more data. I am especially interested in what the 1 and 2 button Color Mice do.
I would also like to get values from the Color Max 3 hi-res interface. If uses the same method, but the RC values are different in the circuit.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Color Disk EDTASM Symbol Table</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/color-disk-edtasm-symbol-table/"/>
        <id>https://tlindner.macmess.org/color-disk-edtasm-symbol-table/</id>

        <updated>2022-01-10T21:26:15-08:00</updated>
            <summary type="html">
                <![CDATA[
                    The Color Disk EDTASM assembler has the option of writing a symbol table to the end of binaries it produces. You enable the feature by including the /WS switch during assembly to disk. The symbol table can be used by the stand alone ZBUG debugger.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The Color Disk EDTASM assembler has the option of writing a symbol table to the end of binaries it produces. You enable the feature by including the /WS switch during assembly to disk. The symbol table can be used by the stand alone ZBUG debugger.

Invoking the switch will add extra data after the LOADM post-amble. Here is how that data is formatted. First is the header. This is always 5 bytes in length.
<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-0lax">Length</th>
    <th class="tg-0lax">Example Value</th>
    <th class="tg-0lax">Description</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0lax">1 Byte</td>
    <td class="tg-0lax">01</td>
    <td class="tg-0lax">Seems to be constant</td>
  </tr>
  <tr>
    <td class="tg-0lax">2 Bytes</td>
    <td class="tg-0lax">0019</td>
    <td class="tg-0lax">The total length of the symbols and values, plus one</td>
  </tr>
  <tr>
    <td class="tg-0lax">2 Bytes</td>
    <td class="tg-0lax">0000</td>
    <td class="tg-0lax">Seems to be constant</td>
  </tr>
</tbody>
</table>

Next you will find a table entry for each symbol and value pair.

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-0lax">Length</th>
    <th class="tg-0lax">Example Value</th>
    <th class="tg-0lax">Description</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0lax">1 Byte</td>
    <td class="tg-0lax">84</td>
    <td class="tg-0lax">Length of the symbol text, with the high bit set</td>
  </tr>
  <tr>
    <td class="tg-0lax">n Bytes</td>
    <td class="tg-0lax">DONE</td>
    <td class="tg-0lax">Symbol name, ASCII encoded</td>
  </tr>
  <tr>
    <td class="tg-0lax">2 Bytes</td>
    <td class="tg-0lax">0004</td>
    <td class="tg-0lax">Symbol value</td>
  </tr>
</tbody>
</table>

And finally is the footer. a single constant byte:

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
  font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-0lax">Length</th>
    <th class="tg-0lax">Example Value</th>
    <th class="tg-0lax">Description</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0lax">1 Byte</td>
    <td class="tg-0lax">0</td>
    <td class="tg-0lax">Seems to be constant</td>
  </tr>
</tbody>
</table>

It should be noted the Assembler and ZBUG pair can only handle symbols with a maximum of six characters.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Salient Assembly Episode 1</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/salient-assembly-episode-1/"/>
        <id>https://tlindner.macmess.org/salient-assembly-episode-1/</id>

        <updated>2021-10-22T09:08:46-07:00</updated>
            <summary type="html">
                <![CDATA[
                    https://www.youtube.com/watch?v=dxwmPFIUpLY Welcome to Salient Assembly. The show where we deep dive into a very specific 6809 assembly language topic. Today we're talking about calling subroutines. Subroutines are a very important aspect to programming. When ever you find yourself needing to do the same thing in&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <style type="text/css">
<!--
 .tab { margin-left: 40px; }
 blockquote p { margin-bottom: 0px; margin-block-end: 0px}
-->
</style>
<a href="https://www.youtube.com/watch?v=dxwmPFIUpLY" title="https://www.youtube.com/watch?v=dxwmPFIUpLY">https://www.youtube.com/watch?v=dxwmPFIUpLY</a>
Welcome to Salient Assembly.

The show where we deep dive into a very specific 6809 assembly language topic.

Today we're talking about calling subroutines. Subroutines are a very important aspect to programming. When ever you find yourself needing to do the same thing in two different parts of your program your best bet is to create a subroutine for that function. This process is so fundamental it has a name: refactoring.

There are many instructions to facilitate this. But the today we'll be investiagting Branch to subroutine, and jump to subroutine. The branch version is used in position independant code, and also has a faster, shorter version for smaller branches.

<h1>JSR with no parameters</h1>

Let's first talk about a subroutine that requires no parameters to be passed. The JSR instruction will push the address of the next instruction to the stack and then pass control to the subroutine.

The RTS instruction will pull two bytes off the top of the stack and jump to that memory location.

These two instructions are what enable calling subroutines in 6809 assemble language.

For example, let's say we're writing a game and we want to write a subroutine that displays the text GAME OVER in the center of the screen.

<blockquote><code>GameOverCondition
<p class="tab">jsr GAMEOVER</p>
<p class="tab">jmp NextMiniGame</p>

GAMEOVER
<p class="tab">ldx #$50C</p>
<p class="tab">ldy #text</p>
loop
<p class="tab">lda ,y+</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">sta ,x+</p>
<p class="tab">bra loop</p>
WaitGameOver
<p class="tab">jsr [POLCAT]</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">rts</p>
text fcn "GAME OVER"
</code>
</blockquote>
<br><br>
Here we see the code for a mini game ending. Let's dig in deep to the specifics

• We execute the jsr instruction. It will push the address of the next instruction on the stack and jump to the operand.
• Do the work of the subroutine. This will copy some text to the middle of the VDG screen.
• Then return to the main program

<h1>JSR with calculated address</h1>

Sometimes you want to branch to different subroutines based on a condition. One method to do this is with a table of of subroutines. For example:

<blockquote><code>GameOverCondition
<p class="tab">ldb randomNumber</p>
<p class="tab">aslb</p>
<p class="tab">ldx #gameOverTable</p>
<p class="tab">abx</p>
<p class="tab">jsr [,x]</p>
<p class="tab">jmp nextMiniGame</p>
gameOverTable
<p class="tab">fdb WaitGameOver1</p>
<p class="tab">fdb WaitGameOver2</p>
WaitGameOver1
<p class="tab">...</p>
<p class="tab">rts</p>
WaitGameOver2
<p class="tab">...</p>
<p class="tab">rts</p>
</code></blockquote>
<br>
• I load a previously calculated random number that will be 0 or 1.
• Then multiply it by two.
• I add that value to the base address of the subroutine table.
• Then jump to that specific subroutine.
• After the subroutine finishes, it returns to the main program.

<h1>Parameter passing</h1>

Most of the time a subroutine will take parameters. These are values that change how the subroutine functions. In the example we've seen so far we may want to change the subroutine to make the text it displays variable. We also may want to have the text's final position variable. Let's go over some methods of passing these parameters to our subroutine.

<h1>JSR fixed memory locations</h1>

A simple, non-position independant method of passing parameters to a sub-routine is by using fixed memory locations.

<blockquote><code>GameOverCondition
<p class="tab">ldx #text</p>
<p class="tab">stx textBufferAddress</p>
<p class="tab">ldx #$50C</p>
<p class="tab">stx textposition</p>
<p class="tab">jsr GAMEOVER</p>
<p class="tab">jmp NextMiniGame</p>
GAMEOVER
<p class="tab">ldx textposition</p>
<p class="tab">ldy textBufferAddress</p>
loop
<p class="tab">lda ,y+</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">sta ,x+</p>
<p class="tab">bra loop</p>
WaitGameOver
<p class="tab">jsr [POLCAT]</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">rts</p>
textBufferAddress fdb 0
textposition fdb 0
text fcn "GAME OVER"
</code>
</blockquote>
<br>
1. load the address of the text string and store it in the parameter area
2. load the screen position and store it into the parameter area
3. jump to the subroutine
4. load the parameters into registers and perform the function.
5. then return to the main program.

This allows the GAMEOVER subroutine to print different messages. You can pass different text string and different positions to get different results.

<h1>JSR register</h1>

A faster way to pass parameters would be to use registers

<blockquote><code>GameOverCondition
<p class="tab">ldy #text</p>
<p class="tab">ldx #$50C</p>
<p class="tab">jsr GAMEOVER</p>
<p class="tab">jmp NextMiniGame</p>
GAMEOVER
loop
<p class="tab">lda ,y+</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">sta ,x+</p>
<p class="tab">bra loop</p>
WaitGameOver
<p class="tab">jsr [POLCAT]</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">rts</p>
text fcn "GAME OVER"
</code></blockquote>
<br>
• load the registers with the parameters
• call the subroutine
• notice how the registers are all setup ready for the function to be done.
• and return to the main program.

<h1>JSR stack</h1>

The stack is also a good way to pass parameters to a subroutine. Since the return address is already stored on the stack it makes sense to put the other parameters there.

<blockquote><code>GameOverCondition
<p class="tab">ldx #text</p>
<p class="tab">pshs x</p>
<p class="tab">ldx #$50C</p>
<p class="tab">pshs x</p>
<p class="tab">jsr GAMEOVER</p>
<p class="tab">jmp NextMiniGame</p>
GAMEOVER
<p class="tab">puls u</p>
<p class="tab">puls x</p>
<p class="tab">puls y</p>
loop
<p class="tab">lda ,y+</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">sta ,x+</p>
<p class="tab">bra loop</p>
WaitGameOver
<p class="tab">jsr [POLCAT]</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">tfr u,pc</p>
text fcn "GAME OVER"</code></blockquote>
<br>
• Push the two parameters onto the stack
• Call the subroutine
• Pop the return address off the stack
• pop the parameters off the stack
• perform the function
• transfer the return address to the pc register and return to the main program.

<h1>JSR post data</h1>

The last method we'll discuss is when you put the data to be passed after the subroutine call. Care must be taken to return to the proper address when done with the subroutine.

<blockquote><code>GameOverCondition
<p class="tab">jsr GAMEOVER</p>
<p class="tab">fdb $50C</p>
<p class="tab">fcn "GAME OVER"</p>
<p class="tab">jmp NextMiniGame</p>
GAMEOVER
<p class="tab">puls x</p>
<p class="tab">leay 2,x</p>
<p class="tab">ldx ,x</p>
loop
<p class="tab">lda ,y+</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">sta ,x+</p>
<p class="tab">bra loop</p>
WaitGameOver
<p class="tab">jsr [POLCAT]</p>
<p class="tab">beq WaitGameOver</p>
<p class="tab">tfr y,pc</p></code></blockquote>
<br>
• First we call the subroutine
• immediately after the call, we put two bytes of a destination address and then a string of characters with a zero terminator.
• In the subroutine we load x with the address that was pushed onto the stack. This is technically the return address, but if we used it as such, we would return to data, not code.
• Then we load register Y with the address of the text string
• Then we load register X with the address of the text destination.
• We perform the function
• Then we return from the subroutine by transferring the Y register to the PC register which will conveniently be the proper return address.

That's it for this episode. I hope you had a good time learning about subroutines and all the various ways you can pass parameters to them.

Bye for now.


            ]]>
        </content>
    </entry>
    <entry>
        <title>CoCo 3 GIME Timer Tests</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coco-3-gime-timer-tests/"/>
        <id>https://tlindner.macmess.org/coco-3-gime-timer-tests/</id>

        <updated>2021-05-12T23:28:33-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Recently I was investigating why the Color Computer 3 version of Arkanoid didn't make any ricochet sounds when the ball bounced off an object in MAME. For an example of the game working properly see this video here: https://youtu.be/1eexgL5b4lo After talking with the author of&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/161/Screen-Shot-2021-05-12-at-11.17.36-PM.png" alt="Screen Shot 2021-05-12 at 11.17.36 PM" width="1920" height="1080"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/161/responsive/Screen-Shot-2021-05-12-at-11.17.36-PM-xs.png 640w ,https://tlindner.macmess.org/media/posts/161/responsive/Screen-Shot-2021-05-12-at-11.17.36-PM-sm.png 768w ,https://tlindner.macmess.org/media/posts/161/responsive/Screen-Shot-2021-05-12-at-11.17.36-PM-md.png 1024w ,https://tlindner.macmess.org/media/posts/161/responsive/Screen-Shot-2021-05-12-at-11.17.36-PM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/161/responsive/Screen-Shot-2021-05-12-at-11.17.36-PM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/161/responsive/Screen-Shot-2021-05-12-at-11.17.36-PM-2xl.png 1920w"></figure>

Recently I was investigating why the Color Computer 3 version of Arkanoid didn't make any ricochet sounds when the ball bounced off an object in MAME. For an example of the game working properly see this video here: <a href="https://youtu.be/1eexgL5b4lo">https://youtu.be/1eexgL5b4lo</a>

After talking with the author of the game (Steve Bjork: name drop) he said the sound in question was being played by using the timer interrupt system in the machine. I disassembled the FIRQ handler and quickly found the problem. His playback routine did two things: it wrote a value to the DAC, and determined the proper amount of time to wait before the next DAC update. It did not update the DAC at a constant frequency.

Here is what the ISR did, in the order it did them:
<blockquote>1. Acknowledge the interrupt.
2. Write the new timer delay to the register
3. Enable the interrupt again.
4. Write the value to the DAC.
5. Determine the next timer delay and store it for the next interrupt.
</blockquote>
The problem was the first time the ISR was called: It wrote a zero for the amount of delay to the next interrupt, because the delay isn't properly determined until then end of the ISR. Documentation about the CoCo 3 hardware says this should stop the timer interrupt. And that is what MAME did. But this is not what real hardware does. On real hardware you get an immediate re-aserting of the interrupt when the timer value is set to zero. On the second interrupt the sound system is properly initialized, real timer values were being written, and samples are being sent to the DAC.

In order to find this problem I wrote some test programs. This helped me to fix the above bug, and also discover another bug in MAME. MAME tightly coupled the pulling of the F/IRQ line with setting the F/IRQ flag. On real hardware turning off the interrupt has no effect whether the flags are set.

The archive below is the test code I wrote. Three different routines that set up the timer interrupt. Every time the interrupt is fired the address $400 is incremented.

TEST1 sets up the slow timer with a value of $FFF. TEST2 sets up the fast timer with a value of $FFF. TEST3 sets up the slow timer with a value of $0. All three programs use polling to check if the timers fired (bug #2). TEST3 is the program that test a timer value of zero (bug #1).

Included are video files from my Color Computer 3 with an '86 GIME. They show what the program display as they are running.

<a href="https://www.macmess.org/downloads/CoCo%203%20Interrupts%20Tests.zip">CoCo 3 Interrupts Tests.zip</a>

            ]]>
        </content>
    </entry>
    <entry>
        <title>Color Computer 3 Text Mode Study</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/color-computer-3-text-mode-study/"/>
        <id>https://tlindner.macmess.org/color-computer-3-text-mode-study/</id>

        <updated>2021-05-01T18:37:49-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I decided to run thru the complete 40 column text mode options on a CoCo 3. Documented with pictures. Here is the program I used to create the display: 10 CLS 20 FOR X = 0 TO 30 30 PRINT 40 PRINT X; 50 FOR&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I decided to run thru the complete 40 column text mode options on a CoCo 3. Documented with pictures.
Here is the program I used to create the display:
<pre>10 CLS
20 FOR X = 0 TO 30
30 PRINT
40 PRINT X;
50 FOR Z = 65 TO 75
60 PRINT CHR$(X+Z);
70 NEXT Z
80 NEXT X
90 FOR X + 0 TO 7
100 LOCATE 0,0:PRINT X
110 POKE &HFF98,X
120 A$=INKEY$:IF A$="" THEN 120
130 NEXT X
140 GOTO 90
</pre>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 1 scan line (LPR2: 0, LPR1: 0, LPR0: 0).
Description: Uses the first row of every text cell for 192 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0946_r.jpg" alt="IMG_0946_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0946_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0946_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0946_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0946_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0946_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0946_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 1 scan line (LPR2: 0, LPR1: 0, LPR0: 1).
Description: Uses the first row of every text cell for 192 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0947_r.jpg" alt="IMG_0947_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0947_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0947_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0947_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0947_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0947_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0947_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 2 scan lines (LPR2: 0, LPR1: 1, LPR0: 0).
Description: Uses the first two rows of every text cell for 96 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0948_r.jpg" alt="IMG_0948_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0948_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0948_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0948_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0948_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0948_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0948_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 8 scan lines per text cell (LPR2: 0, LPR1: 1, LPR0: 1).
Description: 24 rows of text.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0949_r.jpg" alt="IMG_0949_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0949_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0949_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0949_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0949_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0949_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0949_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 9 scan lines per text cel (LPR2: 1, LPR1: 0, LPR0: 0).
Description: 21.3 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0950_r.jpg" alt="IMG_0950_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0950_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0950_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0950_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0950_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0950_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0950_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 10 scan lines per text cell (LPR2: 1, LPR1: 0, LPR0: 1).
Description: 19.3 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0951_r.jpg" alt="IMG_0951_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0951_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0951_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0951_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0951_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0951_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0951_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 11 scan lines per text cell (LPR2: 1, LPR1: 1, LPR0: 0).
Description: 17.5 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0952_r.jpg" alt="IMG_0952_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0952_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0952_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0952_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0952_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0952_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0952_r-2xl.jpg 1920w"></figure><br>
Text Rows: 24 (VRES0: 0, VRES1: 0).
Vertical Size: 16 scan lines per text cell (LPR2: 1, LPR1: 1, LPR0: 1).
Description: 12 rows of text. First row repeated.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0953_r.jpg" alt="IMG_0953_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0953_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0953_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0953_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0953_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0953_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0953_r-2xl.jpg 1920w"></figure><br>
<br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 1 scan line (LPR2: 0, LPR1: 0, LPR0: 0).
Description: Uses the first row of every text cell for 200 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0902_r.jpg" alt="IMG_0902_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0902_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0902_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0902_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0902_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0902_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0902_r-2xl.jpg 1920w"></figure><br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 1 scan line (LPR2: 0, LPR1: 0, LPR0: 1).
Description: Uses the first row of every text cell for 200 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0903_r.jpg" alt="IMG_0903_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0903_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0903_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0903_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0903_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0903_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0903_r-2xl.jpg 1920w"></figure><br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 2 scan lines (LPR2: 0, LPR1: 1, LPR0: 0).
Description: Uses the first two rows of every text cell for 100 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0904_r.jpg" alt="IMG_0904_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0904_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0904_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0904_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0904_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0904_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0904_r-2xl.jpg 1920w"></figure><br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 8 scan lines per text cell (LPR2: 0, LPR1: 1, LPR0: 1).
Description: 25 rows of text.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0914_r.jpg" alt="IMG_0914_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0914_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0914_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0914_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0914_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0914_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0914_r-2xl.jpg 1920w"></figure><br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 9 scan lines per text cel (LPR2: 1, LPR1: 0, LPR0: 0).
Description: 21.3 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0915_r.jpg" alt="IMG_0915_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0915_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0915_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0915_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0915_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0915_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0915_r-2xl.jpg 1920w"></figure><br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 10 scan lines per text cell (LPR2: 1, LPR1: 0, LPR0: 1).
Description: 20 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0916_r.jpg" alt="IMG_0916_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0916_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0916_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0916_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0916_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0916_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0916_r-2xl.jpg 1920w"></figure><br>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 11 scan lines per text cell (LPR2: 1, LPR1: 1, LPR0: 0).
Description: 18 (and one scan line) rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0917_r.jpg" alt="IMG_0917_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0917_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0917_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0917_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0917_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0917_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0917_r-2xl.jpg 1920w"></figure>
Text Rows: 25 (VRES0: 0, VRES1: 1).
Vertical Size: 16 scan lines per text cell (LPR2: 1, LPR1: 1, LPR0: 1).
Description: 13 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0918_r.jpg" alt="IMG_0918_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0918_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0918_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0918_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0918_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0918_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0918_r-2xl.jpg 1920w"></figure>
<br>
<br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 1 scan line (LPR2: 0, LPR1: 0, LPR0: 0).
Description: Uses the first row of every text cell for 224 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0919_r.jpg" alt="IMG_0919_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0919_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0919_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0919_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0919_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0919_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0919_r-2xl.jpg 1920w"></figure><br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 1 scan line (LPR2: 0, LPR1: 0, LPR0: 1).
Description: Uses the first row of every text cell for 224 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0920_r.jpg" alt="IMG_0920_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0920_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0920_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0920_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0920_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0920_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0920_r-2xl.jpg 1920w"></figure><br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 2 scan lines (LPR2: 0, LPR1: 1, LPR0: 0).
Description: Uses the first two rows of every text cell for 112 rows.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0921_r.jpg" alt="IMG_0921_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0921_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0921_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0921_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0921_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0921_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0921_r-2xl.jpg 1920w"></figure><br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 8 scan lines per text cell (LPR2: 0, LPR1: 1, LPR0: 1).
Description: 28 rows of text.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0922_r.jpg" alt="IMG_0922_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0922_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0922_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0922_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0922_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0922_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0922_r-2xl.jpg 1920w"></figure><br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 9 scan lines per text cel (LPR2: 1, LPR1: 0, LPR0: 0).
Description: 25 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0923_r.jpg" alt="IMG_0923_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0923_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0923_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0923_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0923_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0923_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0923_r-2xl.jpg 1920w"></figure><br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 10 scan lines per text cell (LPR2: 1, LPR1: 0, LPR0: 1).
Description: 22.5 rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0924_r.jpg" alt="IMG_0924_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0924_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0924_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0924_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0924_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0924_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0924_r-2xl.jpg 1920w"></figure><br>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 11 scan lines per text cell (LPR2: 1, LPR1: 1, LPR0: 0).
Description: 21.5 (and one scan line) rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0925_r.jpg" alt="IMG_0925_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0925_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0925_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0925_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0925_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0925_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0925_r-2xl.jpg 1920w"></figure>
Text Rows: 28 (VRES0: 1, VRES1: 1).
Vertical Size: 16 scan lines per text cell (LPR2: 1, LPR1: 1, LPR0: 1).
Description: 14 (plus one scan line) rows of text
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/160/IMG_0926_r.jpg" alt="IMG_0926_r" width="2101" height="1575"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/160/responsive/IMG_0926_r-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0926_r-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0926_r-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0926_r-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0926_r-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/160/responsive/IMG_0926_r-2xl.jpg 1920w"></figure>
<br>
<br>

            ]]>
        </content>
    </entry>
    <entry>
        <title>MAME, CoCo, and MIDI</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/mame-coco-and-midi/"/>
        <id>https://tlindner.macmess.org/mame-coco-and-midi/</id>

        <updated>2021-03-11T16:23:39-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I recently added a cartridge to MAME that emulated a MIDI port for the Color Computer. This post is about how to use the feature with the command line version of MAME. First you'll need to setup your host computer's MIDI functionality. On macOS you&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I recently added a cartridge to MAME that emulated a MIDI port for the Color Computer. This post is about how to use the feature with the command line version of MAME.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/159/IMG_0092-Cropped-761x1024.png" alt="IMG_0092-Cropped-761x1024" width="1024" height="761"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/159/responsive/IMG_0092-Cropped-761x1024-xs.png 640w ,https://tlindner.macmess.org/media/posts/159/responsive/IMG_0092-Cropped-761x1024-sm.png 768w ,https://tlindner.macmess.org/media/posts/159/responsive/IMG_0092-Cropped-761x1024-md.png 1024w ,https://tlindner.macmess.org/media/posts/159/responsive/IMG_0092-Cropped-761x1024-lg.png 1366w ,https://tlindner.macmess.org/media/posts/159/responsive/IMG_0092-Cropped-761x1024-xl.png 1600w ,https://tlindner.macmess.org/media/posts/159/responsive/IMG_0092-Cropped-761x1024-2xl.png 1920w"></figure>
First you'll need to setup your host computer's MIDI functionality. On macOS you use a program called Audio MIDI Setup in the Utilities folder. I do not know how to setup MIDI on a Windows or Linux computer.
<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/159/Screen-Shot-2021-11-16-at-8.23.43-AM.png" alt="Screen Shot 2021-11-16 at 8.23.43 AM" width="527" height="392"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/159/responsive/Screen-Shot-2021-11-16-at-8.23.43-AM-xs.png 640w ,https://tlindner.macmess.org/media/posts/159/responsive/Screen-Shot-2021-11-16-at-8.23.43-AM-sm.png 768w ,https://tlindner.macmess.org/media/posts/159/responsive/Screen-Shot-2021-11-16-at-8.23.43-AM-md.png 1024w ,https://tlindner.macmess.org/media/posts/159/responsive/Screen-Shot-2021-11-16-at-8.23.43-AM-lg.png 1366w ,https://tlindner.macmess.org/media/posts/159/responsive/Screen-Shot-2021-11-16-at-8.23.43-AM-xl.png 1600w ,https://tlindner.macmess.org/media/posts/159/responsive/Screen-Shot-2021-11-16-at-8.23.43-AM-2xl.png 1920w"></figure>
After setting up the host interface you will want to start MAME and have it list the MIDI interfaces it can find:
<pre>
tlindner$ ./mame -listmidi

MIDI input ports:
IAC Driver Bus 1 (default)

MIDI output ports:
IAC Driver Bus 1 (default)
</pre>

Next, let's attach a Multi-Pak to the CoCo emulation's expansion port and list the devices we can attach to each slot.
<pre>
tlindner$ ./mame coco2b -ext multi -listslots
SYSTEM           SLOT NAME        SLOT OPTIONS     SLOT DEVICE NAME
---------------- ---------------- ---------------- ----------------------------
coco2b           rs232            dec_loopback     RS232 Loopback (DEC 12-15336-00)
                                  ie15             IE15 Terminal
                                  keyboard         Serial Keyboard
                                  loopback         RS232 Loopback
                                  null_modem       RS232 Null Modem
                                  printer          Serial Printer
                                  pty              Pseudo terminal
                                  rs_printer       Radio Shack Serial Printer
                                  sunkbd           Sun Keyboard Adaptor
                                  swtpc8212        SWTPC8212 Terminal
                                  terminal         Serial Terminal

                 ext              cc2hdb1          CoCo2 HDB-DOS
                                  cc3hdb1          CoCo3 HDB-DOS
                                  ccpsg            CoCo PSG
                                  cd6809_fdc       Codimex CD-6809 Disk BASIC (1986)
                                  cp450_fdc        Prológica CP-450 BASIC Disco V. 1.0 (1984)
                                  dcmodem          CoCo Direct Connect Modem PAK
                                  fdc              CoCo FDC
                                  fdcv11           CoCo FDC v1.1
                                  games_master     CoCo Games Master Cartridge
                                  midi             CoCo MIDI PAK
                                  multi            CoCo Multi-Pak Interface
                                  orch90           CoCo Orch-90 PAK
                                  ram              Disto 1024K RAM Cartridge
                                  rs232            CoCo Deluxe RS-232 PAK
                                  ssc              CoCo S/SC PAK
                                  stecomp          Speech Systems Stereo Composer
                                  sym12            Speech Systems Symphony Twelve

                 ext:multi:slot1  ccpsg            CoCo PSG
                                  dcmodem          CoCo Direct Connect Modem PAK
                                  games_master     CoCo Games Master Cartridge
                                  midi             CoCo MIDI PAK
                                  orch90           CoCo Orch-90 PAK
                                  ram              Disto 1024K RAM Cartridge
                                  rs232            CoCo Deluxe RS-232 PAK
                                  ssc              CoCo S/SC PAK
                                  stecomp          Speech Systems Stereo Composer
                                  sym12            Speech Systems Symphony Twelve

                 ext:multi:slot2  ccpsg            CoCo PSG
                                  dcmodem          CoCo Direct Connect Modem PAK
                                  games_master     CoCo Games Master Cartridge
                                  midi             CoCo MIDI PAK
                                  orch90           CoCo Orch-90 PAK
                                  ram              Disto 1024K RAM Cartridge
                                  rs232            CoCo Deluxe RS-232 PAK
                                  ssc              CoCo S/SC PAK
                                  stecomp          Speech Systems Stereo Composer
                                  sym12            Speech Systems Symphony Twelve

                 ext:multi:slot3  ccpsg            CoCo PSG
                                  dcmodem          CoCo Direct Connect Modem PAK
                                  games_master     CoCo Games Master Cartridge
                                  midi             CoCo MIDI PAK
                                  orch90           CoCo Orch-90 PAK
                                  ram              Disto 1024K RAM Cartridge
                                  rs232            CoCo Deluxe RS-232 PAK
                                  ssc              CoCo S/SC PAK
                                  stecomp          Speech Systems Stereo Composer
                                  sym12            Speech Systems Symphony Twelve

                 ext:multi:slot4  cc2hdb1          CoCo2 HDB-DOS
                                  cc3hdb1          CoCo3 HDB-DOS
                                  ccpsg            CoCo PSG
                                  cd6809_fdc       Codimex CD-6809 Disk BASIC (1986)
                                  cp450_fdc        Prológica CP-450 BASIC Disco V. 1.0 (1984)
                                  dcmodem          CoCo Direct Connect Modem PAK
                                  fdc              CoCo FDC
                                  fdcv11           CoCo FDC v1.1
                                  games_master     CoCo Games Master Cartridge
                                  midi             CoCo MIDI PAK
                                  orch90           CoCo Orch-90 PAK
                                  ram              Disto 1024K RAM Cartridge
                                  rs232            CoCo Deluxe RS-232 PAK
                                  ssc              CoCo S/SC PAK
                                  stecomp          Speech Systems Stereo Composer
                                  sym12            Speech Systems Symphony Twelve

                 ext:multi:slot4:fdcv11:wd17xx:0 qd               5.25" quad density floppy drive
                 ext:multi:slot4:fdcv11:wd17xx:1 qd               5.25" quad density floppy drive
                 ext:multi:slot4:fdcv11:wd17xx:2 qd               5.25" quad density floppy drive
                 ext:multi:slot4:fdcv11:wd17xx:3 qd               5.25" quad density floppy drive
</pre>

There is a lot to take in, but what we're interested in is that slot 'ext:multi:slot3" has an option of midi. To start an emulation with a MIDI cart in that slot you type:

<pre>
./mame coco2b -ext multi -ext:multi:slot3 midi
</pre>

Don't worry there is no floppy disk cartridge specified, it is the default for slot 4.
Next we need to connect the host's MIDI interface to MAME. Refer back the the start of this tutorial and recall the names of the available midi interfaces.

The host-to-emulation MIDI connection is made using a medial type. Issue this command to see the available media types:
<pre>
tlindner$ ./mame coco2b -ext multi -ext:multi:slot3 midi -listmedia
SYSTEM           MEDIA NAME       (brief)    IMAGE FILE EXTENSIONS SUPPORTED
---------------- --------------------------- -------------------------------
coco2b           cassette         (cass)     .wav  .cas  
                 printout         (prin)     .prn  
                 cartridge1       (cart1)    .ccc  .rom  
                 cartridge2       (cart2)    .ccc  .rom  
                 cartridge3       (cart3)    .ccc  .rom  
                 cartridge4       (cart4)    .ccc  .rom  
                 midiin           (min)      .mid  
                 midiout1         (mout1)    .mid  
                 midiout2         (mout2)    .mid  
                 cartridge5       (cart5)    .ccc  .rom  
                 floppydisk1      (flop1)    .dmk  .jvc  .dsk  .vdk  .sdf  .os9  .d77  .d88  .1dd  .dfi  .hfe  .imd  .ipf  .mfi  .mfm  .td0  .cqm  .cqi  
                 floppydisk2      (flop2)    .dmk  .jvc  .dsk  .vdk  .sdf  .os9  .d77  .d88  .1dd  .dfi  .hfe  .imd  .ipf  .mfi  .mfm  .td0  .cqm  .cqi  
                 harddisk1        (hard1)    .vhd  
                 harddisk2        (hard2)    .vhd  


</pre>
Note the avaiablilty of midiin, midiout1, and midiout2. Midiin is the media type used to send information to the CoCo. Midiout1 is the MIDI THRU port that automatically sends any incoming data out. Midiout2 is the regular MIDI OUT that is under software control in the emulation.
This is an example of sending MIDI input into the CoCo emulation:
<pre>
tlindner$ ./mame coco2b -ext multi -ext:multi:slot3 midi -midiin "IAC Driver Bus 1"
</pre>
Using CoCo software to do something with all this is left as an excessive to the reader.


            ]]>
        </content>
    </entry>
    <entry>
        <title>MC6839 ROM</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/mc6839-rom/"/>
        <id>https://tlindner.macmess.org/mc6839-rom/</id>

        <updated>2020-11-20T19:51:25-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I just retyped the manual. I created a page for it. See it here.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I just retyped the manual. I created a page for it. See it <a href="http://tlindner.macmess.org/?page_id=691">here</a>.
            ]]>
        </content>
    </entry>
    <entry>
        <title>2018 and 2019</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/2018-and-2019/"/>
        <id>https://tlindner.macmess.org/2018-and-2019/</id>

        <updated>2020-04-25T09:53:45-07:00</updated>
            <summary type="html">
                <![CDATA[
                    It may seem like nothing happened for these two years. You'd be right.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                It may seem like nothing happened for these two years. You'd be right.
            ]]>
        </content>
    </entry>
    <entry>
        <title>The 2017 Post</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/the-2017-post/"/>
        <id>https://tlindner.macmess.org/the-2017-post/</id>

        <updated>2018-01-06T09:54:38-08:00</updated>
            <summary type="html">
                <![CDATA[
                    It seems I'm only doing year end posts now. I'm not happy about this. If I wanted to do it more, I'd do it more. So let do it more! In April of 2017 I went to the CoCoFest in Chicago. I met with my&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                It seems I'm only doing year end posts now. I'm not happy about this. If I wanted to do it more, I'd do it more. So let do it more!
In April of 2017 I went to the CoCoFest in Chicago. I met with my many wonderful friends. Learned a lot of new things. One thing I did different this year is I got a late flight out Monday, around 5 PM. After checking out of the hotel I took a cab to downtown Chicago and spent some time sight-seeing. It was really fun and decided to do it again in 2018. Although in 2018 I think I'll head straight to a museum. Spend the whole day in there.
In early July I flew to Oregon and spent a week with my sister in Sun River. A lovely place to rent cabins and go to the nearby waterpark. We also went to an Observatory, where I saw the rings of Saturn for the first time. My Uncle Mel also joined us for the trip and he made the whole thing 200% more fun. The lava cast forrest also deserves a mention as a really neat place to visit.
In late July I had a week of hell, also known as the best week ever. On Thursday, July 26 I went into The City to watch a live Mystery Science Theatre 3000 show (Movie: Eegah). Then the next day I went back for a second show (Movie: Argoman the Fantastic Superman). Then the next day I went back for an OMD show. They played some fantastic new stuff from their recently released album. Then the next day I flew to Los Angeles and saw OMD again with 5 other 80s bands. Then the next day, Sunday, my daughter (Megan) and I went to Universal Studios. Whew!
In November the Wine Country Fires took my brother's home. He and his family then moved to Portland. Bummer for me, good for my sister.
In December I flew to England to spend time with my other daughter (Bethany). We made our way to Garmisch Germany. We stayed at a nice hotel, spa. Visited the Linderhoff Palace. And toured a microbrew; Griesbräu Zu Murnau. In German it was nicely covered in snow, very beautiful.
In late December my boss of many, many years decided to up and move to Oregon. And I also signed up for Tinder.

            ]]>
        </content>
    </entry>
    <entry>
        <title>A concert of a life time</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/a-concert-of-a-life-time/"/>
        <id>https://tlindner.macmess.org/a-concert-of-a-life-time/</id>

        <updated>2017-07-28T18:28:47-07:00</updated>
            <summary type="html">
                <![CDATA[
                    In July of 2017 I went to 80s Weekend concert in LA. I was 5 rows from the front, near the center. It was so amazing. I was able to see bands that I never thought I’d see. Here is the set list. The Fixx&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                In July of 2017 I went to 80s Weekend concert in LA. I was 5 rows from the front, near the center. It was so amazing. I was able to see bands that I never thought I’d see. Here is the set list. 

The Fixx
<blockquote>Red Skies
Second song
One Thing Leads to Another
Stand or Fall
Deeper and Deeper
Saved by Zero</blockquote>

Collin Hay (of Men at Work)
<blockquote>Come Tumblin' Down
It's a Mistake
Who Can It Be Now?
Overkill
Down Under
I'm Walking Here
Be Good Johnny</blockquote>

Berlin
<blockquote>Take My Breath Away
The Metro
No More Words
Sex...(I'm A)</blockquote>

The Psychedelic Furs
<blockquote>President Gas
Love My Way
Angels Don't Cry
The Ghost in You
Heartbeat
Heaven
Heartbreak Beat
Pretty in Pink</blockquote>

Belinda Carlisle
<blockquote>Mad About You
Head Over Heels
I Get Weak
Circle in the Sand
Leave a Light On
Our Lips Are Sealed
We Got the Beat
Heaven Is a Place on Earth</blockquote>

OMD
<blockquote>Enola Gay
Secret
Tesla Girls
History of Modern (Part 1)
If You Leave
(Forever) Live and Die
Joan of Arc
So in Love
Dreaming
Locomotion
Electricity</blockquote>
            ]]>
        </content>
    </entry>
    <entry>
        <title>No Secrets</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/questioning-what-i-am/"/>
        <id>https://tlindner.macmess.org/questioning-what-i-am/</id>

        <updated>2016-12-10T21:27:52-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Soon after my divorce, in 2011 I put together three possible plans on how I might continue with future relationships. In the middle of 2016 I decided I might try to implement Plan C. Since I've not written about my three post divorce plans I&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Soon after my divorce, in 2011 I put together three possible plans on how I might continue with future relationships. In the middle of 2016 I decided I might try to implement Plan C.

Since I've not written about my three post divorce plans I guess I should now:

Plan A: Stay single, travel internationally to everywhere I've ever wanted to go.
Plan B: Find a girlfriend my own age and travel domestically everywhere I've every wanted to go.
Plan C: Find a younger woman, fall in love, marry her, and have a second family.

Plan A includes things like Machu Picchu. Plan B is Grand Canyon kind of stuff. Plan C is different, very different. I consider Plan C to be very selfish. But here in 2016 I was thinking it was what I really wanted.

So what kind of woman should I be looking for? Well... a good mother obviously. But I consider my first wife a very good mother, so there had to be more to it than that. Jeanette never understood me or why I did the things I did. I desperately needed someone who could understand why I do what I do.

Then I thought of Didge. My Aunt Didge was a wonderful person. Kind, gentle, loving, empathetic, smart, and stern when she needed to be. She died of cancer way too young in life. Anyone who knew her would know exactly what I meant when I would say I wanted a woman like Didge.

I've actually met someone who was very Didge. Sharon Francis. She is married to Bill, a very good friend of mine, so she's off the market. My uncle Mel actually met Sharon at my daughter's wedding and independently said she reminded him of Didge. This gave me hope, if there was one woman like Didge, then I knew there were others.

It turned out I found one. I worked with one in fact. Wendy (names have been changed to protect the innocent). From what I could tell she was totally Didge. I really wanted to get to know her better. It took all my courage to tell her as much. She told me she had a serious boyfriend, and also didn't date co-workers (good plan). She was so gracious in the way she treated me. I knew I had found someone with so much Didge it made me hurt.

Between the time I expressed my feelings to when I learned she wasn't interested, I tend to go a bit mental. I imagine conversations Wendy and I might have. I believe this prepares me to handle interactions with people better. But in fact my imagined conversations are never even close to what really happens.

One of the internal conversations I had went like this.

Wendy, "Why did you get divorced?"
Me, "We just grew apart. Nothing like infidelity, or alcohol. The love just faded away"
Wendy, "Why did it fade away?"
Me, "Well... it started when Jeanette found out I was molested as a child."

Holy shit! Where did that come from? I had never thought that before.

Before this thought I always knew Jeanette just grew to dislike me over time because of who I am. She's just not compatible with an introvert like me and it took 18 years to finally tire of me. But come on, 18 years to figure out something like that? I was stretching that narrative a little thin.

So now I was thinking that a lie I told 26 years ago, while we were dating, was the germ that doomed my marriage. The discovery of that lie half way thru the marriage, allowed the distrust then hate to bloom. Resulting years later in a divorce. I was absolutely devastated. It <strong>was</strong> all my fault. Just like Jeanette has been telling me (and our common friends) these past five years of divorce.

I could not stop this thought, pushing it away made it come back harder. Thinking it made me cry. Trying to stop crying made me sob. I was a complete wreck.

We should talk about the lie. While I was dating Jeanette, she revealed to me that she was molested. A family friend had touched her. She told someone after it happened, police were called, courts were convened, sentences placed and restitution paid. All very traumatic she revealed, but I could't fully understand because I have never been molested.

But that wasn't true. When I was 4 or 5, I would go see my father while he slept in his bed on Sundays. Every other day of the week he would be up early and off to work. But Sundays were the day he slept in. I enjoyed spending time with him.

One Sunday he asked me to go get him a wad of toilet paper. I did as I was asked, and proceeded to watch him masturbate into it. I was tasked with throwing away the paper and that was it. This happened a few times, exactly the same. Then he asked me if I wanted to try it. So I grabbed his penis and stroked it until he ejaculated. I remember his semen dripping down my fingers. That also happened a few times. Then I stopped doing it. I would still go see him Sundays morning, but I wouldn't get the toilet paper anymore. I never told anyone.

I have always had these events in my memory. They were a part of me I didn't want. So whenever I began to think about them I would involuntary jerk my head to make them stop. Jeanette even asked about this tick early in our relationship. I lied saying I had no idea why it happened.

Fast forward to half-way through my marriage. Jeanette was heading out to work. Before she got into her car she decided to get the mail. I was standing in the stoop because I would be in charge of disposing of the junk mail. But this time I saw her opening up a letter. She said it was addresses to me from my sister. She started reading it aloud.

"Blah, blah, blah… I saw something disturbing between my daughter and my father last Christmas. Blah, blah, blah… becuase of much therapy I have remembered some horrible acts my father committed against me. Blah, blah, blah… because of his refusal to admit what he did, I am no longer associating with my father."

My wife really loved my father, and could not believe what she was reading. My father was always kind with my wife (very different from her own father). She was really getting angry with my sister for spreading such lies. And that is when, for the first time in my life, I told anyone the truth:

"I don't know what happened to AJ. I never saw anything. I was too young, maybe not even born. But I do know what happened to me."

Her jaw dropped. I knew I had to back this up a little, "My tick is me remembering and shaking off the memory."

"I can't process this right now". She got into the car and left for work. Apparently I didn't deserve any sympathy in that moment. And I don't blame her for that. We never spoke about it again. I believe she totally lost respect for me in that moment.

So now I believe I doomed my marriage because I couldn't confront the truth. She confronted a similar truth when it counted. But I was never strong enough, and thus not worthy of love or respect. Throughout our entire marriage, to end an argument she would state her desire for a divorce. It was very effective. I would shut up, feeling too hurt to continue. But one day she told me she had seen a lawyer. That was when I knew it was over.

I have finally realized how it began, what I didn't do about it, and what I've should have done. But it's too late. The marriage is gone, and I'm left here knowing I'm not the man I thought I was.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Obligatory 2016 post</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/obligatory-2016-post/"/>
        <id>https://tlindner.macmess.org/obligatory-2016-post/</id>

        <updated>2016-12-10T19:11:14-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Is it customary if you never do it? The year is almost over and I thought it was time to take a quick look back. This is the year I traveled. A lot. In April I went to the CoCoFest in Chicago. That was super&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Is it customary if you never do it?

The year is almost over and I thought it was time to take a quick look back. This is the year I traveled. A lot.

In April I went to the CoCoFest in Chicago. That was super fun and plan to do it again in 2017.

In June I went to South Korea to visit my daughter Bethany. I was out of the country for the first time ever on this trip and I made the most of it. And by most of it I mean spending a lot of time in an American hotel on an American Air Force base. Bethany had to work most day but we made the most of our time together. The last day I was there, I spent on my own in a real Korean airport hotel. Wonderful toilet.

In July I flew to Oregon to go family camping with my sister, and some of her friends. This year we went to Nehalem state beach. It was very beautify and serene overall a wonderful week off work. I really love my sister. 

Finally in November I flew to England to visit my daughter Bethany at her new base. We spent a night in Cambridge, then a night in London, then two nights in Dublin. So much fun, such beautiful places. I got to meet some of Beth's friends and over all had a great time.

The other great thing about 2016 is my other daughter, Megan, decided to move much closer to where I live. I get to see her more than twice weekly and it has been a blast.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Another New Article</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/another-new-article/"/>
        <id>https://tlindner.macmess.org/another-new-article/</id>

        <updated>2015-11-15T08:15:18-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I wrote an article about modifying Super Extended Color BASIC.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I wrote an <a href="http://tlindner.macmess.org/?page_id=573" title="article">article</a> about modifying Super Extended Color BASIC.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Fountain</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/fountain/"/>
        <id>https://tlindner.macmess.org/fountain/</id>

        <updated>2014-03-02T18:31:41-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I biked down to Santos Pacheco Fountain today. Before now I didn't know it existed. I normally just ride thru the park, eventually making a loop back to my home. But this time I heard something different. I looked into walking path and found a&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I biked down to Santos Pacheco Fountain today. Before now I didn't know it  existed. I normally just ride thru the park, eventually making a loop back to my home. But this time I heard something different. I looked into walking path and found a small fountain.
I noticed it this time because it was loud. I don't think they have ever turned it up this high before. The water made such a roar. Much too loud for it's size.
I sat down on the fountain bench and turned my back to it. I could see thru a double arch way into Todos Santos park. It was dusk and many families were packing up, getting ready to go home.
But every time I tried to think of something else, the rushing water always brought my attention back to it. All of a sudden instead of sitting on a concrete bench, I was sitting on a 200 ton granite boulder watching the water of Nevada Falls fall over it's lip. Crashing 600 feet below. I was 20 years younger, with my brother and sister. We were just part way thru the hike up to Half Dome. 
But now I am back in Concord. It's getting dark. Time to ride back.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Kubota</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/kubota/"/>
        <id>https://tlindner.macmess.org/kubota/</id>

        <updated>2013-04-28T08:14:54-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I was driving South on 680 yesterday and a flat bed trailer caught my eye. There was nothing special about it, except the color of the thing it was carrying. It was caring a tractor, an orange tractor, a Kubota orange tractor. Then a flood&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I was driving South on 680 yesterday and a flat bed trailer caught my eye. There was nothing special about it, except the color of the thing it was carrying. It was caring a tractor, an orange tractor, a Kubota orange tractor.

Then a flood of memories came to me.

While growing up, I lived on a small horse ranch. One day, my dad decided we needed a tractor. My whole life I've beed around tractors, so it was cool we were going to get one. I knew in my head what tractors looked like: they were green. They were made by John Deere. All tractors were like that.

But my dad brought home an orange tractor. What the hell is an orange tractor? Then it hit me. Anyone can make a tractor. Why couldn't the Japanesse make a tractor? What's so special about green, anyway?

It's fun to remember when your world gets tilted a little. It keeps me grounded. I'd like to think I spend all day tilting my world a little.

As a side note, it's a little surprising my brother and I aren't dead from all the times we abused that tractor. It had an articulated bucket on the front. I remember taking turns to riding it up and down. Damn that was fun.
            ]]>
        </content>
    </entry>
    <entry>
        <title>OMD in San Francisco, April 12, 2013</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/omd-in-san-francisco-april-12-2013/"/>
        <id>https://tlindner.macmess.org/omd-in-san-francisco-april-12-2013/</id>

        <updated>2013-04-13T13:54:10-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Last night I saw a concert performance of Orchestral Manoeuvres in the Dark. A week before, they release a new album: English Electric. I spent the week listening to it and enjoyed it very much. But I didn't get the feeling that the band took&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Last night I saw a concert performance of Orchestral Manoeuvres in the Dark. A week before, they release a new album: <i>English Electric</i>. I spent the week listening to it and enjoyed it very much.
But I didn't get the feeling that the band took too many risks while creating this new album. I like all the new songs, they reminded me of their past works. But I didn't see them taking any risks with the new material.
Then I heard the new songs live. I started appreciated them in a new light. <i>Metroland</i> turned from an OK new song (on the album) to a fantastic new song live.
I noticed the audience during the live performance would react differently to the old material and the new material. This is understandable. The old songs have built in emotion for each individual. But I noticed how songs from their previous album, <i>The History of Modern</i> were equally appreciated as the old material. I found that personally gratifying. I know this new album will have an equal place in this fan's appreciation of OMD. Hopefully other's appreciation as well.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Perfect POP3 Proxy</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/perfect-pop3-proxy/"/>
        <id>https://tlindner.macmess.org/perfect-pop3-proxy/</id>

        <updated>2012-10-06T20:20:19-07:00</updated>
            <summary type="html">
                <![CDATA[
                    My Linux server crashed recently. It happened when the electric company had a planned service day. I forgot to power down the machine and when I brought it back up the filesystem was toast. I decided to wipe it and start over. I wanted to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My Linux server crashed recently. It happened when the electric company had a planned service day. I forgot to power down the machine and when I brought it back up the filesystem was toast.

I decided to wipe it and start over. I wanted to try using the Netatalk packaged by the Debian project instead of the the hand build version I was running.

So after some fits and starts I finally have Debian 7 (Test) running with Netatalk serving my Time Machine shares.

But now it was time to install Popfile so I could filter and talk to the gmail servers.

The email client I use is MacSOUP. I love it. But it doesn't talk POP3S. So I need a proxy to get my email from Gmail. But the Debian Popfile package is currently unavaiable for 7.x (Test). So I went looking for an alternative POP proxy package.

I found Perdition. I tried and failed to configure it for my needs. Then I found Stunnel. This was much eiaser to set up. All was good.

But after a day of using it I decided that running Stunnel on my server was over kill. I should be able to run it on my client machine (Max OS X) as a user process. So I decided to set up Stunnel under Launch Agent.

On Mac OS X the Launch Agent service (part of launchd) is what you can use to start programs when a user logs in. So I downloaded the latest version of Stunnel (stunnel-4.53) configures and compiled it.

Then I took the exectuable and placed it in ~/bin. I created a .conf file, a .pem file and a .plist. I put them all in the right place and now I can get my email without my server running. This should encourage me to turn it off every now and then.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Rodney King</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/rodney-king/"/>
        <id>https://tlindner.macmess.org/rodney-king/</id>

        <updated>2012-06-17T09:20:28-07:00</updated>
            <summary type="html">
                <![CDATA[
                    A few days after the LA Riots, I was working the day shift at my father's gas station. It was the Mobil gas station on the Westley Exit on Interstate 5 in California. A little more than half way when driving from Los Angeles to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                A few days after the LA Riots, I was working the day shift at my father's gas station. It was the Mobil gas station on the Westley Exit on Interstate 5 in California. A little more than half way when driving from Los Angeles to San Fransico.
A man came in to pay for his gasoline purchase. He was about to turn around and leave, but something stopped him. Without any prompting from me, he announced he was a police officer in Los Angeles and he knew Rodney personally. He called Rodney an asshole and deserved what he got.
I learned a lot about racism that day.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Repurpose an amp</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/repurpose-an-amp/"/>
        <id>https://tlindner.macmess.org/repurpose-an-amp/</id>

        <updated>2012-03-02T22:09:12-08:00</updated>
            <summary type="html">
                <![CDATA[
                    About ten years ago I built an amplifier for my Kia Rio. I noticed it came with speakers even though I didn't buy a model with a radio. My amp was a simple circuit that came pre-assembled, required 12 volts and took the signal from&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                About ten years ago I built an <a href="http://tlindner.macmess.org/?p=40">amplifier</a> for my Kia Rio. I noticed it came with speakers even though I didn't buy a model with a radio. My amp was a simple circuit that came pre-assembled, required 12 volts and took the signal from my iPod and feed it to the speakers with 22 watts of power.

About two years ago I got rid of that car. But I kept the amp. Today in my new house I am using that amp to power my computer speakers. I am using a pair of Optimus Pro 74V (26-2048). They sound great and can get quite loud with my little amp.

When I first assembled the amp for home use I connected a 12 volt wall wart power suppily (273-1652D) directly to the circuit. But there was a 60hz hum. I though the DC power coming from the wall wart would be very clean, but I was wrong. I then feed the power thru the noise reducer I used while it was powered in the car. It took care of the noise very well.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Playboy</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/playboy/"/>
        <id>https://tlindner.macmess.org/playboy/</id>

        <updated>2012-02-17T15:25:20-08:00</updated>
            <summary type="html">
                <![CDATA[
                    "Playboy does hereby bestow this award upon Charles August Lindner III For his lifetime subscription to Playboy Magazine and his never-ending pursuit of life's pleasures. May he forever remain a connoisseur of beautiful women…and may he retain his lust for the good life for the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/145/IMG_3345_a.jpg"  sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/145/responsive/IMG_3345_a-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/145/responsive/IMG_3345_a-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/145/responsive/IMG_3345_a-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/145/responsive/IMG_3345_a-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/145/responsive/IMG_3345_a-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/145/responsive/IMG_3345_a-2xl.jpg 1920w"></figure>

"Playboy does hereby bestow this award upon Charles August Lindner III For his lifetime subscription to Playboy Magazine and his never-ending pursuit of life's pleasures. May he forever remain a connoisseur of beautiful women…and may he retain his lust for the good life for the rest of his years. From one Playboy to Another, Hugh M. Hefner"

Early in the 1960s my father invested $2000 with Hugh Hefner, in exchange he got a lifetime subscription to the Playboy Magazine and this plaque. He spent this money fresh out of college. Before he died I asked him why he did it. He said he could never justified it then or now, but did it anyway. He did say he never regretted the decision.


            ]]>
        </content>
    </entry>
    <entry>
        <title>Thayer&#x27;s Quest</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/thayers-quest/"/>
        <id>https://tlindner.macmess.org/thayers-quest/</id>

        <updated>2012-01-26T08:28:44-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I was going thru my stuff recently and found this: I remember these sheets sitting next to the arcade machine. See the Wikipedia article to learn more about the game.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I was going thru my stuff recently and found this:
<a href="http://tlindner.macmess.org/wp-content/uploads/2012/01/Thayers-Quest-Instruction-Sheet.jpg"><center><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/144/Thayers-Quest-Instruction-Sheet-228x300.jpg"  sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/144/responsive/Thayers-Quest-Instruction-Sheet-228x300-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/144/responsive/Thayers-Quest-Instruction-Sheet-228x300-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/144/responsive/Thayers-Quest-Instruction-Sheet-228x300-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/144/responsive/Thayers-Quest-Instruction-Sheet-228x300-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/144/responsive/Thayers-Quest-Instruction-Sheet-228x300-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/144/responsive/Thayers-Quest-Instruction-Sheet-228x300-2xl.jpg 1920w"></figure></center></a>
I remember these sheets sitting next to the arcade machine. See the <a href="http://en.wikipedia.org/wiki/Thayer's_Quest">Wikipedia</a> article to learn more about the game.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Learning to fly</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/learning-to-fly/"/>
        <id>https://tlindner.macmess.org/learning-to-fly/</id>

        <updated>2011-09-24T09:27:44-07:00</updated>
            <summary type="html">
                <![CDATA[
                    My brother just called. He tells me he is teaching his 6 year old daughter to fly. He wanted me to to tell her the technique. I said that flying was easy, you just have to throw yourself at the ground and miss. So now&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My brother just called. He tells me he is teaching his 6 year old daughter to fly. He wanted me to to tell her the technique. I said that flying was easy, you just have to throw yourself at the ground and miss.

So now my brother turns back to my niece and says, "He said the exact same thing I did, now all you have to do is practice." She giggled.

It was a nice moment. Thank you Douglas Adams.


            ]]>
        </content>
    </entry>
    <entry>
        <title>Streams</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/streams/"/>
        <id>https://tlindner.macmess.org/streams/</id>

        <updated>2011-08-10T08:39:37-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I've started to write code again. Since January I've been in one of my non-programming moods. Last December my wife and I had one of the best times together in our marriage, but it quickly devolved into our worst. I was feeling depressed and lost&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I've started to write code again. Since January I've been in one of my non-programming moods. Last December my wife and I had one of the best times together in our marriage, but it quickly devolved into our worst. I was feeling depressed and lost interest in most everything.

But recently I started watching the WWDC videos. I got the urge to rewrite my <em>Blocks</em> program. With <em>Blocks</em> I wanted to experiment with the manipulation data as expressed as named blocks. After working on it for a while I hit the stumbling block of not begining with an abstraction deep enough.

With <em>Streams</em>, I started over. I am starting with digital signal processing (another interest of mine). In the screen shot below you'll see an example on converting audio data into bytes the way the Color Computer does when reading a tape file.

<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/142/StreamsScreenShot_Aug10_2011.png" alt="Streams Screen Shot from August 10, 2011" title="Streams Screen Shot from August 10, 2011"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/142/responsive/StreamsScreenShot_Aug10_2011-xs.png 640w ,https://tlindner.macmess.org/media/posts/142/responsive/StreamsScreenShot_Aug10_2011-sm.png 768w ,https://tlindner.macmess.org/media/posts/142/responsive/StreamsScreenShot_Aug10_2011-md.png 1024w ,https://tlindner.macmess.org/media/posts/142/responsive/StreamsScreenShot_Aug10_2011-lg.png 1366w ,https://tlindner.macmess.org/media/posts/142/responsive/StreamsScreenShot_Aug10_2011-xl.png 1600w ,https://tlindner.macmess.org/media/posts/142/responsive/StreamsScreenShot_Aug10_2011-2xl.png 1920w"></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Erzsebet: The Blood Countess Opera</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/erzsebet-the-blood-countess-opera/"/>
        <id>https://tlindner.macmess.org/erzsebet-the-blood-countess-opera/</id>

        <updated>2011-03-28T09:01:53-07:00</updated>
            <summary type="html">
                <![CDATA[
                    My friend Dennis is running a Kickstarter project to stage an opera that is very important to him. I am supporting him and believe you should also. https://www.kickstarter.com/projects/bathory/erzsebet-the-bathory-opera-premiere
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My friend Dennis is running a Kickstarter project to stage an opera that is very important to him. I am supporting him and believe you should also.

<a href="https://www.kickstarter.com/projects/bathory/erzsebet-the-bathory-opera-premiere">https://www.kickstarter.com/projects/bathory/erzsebet-the-bathory-opera-premiere</a>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Coordinated CoCo Conference #3</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coordinated-coco-conference-3/"/>
        <id>https://tlindner.macmess.org/coordinated-coco-conference-3/</id>

        <updated>2011-01-06T23:05:47-08:00</updated>
            <summary type="html">
                <![CDATA[
                    It is time again for the Coordinated CoCo Conference! I'd really like to thank Aaron Wolfe who donates the bandwidth to run the conference: Thank-you! Any our special guest was Marty Goodman, we interview him for the whole hour. Here is a link to the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                It is time again for the Coordinated CoCo Conference!

I'd really like to thank Aaron Wolfe who donates the bandwidth to run the conference: Thank-you!

Any our special guest was Marty Goodman, we interview him for the whole hour. Here is a link to the <a href="http://macmess.org/downloads/Coordinated%20CoCo%20Conference%20%233.mp3">mp3</a>.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Coordinated CoCo Conference #2</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coordinated-coco-conference-2/"/>
        <id>https://tlindner.macmess.org/coordinated-coco-conference-2/</id>

        <updated>2010-12-02T18:47:40-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Me and about 10 of my closest friends conducted Coordinated CoCo Conference #2 on December 1st. We had a good talk about Steve Bjork's floppy disk controller he is working on. Plus many other topics. Here is a link to the mp3. I'd like to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Me and about 10 of my closest friends conducted Coordinated CoCo Conference #2 on December 1st. We had a good talk about Steve Bjork's floppy disk controller he is working on. Plus many other topics. Here is a link to the <a href="http://macmess.org/downloads/Coordinated%20CoCo%20Conference%20%232.mp3">mp3</a>.
I'd like to thank Aaron Wolfe for hosting the Skype call and helping organize the event.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Coordinated CoCo Conference #1</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coordinated-coco-conference-1/"/>
        <id>https://tlindner.macmess.org/coordinated-coco-conference-1/</id>

        <updated>2010-11-02T23:44:51-07:00</updated>
            <summary type="html">
                <![CDATA[
                    In late October of 2010 Aaron Wolfe, Todd Wallace and I decided to try to hold a monthly Color Computer Conference in the internet. We tested TalkShoe and Mumble as platforms to use, but decided to use Skype for the first conference. We announced the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                In late October of 2010 Aaron Wolfe, Todd Wallace and I decided to try to hold a monthly Color Computer Conference in the internet. We tested TalkShoe and Mumble as platforms to use, but decided to use Skype for the first conference.
We announced the first call would help held Tuesday, November 2, 2010.
I am very pleased with how the first conference turned out. I am posting the audio as an attachment to this post. Please enjoy: <a href='http://macmess.org/downloads/Coordinated%20CoCo%20Conference%20%231.mp3' >Coordinated CoCo Conference #1.mp3</a>.
The next conference will be held early in December.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Dating</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/dating/"/>
        <id>https://tlindner.macmess.org/dating/</id>

        <updated>2010-09-23T19:22:41-07:00</updated>
            <summary type="html">
                <![CDATA[
                    15 Year Old Daughter: “What's wrong with me dating an 18 year old?” Me: “Remember when I was teaching you how to drive? Before you pressed the break for the first time, I said, ‘Now press the break pedal gently.’ And the car immediately came&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                15 Year Old Daughter: “What's wrong with me dating an 18 year old?”

Me: “Remember when I was teaching you how to drive? Before you pressed the break for the first time, I said, ‘Now press the break pedal gently.’ And the car immediately came to a jarring halt. And you asked, ‘How come you didn't warn me that would happen?’ And I said, ‘There is no way I could have warned you what kind of pressure was needed to properly stop a car going 10 miles per hour. It's something you have to experience yourself.’

15 Year Old Daughter: “Yeah.”

Me: “That’s what it is going to feel like years from now when you look back at dating an 18 year old”.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Computer Archeology</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/computer-archeology/"/>
        <id>https://tlindner.macmess.org/computer-archeology/</id>

        <updated>2010-09-09T08:16:01-07:00</updated>
            <summary type="html">
                <![CDATA[
                    My friend Boisy recently brought to my attention a wonderful web site called Computer Archeology. Christopher Cantrell's site has many disassembles of old programs. But of particular note is the old Color Computer programs with very detailed comments. Go check it out.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My friend <a href="http://tee-boy.com/">Boisy</a> recently brought to my attention a wonderful web site called <a href="http://computerarcheology.com/">Computer Archeology</a>. Christopher Cantrell's site has many disassembles of old programs. But of particular note is the old Color Computer programs with very detailed comments. Go check it out.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Mac OS X core utility Find and Extended Attributes</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/mac-os-x-core-utility-find-and-extended-attributes/"/>
        <id>https://tlindner.macmess.org/mac-os-x-core-utility-find-and-extended-attributes/</id>

        <updated>2010-01-23T11:43:53-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I've been writing backup scripts recently. I really like rsync and have been using it with Mac OS X's smbfs quite successfully (under 10.5). But the other day I found some files that were created on the receiving file system but contained no data. I&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I've been writing backup scripts recently. I really like rsync and have been using it with Mac OS X's smbfs quite successfully (under 10.5). But the other day I found some files that were created on the receiving file system but contained no data.

I really wanted to know how pervasive this was so I asked <a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/find.1.html">find</a> to list the files that are zero bytes long. Needless to say I got a lot of false positives. It is not uncommon for the files I use to have zero bytes in the data fork. Usually these files will have some data in their resource fork. The find command only looks for data in the data fork. Files with zero bytes in both forks are rare and those are the files I needed to find.

I needed to change the behavior of find. Finding and compiling the source code for find was easy. My first thought was to add up all of the extended attributes each file has and use that as the total file size:
  <style type="text/css">
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px;}
    span.Apple-tab-span {white-space:pre}
  </style>
<code>
<p class="p1">75a76</p>
<p class="p1">&gt; #include &lt;sys/xattr.h&gt;</p>
<p class="p1">1428c1429,1453</p>
<p class="p1">&lt; <span class="Apple-tab-span">	</span>off_t size;</p>
<p class="p1">---</p>
<p class="p1">&gt; <span class="Apple-tab-span">	</span>off_t size, calc_size;</p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>ssize_t list_size;</p>
<p class="p1">&gt; <span class="Apple-converted-space">   </span></p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>calc_size = entry-&gt;fts_statp-&gt;st_size;</p>
<p class="p1">&gt; <span class="Apple-converted-space">   </span></p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>/* get list of extended attribute names */</p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>list_size = listxattr(entry-&gt;fts_path, NULL, 0, XATTR_NOFOLLOW);</p>
<p class="p1">&gt; <span class="Apple-converted-space">   </span></p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>if( list_size &gt; 0 )</p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>{</p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>char *namebuf, *current_name;</p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>namebuf = malloc( list_size );</p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>listxattr(entry-&gt;fts_path, namebuf, list_size, XATTR_NOFOLLOW);</p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>current_name = namebuf;</p>
<p class="p1">&gt;<span class="Apple-converted-space">       </span></p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>/* iterate over list of extended attribute names */</p>
<p class="p1">&gt;<span class="Apple-converted-space">       </span></p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>while( current_name &lt; namebuf+list_size )</p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>{</p>
<p class="p1">&gt;<span class="Apple-converted-space">          </span>calc_size += getxattr(entry-&gt;fts_path, current_name, NULL, 0, 0, XATTR_NOFOLLOW);</p>
<p class="p1">&gt;<span class="Apple-converted-space">          </span>current_name += strlen(current_name) + 1;</p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>}</p>
<p class="p1">&gt; <span class="Apple-converted-space">     </span></p>
<p class="p1">&gt; <span class="Apple-converted-space">      </span>free( namebuf );</p>
<p class="p1">&gt;<span class="Apple-converted-space">    </span>}</p>
<p class="p1">1430,1431c1455</p>
<p class="p1">&lt; <span class="Apple-tab-span">	</span>size = divsize ? (entry-&gt;fts_statp-&gt;st_size + FIND_SIZE - 1) /</p>
<p class="p1">&lt; <span class="Apple-tab-span">	</span><span class="Apple-converted-space">    </span>FIND_SIZE : entry-&gt;fts_statp-&gt;st_size;</p>
<p class="p1">---</p>
<p class="p1">&gt; <span class="Apple-tab-span">	</span>size = divsize ? (calc_size + FIND_SIZE - 1) / FIND_SIZE : calc_size;</p>
</code>

This worked well enough for my needs. Although it has some problems. The biggest one is that it doesn't produce files sizes that match the Finder's get info dialog box. It seems the Finder only adds the data fork with the resource fork. Where as the code above adds every available extended attribute. Common additional extended attributes include "com.apple.quarantine" and "com.apple.FinderInfo". 
            ]]>
        </content>
    </entry>
    <entry>
        <title>I’m with CoCo.</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/im-with-coco/"/>
        <id>https://tlindner.macmess.org/im-with-coco/</id>

        <updated>2010-01-19T18:27:21-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Yup.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Yup.

<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/134/Im-With-CoCo.jpg" alt="I&#039;m With CoCo" title="I&#039;m With CoCo" width="468" height="685"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/134/responsive/Im-With-CoCo-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/134/responsive/Im-With-CoCo-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/134/responsive/Im-With-CoCo-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/134/responsive/Im-With-CoCo-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/134/responsive/Im-With-CoCo-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/134/responsive/Im-With-CoCo-2xl.jpg 1920w"></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Second Blocks Movie</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/second-blocks-movie/"/>
        <id>https://tlindner.macmess.org/second-blocks-movie/</id>

        <updated>2009-08-21T22:19:59-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I also made a page here to document it's progress. Blocks Screen Cast B.mov
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I also made a page <a href="http://tlindner.macmess.org/?page_id=311">here</a> to document it's progress.

<a href="http://www.macmess.org/downloads/Blocks_Screen_Cast_B.mov">Blocks Screen Cast B.mov</a>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Blocks</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/blocks/"/>
        <id>https://tlindner.macmess.org/blocks/</id>

        <updated>2009-08-19T19:21:37-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I'd like to introduce you to Blocks. It's an application I've had in my mind for a very long time. At it's basic level it is about understanding data formats. Very geeky stuff. I finally have something to show, so I'd like to tease you&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I'd like to introduce you to Blocks. It's an application I've had in my mind for a very long time. At it's basic level it is about understanding data formats. Very geeky stuff.

I finally have something to show, so I'd like to tease you all with the folowing Quicktime screen cast:

<a href="http://www.macmess.org/downloads/Blocks_Screen_Cast_A.mov">http://www.macmess.org/downloads/Blocks_Screen_Cast_A.mov</a>

I plan on more screen casts so show more functionality. Please, let me know what you think.

<a href="http://tlindner.macmess.org/?p=56">Here</a> you find where I first write my thought down about all this. It's interesting how the idea has changed since then.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Reoccurring Apple PubSub requests in my Apache logs</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/reoccurring-apple-pubsub-requests-in-my-apache-logs/"/>
        <id>https://tlindner.macmess.org/reoccurring-apple-pubsub-requests-in-my-apache-logs/</id>

        <updated>2009-07-26T10:33:14-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Frequently in my web servers logs I would see a request for an RSS feed I have available from a "PubSub" user agent from my IP address. It bothered me because the feedreader I use doesn't use Apple's PubSub library to read feeds. So I&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Frequently in my web servers logs I would see a request for an RSS feed I have available from a "PubSub" user agent from my IP address. It bothered me because the feedreader I use doesn't use Apple's PubSub library to read feeds.

So I figured Safari was the cause. I had tested Safari's RSS support a long time ago, but didn't like it. I took a quick look and found Safari was subscribed to zero feeds. Hmm. After some web searching I discovered the pubsub command line app Apple provides to manage the resource.

I told it to list all the feeds it knows about and sure enough, there was the offending URL plus some others. I promptly deleted them from the list. I figured all was well. But after a few hours, I found new log entries for the for the same feed. I queried the PubSub command again and found all of the entries restored. I discovered Safari would restore the feeds every time it launched. Safari's GUI was no help. I looked everywhere for entries for the feeds and found nothing. So I started combing thru it's preference files.

I finally found the feeds listed in the "TopSites.plist" file. The GUI displaying the top site in Safari did not list these feeds. Strange.

I used the plist editor to delete the references to the feeds in the top sites preference file, and now Safari no long repopulates PubSub. Happy days indeed.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Today, all day</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/today-all-day/"/>
        <id>https://tlindner.macmess.org/today-all-day/</id>

        <updated>2009-07-21T08:57:50-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I'm checking out the world clock on my iPhone and saw this: It looks like the date shortening routine is a little too aggressive for this use.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I'm checking out the world clock on my iPhone and saw this:

<figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/130/photo.jpg" alt="iPhone World Clock" title="iPhone World Clock" width="320" height="480"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/130/responsive/photo-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/130/responsive/photo-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/130/responsive/photo-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/130/responsive/photo-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/130/responsive/photo-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/130/responsive/photo-2xl.jpg 1920w"></figure>

It looks like the date shortening routine is a little too aggressive for this use.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Rainbow Page Count</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/rainbow-page-count/"/>
        <id>https://tlindner.macmess.org/rainbow-page-count/</id>

        <updated>2009-07-18T16:21:53-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Here is a chart showing The Rainbow's page count over time:
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Here is a chart showing <a href="http://en.wikipedia.org/wiki/The_Rainbow_(magazine)">The Rainbow's</a> page count over time:

<figure class="post__image"><img loading="lazy" src="http://spreadsheets.google.com/pub?key=tXAoGO-1RBb2UKIz7aqP3uQ&oid=2&output=image"  data-is-external-image="true"></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>I&#x27;m 37. I&#x27;m not old.</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/im-37-im-not-old/"/>
        <id>https://tlindner.macmess.org/im-37-im-not-old/</id>

        <updated>2009-06-22T11:12:46-07:00</updated>
            <summary type="html">
                <![CDATA[
                    That line from Monty Python and the Holy Grail keeps going thru my mind. Mainly because I finally became 37 a few days ago. I've always hated people celebrating my birthday. I've never like to make a big deal about it. Fortunately my wife has&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                That line from Monty Python and the Holy Grail keeps going thru my mind. Mainly because I finally became 37 a few days ago. I've always hated people celebrating my birthday. I've never like to make a big deal about it. Fortunately my wife has finally understood this about me and had nothing planned.

<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/5Xd_zkMEgkI&hl=en&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/5Xd_zkMEgkI&hl=en&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Apple hates Color Computers</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/apple-hates-color-computers/"/>
        <id>https://tlindner.macmess.org/apple-hates-color-computers/</id>

        <updated>2009-03-26T17:53:30-07:00</updated>
            <summary type="html">
                <![CDATA[
                    A long time ago Apple Computer released an operating system called Mac OS9. Microware, the makers of OS-9, sued for trademark infringement and lost. I was quite surprised. It seemed like classic trademark dilution to me. Then a few years later Apple released Mac OS&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                A long time ago Apple Computer released an operating system called Mac OS9. Microware, the makers of OS-9, sued for trademark infringement and lost. I was quite surprised. It seemed like classic trademark dilution to me.
Then a few years later Apple released Mac OS X. In Mac OS X, they included an Application Framework called Cocoa. That's awfully close to the nick name of my favorite computer: The CoCo. Hmm, that's suspicious.
Now I learn Apple is creating a new JavaScript engine called Nitro. Very similar to the OS-9 retooling called NitrOS-9. Well, now I am calling it: Apple hates Color Computers!

            ]]>
        </content>
    </entry>
    <entry>
        <title>New Lost timeline</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/new-lost-timeline/"/>
        <id>https://tlindner.macmess.org/new-lost-timeline/</id>

        <updated>2009-03-21T11:47:22-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I hope this doesn't turn into a Lost blog, but I have got to get this off my chest. I really believe a new time time has been created by the Losties in the 70s. The Hyrda station has not been cleared of Dharma stuff.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I hope this doesn't turn into a <i>Lost</i> blog, but I have got to get this off my chest.
I really believe a new time time has been created by the Losties in the 70s.

The Hyrda station has not been cleared of Dharma stuff. The dock (where the submarine was blown up) seems still intact. The barracks were never de-Dharma-ified. The Dharma recruit photos were still on the wall in the orientation building.

It looks like to me that both Dharma and the Others (hostiles) were purged by something our Losties did in the 70s. It's like the purge in the 90s never happened. Or maybe, the rules were changed when Alex was killed, just like Ben said.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Unicode and the obsolesce of audio books</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/unicode-and-the-obsolesce-of-audio-books/"/>
        <id>https://tlindner.macmess.org/unicode-and-the-obsolesce-of-audio-books/</id>

        <updated>2009-03-15T09:37:57-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Wil Wheaton posted a wonderful example of how machine reading of text compares unfavorably to a real performance. He performed a small section of one of his stories and played it next to a standard machine reading. The difference was easy to understand. The human&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Wil Wheaton posted a wonderful example of how machine reading of text compares unfavorably to a real performance. He performed a small section of one of his stories and played it next to a standard machine reading. The difference was easy to understand. The human performance trounced the machine.

We know that that text to speech technology does not constitute creating a copy, thus cannot be considered a derived work under the copyright statute. Eventually technology will become good enough to replace the time consuming recording process a good audio book deserves.

For some books a machine reading will be sufficient. Automatic reading will improve over time and more and more books will become very listenable using the technology. But some works of art need to be performed. How will that be handled?

A while ago I was reading about Apple's text to speech engine and discovered that you can add codes to the text stream to modify the how the machine will read the data aloud. It would be safe to assume Microsoft's text to speech engine includes the same functionality. It would also be safe to assume the two implementations differ in the codes they use. Someone skilled in the arts could use these codes to start directing the text to speech engine, thus creating a true performance. This would never happen in a world with multiple standards.

I propose to assign a Unicode code page to create a similar set of codes that all text to speech system could understand. When a text document is sold to a customer, the codes could be included in the text stream, but made invisible by the Unicode standard. Or they could be sold separately. This will allow reading and listening to the same file.

Authors to not have the right to be paid extra for reading aloud of their text. If automatic text to speech is good enough for you then the authors will not have an opportunity to sell you an additional copy of their work. But using this scheme, authors could go the extra distance to add value to their text and then deserve the extra money.
            ]]>
        </content>
    </entry>
    <entry>
        <title>I wouldn’t be too sure about that</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/i-wouldnt-be-too-sure-about-that/"/>
        <id>https://tlindner.macmess.org/i-wouldnt-be-too-sure-about-that/</id>

        <updated>2009-01-31T20:44:10-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I've always believed Claire (a character in Lost) died in the destruction of her house by the rocket attack in the episode The Shape of Things to Come. But we also saw her stumbling our of the wreckage, seemingly unharmed. I just re-watched a clip&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I've always believed Claire (a character in <i>Lost</i>) died in the destruction of her house by the rocket attack in the episode <i>The Shape of Things to Come</i>. But we also saw her stumbling our of the wreckage, seemingly unharmed. I just re-watched a clip from that show and a little later in the episode we see this exchange:

John Locke: "Clare?"
Sawyer: "You alright, sweetheart?"
Claire: "Yeah. A bit wobbly, but I’ll live."
Miles: "I wouldn’t be too sure about that."

As we all know Miles has a keen sense about dead people. It's this type of foreshadowing that makes me such a fan of the show. But it could also be seen as the opposite of foreshadowing. Mile is telling Claire that her situation is more dire than the others.




            ]]>
        </content>
    </entry>
    <entry>
        <title>New kind of migraine</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/new-kind-of-migraine/"/>
        <id>https://tlindner.macmess.org/new-kind-of-migraine/</id>

        <updated>2008-12-27T09:39:14-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Christmas morning in San Jose was especially clear due to the high winds. It's during times like that I know not to go outside. Bright sunny mornings always give me migraine headaches. Of course having sunglasses helps greatly, but I forgot my pair. I should&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Christmas morning in San Jose was especially clear due to the high winds. It's during times like that I know not to go outside. Bright sunny mornings always give me migraine headaches. Of course having sunglasses helps greatly, but I forgot my pair. I should have acquired some new sunglasses, but most places were closed and I thought I'd just chance the consequences.

I was exposed to the sun two times. First for fifteen minutes loading the car with gifts. Second for a 20 minute drive to our cousins house. We were spending the whole day there for a really fun party. A really loud, fun party. The noise was getting to me and I first noticed the migraine an hour and a half into the party. The pain was annoying but didn't get debilitating. An hour later there was something new.

Most of my life my secondary migraine symptom was static vision. Imaging a spot, near the center of your vision, of static. The kind of static you see on a TV channel where no one is broadcasting. This spot would get larger and larger until half my vision was gone. The head pain would get worse and worse and after a while I would vomit. After that I'd be functional within the hour with several day of lingering pain. As I got older the visual static would become less and less and the migraine pain would hurt less and less. Now my migraines almost never contain any visual symptoms or debilitating pain.

On christmas day, after my head started hurting, I started hearing an echo. At first I thought it was the house I was in. But I had been there may times before and there was nothing new that would have created an echo. But then I remember some sufferers experience auditory problems. I think that is what was happening to me.

The echo is really weird. It's like hearing everything three times. First in the center of your head, like normal. Then again in your left ear, with a little flange applied, and again in your right ear with a little less flange.

This lasted christmas day and all day Friday. Today, Saturday, it's finally gone. But my head still hurts but that is usually the way it works.

I must remember not to forget my sunglasses.


            ]]>
        </content>
    </entry>
    <entry>
        <title>Post CoCo Era</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/post-coco-era/"/>
        <id>https://tlindner.macmess.org/post-coco-era/</id>

        <updated>2008-12-06T17:04:01-08:00</updated>
            <summary type="html">
                <![CDATA[
                    The other day my friend Joe and I were comparing computer notes, and I came up with the following list: 1989 - Macintosh IIcx (16 MHz 68030) 1992 - PowerBook 100 (16 MHz 68HC000) 1997 - Power Macintosh 7300/200 (200 MHz 604e) 2002 - Power&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The other day my friend Joe and I were comparing computer notes, and I came up with the following list:

1989 - Macintosh IIcx (16 MHz 68030)
1992 - PowerBook 100 (16 MHz 68HC000)
1997 - Power Macintosh 7300/200 (200 MHz 604e)
2002 - Power Mac G4 (933 MHz G4)

I'm due for a new computer. I'm leaning toward a new (Intel) iMac. I'm having a hard time justifying a Mac Pro for my needs.
            ]]>
        </content>
    </entry>
    <entry>
        <title>CoCo and Single Density Disks</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/coco-and-single-density-disks/"/>
        <id>https://tlindner.macmess.org/coco-and-single-density-disks/</id>

        <updated>2008-11-23T16:16:26-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I just wrote a page about a single density disk project I completed last year. See it here.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I just wrote a page about a single density disk project I completed last year. See it <a href="http://tlindner.macmess.org/?page_id=250">here</a>.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Pipe wrench fight!</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/pipe-wrench-fight/"/>
        <id>https://tlindner.macmess.org/pipe-wrench-fight/</id>

        <updated>2008-11-15T08:45:12-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Take on Me: Literal Video Version - watch more funny videos
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <object width="480" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="ordie_player_e062d7b4d5"><param name="movie" value="http://player.ordienetworks.com/flash/fodplayer.swf" /><param name="flashvars" value="key=e062d7b4d5" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always"></param><embed width="480" height="400" flashvars="key=e062d7b4d5" allowfullscreen="true" allowscriptaccess="always" quality="high" src="http://player.ordienetworks.com/flash/fodplayer.swf" name="ordie_player_e062d7b4d5" type="application/x-shockwave-flash"></embed></object><div style="width: 480px; margin-top: 0; font-size: x-small" class="align-left"><a href="http://www.funnyordie.com/videos/e062d7b4d5/take-on-me-literal-video-version-from-dustfilms" title="from DustFilms">Take on Me: Literal Video Version</a> - watch more <a href="http://www.funnyordie.com/" title="on Funny or Die">funny videos</a></div>
            ]]>
        </content>
    </entry>
    <entry>
        <title>This is me sharing</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/this-is-me-sharing/"/>
        <id>https://tlindner.macmess.org/this-is-me-sharing/</id>

        <updated>2008-11-05T19:43:33-08:00</updated>
            <summary type="html">
                <![CDATA[
                    At the begining of 2008 I decided to grow my beard. If fact I decided not to cut any of my hair. Two weeks ago I cut my beard off and last week I finally got a hair cut. I asked around to see if&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                At the begining of 2008 I decided to grow my beard. If fact I decided not to cut any of my hair. Two weeks ago I cut my beard off and last week I finally got a hair cut. I asked around to see if anyone had a picture and my friend Chris took one last July. I ended up much more hairy than this.<figure class="post__image"><a href="http://tlindner.macmess.org/wp-content/uploads/2008/11/photo.jpg"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/119/photo-225x300.jpg" alt="Mountian man tim" title="Ruff" width="225" height="300"  sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/119/responsive/photo-225x300-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/119/responsive/photo-225x300-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/119/responsive/photo-225x300-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/119/responsive/photo-225x300-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/119/responsive/photo-225x300-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/119/responsive/photo-225x300-2xl.jpg 1920w"></a><figcaption>Mountian man tim</figcaption></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Pre with line breaks</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/pre-with-line-breaks/"/>
        <id>https://tlindner.macmess.org/pre-with-line-breaks/</id>

        <updated>2008-11-01T14:06:33-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I know I am going to forget this. So I am going to write a post about this and I am hoping this process will help me remember this information. Recently I needed to add some content to a wiki, but I didn't want to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I know I am going to forget this. So I am going to write a post about this and I am hoping this process will help me remember this information.

Recently I needed to add some content to a wiki, but I didn't want to pre-parse the data to escape any wiki or html formatting. What I wanted was the pre tag. But the pre tag will not line break the content to fit on the page. I need a pre tag <b>with</b> line breaks. Here is the standards based  way to do this:

&lt;pre style="white-space: pre-wrap;"&gt;


            ]]>
        </content>
    </entry>
    <entry>
        <title>My sister has a tatoo</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/my-sister-has-a-tatoo/"/>
        <id>https://tlindner.macmess.org/my-sister-has-a-tatoo/</id>

        <updated>2008-10-21T20:57:07-07:00</updated>
            <summary type="html">
                <![CDATA[
                    My sister decided to add a picture of her tatoo to her email signature: I'll ignore how this increases the minimum size of her emails. Adding this to my blog means I am committing copyright infringement. Maybe she’ll sue me. *grin*
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My sister decided to add a picture of her tatoo to her email signature:

<figure class="post__image post__image--left"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/116/lloyd-small.jpg" alt="" title="lloyd-small"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/116/responsive/lloyd-small-xs.jpg 640w ,https://tlindner.macmess.org/media/posts/116/responsive/lloyd-small-sm.jpg 768w ,https://tlindner.macmess.org/media/posts/116/responsive/lloyd-small-md.jpg 1024w ,https://tlindner.macmess.org/media/posts/116/responsive/lloyd-small-lg.jpg 1366w ,https://tlindner.macmess.org/media/posts/116/responsive/lloyd-small-xl.jpg 1600w ,https://tlindner.macmess.org/media/posts/116/responsive/lloyd-small-2xl.jpg 1920w"></figure>I'll ignore how this increases the minimum size of her emails. Adding this to my blog means I am committing copyright infringement. Maybe she’ll sue me. *grin*
            ]]>
        </content>
    </entry>
    <entry>
        <title>Mini Movie Review</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/mini-movie-review/"/>
        <id>https://tlindner.macmess.org/mini-movie-review/</id>

        <updated>2008-10-13T20:27:05-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Nick & Norah’s Infinite Playlist If there was an award for most considerate depiction of third base, this movie would get it. I don’t care if Michael Cera plays the same character in every movie, I can't get enough of him.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Nick & Norah’s Infinite Playlist

If there was an award for most considerate depiction of third base, this movie would get it.

I don’t care if Michael Cera plays the same character in every movie, I can't get enough of him.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Maybe funny</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/maybe-funny/"/>
        <id>https://tlindner.macmess.org/maybe-funny/</id>

        <updated>2008-09-21T22:50:40-07:00</updated>
            <summary type="html">
                <![CDATA[
                    spoon, spooning. fork, forking. knife, knifing. Hmmmm…
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                spoon, spooning.
fork, forking.
knife, knifing.


Hmmmm…
            ]]>
        </content>
    </entry>
    <entry>
        <title>Dear Apple, Inc.:</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/dear-apple-inc/"/>
        <id>https://tlindner.macmess.org/dear-apple-inc/</id>

        <updated>2008-09-13T17:10:28-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Rejecting an iPhone/iPod Touch application because it will compete with iTunes is not a good enough reason to reject it. I completely agree with Paul Kafasis.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Rejecting an iPhone/iPod Touch application because it will compete with iTunes is <b>not</b> a good enough reason to reject it.

I completely agree with <a href="http://blogs.oreilly.com/iphone/2008/09/a-bridge-too-far.html">Paul Kafasis</a>.


            ]]>
        </content>
    </entry>
    <entry>
        <title>A Palin I Would Vote For</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/a-palin-i-would-vote-for/"/>
        <id>https://tlindner.macmess.org/a-palin-i-would-vote-for/</id>

        <updated>2008-09-13T13:08:29-07:00</updated>
            <summary></summary>
        <content type="html">
            <![CDATA[
                <object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/jf1y9s73Nos&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/jf1y9s73Nos&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Writing Web Applications</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/writing-web-applications/"/>
        <id>https://tlindner.macmess.org/writing-web-applications/</id>

        <updated>2008-09-07T10:42:31-07:00</updated>
            <summary type="html">
                <![CDATA[
                    The last few weeks I've been writing a web application. My first. I used perl for the back-end, and HTML and Javascript for the front-end. It is far enough along that I announced it to the community it is aimed at. http://cocomag.dyndns.org/UnderColor.shtml I'd like to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The last few weeks I've been writing a web application. My first.
I used perl for the back-end, and HTML and Javascript for the front-end. It is far enough along that I announced it to the community it is aimed at.
<blockquote><a href="http://cocomag.dyndns.org/UnderColor.shtml">http://cocomag.dyndns.org/UnderColor.shtml</a></blockquote>
I'd like to thank Robert Gault, Joel Ewy, and Darren A. for wonderful feature suggestions and bug reports.
My biggest mistake so far was not doing enough testing when I moved the app from the development machine (Max OS X) to the deployment machine (Debian). I had it in my mind to do the testing, but when everything was working so wonderfully on my development machine I decided just to release without testing everything. This caused a 12 hour period where the site was up and down and things did not look so good. But I got thru it.
Finding little differences between Linux and Mac was an interesting problem. Opendir/readdir on the Mac will return alphabetically sorted entries, on Linux it won't. There was also a weird problem with a system() call. When calling ImageMagick's convert program I would pass computed cropping and resizing like this:
<blockquote><code>'-crop', $width."x".$height."+".$left."+".$top, '-resize','540x700'</code></blockquote>
On Mac this would produce the a correctly cropped and scaled image, maintaining the proper aspect ratio. But on Linux the image would be stretched to exactly 540 pixels by 700 pixels. The fix was to do this instead (this works on both Mac and Linux):
<blockquote><code>'-crop', $width.'x'.$height.'+'.$left.'+'.$top, '-resize','540x700'</code></blockquote>
I really can't explain why one would work and the other wouldn't.

Update: I published this entry on September 7, 2008 10:42 AM, and Google did it's first read of my project at: September 7, 2008 11:10 AM. Neat.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Packages of Two</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/packages-of-two/"/>
        <id>https://tlindner.macmess.org/packages-of-two/</id>

        <updated>2008-09-01T10:19:06-07:00</updated>
            <summary type="html">
                <![CDATA[
                    The other day, my 10-year-old daughter comes into our bedroom and asks, "Can I have a Poptart™?" My wife and I have the exact same response, though she said it first, "You can have one." This sends Megan into a fit. She wants two! Our&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The other day, my 10-year-old daughter comes into our bedroom and asks, "Can I have a Poptart™?"
My wife and I have the exact same response, though she said it first, "You can have one."
This sends Megan into a fit. She wants two! Our thinking is this: Poptarts™ come in packages of two, she'll cook two, she'll be full after eating one, the other will be wasted. Just as my wife starts yelling back at her to calm down and use her "Quiet Voice", something unusual happens to me. I become calm and I know exactly what to say.
"Megan, cook only one, and we'll see how you feel afterword about the other one."
Megan calms down, says, "OK."
Just as she turns around I say, "And put the other Poptart™ in a bag."
Mentioning the bag after she agreed to eat only one was important. She already accepted the deal, so the bag didn't affect her attitude.
And this is why I'm eating the last tasty Poptart™ in the house right now.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Venture Bros.: The Family That Slays Together, Stays Together</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/venture-bros-the-family-that-slays-together-stays-together/"/>
        <id>https://tlindner.macmess.org/venture-bros-the-family-that-slays-together-stays-together/</id>

        <updated>2008-08-19T09:47:22-07:00</updated>
            <summary type="html">
                <![CDATA[
                    When this episode was shown on TV (and also on Adult Swim's web site) the name of the motel was obscured. For the life of me, I can't figure out why. But I just noticed the version posted to iTunes was clear as a bell.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                When <a href="http://mantiseye.com/?ep38">this</a> episode was shown on TV (and also on Adult Swim's web site) the name of the motel was obscured. For the life of me, I can't figure out why. But I just noticed the version posted to iTunes was clear as a bell.

<a href="http://tlindner.macmess.org/wp-content/uploads/2008/08/picture-2.png"><figure class="post__image"><img loading="lazy" src="https://tlindner.macmess.org/media/posts/110/picture-2-300x169.png" alt="" title="Tiki-Taki Motel" width="300" height="169"   sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://tlindner.macmess.org/media/posts/110/responsive/picture-2-300x169-xs.png 640w ,https://tlindner.macmess.org/media/posts/110/responsive/picture-2-300x169-sm.png 768w ,https://tlindner.macmess.org/media/posts/110/responsive/picture-2-300x169-md.png 1024w ,https://tlindner.macmess.org/media/posts/110/responsive/picture-2-300x169-lg.png 1366w ,https://tlindner.macmess.org/media/posts/110/responsive/picture-2-300x169-xl.png 1600w ,https://tlindner.macmess.org/media/posts/110/responsive/picture-2-300x169-2xl.png 1920w"></figure></a>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Brick</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/brick/"/>
        <id>https://tlindner.macmess.org/brick/</id>

        <updated>2008-08-13T11:53:17-07:00</updated>
            <summary type="html">
                <![CDATA[
                    On the last episode of The Totally Rad Show Dan Trachtenberg mentioned that Brick was a good movie and everyone should see it. His movie recommendations have always been good, so I decided to watch it. Thanks to my local video store I did just&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                On the last episode of <a href="http://www.totallyradshow.com/">The Totally Rad Show</a> Dan Trachtenberg mentioned that <em><a href="http://www.imdb.com/title/tt0393109/">Brick</a></em> was a good movie and everyone should see it. His movie recommendations have always been good, so I decided to watch it. Thanks to my local video store I did just that a few days ago.

He mentioned it's style was film noir, but with a twist. I enjoyed it a lot. As usual these days, it took me two viewings to fully understand the movie.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Copy and Paste on the iPhone</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/copy-and-paste-on-the-iphone/"/>
        <id>https://tlindner.macmess.org/copy-and-paste-on-the-iphone/</id>

        <updated>2008-07-22T10:29:42-07:00</updated>
            <summary type="html">
                <![CDATA[
                    My guess as to why there is no Copy/Paste on the iPhone is because there is a software patent in the way. Steve Jobs prolly has a certain way he wants it implemented, and there is some patent stopping him from releasing it. Apple is&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My guess as to why there is no Copy/Paste on the iPhone is because there is a software patent in the way. Steve Jobs prolly has a certain way he wants it implemented, and there is some patent stopping him from releasing it.
Apple is most likely negotiating right now with the patent holder or looking for prior art.
I have no evidence to back any of this up.
            ]]>
        </content>
    </entry>
    <entry>
        <title>MacSOUP and Time Machine</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/macsoup-and-time-machine/"/>
        <id>https://tlindner.macmess.org/macsoup-and-time-machine/</id>

        <updated>2008-06-28T11:59:04-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Time Machine is Mac OS X's backup solution. It supports incremental backups. Which is really the way to go. But I avoided it because of the email program I use: MacSOUP. Like most email programs it keeps individual messages in large files. I currently have&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Time Machine is Mac OS X's backup solution. It supports incremental backups. Which is really the way to go. But I avoided it because of the email program I use: <a href="http://home.snafu.de/stk/macsoup/">MacSOUP</a>. Like most email programs it keeps individual messages in large files. I currently have 2.3 gigabytes of email. The actual implementation MacSOUP uses is to have a file for each mailbox.

My largest mailbox is 600 megabytes. The file grows every time I get email, dozens of times per day. This will cause a problems for me because my backup hard drive is the same size as my main drive. This means the drive will fill up very fast and I will have few incremental snap shots to choose from.

Apple got around this problem for Mail.app by keeping email messages in their own separate files. So Time Machine's file based incremental backup fits nicely with that scheme.

I recently learned about the new bundle version of Apple's sparse disk image format. Using this image format can really help keep Time Machine incremental backups from filling up the back up hard drive.

First some definitions. A disk image is a file on your computer that you can mount as a hard drive. It is becoming very common for software to be released on disk images. Like real hard drives, disk images have a maximum amount of data they can hold. A sparse disk image keeps the image file small and it will grow as you increase the amount data stored on the image. A sparse disk image bundle uses many 8 megabyte files to contain the image data. The small files are created as needed and writes to the disk image only modify the individual files that have changes.

This fits very nicely with Time Machine. MacSOUP can use it's large files to store email and Time Machine has it's small files for incremental backup.

<a href="http://db.tidbits.com/article/9673">Tidbits</a> has a nice tutorial on how to create these sparse disk image bundles.

After copying all of my MacSOUP data to the mounted disk image, I made an alias of the MacSOUP settings file. The alias file resides in my documents folder. I then added that alias to my dock. When I click the alias, the system is smart enough to mount the disk image if needed and then open the file which starts MacSOUP.

            ]]>
        </content>
    </entry>
    <entry>
        <title>Venture Bros: Invisible Hand of Fate</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/venture-bros-invisible-hand-of-fait/"/>
        <id>https://tlindner.macmess.org/venture-bros-invisible-hand-of-fait/</id>

        <updated>2008-06-16T20:35:26-07:00</updated>
            <summary type="html">
                <![CDATA[
                    How did Billy go from being handcuffed on the bench to the inside a Brock's duffle bag?
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                How did Billy go from being handcuffed on the bench to the inside a Brock's duffle bag?
            ]]>
        </content>
    </entry>
    <entry>
        <title>a1 a1 fb</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/a1-a1-fb/"/>
        <id>https://tlindner.macmess.org/a1-a1-fb/</id>

        <updated>2008-06-07T13:16:41-07:00</updated>
            <summary type="html">
                <![CDATA[
                    To no one's surprise, I look at my search referrers quite often. Just now I saw someone search for "a1 a1 fb" and actually click on one of the pages I've written on the subject. I thought this was interesting. I'll leave the meaning of&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                To no one's surprise, I look at my search referrers quite often. Just now I saw someone search for "a1 a1 fb" and actually click on one of the pages I've written on the subject.

I thought this was interesting. I'll leave the meaning of "a1 a1 fb" undisclosed at this point in time. But it is pretty arcane. Whoever searched on this, I applaud you!
            ]]>
        </content>
    </entry>
    <entry>
        <title>New FavIcon at Google</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/new-favicon-at-google/"/>
        <id>https://tlindner.macmess.org/new-favicon-at-google/</id>

        <updated>2008-05-30T12:10:37-07:00</updated>
            <summary type="html">
                <![CDATA[
                    The new icon is 1150 bytes while the old one was 1406 bytes. That is quite a bit smaller. Should reduce the load on Google's servers considerably.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The new icon is 1150 bytes while the old one was 1406 bytes. That is quite a bit smaller. Should reduce the load on Google's servers considerably.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Filters everywhere</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/filters-everywhere/"/>
        <id>https://tlindner.macmess.org/filters-everywhere/</id>

        <updated>2008-05-07T09:22:41-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Finally a clear article describing what NBC wants from Apple: Microsoft May Build A Copyright Cop Into Every Zune I really like the last bit: Mr. Perrette said NBC understands the potential resistance. “In the short term, this will not win us a lot of&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Finally a clear article describing what NBC wants from Apple:


<a href="http://bits.blogs.nytimes.com/2008/05/07/microsoft-may-build-a-copyright-cop-into-every-zune/">Microsoft May Build A Copyright Cop Into Every Zune</a><br><br>I really like the last bit:<blockquote>
Mr. Perrette said NBC understands the potential resistance. “In the short term, this will not win us a lot of friends,” he said. “In the long term, the consumer wants there to be quality premium-produced content, and in order for that to continue to be a viable business, there needs to be significant protection around it.”</blockquote>
I have some advice for NBC to ensure their success:

1. Stop giving away their content for free (Over the air).
2. Screw their customers (Filters everywhere).
3. Profit.


            ]]>
        </content>
    </entry>
    <entry>
        <title>Chain Of Trust</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/chain-of-trust/"/>
        <id>https://tlindner.macmess.org/chain-of-trust/</id>

        <updated>2008-04-19T08:23:12-07:00</updated>
            <summary type="html">
                <![CDATA[
                    The newest scam in the certificate business is EV SSL (Extended Validation Secure Sockets Layer) certificates. If you pay more money, then you get a more "secure" certificate. But the reality is the certificate is no more secure then any other. All you get is&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                The newest scam in the certificate business is EV SSL (Extended Validation Secure Sockets Layer) certificates. If you pay more money, then you get a more "secure" certificate.

But the reality is the certificate is no more secure then any other. All you get is a green tinted tool bar in the web browser. You only get this green tinted tool bar if your browser publisher decides to implement this feature.

This is completely backwards.

The contents of an SSL certificate is really important, it <strong>needs</strong> to be presented to the user. All web browsers I have used have given the option for the user to view the certificate and this is good. But we need more. I think the chain of trust should be displayed above the web page every time a certificate is accepted by the browser. This  section should not be removable or modifiable. No more "trusting" https. No need to buy overpriced certificates.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Home Videos</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/home-videos/"/>
        <id>https://tlindner.macmess.org/home-videos/</id>

        <updated>2008-04-07T15:47:19-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Here are some videos of my children: First At Bat Escaping And something different: Hilarious Muppets Bloopers!
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Here are some videos of my children:

<a href="http://www.youtube.com/watch?v=NgVdrqaRUHI">First At Bat</a>
<a href="http://www.youtube.com/watch?v=kqfwFpCHYEY">Escaping</a>

And something different:

<a href="http://www.youtube.com/watch?v=3KANI2dpXLw">Hilarious Muppets Bloopers!</a>


            ]]>
        </content>
    </entry>
    <entry>
        <title>Lucky Charms</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/lucky-charms/"/>
        <id>https://tlindner.macmess.org/lucky-charms/</id>

        <updated>2008-03-25T22:19:51-07:00</updated>
            <summary type="html">
                <![CDATA[
                    It all went downhill after the purple horseshoes.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                It all went downhill after the purple horseshoes.
            ]]>
        </content>
    </entry>
    <entry>
        <title>URL shortening services are a scourge on the web</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/url-shortening-services-are-a-scourge-on-the-web/"/>
        <id>https://tlindner.macmess.org/url-shortening-services-are-a-scourge-on-the-web/</id>

        <updated>2008-03-25T12:46:38-07:00</updated>
            <summary type="html">
                <![CDATA[
                    I don't understand the need for services such as tinyurl and others like them. They obfuscate links. I pretty much refuse to use them, either as a consumer or a producer. They seems to have been started because emailing links to web pages caused a&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I don't understand the need for services such as <em>tinyurl</em> and others like them. They obfuscate links. I pretty much refuse to use them, either as a consumer or a producer.

They seems to have been started because emailing links to web pages caused a lot of problems. Many email programs will insert line breaks on long lines of text. This will usually corrupt the URL.

But they are completely unnecessary in modern email clients. Now I see some forum moderators are demanding URLs to be shortened when posting content. Again, completely unnecessary because most forum software include tags to allow the naming of URLs.
            ]]>
        </content>
    </entry>
    <entry>
        <title>MacBook Air</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/macbook-air/"/>
        <id>https://tlindner.macmess.org/macbook-air/</id>

        <updated>2008-02-22T12:38:27-08:00</updated>
            <summary type="html">
                <![CDATA[
                    On the CoCoaDev mailing list it was revealed that the MacBook Air's operating system has it's symbols stripped. That is an interesting step to take. I can only assume it is because of the small(-sh) hard drive that the machine comes with.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                On the CoCoaDev mailing list it was revealed that the MacBook Air's operating system has it's symbols stripped. That is an interesting step to take. I can only assume it is because of the small(-sh) hard drive that the machine comes with.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Flash on the iPhone</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/flash-on-the-iphone/"/>
        <id>https://tlindner.macmess.org/flash-on-the-iphone/</id>

        <updated>2008-02-14T15:26:27-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Like PDF on Mac OS X, if there is flash on the iPhone it'll be Apple's own implementation. There are just too many memories of the way Adobe treated NeXT regarding Display Postscript.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Like PDF on Mac OS X, if there is flash on the iPhone it'll be Apple's own implementation. There are just too many memories of the way Adobe treated NeXT regarding Display Postscript.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Heck of a cold.</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/heck-of-a-cold/"/>
        <id>https://tlindner.macmess.org/heck-of-a-cold/</id>

        <updated>2008-02-10T14:07:59-08:00</updated>
            <summary type="html">
                <![CDATA[
                    For the last half week I've been under the weather. So to speak. My daughter brought home a cold and I got it bad. Just today, I am starting to feel good again. I'm sure my co-workers will appreciate that on Monday.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                For the last half week I've been under the weather. So to speak. My daughter brought home a cold and I got it bad.
Just today, I am starting to feel good again. I'm sure my co-workers will appreciate that on Monday.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Megan made a little girl vomit</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/megan-made-a-little-girl-vomit/"/>
        <id>https://tlindner.macmess.org/megan-made-a-little-girl-vomit/</id>

        <updated>2008-01-03T13:38:23-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I had a laugh today. I took my younger daughter to the park today. They have a tire swing there. Megan really like to ride it. When we first got there I pushed Megan a little, she likes to go fast. Then I sat down&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I had a laugh today. I took my younger daughter to the park today. They have a tire swing there. Megan really like to ride it.

When we first got there I pushed Megan a little, she likes to go fast. Then I sat down to watch people for a little bit. Frankly I was surprised by the number of fathers there with their children, way more than usual.

One father was there with his boy and girl. The boy was taking a lot of his time, so my daughter decided to ask this little girl if she wanted to tire swing with her. She looked to be about five years old, about half my daughter's age. The girl agreed and they both got on the swing and Megan started pushing.

I was only half paying attention, and saw that Megan was spinning really fast. But it didn't bother me much because it wasn't as fast as I usually spin her. After a few minutes of this I see the little getting off the tire swing and walking toward her father, vomiting. Megan came over to me and I said to her she should apologize to her father. She didn't. I ended up cleaning a little vomit off the tire swing. We left shortly after that.

The sickness didn't seem to effect the little girls much. She was playing with other kids soon after.
            ]]>
        </content>
    </entry>
    <entry>
        <title>SDLMESS and the New Apple Keyboard</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/sdlmess-and-the-new-apple-keyboard/"/>
        <id>https://tlindner.macmess.org/sdlmess-and-the-new-apple-keyboard/</id>

        <updated>2008-01-01T12:36:51-08:00</updated>
            <summary type="html">
                <![CDATA[
                    SDLMESS inherited it's keyboard handling code from mainline MESS. Mainline MESS uses the Scroll Lock key to toggle between User Interface modes. On the Mac, SDLMESS has a conditional compile to use the Insert key instead of the other key. This worked well before the&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                SDLMESS inherited it's keyboard handling code from mainline MESS. Mainline MESS uses the <em>Scroll Lock</em> key to toggle between User Interface modes. On the Mac, SDLMESS has a conditional compile to use the <em>Insert</em> key instead of the other key. This worked well before the new Apple keyboard.

The new Apple keyboard has removed the <em>Insert</em> key and replaced it with an <em>fn</em> key. A press on this key is never sent to the operating system. It changes a mode internal to the keyboard. This is good and bad for SDLMESS on the Macintosh.

Thankfully SDLMESS has no hardwired keys in the software. All keys can be reassigned in the tab menu. But the one catch-22 situation is the User Interface Mode toggle key. If this key is inaccessible, you are stuck with no access to the tab menu. About a year ago I saw this situation with some Macintosh laptop computers and submitted a patch to assign the keyboard mode key on the command line or inside the INI file. The switch is <em>uimodekey</em>. Since I have the new keyboard I changed it to ITEM_ID_DEL. This is the key directly below the <em>fn</em> key. This is a good way to solve the problem.

There is also a benefit to the new Apple keyboard. Apple has been assigning many different functions to the function keys (F1-F12) over the past few years and SDLMESS also assigns functions to the functions keys. Since Mac OS X would take precedence, SDLMESS would never receive the keydowns and it would look like SDLMESS was malfunctioning. If you hold the <em>fn</em> key and then press a function key, SDLMESS will receive the keydown and the system will ignore the key. You can even reverse this in the system preferences.


            ]]>
        </content>
    </entry>
    <entry>
        <title>The Shift Key</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/the-shift-key/"/>
        <id>https://tlindner.macmess.org/the-shift-key/</id>

        <updated>2007-12-28T20:41:09-08:00</updated>
            <summary type="html">
                <![CDATA[
                    When I hold down the shift and press the eject key on my Macintosh keyboard I notice the DVD tray slides out at a tenth of the speed it usually does.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                When I hold down the shift and press the eject key on my Macintosh keyboard I notice the DVD tray slides out at a tenth of the speed it usually does.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Chicklet Keyboard</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/chicklet-keyboard/"/>
        <id>https://tlindner.macmess.org/chicklet-keyboard/</id>

        <updated>2007-12-26T11:46:12-08:00</updated>
            <summary type="html">
                <![CDATA[
                    My first computer, the Color Computer, came with a variety of keyboard commonly called a chicklet keyboard. The name comes from the shape of the individual keys. I always liked the keyboard. When I recived my CoCo 3 I shipped off my old CoCo to&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My first computer, the Color Computer, came with a variety of keyboard commonly called a chicklet keyboard. The name comes from the shape of the individual keys.

I always liked the keyboard. When I recived my CoCo 3 I shipped off my old CoCo to my uncle in Los Angeles. He used the computer for a few years finally upgrading to an Atari ST mega. When I got the computer back I found he had replaced the keyboard with an after market keyboard with more proper keys. This was a common thing to do, a lot of people didn't like the keyboard.

Recently Apple released a new keyboard that is really nice. I asked my wife to get it for me for xmas. It uses flat, laptop style keys and is very low profile. It reminds me a lot about the original CoCo keyboard. I am really loving it. It's was a really great present.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Carrot on a Stick</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/carrot-on-a-stick/"/>
        <id>https://tlindner.macmess.org/carrot-on-a-stick/</id>

        <updated>2007-12-23T08:42:52-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Sometimes people have a meta conversation about negotiating. Sometimes those same people talk about the carrot and stick method of negotiating. Those people really anger me. Mostly because the "carrot and stick" term is a bastardization of the proper term "carrot on a stick". Thankfully&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Sometimes people have a meta conversation about negotiating. Sometimes those same people talk about the carrot and stick method of negotiating. Those people really anger me.

Mostly because the "carrot and stick" term is a bastardization of the proper term "carrot on a stick". Thankfully they mean completely different things.

Carrot and stick usually means you're going to play nice until a certain point where things get nasty. This represents oppression to me.

Carrot on a stick usually means you offer niceness in front of the other party, and if they grab for it, you move a step away, hoping for the first party to make another grab. This represents cooperation to me.

I've noticed people using either term are not using it incorrectly. That makes me feel a little better. Nevertheless, I've got a lot of carrots here for the people who insist on using it.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Deadly Disks</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/deadly-discs/"/>
        <id>https://tlindner.macmess.org/deadly-discs/</id>

        <updated>2007-12-08T21:27:17-08:00</updated>
            <summary type="html">
                <![CDATA[
                    Oh, Dan Trachtenberg (regarding Episode #37), why did you have to dislike my favorite game! TRON Deadly Disks for the Intellivision is super fun. I really liked the arcade version of the game based off the TRON movie. The four mini games: Tank, Lightcycles, MCP&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Oh, <a href="http://www.totallyradshow.com/">Dan Trachtenberg</a> (regarding Episode #37), why did you have to dislike my favorite game! <a href="http://www.intellivisiongames.com/gamepage.php?gameId=109">TRON Deadly Disks</a> for the Intellivision is super fun.

I really liked the <a href="http://www.klov.com/game_detail.php?game_id=10204">arcade</a> version of the game based off the TRON movie. The four mini games: Tank, Lightcycles, MCP cone and the spiders were all good. I was also dissapointed there was no disc game included. It would be many years before I saw <a href="http://www.klov.com/game_detail.php?game_id=7594">Discs of TRON</a> in an arcade.

But when TRON Deadly Disks was released for the Intellivision I was hooked. A really good single player game.

Dan did like <a href="http://www.intellivisiongames.com/gamepage.php?gameId=117">Utopia</a>, so at least we can agree on that.
            ]]>
        </content>
    </entry>
    <entry>
        <title>The Kids Table</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/the-kids-table/"/>
        <id>https://tlindner.macmess.org/the-kids-table/</id>

        <updated>2007-11-30T22:00:53-08:00</updated>
            <summary type="html">
                <![CDATA[
                    My oldest daughter, Bethany, was very upset with us this Thanksgiving. She didn't want to sit at the kids table. At Twelve she was the oldest child during the occasion. As far as I know The Kids Table is an institution in this country just&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                My oldest daughter, Bethany, was very upset with us this Thanksgiving. She didn't want to sit at the kids table. At Twelve she was the oldest child during the occasion.
As far as I know <em>The Kids Table</em> is an institution in this country just as large as Thanksgiving itself. Bethany had the audacity to ask me to switch places with her so she didn't have to sit at that table. I think that really speaks towards to my lack of parenting skills for not instilling in her a proper respect for me. Only time will tell how that turns out.
On the drive home, my wife and I were talking about how mopey she was during dinner. Bethany promptly declared in her future household there will be no such thing as a kids table. The indignity of separating the children will not be tolerated.
Needless to say, my wife and I had not had a laugh that large in a long time. Jeanette, my wife, suggested I blog about this because something this good needs to be remembered for the future.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Atop half dome</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/atop-half-dome/"/>
        <id>https://tlindner.macmess.org/atop-half-dome/</id>

        <updated>2007-11-24T13:16:41-08:00</updated>
            <summary type="html">
                <![CDATA[
                    When I was much younger, I think around nineteen years old, I climbed half dome in Yosemite National park. I did it with my brother and sister. It was really fun. You don't have to be a hard-core rock climber to scale half dome. After&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                When I was much younger, I think around nineteen years old, I climbed half dome in Yosemite National park. I did it with my brother and sister. It was really fun. You don't have to be a hard-core rock climber to scale half dome. After the Spring rains the park attaches cables to the side of the rock so just about anyone can go up it. I've have always wanted to return.
This Summer I took my two daughters to Yosemite. My intention was to show them Nevada and then Bridal Veil falls. Sadly I could only go as far as the observation bridge. I am too overweight and out of shape to even make it to see the falls. Luckily my younger daughter had enough of this "hiking" so we turned back. My older daughter wanted to go on and see the falls up close. We spent the rest of the day at Mirror lake.
But I felt I let my older daughter down. I asked her if she wanted to ever go to the top of Half Dome. She enthusiastically said yes. We set a date for the following summer to make our attempt. She reminded me I'll need to do a lot of training to get into the proper shape.
Now Summer is long gone. We're well into Fall. I've finally started getting into shape. Thirty minutes a day on a treadmill is how I am starting. I'm not sure if I'll be ready by this Summer, but I wont know if I don't try.
As a side note. While at Mirror lake, we heard a helicopter. It's never a good thing to hear a helicopter in Yosemite. It is almost always the sign of something terrible has happened. We found out later that week a man had fallen off the cables leading to the top of Half Dome. It's a dangerous thing to do, so care should be taken.
            ]]>
        </content>
    </entry>
    <entry>
        <title>Home Server</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/home-server/"/>
        <id>https://tlindner.macmess.org/home-server/</id>

        <updated>2007-11-12T15:39:46-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I listen to a lot of Leo Laporte's podcasts. I really enjoy all of his work. But listening to his Windows Weekly podcast is becoming more and more difficult. Leo and his cohost sometimes talk about Windows Home Server. An OEM version of Windows designed&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I listen to a lot of <a href="http://www.twit.tv/">Leo Laporte's podcasts</a>. I really enjoy all of his work. But listening to his <a href="http://www.twit.tv/ww">Windows Weekly</a> podcast is becoming more and more difficult. 

Leo and his cohost sometimes talk about <a href="http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx">Windows Home Server</a>. An OEM version of Windows designed to manage the ever increasing notion of having more that one computer in your household. The product does seem to fill a a nitch. But what bothers me is Leo never mentions how Apple is solving this same problem. And how Apple's solution is much better for the home user.

So what problems is Windows Home Server trying to solve? Mainly aggregation of content. A single place for your media so they can be accessible from multiple computers. It also offers a place for backups to go. Sometimes I think Leo is disappointed in Apple for not offering a similar product.

It is an antithesis for someone to expect Apple to require a server (a separate machine running separate software) for these abilities. If you want to share pictures, you turn on picture sharing in iPhoto, and they automatically appear on other machines in your network. If you want to share music, you turn on music sharing in iTunes and your music automatically appears on other computers in your network. No server necessary. That means no configuration necessary. That is the Macintosh Way.

Apples backup solution (Called <i>Time Machine</i>) is just as simple. Plug in an external hard drive and it asks you if you want to backup to it. No server, no configuration necessary. Sure it is not centralized, but for storage of backups that isn't even encouraged.
            ]]>
        </content>
    </entry>
    <entry>
        <title>MacSOUP is my favorite email/news reader</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/macsoup-is-my-favorite-emailnews-reader/"/>
        <id>https://tlindner.macmess.org/macsoup-is-my-favorite-emailnews-reader/</id>

        <updated>2007-11-08T16:23:16-08:00</updated>
            <summary type="html">
                <![CDATA[
                    I have been using MacSOUP for a long time. It really suits my style. Most people prolly couldn't live without MIME, but I find it very cumbersome. At work I have to use Mail.app. I find it to slow for my tastes. Whenever I do&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                I have been using <a href="http://home.snafu.de/stk/macsoup/">MacSOUP</a> for a long time. It really suits my style. Most people prolly couldn't live without MIME, but I find it very cumbersome.

At work I have to use Mail.app. I find it to slow for my tastes.

Whenever I do have to use MIME, I usually use the web mail provided by my ISP.
            ]]>
        </content>
    </entry>
    <entry>
        <title>My Favorite Leopard Feature</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/my-favorite-leopard-feature/"/>
        <id>https://tlindner.macmess.org/my-favorite-leopard-feature/</id>

        <updated>2007-10-31T15:44:36-07:00</updated>
            <summary type="html">
                <![CDATA[
                    It turns out I am easy to impress. My favorite Leopard feature is the new hash comment style in AppleScript. This allows AppleScript text files to use she-bang style shell scripting. Really cool stuff. I should really upgrade soon.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                It turns out I am easy to impress. My favorite Leopard feature is the new hash comment style in AppleScript. This allows AppleScript text files to use <a href="http://developer.apple.com/releasenotes/AppleScript/RN-AppleScript/index.html#//apple_ref/doc/uid/TP40000982-DontLinkElementID_7">she-bang</a> style shell scripting. Really cool stuff.

I should really upgrade soon.
            ]]>
        </content>
    </entry>
    <entry>
        <title>EMUBRK update</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/emubrk-update-2/"/>
        <id>https://tlindner.macmess.org/emubrk-update-2/</id>

        <updated>2007-10-13T18:26:55-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Robert Gault notified me of a small warning in emubrk so I updated it.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Robert Gault notified me of a small warning in emubrk so I updated it.
            ]]>
        </content>
    </entry>
    <entry>
        <title>USENET Meme</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/usenet-meme/"/>
        <id>https://tlindner.macmess.org/usenet-meme/</id>

        <updated>2007-09-20T11:21:18-07:00</updated>
            <summary type="html">
                <![CDATA[
                    David Levine has started a new meme. Find and publish your earliest USENET post. Mine is from January 21, 1994. I sure wish it was more interesting: http://groups.google.com/group/comp.sys.mac.apps/msg/000a99e8a33cfb60
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <a href="http://davidlevine.livejournal.com/101549.html">David Levine</a> has started a new meme. Find and publish your earliest USENET post. Mine is from January 21, 1994. I sure wish it was more interesting:

<a href="http://groups.google.com/group/comp.sys.mac.apps/msg/000a99e8a33cfb60">http://groups.google.com/group/comp.sys.mac.apps/msg/000a99e8a33cfb60</a>

            ]]>
        </content>
    </entry>
    <entry>
        <title>Megan Extreme</title>
        <author>
            <name>tlindner</name>
        </author>
        <link href="https://tlindner.macmess.org/megan-extreme/"/>
        <id>https://tlindner.macmess.org/megan-extreme/</id>

        <updated>2007-08-14T09:01:32-07:00</updated>
            <summary type="html">
                <![CDATA[
                    Sunday, August 12 was suppose to be a special day for Megan and I. We went to California Extreme together. After driving about an hour to get to Parkside Hall in San Jose, I payed thirty dollars for me and fifteen for Megan to enter&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                Sunday, August 12 was suppose to be a special day for Megan and I. We went to <a href="http://www.caextreme.org/">California Extreme</a> together. After driving about an hour to get to Parkside Hall in San Jose, I payed thirty dollars for me and fifteen for Megan to enter the event. All of the lights and sounds got her truly excited. After about an hour of playing games I had a horrible thought.

The day before Megan told me her pump had about 20 units of insulin available. She goes thru about 30 units a day and I tell her we will change the reservoir the next morning. It occurred to me, in the middle of a game that I never refilled the pump. I took a look at it and found she had 1 unit available for delivery. This is about enough for half an hour.

Being an hour away from home was not far enough for me to pack a full compliment pump supplies. All I packed was low food. I had nothing with me to refill the pump.

It is not acceptable for Megan to spend even a few hours without her pump. Since she was hungry and needed to eat, I needed to give her insulin to cover those carbohydrates. Plus, with the pump empty she is not getting her basil insulin so her blood glucose will almost immediately rise beyond acceptable levels. So we had to leave.

That morning she was not sure if California Extreme was going to be fun. But after only an hour she was having such a good time I felt horrible that I had to tell her we had to go. I was really hard on myself on the drive home. Just a little bit of planning and we would have been able to spend a half-day playing video games and pinball machines.
            ]]>
        </content>
    </entry>
</feed>
