<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xml:base="https://vincent.bernat.ch">
  <title>Vincent Bernat — Retrocomputing</title>
  <link href="https://vincent.bernat.ch/en/blog/atom-retro.xml" rel="self"/>
  <link href="https://vincent.bernat.ch/en/blog#tag-retro" rel="alternate"/>
  <id>http://www.luffy.cx/en/blog/atom-retro.xml/</id>
  <updated>2026-10-31T10:32:31Z</updated>

  <entry>
    <title type="html">Fragments of an adolescent web</title>
    <author><name>Vincent Bernat</name></author>
    <link href="https://vincent.bernat.ch/en/blog/2026-old-web-articles" rel="alternate"/>
    <link href="https://vincent.bernat.ch/en/blog/2026-old-web-articles#isso-thread" rel="replies" type="text/html"/>
    <updated>2026-02-08T13:51:44Z</updated>
    <id>http://www.luffy.cx/en/blog/2026-old-web-articles.html</id>

    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<p>I have unearthed a few <a href="/en/blog#tag-retro-wguide" title="MTU Ninja | Vincent Bernat">old articles</a> typed during my adolescence, between
1996 and 1998. Unremarkable at the time, they now read, three decades later, as
a chronicle of a vanished era.<sup id="fnref:french"><a class="footnote-ref" href="#fn:french">1</a></sup></p>
<p>The word “blog” does not exist yet. Wikipedia has yet to come. Google has not
been born. AltaVista reigns over searches, while <a href="/fr/blog/1998-moteurs-de-recherche" title="Le manque d'efficacité des moteurs de recherche">already struggling to keep up
with</a> the rapidly growing web.<sup id="fnref:index"><a class="footnote-ref" href="#fn:index">2</a></sup> To meet someone,
you had to agree in advance and prepare your route on paper maps. 🗺️</p>
<p>The web is taking off. The CSS specification has just emerged, HTML tables still
serve for page layout. <a href="/fr/blog/1997-cookies" title="Les cookies">Cookies</a> and <a href="/fr/blog/1997-page-publicitaire" title="Une page de pub">advertising banners</a> are making
their appearance. Pages start embedding <a href="/fr/blog/1997-web-multimedia" title="Le web multimédia">music and videos</a>, forcing
browsers to support <a href="/fr/blog/1997-web-plugins" title="La jungle des plugins">plugins</a>. Netscape Navigator holds 86% of the market,
but Windows 95 now bundles Internet Explorer to <a href="/fr/blog/1998-monopole-microsoft" title="Pratiques monopolistiques de Microsoft">quickly catch up</a>.
In response, Netscape <a href="/fr/blog/1998-netscape" title="Coup de vent sur Netscape">open-sources its browser</a>.</p>
<p>France <a href="/fr/blog/1997-france-retard-internet" title="La France en retard ?">falls behind</a>. Outside universities, Internet access remains
<a href="/en/blog/1997-reduce-bill-ft" title="Reduce your France Télécom bill">expensive</a> and laborious. <a href="https://en.wikipedia.org/wiki/Minitel" title="Minitel on Wikipedia">Minitel</a> still reigns, offering a phone
directory, train tickets, remote shopping. This was not yet possible with the
Internet: <a href="/fr/blog/1998-achats-electroniques" title="Achats électroniques">buying a CD online</a> was a pipe dream. Encryption suffers from
<a href="/fr/blog/1997-commerce-electronique" title="Le commerce électronique">inappropriate regulation</a>: the DES algorithm is capped at 40 bits and
<a href="/fr/blog/1998-3-secondes" title="3 secondes !">cracked in a few seconds</a>.</p>
<p>These pages bear the trace of the web’s adolescence. Thirty years have passed.
The same battles continue: data selling, advertising, monopolies.</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:french">
<p>Most articles linked here are not translated from French to English. <a class="footnote-backref" href="#fnref:french" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:index">
<p>I recently noticed that Google no longer fully indexes my blog. For
example, it is no longer possible to find the <a href="/en/blog/2013-lanco" title="lanĉo: a task launcher powered by cgroups">article on lanĉo</a>. I
assume this is a consequence of the explosion of AI-generated content or a
change in priorities for Google. <a class="footnote-backref" href="#fnref:index" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
      </div>
    </content>
  </entry>
  <entry>
    <title type="html">My collection of vintage PC cards</title>
    <author><name>Vincent Bernat</name></author>
    <link href="https://vincent.bernat.ch/en/blog/2020-old-pc-cards" rel="alternate"/>
    <link href="https://vincent.bernat.ch/en/blog/2020-old-pc-cards#isso-thread" rel="replies" type="text/html"/>
    <updated>2020-11-02T18:29:38Z</updated>
    <id>http://www.luffy.cx/en/blog/2020-old-pc-cards.html</id>

    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<p>Recently, I have been gathering old hardware at my parents’ house,
notably PC extension cards. They do not take much room and make a nice
display. Unfortunately, I never cared much about keeping things
around. Of all the hardware I acquired over the years, only a few
pieces remain.</p>
<div class="toc">
<ul>
<li><a href="#tseng-labs-et4000ax-1989">Tseng Labs ET4000AX (1989)</a></li>
<li><a href="#adlib-clone-1992">AdLib clone (1992)</a></li>
<li><a href="#sound-blaster-pro-2-1992">Sound Blaster Pro 2 (1992)</a></li>
<li><a href="#promise-eide-2300-plus-1995">Promise EIDE 2300 Plus (1995)</a></li>
<li><a href="#3dfx-voodoo2-magic-3d-ii-1998">3dfx Voodoo2 Magic 3D II (1998)</a></li>
<li><a href="#3com-3c905c-tx-m-tornado-1999">3Com 3C905C-TX-M “Tornado” (1999)</a></li>
</ul>
</div>
<h1 id="tseng-labs-et4000ax-1989">Tseng Labs ET4000AX (1989)</h1>
<p>This SVGA graphics card was installed in a PC powered by a 386SX CPU
running at 16 MHz. It was a good card for its time: pretty fast. It
did not feature 2D acceleration, unlike the later ET4000/W32. This
version features only 512 KB of RAM. It can display 1024×768 images
with 16 colors or 800×600 with 256 colors. It also supported CGA,
EGA, VGA, MDA, and Hercules modes. No contemporary games used the
SVGA modes, but the higher resolutions proved useful with Windows 3.
Tseng Labs manufactured this card directly.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 900px"><span class="lf-media-inner" style="padding-bottom: 86.667%"><img alt="Tseng Labs ET4000AX ISA card on top of the &quot;Planète Aventure&quot; box" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/et4000@1x.b507cfd767aeba.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/et4000@1x.b507cfd767aeba.jpg 1131w,https://media-bernat-ch.b-cdn.net/images/pc-cards/et4000@2x.290fd6b16c25d6.jpg 1800w" sizes="auto, (max-width: 900px) 100vw, 900px" width="900" height="780" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAANAQMAAABM0KYCAAAAA1BMVEXZk1ga/jN6AAAADElEQVR42mNgIAoAAAAnAAH0usIGAAAAAElFTkSuQmCC)"/></span></div><figcaption>Tseng Labs ET4000 AX ISA card</figcaption></figure>
<h1 id="adlib-clone-1992">AdLib clone (1992)</h1>
<p>My first sound card was an AdLib. My parents bought it in Canada
during the summer holidays in 1992. It uses a Yamaha OPL2 chip to
produce sound via FM synthesis. The first game I tried was
<a href="https://en.wikipedia.org/wiki/Indiana_Jones_and_the_Last_Crusade:_The_Graphic_Adventure" title="Indiana Jones and the Last Crusade: The Graphic Adventure on Wikipedia">Indiana Jones and the Last Crusade</a>.</p>
<p>I think I gave this AdLib to a friend once I upgraded my PC with a
Sound Blaster Pro 2. Recently, I needed one for a side project, but
they are rare and expensive on eBay. Someone mentioned a cheap clone
on <a href="https://www.vogons.org/viewtopic.php?t=73429" title="Sun Moon Star Adlib Clone">Vogons</a>, so I bought it. Sun Moon Star sold it in 1992 and
shipped it with a CD-ROM of Doom shareware.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 700px"><span class="lf-media-inner" style="padding-bottom: 88.429%"><img alt="AdLib clone on top of &quot;Alone in the Dark&quot; box" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/adlib-clone@1x.1877f385050d52.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/adlib-clone@1x.1877f385050d52.jpg 880w,https://media-bernat-ch.b-cdn.net/images/pc-cards/adlib-clone@2x.d611359a9dfa02.jpg 1400w" sizes="auto, (max-width: 700px) 100vw, 700px" width="700" height="619" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAAJrAQMAAAA4T9KXAAAAA1BMVEXsqmgQA6kXAAAATElEQVR42u3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODHXMwABYQyZlAAAAABJRU5ErkJggg==)"/></span></div><figcaption>AdLib clone ISA card by Sun Moon Star</figcaption></figure>
<p>On this topic, take a look at “<a href="/en/blog/2018-adlib-opl2lpt" title="OPL2LPT: an AdLib sound card for the parallel port">OPL2LPT: an AdLib sound card for the
parallel port</a>” and “<a href="/en/blog/2018-opl2-audio-board" title="OPL2 Audio Board: an AdLib sound card for Arduino">OPL2 Audio Board: an AdLib sound card for
Arduino</a>.” The first article includes a more exact copy of an AdLib
clone.</p>
<h1 id="sound-blaster-pro-2-1992">Sound Blaster Pro 2 (1992)</h1>
<p>Later, I replaced the AdLib with a Sound Blaster Pro 2. It features
an OPL3 chip and can also output digital samples. At the time, this
was a welcome addition, but less important than the FM synthesis the
AdLib introduced.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 900px"><span class="lf-media-inner" style="padding-bottom: 88.222%"><img alt="Sound Blaster Pro 2 on top of &quot;Day of the Tentacle&quot; box" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/sbpro@1x.fb338b4f623c74.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/sbpro@1x.fb338b4f623c74.jpg 1131w,https://media-bernat-ch.b-cdn.net/images/pc-cards/sbpro@2x.cd79c8563ce079.jpg 1800w" sizes="auto, (max-width: 900px) 100vw, 900px" width="900" height="794" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAGNAQMAAAC42OO/AAAAA1BMVEXOg0kj5bQsAAAALUlEQVR42u3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4DFnyAAEN75NNAAAAAElFTkSuQmCC)"/></span></div><figcaption>Sound Blaster Pro 2 ISA card</figcaption></figure>
<h1 id="promise-eide-2300-plus-1995">Promise EIDE 2300 Plus (1995)</h1>
<p>I bought this card mostly for the serial port. I was using a 486DX2 running at
66 MHz with a Creatix LC 288 FC external modem. The serial port used an 8250
UART with no buffer. Thanks to <a href="https://web.archive.org/web/2020/http://www.terminate.com/" title="Terminate, a DOS terminal program">Terminate</a>, I could connect to <a href="https://en.wikipedia.org/wiki/Bulletin_board_system" title="Bulletin board system on Wikipedia">BBSes</a> from
DOS, but not from Windows 3 or OS/2. I needed one of these fancy new cards with
a 16550 UART, featuring a 16-byte buffer. At the time, finding one in France was
difficult. During a holiday trip, I convinced my parents to detour from Los
Angeles to San Diego to buy this <em>Promise EIDE 2300 Plus</em> controller card at a
shop I found through an advertisement in a local magazine!</p>
<p>The card also features an EIDE controller with multi-word DMA mode 2 support. In
contrast with the older PIO modes, the CPU did not have to copy data from disk
to memory.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 900px"><span class="lf-media-inner" style="padding-bottom: 77.111%"><img alt="Promise EIDE 2300 Plus next to an OS/2 Warp CD" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/promise@1x.3755132170159e.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/promise@1x.3755132170159e.jpg 1131w,https://media-bernat-ch.b-cdn.net/images/pc-cards/promise@2x.b5614198af211e.jpg 1800w" sizes="auto, (max-width: 900px) 100vw, 900px" width="900" height="694" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAFbAQMAAAB8vxyNAAAAA1BMVEXHfEYvr29AAAAAKElEQVR42u3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAZOngABmC8KMQAAAABJRU5ErkJggg==)"/></span></div><figcaption>Promise EIDE 2300 Plus VLB card</figcaption></figure>
<h1 id="3dfx-voodoo2-magic-3d-ii-1998">3dfx Voodoo2 Magic 3D II (1998)</h1>
<p>The 3dfx Voodoo2 was one of the first add-in graphics cards to
implement hardware acceleration of 3D graphics. I bought it from a
friend along with his Pentium II box in 1999. It marked a big step in
PC gaming: games became more beautiful and fluid. 2D still required a
traditional video controller. A pass-through VGA cable daisy-chained
the video controller to the Voodoo, which was itself connected to the
monitor.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 900px"><span class="lf-media-inner" style="padding-bottom: 79.778%"><img alt="3dfx Voodoo 2 Magic 3D II on top of &quot;Jedi Knight: Dark Forces II&quot; box" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/3dfx@1x.cc5766c0602b3b.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/3dfx@1x.cc5766c0602b3b.jpg 1131w,https://media-bernat-ch.b-cdn.net/images/pc-cards/3dfx@2x.995a486b05c549.jpg 1800w" sizes="auto, (max-width: 900px) 100vw, 900px" width="900" height="718" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAFnAQMAAAAPB9tbAAAAA1BMVEXiqnF+9izdAAAAK0lEQVR42u3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAHg1RVgABDGwQUgAAAABJRU5ErkJggg==)"/></span></div><figcaption>3dfx Voodoo2 Magic 3D II PCI card</figcaption></figure>
<h1 id="3com-3c905c-tx-m-tornado-1999">3Com 3C905C-TX-M “Tornado” (1999)</h1>
<p>In the early 2000s, in college, a <a href="https://web.archive.org/web/20020327172921/http://www.crans.org/" title="Cachan Réseau @ Normale Sup'">student association</a> provided the
campus Internet connection through a 100 Mbps Ethernet cable. If you
wanted to reach the maximum speed, the <em>3Com 3C905C-TX-M</em> PCI network
adapter, nicknamed “Tornado,” was the card you needed. We bought them
second-hand by the dozen and sold them to other students for around
€30.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 700px"><span class="lf-media-inner" style="padding-bottom: 96.571%"><img alt="3COM 3C905C-TX-M on top of &quot;Red Alert&quot; box" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/3com@1x.040b4caf7b9855.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/3com@1x.040b4caf7b9855.jpg 880w,https://media-bernat-ch.b-cdn.net/images/pc-cards/3com@2x.7a46dcb92f790c.jpg 1400w" sizes="auto, (max-width: 700px) 100vw, 700px" width="700" height="676" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK8AAACpAQMAAABnBf8rAAAAA1BMVEXfnmn6AzG/AAAAGklEQVR42u3BMQEAAADCoPVP7W8GoAAAAIAzDy8AARvszY4AAAAASUVORK5CYII=)"/></span></div><figcaption>3Com 3C905C-TX-M PCI card</figcaption></figure>
      </div>
    </content>
  </entry>
  <entry>
    <title type="html">OPL2 Audio Board: an AdLib sound card for Arduino</title>
    <author><name>Vincent Bernat</name></author>
    <link href="https://vincent.bernat.ch/en/blog/2018-opl2-audio-board" rel="alternate"/>
    <link href="https://vincent.bernat.ch/en/blog/2018-opl2-audio-board#isso-thread" rel="replies" type="text/html"/>
    <updated>2018-04-21T07:19:30Z</updated>
    <id>http://www.luffy.cx/en/blog/2018-opl2-audio-board.html</id>

    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<p>In a <a href="/en/blog/2018-adlib-opl2lpt" title="OPL2LPT: an AdLib sound card for the parallel port">previous article</a>, I presented the <a href="https://serdashop.com/products/opl2lpt" title="OPL2LPT on Serdashop">OPL2LPT</a>, a sound card
for the parallel port featuring a <a href="https://en.wikipedia.org/wiki/Yamaha_YM3812" title="Yamaha YM3812 on Wikipedia">Yamaha YM3812</a> chip, also known
as <em>OPL2</em>—the chip of the <a href="https://en.wikipedia.org/wiki/Ad_Lib,_Inc.#AdLib_Music_Synthesizer_Card_(1987)" title="AdLib Music Synthesizer Card on Wikipedia">AdLib sound card</a>. The <a href="https://hackaday.io/project/18995-opl2-audio-board-for-arduino-raspberry-pi" title="OPL2 Audio Board for Arduino &amp; Raspberry Pi">OPL2 Audio Board
for Arduino</a> is another indie sound card using this chip. However,
instead of relying on a parallel port, it uses a serial interface,
which can be driven from an Arduino board or a Raspberry Pi. While the
<em>OPL2LPT</em> targets retrogamers with real hardware, the <em>OPL2 Audio
Board</em> cannot be used in the same way. Nonetheless, it can also be
operated from <a href="https://www.scummvm.org/" title="ScummVM">ScummVM</a> and <a href="https://www.dosbox.com/" title="DOSBox, an x86 emulator with DOS">DOSBox</a>!</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 400px"><span class="lf-media-inner" style="padding-bottom: 76.000%"><img alt="OPL2 Audio Board for Arduino" src="https://media-bernat-ch.b-cdn.net/images/opl2-audioboard@1x.b70f036732e800.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/opl2-audioboard@1x.b70f036732e800.jpg 503w,https://media-bernat-ch.b-cdn.net/images/opl2-audioboard@2x.dbccf6394b3214.jpg 800w" sizes="auto, (max-width: 400px) 100vw, 400px" width="400" height="304" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAATAQMAAABfvDRGAAAAA1BMVEVISk5CASq6AAAADElEQVR42mNgoCkAAABfAAEDNl01AAAAAElFTkSuQmCC)"/></span></div><figcaption>The OPL2 Audio Board over a “Grim Fandango” box.</figcaption></figure>
<div class="toc">
<ul>
<li><a href="#unboxing">Unboxing</a></li>
<li><a href="#usage-with-dosbox-scummvm">Usage with DOSBox &amp; ScummVM</a><ul>
<li><a href="#dosbox">DOSBox</a></li>
<li><a href="#scummvm">ScummVM</a></li>
</ul>
</li>
</ul>
</div>
<h1 id="unboxing">Unboxing</h1>
<p>The <em>OPL2 Audio Board</em> can be purchased on <a href="https://www.tindie.com/products/cheerful/opl2-audio-board/" title="OPL2 Audio Board">Tindie</a>, either as a kit
or fully assembled. I have paired it with a cheap clone of the
<a href="https://store.arduino.cc/products/arduino-nano" title="Arduino Nano">Arduino Nano</a>. A library to drive the board is available on
<a href="https://github.com/DhrBaksteen/ArduinoOPL2/" title="Arduino library for use with the OPL2 board (YM3812)">GitHub</a>, along with some examples.</p>
<p>One of them is <a href="https://github.com/DhrBaksteen/ArduinoOPL2/blob/v1.4.6/examples/DemoTune/DemoTune.ino" title="ArduinoOPL2/examples/DemoTune/DemoTune.ino"><code>DemoTune.ino</code></a>. It plays a short tune
on three channels. It can be compiled and uploaded to the Arduino with
<a href="https://platformio.org/" title="PlatformIO is an open source ecosystem for IoT development">PlatformIO</a>—installable with <code>pip install platformio</code>—using the
following command:<sup id="fnref:nano"><a class="footnote-ref" href="#fn:nano">1</a></sup></p>
<div class="language-bash-session codehilite"><pre><span/><code><span class="gp">$ </span>platformio<span class="w"> </span>ci<span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--board<span class="w"> </span>nanoatmega328<span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--lib<span class="w"> </span>../../src<span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--project-option<span class="o">=</span><span class="s2">"targets=upload"</span><span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--project-option<span class="o">=</span><span class="s2">"upload_port=/dev/ttyUSB0"</span><span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>DemoTune.ino
<span class="go">[…]</span>
<span class="go">PLATFORM: Atmel AVR &gt; Arduino Nano ATmega328</span>
<span class="go">SYSTEM: ATMEGA328P 16MHz 2KB RAM (30KB Flash)</span>
<span class="go">Converting DemoTune.ino</span>
<span class="go">[…]</span>
<span class="go">Configuring upload protocol...</span>
<span class="go">AVAILABLE: arduino</span>
<span class="go">CURRENT: upload_protocol = arduino</span>
<span class="go">Looking for upload port...</span>
<span class="go">Use manually specified: /dev/ttyUSB0</span>
<span class="go">Uploading .pioenvs/nanoatmega328/firmware.hex</span>
<span class="go">[…]</span>
<span class="go">avrdude: 6618 bytes of flash written</span>
<span class="go">[…]</span>
<span class="go">===== [SUCCESS] Took 5.94 seconds =====</span>
</code></pre></div>

<p>Immediately after the upload, the Arduino plays the tune. 🎶</p>
<p>The next interesting example is <a href="https://github.com/DhrBaksteen/ArduinoOPL2/blob/v1.4.6/examples/SerialIface/SerialIface.ino" title="ArduinoOPL2/examples/SerialIface/SerialIface.ino"><code>SerialIface.ino</code></a>.
It turns the audio board into a sound card over serial port. Once the
code has been pushed to the Arduino, you can use the <code>play.py</code> program
in the same directory to play <abbr title="Video Game Music">VGM</abbr> files. They are a sample-accurate
sound format for many sound chips. They log the exact commands
sent. There are many of them on <a href="https://vgmrips.net/packs/" title="VGMRips">VGMRips</a>. Be sure to choose the
ones for the <a href="https://vgmrips.net/packs/chip/ym3812" title="VGMRips: Packs using YM3812">YM3812/OPL2</a>!  Here is a small selection:</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 1280px"><span class="lf-media-inner" style="padding-bottom: 56.250%"><video width="1280" height="720" controls="" preload="none" crossorigin="anonymous" poster="https://media-bernat-ch.b-cdn.net/images/posters/2018-opl2-audio-board-1.6b08787e4fbabc.jpg" class="lf-media lf-opaque"><source src="https://media.bernat.ch/videos/2018-opl2-audio-board-1.m3u8" type="application/vnd.apple.mpegurl"/><source src="https://media.bernat.ch/videos/2018-opl2-audio-board-1/progressive.mp4" type="video/mp4; codecs=&quot;mp4a.40.2,avc1.4d401f&quot;"/><track src="https://media.bernat.ch/videos/2018-opl2-audio-board-1.chapters.vtt" kind="chapters" label="Chapters"/></video></span></div><figcaption>The OPL2 Audio Board playing some VGM files. It is connected to an Arduino Nano. You can see the LEDs blinking when the Arduino receives the commands from the serial port.</figcaption></figure>
<ul>
<li><a href="#video:seek-0">0:00</a>, <em>Railroad Story</em> from the <a href="https://vgmrips.net/packs/pack/adlib-music-synthesizer-card-demo-songs-ibm-pc-xt-at" title="VGMRips: Adlib Music Synthesizer Card Demo Songs">demo songs shipped with the AdLib sound card</a> (1987)</li>
<li><a href="#video:seek-64">1:04</a>, the opening of <a href="https://vgmrips.net/packs/pack/star-wars-x-wing-ibm-pc-at" title="VGMRips: Star Wars: X-Wing">Star Wars: X-Wing</a> (1993)</li>
<li><a href="#video:seek-139">2:19</a>, the opening of <a href="https://vgmrips.net/packs/pack/the-secret-of-monkey-island-ibm-pc-at" title="VGMRips: The Secret of Monkey Island">The Secret of Monkey Island</a> (1990)</li>
<li><a href="#video:seek-238">3:58</a>, the opening of <a href="https://vgmrips.net/packs/pack/indiana-jones-and-the-last-crusade-the-graphic-adventure-ibm-pc-xt-at" title="VGMRips: Indiana Jones and the Last Crusade">Indiana Jones and the Last Crusade</a> (1989)</li>
</ul>
<h1 id="usage-with-dosbox-scummvm">Usage with DOSBox &amp; ScummVM</h1>
<div class="admonition">
<p class="admonition-title">Notice</p>
<p>The support for the serial protocol used in this section has <a href="https://github.com/DhrBaksteen/ArduinoOPL2/pull/20" title="SerialIface.ino: add a variant protocol using less bytes">not been
merged</a>: instead, a simpler protocol was designed. You need to grab
<code>SerialIface.ino</code> from my pull request: <code>git checkout 50e1717</code>.</p>
</div>
<p>When the Arduino is flashed with <code>SerialIface.ino</code>, the board can be
driven through a simple protocol over the serial port. By patching
<em>DOSBox</em> and <em>ScummVM</em>, we can make them use this unusual sound
card. Here are some examples of games:</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 854px"><span class="lf-media-inner" style="padding-bottom: 56.206%"><video width="854" height="480" controls="" preload="none" crossorigin="anonymous" poster="https://media-bernat-ch.b-cdn.net/images/posters/2018-opl2-audio-board-2.263f6add26addf.jpg" class="lf-media lf-opaque"><source src="https://media.bernat.ch/videos/2018-opl2-audio-board-2.m3u8" type="application/vnd.apple.mpegurl"/><source src="https://media.bernat.ch/videos/2018-opl2-audio-board-2/progressive.mp4" type="video/mp4; codecs=&quot;mp4a.40.2,avc1.4d401f&quot;"/><track src="https://media.bernat.ch/videos/2018-opl2-audio-board-2.chapters.vtt" kind="chapters" label="Chapters"/></video></span></div></figure>
<ul>
<li><a href="#video:seek-0">0:00</a>, with <strong>DOSBox</strong>, the first level of <strong>Doom</strong> 🎮 (1993)</li>
<li><a href="#video:seek-66">1:06</a>, with <strong>DOSBox</strong>, the introduction of <strong>Loom</strong> 🎼 (1990)</li>
<li><a href="#video:seek-158">2:38</a>, with <strong>DOSBox</strong>, the first level of <strong>Lemmings</strong> 🐹 (1991)</li>
<li><a href="#video:seek-212">3:32</a>, with <strong>DOSBox</strong>, the introduction of <strong>Legend of Kyrandia</strong> 🃏 (1992)</li>
<li><a href="#video:seek-407">6:47</a>, with <strong>ScummVM</strong>, the introduction of <strong>Day of the Tentacle</strong> ☢️ (1993)</li>
<li><a href="#video:seek-670">11:10</a>, with <strong>DOSBox</strong>, the introduction of <strong>Another World</strong> 🐅 (1991)</li>
</ul>
<p><a href="https://en.wikipedia.org/wiki/Another_World_(video_game)" title="Another World on Wikipedia">Another World</a> (also known as <em>Out of This World</em>), designed by
Éric Chahi, is using sampled sounds at 5 kHz or 10 kHz. With a serial
port operating at 115,200 bits/s, the 5 kHz option is just within our
reach. <del>However, I have no idea if the rendering is
faithful.</del></p>
<div class="admonition">
<p class="admonition-title">Update (2018-05)</p>
<p>After some discussions with <a href="https://github.com/waltervn" title="Walter van Niftrik on GitHub">Walter van Niftrik</a>, we came to the
conclusion that, above 1 kHz, <em>DOSBox</em> doesn’t “time-accurately” execute OPL
commands. It is using a time slice of one millisecond during which it
executes either a fixed number of CPU cycles or as many as possible (with
<code>cycles=max</code>). In both cases, emulated CPU instructions are executed as fast
as possible and I/O delays are simulated by removing a fixed number of
cycles from the allocation of the current time slice.</p>
</div>
<h2 id="dosbox">DOSBox</h2>
<p>The serial protocol is described in the <code>SerialIface.ino</code> file:</p>
<div class="language-c codehilite"><pre><span/><code><span class="cm">/*</span>
<span class="cm"> * A very simple serial protocol is used.</span>
<span class="cm"> *</span>
<span class="cm"> * - Initial 3-way handshake to overcome reset delay / serial noise issues.</span>
<span class="cm"> * - 5-byte binary commands to write registers.</span>
<span class="cm"> *   - (uint8)  OPL2 register address</span>
<span class="cm"> *   - (uint8)  OPL2 register data</span>
<span class="cm"> *   - (int16)  delay (milliseconds); negative -&gt; pre-delay; positive -&gt; post-delay</span>
<span class="cm"> *   - (uint8)  delay (microseconds / 4)</span>
<span class="cm"> *</span>
<span class="cm"> * Example session:</span>
<span class="cm"> *</span>
<span class="cm"> * Arduino: HLO!</span>
<span class="cm"> * PC:      BUF?</span>
<span class="cm"> * Arduino: 256 (switches to binary mode)</span>
<span class="cm"> * PC:      0xb80a014f02 (write OPL register and delay)</span>
<span class="cm"> * Arduino: k</span>
<span class="cm"> *</span>
<span class="cm"> * A variant of this protocol is available without the delays. In this</span>
<span class="cm"> * case, the BUF? command should be sent as B0F? The binary protocol</span>
<span class="cm"> * is now using 2-byte binary commands:</span>
<span class="cm"> *   - (uint8)  OPL2 register address</span>
<span class="cm"> *   - (uint8)  OPL2 register data</span>
<span class="cm"> */</span>
</code></pre></div>

<p>Adding support for this protocol in <em>DOSBox</em> is relatively simple
(<a href="https://github.com/vincentbernat/dosbox/compare/feature/opl2audioboard" title="OPL2 Audio Board for Arduino support for DOSBox">patch</a>). For best performance, we use the 2-byte
variant (5000 ops/s). The binary commands are pipelined and a
dedicated thread collects the acknowledgments. A <a href="https://wiki.libsdl.org/SDL3/SDL_CreateSemaphore" title="SDL_CreateSemaphore">semaphore</a>
captures the number of free slots in the receive buffer. As it is not
possible to read registers, we rely on <em>DOSBox</em> to emulate the timers,
which are mostly used to let the various games <a href="https://web.archive.org/web/2018/http://www.fit.vutbr.cz/~arnost/opl/opl3.html#appendixB" title="OPL3 Programmer's Guide: Detection Methods">detect the OPL2</a>.</p>
<p>The patch is tested only on Linux but should work on any POSIX
system—not Windows.  To test it, you need to build <em>DOSBox</em> from
source:</p>
<div class="language-bash-session codehilite"><pre><span/><code><span class="gp">$ </span>sudo<span class="w"> </span>apt<span class="w"> </span>build-dep<span class="w"> </span>dosbox
<span class="gp">$ </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/vincentbernat/dosbox.git<span class="w"> </span>-b<span class="w"> </span>feature/opl2audioboard
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>dosbox
<span class="gp">$ </span>./autogen.sh
<span class="gp">$ </span>./configure<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>make
</code></pre></div>

<p>Replace the <code>sblaster</code> section of <code>~/.dosbox/dosbox-SVN.conf</code>:</p>
<div class="language-ini codehilite"><pre><span/><code><span class="k">[sblaster]</span>
<span class="na">sbtype</span><span class="o">=</span><span class="s">none</span>
<span class="na">oplmode</span><span class="o">=</span><span class="s">opl2</span>
<span class="na">oplrate</span><span class="o">=</span><span class="s">49716</span>
<span class="na">oplemu</span><span class="o">=</span><span class="s">opl2arduino</span>
<span class="na">opl2arduino</span><span class="o">=</span><span class="s">/dev/ttyUSB0</span>
</code></pre></div>

<p>Then, run <em>DOSBox</em> with <code>./src/dosbox</code>. That’s it!</p>
<p>You will likely get the “<code>OPL2Arduino: too slow, consider increasing
buffer</code>” message a lot. To fix this, you need to recompile
<code>SerialIface.ino</code> with a bigger receive buffer:</p>
<div class="language-bash-session codehilite"><pre><span/><code><span class="gp">$ </span>platformio<span class="w"> </span>ci<span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--board<span class="w"> </span>nanoatmega328<span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--lib<span class="w"> </span>../../src<span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--project-option<span class="o">=</span><span class="s2">"targets=upload"</span><span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--project-option<span class="o">=</span><span class="s2">"upload_port=/dev/ttyUSB0"</span><span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>--project-option<span class="o">=</span><span class="s2">"build_flags=-DSERIAL_RX_BUFFER_SIZE=512"</span><span class="w"> </span><span class="se">\</span>
<span class="gp">&gt; </span><span class="w">  </span>SerialIface.ino
</code></pre></div>

<h2 id="scummvm">ScummVM</h2>
<p>The same code can be adapted for <em>ScummVM</em>
(<a href="https://github.com/scummvm/scummvm/compare/master...vincentbernat:feature/opl2audioboard" title="OPL2 Audio Board for Arduino support for ScummVM">patch</a>). To test, build it from source:</p>
<div class="language-bash-session codehilite"><pre><span/><code><span class="gp">$ </span>sudo<span class="w"> </span>apt<span class="w"> </span>build-dep<span class="w"> </span>scummvm
<span class="gp">$ </span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/vincentbernat/scummvm.git<span class="w"> </span>-b<span class="w"> </span>feature/opl2audioboard
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>scummvm
<span class="gp">$ </span>./configure<span class="w"> </span>--disable-all-engines<span class="w"> </span>--enable-engine<span class="o">=</span>scumm<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>make
</code></pre></div>

<p>Then, you can start <em>ScummVM</em> with <code>./scummvm</code>. Select “AdLib
Emulator” as the music device and “OPL2 Arduino” as the AdLib
emulator.<sup id="fnref:serial"><a class="footnote-ref" href="#fn:serial">2</a></sup> Like for <em>DOSBox</em>, watch the console to check if
you need a larger receive buffer.</p>
<p>Enjoy! 🎶</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:nano">
<p>This command is valid for an Arduino Nano. For another board,
take a look at the output of <code>platformio boards arduino</code>. <a class="footnote-backref" href="#fnref:nano" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:serial">
<p>If you need to specify a serial port other than
<code>/dev/ttyUSB0</code>, add a line <code>opl2arduino_device=</code> in the
<code>~/.scummvmrc</code> configuration file. <a class="footnote-backref" href="#fnref:serial" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>
      </div>
    </content>
  </entry>
  <entry>
    <title type="html">OPL2LPT: an AdLib sound card for the parallel port</title>
    <author><name>Vincent Bernat</name></author>
    <link href="https://vincent.bernat.ch/en/blog/2018-adlib-opl2lpt" rel="alternate"/>
    <link href="https://vincent.bernat.ch/en/blog/2018-adlib-opl2lpt#isso-thread" rel="replies" type="text/html"/>
    <updated>2018-02-24T18:16:56Z</updated>
    <id>http://www.luffy.cx/en/blog/2018-adlib-opl2lpt.html</id>

    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<p>The <a href="https://en.wikipedia.org/wiki/Ad_Lib,_Inc.#AdLib_Music_Synthesizer_Card_(1987)" title="AdLib Music Synthesizer Card on Wikipedia">AdLib sound card</a> was the first popular sound card for IBM
PC—before that, we were pampered by the sound of the PC
speaker. Connected to an 8-bit ISA slot, it is powered by a <a href="https://en.wikipedia.org/wiki/Yamaha_YM3812" title="Yamaha YM3812 on Wikipedia">Yamaha
YM3812</a> chip, also known as <em>OPL2</em>. This chip can drive 9 sound
channels whose characteristics can be fine-tuned through 244
write-only registers.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 700px"><span class="lf-media-inner" style="padding-bottom: 91.000%"><img alt="AdLib sound card" src="https://media-bernat-ch.b-cdn.net/images/pc-cards/adlib-copy@1x.492c36c4936165.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/pc-cards/adlib-copy@1x.492c36c4936165.jpg 880w,https://media-bernat-ch.b-cdn.net/images/pc-cards/adlib-copy@2x.e0b4b6c40d27f4.jpg 1400w" sizes="auto, (max-width: 700px) 100vw, 700px" width="700" height="637" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABbAQMAAAC/ALJvAAAAA1BMVEX1oWWesZSeAAAAEklEQVR42mNgGAWjYBSMgpEGAAT6AAH0AohyAAAAAElFTkSuQmCC)"/></span></div><figcaption>A copy of an AdLib sound card from <a href="https://monotech.fwscart.com/AdLib_OPL2_Sound_Card/p6083514_19478748.aspx">Monotech</a>. The OPL2 chip is in the lower right part. Notable differences with the original include the volume potentiometer and the metal film resistors—instead of carbon film resistors.</figcaption></figure>
<p>I had one but I am unable to locate it anymore. Models on eBay are
quite rare and expensive. It is possible to build one yourself (either
<a href="https://github.com/skiselev/isa-opl2" title="ISA OPL2 Card">Sergey’s one</a> or this <a href="https://tubetime.us/index.php/2016/07/22/a-reproduction-adlib-sound-card/" title="A Reproduction AdLib Sound Card">faithful reproduction</a>). However, you
still need an ISA port. The limitless imagination of some hackers can
still help here. For example, you can combine <a href="https://github.com/skiselev/xi_8088" title="Sergey's projects: Xi 8088">Sergey’s Xi 8088
processor board</a>, with his <a href="https://github.com/skiselev/isa8_backplane" title="Sergey's projects: ISA 8-bit backplane">ISA 8-bit backplane</a>, his <a href="https://github.com/skiselev/isa-super-vga" title="Sergey's projects: ISA Super VGA">Super VGA
card</a>, and his <a href="https://github.com/skiselev/xt-cf-lite-v4" title="Sergey's projects: XT-CF-Lite v4">XT-CF-Lite card</a> to get your very own modernish IBM
PC compatible. Alternatively, you can look at the <a href="https://www.raphnet.net/electronique/adlib/adlib_en.php" title="AdLib sound card on a parallel port">AdLib sound card on
a parallel port</a> from Raphaël Assénat.</p>
<div class="toc">
<ul>
<li><a href="#the-opl2lpt-sound-card">The OPL2LPT sound card</a></li>
<li><a href="#addendum">Addendum</a><ul>
<li><a href="#indiana-jones-and-the-fate-of-atlantis">Indiana Jones and the Fate of Atlantis</a></li>
<li><a href="#monkey-island-2">Monkey Island 2</a></li>
<li><a href="#how-the-videos-were-recorded">How the videos were recorded</a></li>
</ul>
</li>
</ul>
</div>
<h1 id="the-opl2lpt-sound-card">The OPL2LPT sound card</h1>
<p>Recently, the <a href="https://www.the8bitguy.com/" title="The 8-Bit Guy">8-Bit Guy</a> released a video about an <a href="https://www.youtube.com/watch?v=z3DU2mNBa6M" title="The 8-Bit Guy: Ad-Lib Sound Card for the Parallel Port">AdLib sound
card for the parallel port</a>, the <a href="https://serdashop.com/products/opl2lpt" title="OPL2LPT on Serdashop">OPL2LPT</a>. While current
motherboards don’t have a parallel port anymore, it’s easy to add a
<a href="https://www.amazon.fr/dp/B00YE0QATW/" title="SIENOC PCI (PCI-E TO RS232+DB25 Adapter) on Amazon">PCI-Express one</a>. I bought a pre-soldered <em>OPL2LPT</em> and a few
days later, it was in my milk box:</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 400px"><span class="lf-media-inner" style="padding-bottom: 80.250%"><img alt="OPL2LPT sound card" src="https://media-bernat-ch.b-cdn.net/images/opl2lpt@1x.b262f8b6a092c6.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/opl2lpt@1x.b262f8b6a092c6.jpg 503w,https://media-bernat-ch.b-cdn.net/images/opl2lpt@2x.efd68332711c2e.jpg 800w" sizes="auto, (max-width: 400px) 100vw, 400px" width="400" height="321" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAFBAQMAAABjE2sFAAAAA1BMVEU/RVP3ISR5AAAAJ0lEQVR42u3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAICDAT/zAAGtT+9TAAAAAElFTkSuQmCC)"/></span></div><figcaption>The OPL2LPT sound card on an original “Day of the Tentacle” box to indicate scale.</figcaption></figure>
<div class="admonition">
<p class="admonition-title">Update (2018-03)</p>
<p><del>You can also buy a 3D-printed enclosure for the <em>OPL2LPT</em>.</del> After
writing this article, I have been offered one:</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 400px"><span class="lf-media-inner" style="padding-bottom: 84.750%"><img alt="OPL2LPT enclosure" src="https://media-bernat-ch.b-cdn.net/images/opl2lpt-case@1x.8a82af2776642a.jpg" srcset="https://media-bernat-ch.b-cdn.net/images/opl2lpt-case@1x.8a82af2776642a.jpg 503w,https://media-bernat-ch.b-cdn.net/images/opl2lpt-case@2x.c219b02bd57672.jpg 800w" sizes="auto, (max-width: 400px) 100vw, 400px" width="400" height="339" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAFTAQMAAAAtDciVAAAAA1BMVEXeqW+CpV6JAAAAJUlEQVR42u3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAGhDiQAB5OCYkAAAAABJRU5ErkJggg==)"/></span></div><figcaption>The OPL2LPT sound card in its 3D-printed enclosure on a “Monkey Island 4” box.</figcaption></figure>
</div>
<div class="admonition">
<p class="admonition-title">Update (2018-07)</p>
<p>The <a href="https://serdashop.com/products/opl3lpt" title="OPL3LPT on Serdashop">OPL3LPT</a> is now available. It features a similar design but with an
OPL3 chip.</p>
</div>
<p>The expected mode of operation for such a device is to plug it into an
ISA parallel port (accessible through I/O port 0x378), load a <a href="https://github.com/pdewacht/adlipt/tree/master/adlipt" title="ADLiPT: DOS driver for the OPL2LPT"><abbr title="Disk Operating System">DOS</abbr>
driver</a> to intercept calls to AdLib’s address, and run some
AdLib-compatible game. While correctly supported by Linux, the
PCI-Express parallel port doesn’t operate like an ISA one. <a href="https://www.qemu.org/" title="QEMU: generic and open source machine emulator and virtualizer">QEMU</a>
comes with a parallel port emulation but, due to <a href="https://github.com/pdewacht/adlipt/issues/3" title="OPL2LPT: Not working with QEMU parallel port emulation">timing issues</a>,
cannot correctly drive the <em>OPL2LPT</em>. However, <a href="https://www.virtualbox.org/" title="Oracle VM VirtualBox">VirtualBox</a>
emulation is good enough.<sup id="fnref:vbox"><a class="footnote-ref" href="#fn:vbox">1</a></sup></p>
<p>On Linux, the <em>OPL2LPT</em> can be programmed almost like an <a href="http://shipbrook.net/jeff/sb.html" title="Programming the AdLib/Sound Blaster FM Music Chips">actual
AdLib</a>. The following code writes a value to a register:</p>
<div class="language-c codehilite"><pre><span/><code><span class="k">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">lpt_write</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ctrl</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">  </span><span class="n">ieee1284_write_data</span><span class="p">(</span><span class="n">port</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">);</span>
<span class="w">  </span><span class="n">ieee1284_write_control</span><span class="p">(</span><span class="n">port</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">ctrl</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">C1284_NINIT</span><span class="p">)</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="n">C1284_INVERTED</span><span class="p">);</span>
<span class="w">  </span><span class="n">ieee1284_write_control</span><span class="p">(</span><span class="n">port</span><span class="p">,</span><span class="w">  </span><span class="n">ctrl</span><span class="w">                </span><span class="o">^</span><span class="w"> </span><span class="n">C1284_INVERTED</span><span class="p">);</span>
<span class="w">  </span><span class="n">ieee1284_write_control</span><span class="p">(</span><span class="n">port</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">ctrl</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">C1284_NINIT</span><span class="p">)</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="n">C1284_INVERTED</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">opl_write</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">reg</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">  </span><span class="n">lpt_write</span><span class="p">(</span><span class="n">reg</span><span class="p">,</span><span class="w"> </span><span class="n">C1284_NSELECTIN</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">C1284_NSTROBE</span><span class="p">);</span>
<span class="w">  </span><span class="n">usleep</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span><span class="w"> </span><span class="c1">// 3.3 microseconds</span>

<span class="w">  </span><span class="n">lpt_write</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">C1284_NSELECTIN</span><span class="p">);</span>
<span class="w">  </span><span class="n">usleep</span><span class="p">(</span><span class="mi">23</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>

<p>To “natively” use the <em>OPL2LPT</em>, I have modified the following
applications:</p>
<ul>
<li><a href="https://www.scummvm.org/" title="ScummVM">ScummVM</a>, an emulator for classic point-and-click adventure games, including
   many Lucas­Arts games—<a href="https://github.com/scummvm/scummvm/pull/1137" title="AUDIO: add support for OPL2LPT">patch</a><sup id="fnref:scummvm"><a class="footnote-ref" href="#fn:scummvm">2</a></sup></li>
<li><a href="https://www.qemu.org/" title="QEMU: generic and open source machine emulator and virtualizer">QEMU</a>, a quick generic emulator—<a href="https://patchwork.ozlabs.org/project/qemu-devel/patch/20180218144021.11641-1-vincent@bernat.im/" title="[RFC,v1] hw/audio/opl2lpt: add support for OPL2LPT">patch</a> with a minimal emulation
   for timers and hard-coded sleep delays 🙄</li>
<li><a href="https://www.dosbox.com/" title="DOSBox, an x86 emulator with DOS">DOSBox</a>, an x86 emulator bundled with <abbr title="Disk Operating System">DOS</abbr>—<a href="https://github.com/vincentbernat/dosbox/compare/feature/opl2lpt" title="Add OPL2LPT support">patch</a>
   with a complete emulation for timers and a dedicated working thread<sup id="fnref:delays"><a class="footnote-ref" href="#fn:delays">3</a></sup></li>
</ul>
<p>You can compare the results in the following video, with the
introduction of <a href="https://en.wikipedia.org/wiki/Indiana_Jones_and_the_Last_Crusade:_The_Graphic_Adventure" title="Indiana Jones and the Last Crusade: The Graphic Adventure on Wikipedia">Indiana Jones and the Last Crusade</a>, released in
1989:<sup id="fnref:nostalgia"><a class="footnote-ref" href="#fn:nostalgia">4</a></sup></p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 854px"><span class="lf-media-inner" style="padding-bottom: 56.206%"><video width="854" height="480" controls="" preload="none" crossorigin="anonymous" poster="https://media-bernat-ch.b-cdn.net/images/posters/2018-adlib-opl2lpt-1-indy3.8fc987a1b940b5.jpg" class="lf-media lf-opaque"><source src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-1-indy3.m3u8" type="application/vnd.apple.mpegurl"/><source src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-1-indy3/progressive.mp4" type="video/mp4; codecs=&quot;mp4a.40.2,avc1.4d401f&quot;"/><track src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-1-indy3.chapters.vtt" kind="chapters" label="Chapters"/></video></span></div></figure>
<ul>
<li><a href="#video:seek-0">0:00</a>, <strong>DOSBox</strong> with an emulated <strong>PC speaker</strong></li>
<li><a href="#video:seek-58">0:58</a>, <strong>DOSBox</strong> with an emulated <strong>AdLib</strong></li>
<li><a href="#video:seek-111">1:51</a>, <strong>VirtualBox</strong> with the <strong>OPL2LPT</strong> (on an emulated parallel port)</li>
<li><a href="#video:seek-162">2:42</a>, patched <strong>ScummVM</strong> with the <strong>OPL2LPT</strong> (native)</li>
<li><a href="#video:seek-213">3:33</a>, patched <strong>QEMU</strong> with the <strong>OPL2LPT</strong> (native)</li>
<li><a href="#video:seek-264">4:24</a>, patched <strong>DOSBox</strong> with the <strong>OPL2LPT</strong> (native)</li>
<li><a href="#video:seek-317">5:17</a>, patched <strong>DOSBox</strong> with an improved <strong>OPL3 emulator</strong> (<a href="https://sourceforge.net/p/dosbox/patches/270/" title="Nuked OPL3 patch for DOSBox">Nuked OPL3</a>)</li>
<li><a href="#video:seek-370">6:10</a>, <strong>ScummVM</strong> with the <strong>CD track</strong> (<a href="https://en.wikipedia.org/wiki/FM_Towns" title="FM Towns on Wikipedia">FM Towns</a> version)</li>
</ul>
<p>I let you judge how good each option is! There are two ways to buy an
<del><em>OPL2LPT</em></del> <em>OPL3LPT</em>: in Europe, from <a href="https://serdashop.com/products/opl3lpt" title="OPL3LPT on Serdashop">Serdashop</a>
<del>or in North America, from <a href="https://web.archive.org/web/2018/https://www.the8bitguy.com/product/opl3lpt-ad-lib-compatible-parallel-sound-card/" title="OPL3LPT from The 8-Bit Guy">The 8-Bit Guy</a></del>.</p>
<h1 id="addendum">Addendum</h1>
<h2 id="indiana-jones-and-the-fate-of-atlantis">Indiana Jones and the Fate of Atlantis</h2>
<p>Here is another video featuring <a href="https://en.wikipedia.org/wiki/Indiana_jones_and_the_fate_of_atlantis" title="Indiana Jones and the Fate of Atlantis on Wikipedia">Indiana Jones and the Fate of
Atlantis</a>, released in 1992, running in <em>DOSBox</em> with the
<em>OPL2LPT</em>. It’s the second game using the <a href="https://en.wikipedia.org/wiki/IMUSE" title="iMUSE on Wikipedia">iMUSE</a> sound system:
music is synchronized with actions and transitions are done
seamlessly. Quite a feat at the time!</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 854px"><span class="lf-media-inner" style="padding-bottom: 56.206%"><video width="854" height="480" controls="" preload="none" crossorigin="anonymous" poster="https://media-bernat-ch.b-cdn.net/images/posters/2018-adlib-opl2lpt-2-indy4.85613a13a5d647.jpg" class="lf-media lf-opaque"><source src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-2-indy4.m3u8" type="application/vnd.apple.mpegurl"/><source src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-2-indy4/progressive.mp4" type="video/mp4; codecs=&quot;mp4a.40.2,avc1.4d401f&quot;"/></video></span></div></figure>
<h2 id="monkey-island-2">Monkey Island 2</h2>
<p>The first game featuring <em>iMUSE</em> is <a href="https://en.wikipedia.org/wiki/Monkey_Island_2:_LeChuck%27s_Revenge" title="Monkey Island 2: LeChuck's Revenge on Wikipedia">Monkey Island 2</a>, released
in 1991. The video below displays the first minutes of the game,
running in <em>DOSBox</em> with the <em>OPL2LPT</em>.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 854px"><span class="lf-media-inner" style="padding-bottom: 56.206%"><video width="854" height="480" controls="" preload="none" crossorigin="anonymous" poster="https://media-bernat-ch.b-cdn.net/images/posters/2018-adlib-opl2lpt-3-monkey2.b6ef8dfec7ca65.jpg" class="lf-media lf-opaque"><source src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-3-monkey2.m3u8" type="application/vnd.apple.mpegurl"/><source src="https://media.bernat.ch/videos/2018-adlib-opl2lpt-3-monkey2/progressive.mp4" type="video/mp4; codecs=&quot;mp4a.40.2,avc1.4d401f&quot;"/></video></span></div></figure>
<p>Notably, at <a href="#video:seek-333">5:33</a>, when Guybrush is in Woodtick, a
small town on Scabb Island, the music plays around a variation of a
basic theme with a different instrument for each place without any
interruption.</p>
<h2 id="how-the-videos-were-recorded">How the videos were recorded</h2>
<p>With a VGA adapter, many games use <a href="https://en.wikipedia.org/wiki/Mode_13h" title="Mode 13h on Wikipedia">Mode 13h</a>, a 256-color mode with
a 320×200 resolution. On a 4:3 display, this mode doesn’t feature
square pixels: they are stretched vertically by a factor of 1.2.</p>
<p>The above videos were recorded with <a href="https://ffmpeg.org/" title="FFmpeg: cross-platform solution to record, convert and stream audio and video">FFmpeg</a> (and edited with
<a href="https://www.blender.org/" title="Free and Open 3D creation software">Blender</a>). It packs a lot of <a href="https://ffmpeg.org/ffmpeg-filters.html" title="FFmpeg Filters Documentation">useful filters</a> making it easy to
automate video capture. Here is an example:</p>
<div class="language-bash codehilite"><pre><span/><code><span class="nv">FONT</span><span class="o">=</span><span class="s2">"font=Monkey Island 1991 refined:</span>
<span class="s2">      fontcolor=OrangeRed:</span>
<span class="s2">      fontsize=16:</span>
<span class="s2">      x=w-text_w-10"</span>
ffmpeg<span class="w"> </span>-y<span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-thread_queue_size<span class="w"> </span><span class="m">64</span><span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-f<span class="w"> </span>x11grab<span class="w"> </span>-draw_mouse<span class="w"> </span><span class="m">0</span><span class="w"> </span>-r<span class="w"> </span><span class="m">30</span><span class="w"> </span>-s<span class="w"> </span>640x400<span class="w"> </span>-i<span class="w"> </span>:0+844,102<span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-thread_queue_size<span class="w"> </span><span class="m">64</span><span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-f<span class="w"> </span>pulse<span class="w"> </span>-ac<span class="w"> </span><span class="m">1</span><span class="w"> </span>-i<span class="w"> </span>default<span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-filter_complex<span class="w"> </span><span class="s2">"[0:v]pad=854:400:0:0,</span>
<span class="s2">       drawtext=</span><span class="si">${</span><span class="nv">FONT</span><span class="si">}</span><span class="s2">:y= 10:text=Indiana Jones 3,</span>
<span class="s2">       drawtext=</span><span class="si">${</span><span class="nv">FONT</span><span class="si">}</span><span class="s2">:y= 34:text=Intro,</span>
<span class="s2">       drawtext=</span><span class="si">${</span><span class="nv">FONT</span><span class="si">}</span><span class="s2">:y=100:text=DOSBox,</span>
<span class="s2">       drawtext=</span><span class="si">${</span><span class="nv">FONT</span><span class="si">}</span><span class="s2">:y=124:text=VGA,</span>
<span class="s2">       drawtext=</span><span class="si">${</span><span class="nv">FONT</span><span class="si">}</span><span class="s2">:y=148:text=PC speaker,</span>
<span class="s2">       scale=854:480:flags=neighbor[game];</span>
<span class="s2">       [1:a]volumedetect;</span>
<span class="s2">       [1:a]showwaves=s=214x100:colors=OrangeRed:scale=lin[waves];</span>
<span class="s2">       [1:a]showcqt=s=214x100[spectrum];</span>
<span class="s2">       [waves][spectrum]vstack[vis];</span>
<span class="s2">       [game][vis]overlay=x=640:y=280"</span><span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-pix_fmt<span class="w"> </span>yuv420p<span class="w"> </span>-c:v<span class="w"> </span>libx264<span class="w"> </span>-qp<span class="w"> </span><span class="m">0</span><span class="w"> </span>-preset<span class="w"> </span>ultrafast<span class="w"> </span><span class="se">\</span>
<span class="w">  </span>indy3-dosbox-pcspkr.mkv
</code></pre></div>

<p>The interesting part is the <code>filter_complex</code> argument. The input video
is <a href="https://ffmpeg.org/ffmpeg-filters.html#pad-1" title="FFmpeg pad filter">padded</a> from 640×400 to 854×400 as a first step to a
16:9 aspect ratio.<sup id="fnref:blur"><a class="footnote-ref" href="#fn:blur">5</a></sup> Using <a href="https://www.ptless.org/sfomi/" title="The Secret Font of Monkey Island">The Secret Font of Monkey
Island</a>, some <a href="https://ffmpeg.org/ffmpeg-filters.html#drawtext" title="FFmpeg drawtext filter">text</a> is added to the right of
the video. The result is then <a href="https://ffmpeg.org/ffmpeg-filters.html#scale" title="FFmpeg scale filter">scaled</a> to 854×480 to get
the final aspect ratio while stretching pixels to the expected 1.2
factor. The video up to this point is sent to a stream named
<code>game</code>. As a second step, from the input audio, we build two
visualizations: a <a href="https://ffmpeg.org/ffmpeg-filters.html#showwaves" title="FFmpeg showwaves filter">waveform</a> and a
<a href="https://ffmpeg.org/ffmpeg-filters.html#showcqt" title="FFmpeg showcqt filter">spectrum</a>. They are <a href="https://ffmpeg.org/ffmpeg-filters.html#vstack" title="FFmpeg vstack filter">stacked
vertically</a> and the result is a stream named <code>vis</code>. The
last step is to <a href="https://ffmpeg.org/ffmpeg-filters.html#overlay" title="FFmpeg overlay filter">overlay</a> the visualization stream
over the gameplay stream.</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:vbox">
<p>There is no dialog to configure a parallel port. This needs
to be done from the command-line after the instance creation:</p>
<div class="language-bash-session codehilite"><pre><span/><code><span class="gp">$ </span>VBoxManage<span class="w"> </span>modifyvm<span class="w"> </span><span class="s2">"FreeDOS (games)"</span><span class="w"> </span>--lptmode1<span class="w"> </span>/dev/parport0
<span class="gp">$ </span>VBoxManage<span class="w"> </span>modifyvm<span class="w"> </span><span class="s2">"FreeDOS (games)"</span><span class="w"> </span>--lpt1<span class="w"> </span>0x378<span class="w"> </span><span class="m">7</span>
</code></pre></div>

<p><a class="footnote-backref" href="#fnref:vbox" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:scummvm">
<p>The patch for <em>ScummVM</em> has been merged. Support for the
<em>OPL2LPT</em> should appear in the 2.1 release. At compile-time, the
<code>--enable-opl2lpt</code> option should be specified. <a class="footnote-backref" href="#fnref:scummvm" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:delays">
<p>With <em>QEMU</em> or <em>DOSBox</em>, it should be the responsibility of
the executing game to respect the required delays for the OPL2 to
process the received bytes. However, <em>QEMU</em> doesn’t seem to try to
emulate I/O delays while <em>DOSBox</em> <del>seems to not be precise
enough</del> <ins>works with 1-ms chunks of time</ins>. For the
latter, the <em>OPL2LPT</em> is managed from a dedicated thread receiving
the writes and ensuring the required delays are met. <a class="footnote-backref" href="#fnref:delays" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:nostalgia">
<p><em>Indiana Jones and the Last Crusade</em> was the first game
I tried after plugging in the brand new AdLib sound card I
compelled my parents to buy on a trip to Canada in 1992. At the
time, no brick and mortar retailer sold this card in my French
city and online purchases (through the <a href="https://en.wikipedia.org/wiki/Minitel" title="Minitel on Wikipedia">Minitel</a>) were limited
to consumer goods (like a VHS player). Hard times. 😏</p>
<p>The video is running the VGA version (320×200,
256 colors), released in 1990. However, back in the day, I
was playing the CGA/EGA version (320×200, 4 fixed colors or
640×350, 16 colors from a palette of 64). <a class="footnote-backref" href="#fnref:nostalgia" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:blur">
<p>A common method to extend a 4:3 video to a 16:9 aspect ratio
without adding black bars is to add a blurred background using the
same video as a source. I didn’t do this here but it is also
<a href="https://stackoverflow.com/questions/30789367/ffmpeg-how-to-convert-vertical-video-with-black-sides-to-video-169-with-blur" title="Stack Overflow: FFmpeg: How to convert vertical video with black sides, to video 16:9, with blurred background sides">possible with FFmpeg</a>! <a class="footnote-backref" href="#fnref:blur" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>
      </div>
    </content>
  </entry>
  <entry>
    <title type="html">Reduce your France Télécom bill</title>
    <author><name>Vincent Bernat</name></author>
    <link href="https://vincent.bernat.ch/en/blog/1997-reduce-bill-ft" rel="alternate"/>
    <link href="https://vincent.bernat.ch/en/blog/1997-reduce-bill-ft#isso-thread" rel="replies" type="text/html"/>
    <updated>1997-08-01T14:00:00Z</updated>
    <id>http://www.luffy.cx/en/blog/1997-reduce-bill-ft.html</id>

    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
<div class="admonition">
<p class="admonition-title">Note</p>
<p>This article was published in “<a href="https://web.archive.org/web/1998/http://www.multimania.com/www/accueil.shtml">W</a>,” a web directory accompanied by
several articles that I maintained between 1996 and 1998. For the purpose of
historical preservation of this dial-up Internet era in France, it is
reproduced here, translated into English.</p>
</div>
<p>The scenario is classic: you buy a modem, get an Internet subscription, surf for
a month or more without a care, and then comes the France Télécom bill with a
total amount spanning at least 4 digits. The charm is then broken and the
conclusion is obvious: surfing is expensive. Yet there must be a way to reduce
this bill while continuing to surf normally. There are indeed many ways to
achieve this goal. Here are most of them.</p>
<div class="toc">
<ul>
<li><a href="#choosing-your-provider">Choosing your provider</a></li>
<li><a href="#choosing-your-connection-hours">Choosing your connection hours</a></li>
<li><a href="#timing">Timing</a></li>
<li><a href="#local-package-primaliste-temporalis">Local package, Primaliste, Temporalis</a></li>
<li><a href="#a-matter-of-organization">A matter of organization</a></li>
<li><a href="#and-in-the-future">And in the future?</a></li>
</ul>
</div>
<h1 id="choosing-your-provider">Choosing your provider</h1>
<p>This seems obvious, but it deserves clarification for beginners in modem
telecommunications: you must choose your provider above all based on where it is
located. Today, most providers offer access points scattered throughout France.
This access point is what you will call to connect to the Internet, and the
price of the call will depend on the distance separating you from this point. So
choose a provider that offers an access point in your local or extended local
area.</p>
<p>What is this area? A consultation of the directory will show you. If you call
your provider outside this area, chances are that the gigantic bill you received
comes from there.</p>
<p>Some providers offer IP Kiosk. This is a service that allows you to call
anywhere in France for the price of a local call. The number is the same for
everyone. However, be careful, only take this solution as a last resort, indeed,
the IP Kiosk has several drawbacks: it is slow (except in version 2, available
only at certain providers including Wanadoo), often saturated (this will cost
you several telephone units) and does not allow you to benefit from certain
advantages (local package, primaliste, temporalis).</p>
<h1 id="choosing-your-connection-hours">Choosing your connection hours</h1>
<p>Second technique to save several hundred French francs on the bill: choose your
connection hours. If you were connecting at any time, you can undoubtedly
significantly reduce your bill by following these tips. By calling during
certain time slots, you can benefit from significant reductions.</p>
<p>At red rate (or normal), you pay one telephone unit (1 UT = FF 0.742 including
VAT or FF 0.65 excluding VAT) every 3 minutes. At blue night rate, you pay one
telephone unit every 9 minutes, which is a 200% reduction! Here is the table
summarizing the different time slots:</p>
<div class="lf-table"><table>
<thead>
<tr>
<th/>
<th>6h→</th>
<th>8h→</th>
<th>12h30→</th>
<th>13h30→</th>
<th>18h→</th>
<th>21h30→</th>
<th>22h30→6h</th>
</tr>
</thead>
<tbody>
<tr>
<td><em>Monday to Friday</em></td>
<td>$$</td>
<td>$$$$</td>
<td>$$$</td>
<td>$$$$</td>
<td>$$$</td>
<td>$$</td>
<td>$</td>
</tr>
<tr>
<td><em>Saturday</em></td>
<td>$$</td>
<td>$$$$</td>
<td>$$$</td>
<td>$$</td>
<td>$$</td>
<td>$$</td>
<td>$</td>
</tr>
<tr>
<td><em>Sunday and public holidays</em></td>
<td>$$</td>
<td>$$</td>
<td>$$</td>
<td>$$</td>
<td>$$</td>
<td>$$</td>
<td>$</td>
</tr>
</tbody>
</table>
</div><ul>
<li>$$$$ (<em>Red</em>): 1 UT every 3 minutes</li>
<li>$$$ (<em>White</em>): 1 UT every 4 and a half minutes</li>
<li>$$ (<em>Blue</em>): 1 UT every 6 minutes</li>
<li>$ (<em>Blue night</em>): 1 UT every 9 minutes</li>
</ul>
<p>In short, wait a little bit before connecting, it can save you a few francs. Do
long transfers earlier in the morning or later in the evening, as the case may
be.</p>
<h1 id="timing">Timing</h1>
<p>Now, you need to monitor each telephone unit. Any unit you start, you pay for.
So you might as well consume it entirely.</p>
<p>Two solutions are available to you: a watch, a pencil and a little patience, or
software that replaces all that. The goal is to time precisely how long you have
been connected since the remote modem picked up. This way, you can fully enjoy
the unit and avoid hanging up when a new unit has just started.</p>
<p>Dedicated software like PTime or TarifCom is much more practical. They do all
this automatically: calculate what you spent, track how long you stayed online,
and warn you a few seconds before the end of the unit. Set this warning to
around 25 seconds. This avoids having to abruptly cut the call or seeing the
next unit pass during a hard disk swap. You will be able to fully enjoy the unit
and also plan your connection sessions. You can estimate if you can afford to
connect today. This helps avoid surprises when the bill arrives.</p>
<figure class="lf-fullbleed"><div class="lf-media-outer" style="width: 525px"><span class="lf-media-inner" style="padding-bottom: 56.952%"><img alt="Screenshot of TarifCom, one of the telecommunications price tracking&#10;software" src="https://media-bernat-ch.b-cdn.net/images/tarifcom.8a138af929a8f3.jpg" width="525" height="299" class="lf-media lf-opaque" style="background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAg0AAAErAQMAAABnyyJhAAAAA1BMVEXh4N9HSLvkAAAAKklEQVR42u3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAC4ME5BAAFTaIR2AAAAAElFTkSuQmCC)"/></span></div><figcaption>TarifCom: real-time tracking of telecommunications prices</figcaption></figure>
<h1 id="local-package-primaliste-temporalis">Local package, Primaliste, Temporalis</h1>
<p>Can we still save money? Yes! Get the local package right now without
hesitation, as long as you spend more than 6 hours on the phone after 6 PM every
month. For FF 30 per month, it offers you 6 free hours after 6 PM. In other
words, for 6 hours, you get the blue night rate after 6 PM. Be careful however:
the package actually covers 12 hours every two months. You can spend all your
package during the first month. Also note that billing happens almost to the
second. The minimum unit is the minute, then the second. If you connect for 54
seconds, one minute gets deducted from the package. If you connect for 1 minute
and 16 seconds, that exact time gets deducted.</p>
<p>Now, you need to choose between Primaliste and Temporalis. Primaliste offers 15%
discount on 6 chosen numbers and on calls of more than one minute. Temporalis
offers a duration-based discount. You can get up to 30% discount on a phone call
lasting more than 30 minutes. These two offers are not cumulative. You need to
choose the one that suits you best: Primaliste for fairly short calls,
Temporalis if you stay online for a long time. Your FT agency should be able to
tell you which service is most profitable by examining your last bill.</p>
<p>These promotions are not applicable to IP Kiosk—except the local package!</p>
<h1 id="a-matter-of-organization">A matter of organization</h1>
<p>We have seen the best ways to save on an FT bill. There are others whose results
are more difficult to assess. You can write down on a piece of paper everything
you need to do once connected. Then only connect when the paper is full enough,
during a favorable time slot.</p>
<p>You can also try to automate as many things as possible. Launch several services
automatically (email retrieval, news, etc.). Use tools to capture Web pages to
view them offline and save online time. Read and write news offline. Do the same
for mail. Also avoid IRC, as it costs a lot! 🙂 Launch multiple browsers to take
advantage of all the bandwidth. Save what interests you to read it comfortably
once disconnected. In short, automate!</p>
<h1 id="and-in-the-future">And in the future?</h1>
<p>France Télécom wants to develop telecommunications in France and make us love
the year 2000. They decided to simplify the grid of time slots. Good news? No.
The white rate, and especially the blue night rate, will be eliminated! During
the week, the blue rate will take effect around 6 PM. In short, at night, the
hour will go from FF 5 to FF 7 (approximately). France Télécom has promised to
study an offer for Internet users. Will we pay double what others pay?</p>
<p>At the start of the school year, we will also see the switch to per-second
billing. Good news? Maybe. We have to see the conditions and especially the
rates offered. One last thing: 1998 will be the year of deregulation of
telecommunications in France. Competition will be able to propose offers that
can only be cheaper. However, companies will mainly benefit. We still have a
long way to go to have free local calls (or at one unit, regardless of duration)
as is done in the United States or Canada.</p>
      </div>
    </content>
  </entry>
</feed>