mirror of
https://github.com/cmosher01/Epple-II.git
synced 2024-07-16 07:28:56 +00:00
2326 lines
109 KiB
HTML
2326 lines
109 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<meta name="generator" content="AsciiDoc 8.6.7">
|
|
<title>Epple ][</title>
|
|
<style type="text/css">
|
|
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
|
|
|
/* Default font. */
|
|
body {
|
|
font-family: Georgia,serif;
|
|
}
|
|
|
|
/* Title font. */
|
|
h1, h2, h3, h4, h5, h6,
|
|
div.title, caption.title,
|
|
thead, p.table.header,
|
|
#toctitle,
|
|
#author, #revnumber, #revdate, #revremark,
|
|
#footer {
|
|
font-family: Arial,Helvetica,sans-serif;
|
|
}
|
|
|
|
body {
|
|
margin: 1em 5% 1em 5%;
|
|
}
|
|
|
|
a {
|
|
color: blue;
|
|
text-decoration: underline;
|
|
}
|
|
a:visited {
|
|
color: fuchsia;
|
|
}
|
|
|
|
em {
|
|
font-style: italic;
|
|
color: navy;
|
|
}
|
|
|
|
strong {
|
|
font-weight: bold;
|
|
color: #083194;
|
|
}
|
|
|
|
h1, h2, h3, h4, h5, h6 {
|
|
color: #527bbd;
|
|
margin-top: 1.2em;
|
|
margin-bottom: 0.5em;
|
|
line-height: 1.3;
|
|
}
|
|
|
|
h1, h2, h3 {
|
|
border-bottom: 2px solid silver;
|
|
}
|
|
h2 {
|
|
padding-top: 0.5em;
|
|
}
|
|
h3 {
|
|
float: left;
|
|
}
|
|
h3 + * {
|
|
clear: left;
|
|
}
|
|
h5 {
|
|
font-size: 1.0em;
|
|
}
|
|
|
|
div.sectionbody {
|
|
margin-left: 0;
|
|
}
|
|
|
|
hr {
|
|
border: 1px solid silver;
|
|
}
|
|
|
|
p {
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
|
|
ul, ol, li > p {
|
|
margin-top: 0;
|
|
}
|
|
ul > li { color: #aaa; }
|
|
ul > li > * { color: black; }
|
|
|
|
pre {
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
#author {
|
|
color: #527bbd;
|
|
font-weight: bold;
|
|
font-size: 1.1em;
|
|
}
|
|
#email {
|
|
}
|
|
#revnumber, #revdate, #revremark {
|
|
}
|
|
|
|
#footer {
|
|
font-size: small;
|
|
border-top: 2px solid silver;
|
|
padding-top: 0.5em;
|
|
margin-top: 4.0em;
|
|
}
|
|
#footer-text {
|
|
float: left;
|
|
padding-bottom: 0.5em;
|
|
}
|
|
#footer-badges {
|
|
float: right;
|
|
padding-bottom: 0.5em;
|
|
}
|
|
|
|
#preamble {
|
|
margin-top: 1.5em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
div.imageblock, div.exampleblock, div.verseblock,
|
|
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
|
div.admonitionblock {
|
|
margin-top: 1.0em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
div.admonitionblock {
|
|
margin-top: 2.0em;
|
|
margin-bottom: 2.0em;
|
|
margin-right: 10%;
|
|
color: #606060;
|
|
}
|
|
|
|
div.content { /* Block element content. */
|
|
padding: 0;
|
|
}
|
|
|
|
/* Block element titles. */
|
|
div.title, caption.title {
|
|
color: #527bbd;
|
|
font-weight: bold;
|
|
text-align: left;
|
|
margin-top: 1.0em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
div.title + * {
|
|
margin-top: 0;
|
|
}
|
|
|
|
td div.title:first-child {
|
|
margin-top: 0.0em;
|
|
}
|
|
div.content div.title:first-child {
|
|
margin-top: 0.0em;
|
|
}
|
|
div.content + div.title {
|
|
margin-top: 0.0em;
|
|
}
|
|
|
|
div.sidebarblock > div.content {
|
|
background: #ffffee;
|
|
border: 1px solid #dddddd;
|
|
border-left: 4px solid #f0f0f0;
|
|
padding: 0.5em;
|
|
}
|
|
|
|
div.listingblock > div.content {
|
|
border: 1px solid #dddddd;
|
|
border-left: 5px solid #f0f0f0;
|
|
background: #f8f8f8;
|
|
padding: 0.5em;
|
|
}
|
|
|
|
div.quoteblock, div.verseblock {
|
|
padding-left: 1.0em;
|
|
margin-left: 1.0em;
|
|
margin-right: 10%;
|
|
border-left: 5px solid #f0f0f0;
|
|
color: #888;
|
|
}
|
|
|
|
div.quoteblock > div.attribution {
|
|
padding-top: 0.5em;
|
|
text-align: right;
|
|
}
|
|
|
|
div.verseblock > pre.content {
|
|
font-family: inherit;
|
|
font-size: inherit;
|
|
}
|
|
div.verseblock > div.attribution {
|
|
padding-top: 0.75em;
|
|
text-align: left;
|
|
}
|
|
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
|
div.verseblock + div.attribution {
|
|
text-align: left;
|
|
}
|
|
|
|
div.admonitionblock .icon {
|
|
vertical-align: top;
|
|
font-size: 1.1em;
|
|
font-weight: bold;
|
|
text-decoration: underline;
|
|
color: #527bbd;
|
|
padding-right: 0.5em;
|
|
}
|
|
div.admonitionblock td.content {
|
|
padding-left: 0.5em;
|
|
border-left: 3px solid #dddddd;
|
|
}
|
|
|
|
div.exampleblock > div.content {
|
|
border-left: 3px solid #dddddd;
|
|
padding-left: 0.5em;
|
|
}
|
|
|
|
div.imageblock div.content { padding-left: 0; }
|
|
span.image img { border-style: none; }
|
|
a.image:visited { color: white; }
|
|
|
|
dl {
|
|
margin-top: 0.8em;
|
|
margin-bottom: 0.8em;
|
|
}
|
|
dt {
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0;
|
|
font-style: normal;
|
|
color: navy;
|
|
}
|
|
dd > *:first-child {
|
|
margin-top: 0.1em;
|
|
}
|
|
|
|
ul, ol {
|
|
list-style-position: outside;
|
|
}
|
|
ol.arabic {
|
|
list-style-type: decimal;
|
|
}
|
|
ol.loweralpha {
|
|
list-style-type: lower-alpha;
|
|
}
|
|
ol.upperalpha {
|
|
list-style-type: upper-alpha;
|
|
}
|
|
ol.lowerroman {
|
|
list-style-type: lower-roman;
|
|
}
|
|
ol.upperroman {
|
|
list-style-type: upper-roman;
|
|
}
|
|
|
|
div.compact ul, div.compact ol,
|
|
div.compact p, div.compact p,
|
|
div.compact div, div.compact div {
|
|
margin-top: 0.1em;
|
|
margin-bottom: 0.1em;
|
|
}
|
|
|
|
tfoot {
|
|
font-weight: bold;
|
|
}
|
|
td > div.verse {
|
|
white-space: pre;
|
|
}
|
|
|
|
div.hdlist {
|
|
margin-top: 0.8em;
|
|
margin-bottom: 0.8em;
|
|
}
|
|
div.hdlist tr {
|
|
padding-bottom: 15px;
|
|
}
|
|
dt.hdlist1.strong, td.hdlist1.strong {
|
|
font-weight: bold;
|
|
}
|
|
td.hdlist1 {
|
|
vertical-align: top;
|
|
font-style: normal;
|
|
padding-right: 0.8em;
|
|
color: navy;
|
|
}
|
|
td.hdlist2 {
|
|
vertical-align: top;
|
|
}
|
|
div.hdlist.compact tr {
|
|
margin: 0;
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
.comment {
|
|
background: yellow;
|
|
}
|
|
|
|
.footnote, .footnoteref {
|
|
font-size: 0.8em;
|
|
}
|
|
|
|
span.footnote, span.footnoteref {
|
|
vertical-align: super;
|
|
}
|
|
|
|
#footnotes {
|
|
margin: 20px 0 20px 0;
|
|
padding: 7px 0 0 0;
|
|
}
|
|
|
|
#footnotes div.footnote {
|
|
margin: 0 0 5px 0;
|
|
}
|
|
|
|
#footnotes hr {
|
|
border: none;
|
|
border-top: 1px solid silver;
|
|
height: 1px;
|
|
text-align: left;
|
|
margin-left: 0;
|
|
width: 20%;
|
|
min-width: 100px;
|
|
}
|
|
|
|
div.colist td {
|
|
padding-right: 0.5em;
|
|
padding-bottom: 0.3em;
|
|
vertical-align: top;
|
|
}
|
|
div.colist td img {
|
|
margin-top: 0.3em;
|
|
}
|
|
|
|
@media print {
|
|
#footer-badges { display: none; }
|
|
}
|
|
|
|
#toc {
|
|
margin-bottom: 2.5em;
|
|
}
|
|
|
|
#toctitle {
|
|
color: #527bbd;
|
|
font-size: 1.1em;
|
|
font-weight: bold;
|
|
margin-top: 1.0em;
|
|
margin-bottom: 0.1em;
|
|
}
|
|
|
|
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
|
margin-top: 0;
|
|
margin-bottom: 0;
|
|
}
|
|
div.toclevel2 {
|
|
margin-left: 2em;
|
|
font-size: 0.9em;
|
|
}
|
|
div.toclevel3 {
|
|
margin-left: 4em;
|
|
font-size: 0.9em;
|
|
}
|
|
div.toclevel4 {
|
|
margin-left: 6em;
|
|
font-size: 0.9em;
|
|
}
|
|
|
|
span.aqua { color: aqua; }
|
|
span.black { color: black; }
|
|
span.blue { color: blue; }
|
|
span.fuchsia { color: fuchsia; }
|
|
span.gray { color: gray; }
|
|
span.green { color: green; }
|
|
span.lime { color: lime; }
|
|
span.maroon { color: maroon; }
|
|
span.navy { color: navy; }
|
|
span.olive { color: olive; }
|
|
span.purple { color: purple; }
|
|
span.red { color: red; }
|
|
span.silver { color: silver; }
|
|
span.teal { color: teal; }
|
|
span.white { color: white; }
|
|
span.yellow { color: yellow; }
|
|
|
|
span.aqua-background { background: aqua; }
|
|
span.black-background { background: black; }
|
|
span.blue-background { background: blue; }
|
|
span.fuchsia-background { background: fuchsia; }
|
|
span.gray-background { background: gray; }
|
|
span.green-background { background: green; }
|
|
span.lime-background { background: lime; }
|
|
span.maroon-background { background: maroon; }
|
|
span.navy-background { background: navy; }
|
|
span.olive-background { background: olive; }
|
|
span.purple-background { background: purple; }
|
|
span.red-background { background: red; }
|
|
span.silver-background { background: silver; }
|
|
span.teal-background { background: teal; }
|
|
span.white-background { background: white; }
|
|
span.yellow-background { background: yellow; }
|
|
|
|
span.big { font-size: 2em; }
|
|
span.small { font-size: 0.6em; }
|
|
|
|
span.underline { text-decoration: underline; }
|
|
span.overline { text-decoration: overline; }
|
|
span.line-through { text-decoration: line-through; }
|
|
|
|
div.unbreakable { page-break-inside: avoid; }
|
|
|
|
|
|
/*
|
|
* xhtml11 specific
|
|
*
|
|
* */
|
|
|
|
tt {
|
|
font-family: "Courier New", Courier, monospace;
|
|
font-size: inherit;
|
|
color: navy;
|
|
}
|
|
|
|
div.tableblock {
|
|
margin-top: 1.0em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
div.tableblock > table {
|
|
border: 3px solid #527bbd;
|
|
}
|
|
thead, p.table.header {
|
|
font-weight: bold;
|
|
color: #527bbd;
|
|
}
|
|
p.table {
|
|
margin-top: 0;
|
|
}
|
|
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
|
div.tableblock > table[frame="void"] {
|
|
border-style: none;
|
|
}
|
|
div.tableblock > table[frame="hsides"] {
|
|
border-left-style: none;
|
|
border-right-style: none;
|
|
}
|
|
div.tableblock > table[frame="vsides"] {
|
|
border-top-style: none;
|
|
border-bottom-style: none;
|
|
}
|
|
|
|
|
|
/*
|
|
* html5 specific
|
|
*
|
|
* */
|
|
|
|
.monospaced {
|
|
font-family: "Courier New", Courier, monospace;
|
|
font-size: inherit;
|
|
color: navy;
|
|
}
|
|
|
|
table.tableblock {
|
|
margin-top: 1.0em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
thead, p.tableblock.header {
|
|
font-weight: bold;
|
|
color: #527bbd;
|
|
}
|
|
p.tableblock {
|
|
margin-top: 0;
|
|
}
|
|
table.tableblock {
|
|
border-width: 3px;
|
|
border-spacing: 0px;
|
|
border-style: solid;
|
|
border-color: #527bbd;
|
|
border-collapse: collapse;
|
|
}
|
|
th.tableblock, td.tableblock {
|
|
border-width: 1px;
|
|
padding: 4px;
|
|
border-style: solid;
|
|
border-color: #527bbd;
|
|
}
|
|
|
|
table.tableblock.frame-topbot {
|
|
border-left-style: hidden;
|
|
border-right-style: hidden;
|
|
}
|
|
table.tableblock.frame-sides {
|
|
border-top-style: hidden;
|
|
border-bottom-style: hidden;
|
|
}
|
|
table.tableblock.frame-none {
|
|
border-style: hidden;
|
|
}
|
|
|
|
th.tableblock.halign-left, td.tableblock.halign-left {
|
|
text-align: left;
|
|
}
|
|
th.tableblock.halign-center, td.tableblock.halign-center {
|
|
text-align: center;
|
|
}
|
|
th.tableblock.halign-right, td.tableblock.halign-right {
|
|
text-align: right;
|
|
}
|
|
|
|
th.tableblock.valign-top, td.tableblock.valign-top {
|
|
vertical-align: top;
|
|
}
|
|
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
|
vertical-align: middle;
|
|
}
|
|
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
|
vertical-align: bottom;
|
|
}
|
|
|
|
|
|
/*
|
|
* manpage specific
|
|
*
|
|
* */
|
|
|
|
body.manpage h1 {
|
|
padding-top: 0.5em;
|
|
padding-bottom: 0.5em;
|
|
border-top: 2px solid silver;
|
|
border-bottom: 2px solid silver;
|
|
}
|
|
body.manpage h2 {
|
|
border-style: none;
|
|
}
|
|
body.manpage div.sectionbody {
|
|
margin-left: 3em;
|
|
}
|
|
|
|
@media print {
|
|
body.manpage div#toc { display: none; }
|
|
}
|
|
@media screen {
|
|
body {
|
|
max-width: 50em; /* approximately 80 characters wide */
|
|
margin-left: 16em;
|
|
}
|
|
|
|
#toc {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
bottom: 0;
|
|
width: 13em;
|
|
padding: 0.5em;
|
|
padding-bottom: 1.5em;
|
|
margin: 0;
|
|
overflow: auto;
|
|
border-right: 3px solid #f8f8f8;
|
|
background-color: white;
|
|
}
|
|
|
|
#toc .toclevel1 {
|
|
margin-top: 0.5em;
|
|
}
|
|
|
|
#toc .toclevel2 {
|
|
margin-top: 0.25em;
|
|
display: list-item;
|
|
color: #aaaaaa;
|
|
}
|
|
|
|
#toctitle {
|
|
margin-top: 0.5em;
|
|
}
|
|
}
|
|
</style>
|
|
<script type="text/javascript">
|
|
/*<![CDATA[*/
|
|
var asciidoc = { // Namespace.
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Table Of Contents generator
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
/* Author: Mihai Bazon, September 2002
|
|
* http://students.infoiasi.ro/~mishoo
|
|
*
|
|
* Table Of Content generator
|
|
* Version: 0.4
|
|
*
|
|
* Feel free to use this script under the terms of the GNU General Public
|
|
* License, as long as you do not remove or alter this notice.
|
|
*/
|
|
|
|
/* modified by Troy D. Hanson, September 2006. License: GPL */
|
|
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
|
|
|
|
// toclevels = 1..4.
|
|
toc: function (toclevels) {
|
|
|
|
function getText(el) {
|
|
var text = "";
|
|
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
|
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
|
|
text += i.data;
|
|
else if (i.firstChild != null)
|
|
text += getText(i);
|
|
}
|
|
return text;
|
|
}
|
|
|
|
function TocEntry(el, text, toclevel) {
|
|
this.element = el;
|
|
this.text = text;
|
|
this.toclevel = toclevel;
|
|
}
|
|
|
|
function tocEntries(el, toclevels) {
|
|
var result = new Array;
|
|
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
|
|
// Function that scans the DOM tree for header elements (the DOM2
|
|
// nodeIterator API would be a better technique but not supported by all
|
|
// browsers).
|
|
var iterate = function (el) {
|
|
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
|
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
|
var mo = re.exec(i.tagName);
|
|
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
|
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
|
}
|
|
iterate(i);
|
|
}
|
|
}
|
|
}
|
|
iterate(el);
|
|
return result;
|
|
}
|
|
|
|
var toc = document.getElementById("toc");
|
|
if (!toc) {
|
|
return;
|
|
}
|
|
|
|
// Delete existing TOC entries in case we're reloading the TOC.
|
|
var tocEntriesToRemove = [];
|
|
var i;
|
|
for (i = 0; i < toc.childNodes.length; i++) {
|
|
var entry = toc.childNodes[i];
|
|
if (entry.nodeName.toLowerCase() == 'div'
|
|
&& entry.getAttribute("class")
|
|
&& entry.getAttribute("class").match(/^toclevel/))
|
|
tocEntriesToRemove.push(entry);
|
|
}
|
|
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
|
toc.removeChild(tocEntriesToRemove[i]);
|
|
}
|
|
|
|
// Rebuild TOC entries.
|
|
var entries = tocEntries(document.getElementById("content"), toclevels);
|
|
for (var i = 0; i < entries.length; ++i) {
|
|
var entry = entries[i];
|
|
if (entry.element.id == "")
|
|
entry.element.id = "_toc_" + i;
|
|
var a = document.createElement("a");
|
|
a.href = "#" + entry.element.id;
|
|
a.appendChild(document.createTextNode(entry.text));
|
|
var div = document.createElement("div");
|
|
div.appendChild(a);
|
|
div.className = "toclevel" + entry.toclevel;
|
|
toc.appendChild(div);
|
|
}
|
|
if (entries.length == 0)
|
|
toc.parentNode.removeChild(toc);
|
|
},
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Footnotes generator
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
/* Based on footnote generation code from:
|
|
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
|
*/
|
|
|
|
footnotes: function () {
|
|
// Delete existing footnote entries in case we're reloading the footnodes.
|
|
var i;
|
|
var noteholder = document.getElementById("footnotes");
|
|
if (!noteholder) {
|
|
return;
|
|
}
|
|
var entriesToRemove = [];
|
|
for (i = 0; i < noteholder.childNodes.length; i++) {
|
|
var entry = noteholder.childNodes[i];
|
|
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
|
entriesToRemove.push(entry);
|
|
}
|
|
for (i = 0; i < entriesToRemove.length; i++) {
|
|
noteholder.removeChild(entriesToRemove[i]);
|
|
}
|
|
|
|
// Rebuild footnote entries.
|
|
var cont = document.getElementById("content");
|
|
var spans = cont.getElementsByTagName("span");
|
|
var refs = {};
|
|
var n = 0;
|
|
for (i=0; i<spans.length; i++) {
|
|
if (spans[i].className == "footnote") {
|
|
n++;
|
|
var note = spans[i].getAttribute("data-note");
|
|
if (!note) {
|
|
// Use [\s\S] in place of . so multi-line matches work.
|
|
// Because JavaScript has no s (dotall) regex flag.
|
|
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
|
spans[i].innerHTML =
|
|
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
|
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
|
spans[i].setAttribute("data-note", note);
|
|
}
|
|
noteholder.innerHTML +=
|
|
"<div class='footnote' id='_footnote_" + n + "'>" +
|
|
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
|
n + "</a>. " + note + "</div>";
|
|
var id =spans[i].getAttribute("id");
|
|
if (id != null) refs["#"+id] = n;
|
|
}
|
|
}
|
|
if (n == 0)
|
|
noteholder.parentNode.removeChild(noteholder);
|
|
else {
|
|
// Process footnoterefs.
|
|
for (i=0; i<spans.length; i++) {
|
|
if (spans[i].className == "footnoteref") {
|
|
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
|
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
|
n = refs[href];
|
|
spans[i].innerHTML =
|
|
"[<a href='#_footnote_" + n +
|
|
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
install: function(toclevels) {
|
|
var timerId;
|
|
|
|
function reinstall() {
|
|
asciidoc.footnotes();
|
|
if (toclevels) {
|
|
asciidoc.toc(toclevels);
|
|
}
|
|
}
|
|
|
|
function reinstallAndRemoveTimer() {
|
|
clearInterval(timerId);
|
|
reinstall();
|
|
}
|
|
|
|
timerId = setInterval(reinstall, 500);
|
|
if (document.addEventListener)
|
|
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
|
else
|
|
window.onload = reinstallAndRemoveTimer;
|
|
}
|
|
|
|
}
|
|
asciidoc.install(3);
|
|
/*]]>*/
|
|
</script>
|
|
</head>
|
|
<body class="article">
|
|
<div id="header">
|
|
<h1>Epple ][</h1>
|
|
<span id="author">Chris Mosher</span><br>
|
|
<span id="email" class="monospaced"><<a href="mailto:chris-keyword-epple2.4a8db3@mosher.mine.nu">chris-keyword-epple2.4a8db3@mosher.mine.nu</a>></span><br>
|
|
<div id="toc">
|
|
<div id="toctitle">Table of Contents</div>
|
|
<noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
|
|
</div>
|
|
</div>
|
|
<div id="content">
|
|
<div id="preamble">
|
|
<div class="sectionbody">
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="epple2logo.png" alt="epple2logo.png">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_introduction">Introduction</h2>
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p>Epple ][ is an emulator of the original APPLE ][ and APPLE ][ PLUS
|
|
computers from <a href="http://www.apple.com/">Apple, Inc.</a> It
|
|
runs on Windows and Linux platforms, and is released under
|
|
<a href="http://www.gnu.org/licenses/gpl-3.0-standalone.html">GPLv3</a>
|
|
<span class="image">
|
|
<img src="gplv3logo.png" alt="GPLv3">
|
|
</span></p></div>
|
|
<div class="paragraph"><p>It is written in C++ and is designed with cross-platform
|
|
portability in mind. It uses the <a href="http://www.libsdl.org/">SDL</a> graphics library.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_features">Features</h2>
|
|
<div class="sectionbody">
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
Cycle-accurate: emulates all MOS 6502 CPU cycles including “phantom reads”
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Video display is synchronized with CPU
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
NTSC video signal emulation: all video quirks emulated accurately
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Revision 0 motherboard (optional)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Multiple display types: monitor and TV emulation
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Can run full-screen or in a window
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
640x480 resolution
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Floating data bus, and video scanner
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Cards: Disk ][, language, firmware, clock
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Paddles (mouse emulates two paddles)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Cassette tape interface
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
PR#1 writes to standard output
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Accurate keyboard emulation, including the repeat key
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
It even emulates the POWER light!
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_screenshots">Screenshots</h2>
|
|
<div class="sectionbody">
|
|
<div class="sect2">
|
|
<h3 id="_dos_3_3_system_master_boot">DOS 3.3 System Master boot</h3>
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="dos330boot.png" alt="dos330boot.png">
|
|
</div>
|
|
</div>
|
|
<div class="paragraph"><p>Here we’ve configured an Apple ][ plus, with a disk
|
|
controller in slot 6, and a language card in slot 0.
|
|
We’ve booted the DOS 3.3 System Master disk. It correctly
|
|
identifies the machine as an Apple ][ plus, and then
|
|
loads Integer BASIC into the language card. You can switch
|
|
between Applesoft and Integer BASIC by using the <span class="monospaced">FP</span> and
|
|
<span class="monospaced">INT</span> commands.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_dos_3_1_system_master_on_revision_0_motherboard">DOS 3.1 System Master on Revision 0 motherboard</h3>
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="dos310rev0.png" alt="dos310rev0.png">
|
|
</div>
|
|
</div>
|
|
<div class="paragraph"><p>Here we’ve configured an Apple ][ (Integer BASIC ROMs),
|
|
with a Revision Zero motherboard, and a disk
|
|
controller (with 13-sector ROMs) in slot 6. With a
|
|
revision 0 motherboard, when the machine is powered-on,
|
|
the CPU doesn’t start actually running until you
|
|
manually press the RESET button. Also, the old Monitor
|
|
ROMs do not boot from the disk drives automatically;
|
|
you need to type <span class="monospaced">C600G</span> to boot.
|
|
We’ve booted the DOS 3.1 System Master disk and done a
|
|
catalog of it. As you can see, with a revision 0 motherboard,
|
|
the text is displayed in green and purple, which are also the
|
|
only two HIRES colors. Later revisions
|
|
of the motherboard added a “color burst killer” which is
|
|
active during text mode, so the text would be strictly white.
|
|
Two more HIRES colors, blue and orange, were also added in
|
|
later revisions.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_prodos_1_1_1_boot">PRODOS 1.1.1 boot</h3>
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="prodos.png" alt="prodos.png">
|
|
</div>
|
|
</div>
|
|
<div class="paragraph"><p>Here we’ve configured an Apple ][ plus with language card
|
|
and disk drive. We’re booting a PRODOS 1.1.1 disk.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_bishop_8217_s_apple_split">Bishop’s Apple Split</h3>
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="applesplit.png" alt="applesplit.png">
|
|
</div>
|
|
</div>
|
|
<div class="paragraph"><p>The October 1982 issue of <a href="http://en.wikipedia.org/wiki/Softalk">Softalk</a>
|
|
featured an article by Bob Bishop entitled
|
|
<a href="http://rich12345.tripod.com/aiivideo/softalk.html">Have an Apple Split</a>, which describes
|
|
in some detail the inner workings of the Apple ]['s video processing. Listings 1 and 2 from that
|
|
article show a short Applesoft program and assembly language subroutine that allow the Apple ][
|
|
to have a screen split between text and graphics display. To achieve this on the EPPLE ][,
|
|
copy the following text and paste it into the emulator (at the Applesoft <span class="monospaced">]</span> prompt). Since the
|
|
EPPLE ][ accurately emulates the video scanning and timing of the original Apple ][s, this
|
|
“split screen” technique works successfully.
|
|
The rest of the behavior described in the article (the floating data bus) is also emulated
|
|
faithfully by the EPPLE ][.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt><span style="font-weight: bold"><span style="color: #0000FF">CALL</span></span> <span style="color: #990000">-</span><span style="color: #993399">151</span>
|
|
|
|
<span style="color: #993399">300</span><span style="color: #990000">:</span>8D <span style="color: #993399">52</span> C0 A9 E0 A2 <span style="color: #993399">04</span> CD <span style="color: #993399">51</span> C0 D0 F9 CA D0 F8 A9
|
|
<span style="color: #993399">310</span><span style="color: #990000">:</span>A0 A2 <span style="color: #993399">04</span> CD <span style="color: #993399">50</span> C0 D0 F9 CA D0 F8 8D <span style="color: #993399">51</span> C0 <span style="color: #993399">60</span>
|
|
|
|
E000G
|
|
|
|
<span style="color: #993399">100</span> HOME
|
|
|
|
<span style="color: #993399">200</span> <span style="font-weight: bold"><span style="color: #0000FF">FOR</span></span> K <span style="color: #990000">=</span> <span style="color: #993399">0</span> TO <span style="color: #993399">39</span>
|
|
<span style="color: #993399">210</span> POKE <span style="color: #993399">1448</span><span style="color: #990000">+</span>K<span style="color: #990000">,</span> <span style="color: #993399">14</span><span style="color: #990000">*</span><span style="color: #993399">16</span>
|
|
<span style="color: #993399">220</span> POKE <span style="color: #993399">2000</span><span style="color: #990000">+</span>K<span style="color: #990000">,</span> <span style="color: #993399">10</span><span style="color: #990000">*</span><span style="color: #993399">16</span>
|
|
<span style="color: #993399">230</span> COLOR <span style="color: #990000">=</span> K<span style="color: #990000">+</span><span style="color: #993399">4</span>
|
|
<span style="color: #993399">240</span> VLIN <span style="color: #993399">24</span><span style="color: #990000">,</span> <span style="color: #993399">45</span> AT K
|
|
<span style="color: #993399">250</span> <span style="font-weight: bold"><span style="color: #0000FF">NEXT</span></span> K
|
|
|
|
<span style="color: #993399">300</span> VTAB <span style="color: #993399">6</span> <span style="color: #990000">:</span> HTAB <span style="color: #993399">17</span>
|
|
<span style="color: #993399">310</span> PRINT <span style="color: #FF0000">"APPLE II"</span>
|
|
|
|
<span style="color: #993399">400</span> <span style="font-weight: bold"><span style="color: #0000FF">CALL</span></span> <span style="color: #993399">768</span>
|
|
<span style="color: #993399">500</span> GOTO <span style="color: #993399">400</span>
|
|
|
|
RUN</tt></pre></div></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_mysterious_pink_line">Mysterious Pink Line</h3>
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="pinkmystery.png" alt="pinkmystery.png">
|
|
</div>
|
|
</div>
|
|
<div class="paragraph"><p>Jim Sather’s book
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
which was the primary
|
|
reference for the internal design of the EPPLE ][ emulator, describes the video
|
|
generation process of the Apple ][, in great detail, in Chapter 8.
|
|
On page 8-21 he shows a simple Applesoft BASIC program (shown below)
|
|
that shows an example of one of the hi-res idiosyncrasies on the Apple ][.
|
|
The program would logically draw three orange lines, but due to the
|
|
video cutoff and extension of half-dot shifted pixels, instead the right
|
|
line is brown, and there is a “mysterious pink line” (actually magenta)
|
|
on the far left of the screen. The EPPLE ][ faithfully emulates this behavior.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>NEW
|
|
|
|
<span style="color: #993399">10</span> HGR <span style="color: #990000">:</span> HCOLOR <span style="color: #990000">=</span> <span style="color: #993399">5</span> <span style="color: #990000">:</span> HPLOT <span style="color: #993399">5</span><span style="color: #990000">,</span><span style="color: #993399">159</span> TO <span style="color: #993399">5</span><span style="color: #990000">,</span><span style="color: #993399">0</span> TO <span style="color: #993399">279</span><span style="color: #990000">,</span><span style="color: #993399">0</span> TO <span style="color: #993399">279</span><span style="color: #990000">,</span><span style="color: #993399">159</span>
|
|
|
|
RUN</tt></pre></div></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_split_screen_hires_lores_colors">Split Screen HIRES/LORES colors</h3>
|
|
<div class="imageblock">
|
|
<div class="content">
|
|
<img src="splitcolors.png" alt="splitcolors.png">
|
|
</div>
|
|
</div>
|
|
<div class="paragraph"><p>Jim Sather’s book
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
shows an Applesoft BASIC
|
|
program and assembly language subroutine on pages 3-16 and 3-17 (reproduced
|
|
below) that produce the display shown here. The screen is split between HIRES
|
|
and LORES graphics by a timed loop that manipulates the screen switches.
|
|
(Press any key repeatedly to move the position of the split.)</p></div>
|
|
<div class="paragraph"><p>Notice that the Apple ][ can actually produce more HIRES colors than are
|
|
documented in the standard Apple reference manuals. White, black, green,
|
|
purple, blue, and orange are normally documented, but by careful manipulation
|
|
of the high-bit (half-dot shift indicator) of the HIRES display byte, many
|
|
other colors can be produced. The additional colors match some LORES colors.
|
|
Also notice that the text at the bottom of the screen is colored green and
|
|
purple while in mixed text/graphics mode. This is because the “color
|
|
burst killer” circuit is not active while displaying graphics on the
|
|
Apple ][ machines.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt><span style="font-weight: bold"><span style="color: #0000FF">CALL</span></span> <span style="color: #990000">-</span><span style="color: #993399">151</span>
|
|
1F00<span style="color: #990000">:</span>AC <span style="color: #993399">54</span> C0 A0 <span style="color: #993399">27</span> <span style="color: #993399">20</span> <span style="color: #993399">27</span> 1F
|
|
1F08<span style="color: #990000">:</span>AC <span style="color: #993399">10</span> C0 AC <span style="color: #993399">00</span> C0 <span style="color: #993399">30</span> F3
|
|
1F10<span style="color: #990000">:</span><span style="color: #993399">69</span> <span style="color: #993399">01</span> <span style="color: #993399">29</span> <span style="color: #993399">01</span> AA BC <span style="color: #993399">56</span> C0
|
|
1F18<span style="color: #990000">:</span>A2 <span style="color: #993399">08</span> <span style="color: #993399">20</span> <span style="color: #993399">31</span> 1F A0 <span style="color: #993399">31</span> <span style="color: #993399">20</span>
|
|
1F20<span style="color: #990000">:</span><span style="color: #993399">27</span> 1F <span style="color: #993399">18</span> <span style="color: #993399">90</span> E6 D0 <span style="color: #993399">01</span> <span style="color: #993399">88</span>
|
|
1F28<span style="color: #990000">:</span><span style="color: #993399">88</span> EA D0 F9 <span style="color: #993399">60</span> <span style="color: #993399">48</span> <span style="color: #993399">68</span> EA
|
|
1F30<span style="color: #990000">:</span>EA A0 <span style="color: #993399">62</span> <span style="color: #993399">20</span> <span style="color: #993399">27</span> 1F EA CA
|
|
1F38<span style="color: #990000">:</span>D0 F3 <span style="color: #993399">60</span>
|
|
|
|
E000G
|
|
<span style="color: #993399">30</span> HGR <span style="color: #990000">:</span> HOME <span style="color: #990000">:</span> VTAB <span style="color: #993399">21</span> <span style="color: #990000">:</span> PRINT <span style="color: #FF0000">"1 7 D 2 8 E B 4 5 A 3 6 C 9 F 8"</span>
|
|
<span style="color: #993399">40</span> <span style="font-weight: bold"><span style="color: #0000FF">DIM</span></span> <span style="font-weight: bold"><span style="color: #000000">COLR</span></span><span style="color: #990000">(</span><span style="color: #993399">39</span><span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">X</span></span><span style="color: #990000">(</span><span style="color: #993399">21</span><span style="color: #990000">)</span>
|
|
<span style="color: #993399">100</span> <span style="font-weight: bold"><span style="color: #0000FF">FOR</span></span> A <span style="color: #990000">=</span> <span style="color: #993399">0</span> TO <span style="color: #993399">39</span> <span style="color: #990000">:</span> READ <span style="font-weight: bold"><span style="color: #000000">COLR</span></span><span style="color: #990000">(</span>A<span style="color: #990000">)</span> <span style="color: #990000">:</span> COLOR <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">COLR</span></span><span style="color: #990000">(</span>A<span style="color: #990000">)</span> <span style="color: #990000">:</span> VLIN <span style="color: #993399">0</span><span style="color: #990000">,</span> <span style="color: #993399">39</span> AT A <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">NEXT</span></span> A
|
|
<span style="color: #993399">200</span> <span style="font-weight: bold"><span style="color: #0000FF">FOR</span></span> A <span style="color: #990000">=</span> <span style="color: #993399">0</span> TO <span style="color: #993399">21</span> <span style="color: #990000">:</span> READ <span style="font-weight: bold"><span style="color: #000000">COLR</span></span><span style="color: #990000">(</span>A<span style="color: #990000">)</span> <span style="color: #990000">:</span> READ <span style="font-weight: bold"><span style="color: #000000">X</span></span><span style="color: #990000">(</span>A<span style="color: #990000">)</span> <span style="color: #990000">:</span> HCOLOR <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">COLR</span></span><span style="color: #990000">(</span>A<span style="color: #990000">)</span>
|
|
<span style="color: #993399">210</span> HPLOT <span style="font-weight: bold"><span style="color: #000000">X</span></span><span style="color: #990000">(</span>A<span style="color: #990000">),</span> <span style="color: #993399">0</span> TO <span style="font-weight: bold"><span style="color: #000000">X</span></span><span style="color: #990000">(</span>A<span style="color: #990000">),</span> <span style="color: #993399">159</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">NEXT</span></span> A
|
|
<span style="color: #993399">220</span> <span style="font-weight: bold"><span style="color: #0000FF">FOR</span></span> A <span style="color: #990000">=</span> <span style="color: #993399">8319</span> TO <span style="color: #993399">16383</span> STEP <span style="color: #993399">128</span> <span style="color: #990000">:</span> POKE A<span style="color: #990000">,</span> <span style="color: #993399">64</span> <span style="color: #990000">:</span> <span style="font-weight: bold"><span style="color: #0000FF">NEXT</span></span> A
|
|
<span style="color: #993399">300</span> <span style="font-weight: bold"><span style="color: #0000FF">CALL</span></span> <span style="color: #993399">7936</span>
|
|
<span style="color: #993399">400</span> REM LORES DATA
|
|
<span style="color: #993399">410</span> DATA <span style="color: #993399">1</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">13</span><span style="color: #990000">,</span><span style="color: #993399">13</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">2</span><span style="color: #990000">,</span><span style="color: #993399">2</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">8</span><span style="color: #990000">,</span><span style="color: #993399">8</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">14</span><span style="color: #990000">,</span><span style="color: #993399">14</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">11</span><span style="color: #990000">,</span><span style="color: #993399">11</span><span style="color: #990000">,</span><span style="color: #993399">0</span>
|
|
<span style="color: #993399">420</span> DATA <span style="color: #993399">4</span><span style="color: #990000">,</span><span style="color: #993399">4</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">5</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">10</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">6</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">12</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">9</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">15</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">8</span>
|
|
<span style="color: #993399">500</span> REM HIRES DATA
|
|
<span style="color: #993399">510</span> DATA <span style="color: #993399">4</span><span style="color: #990000">,</span><span style="color: #993399">0</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">20</span><span style="color: #990000">,</span><span style="color: #993399">4</span><span style="color: #990000">,</span><span style="color: #993399">21</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">41</span><span style="color: #990000">,</span><span style="color: #993399">4</span><span style="color: #990000">,</span><span style="color: #993399">42</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">62</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">83</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">104</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">105</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">125</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">126</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">159</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">161</span>
|
|
<span style="color: #993399">520</span> DATA <span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">180</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">182</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">206</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">220</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">233</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">247</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">262</span><span style="color: #990000">,</span><span style="color: #993399">3</span><span style="color: #990000">,</span><span style="color: #993399">263</span><span style="color: #990000">,</span><span style="color: #993399">7</span><span style="color: #990000">,</span><span style="color: #993399">279</span>
|
|
|
|
RUN</tt></pre></div></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_download">Download</h2>
|
|
<div class="sectionbody">
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./tip.png" alt="Tip">
|
|
</td>
|
|
<td class="content">Usable Apple ROMs (proprietary
|
|
<span class="footnote" id="_footnote_disclaimer"><br>[You must respect the fact that the Apple System Software and Apple Disk Operating System (DOS) Software are <em>proprietary</em> software; they are copyright by Apple and/or others. This web page is not providing any advice as to the legality of any copying or downloading you may perform.]<br></span>)
|
|
are available at the <a href="http://mosher.mine.nu/apple2/">Apple II Library</a>.</td>
|
|
</tr></table>
|
|
</div>
|
|
<div class="paragraph"><p>The following software is licensed under
|
|
<a href="http://www.gnu.org/licenses/gpl-3.0-standalone.html">GPLv3</a>.</p></div>
|
|
<div class="paragraph"><p>Epple ][ Program: <a href="http://mosher.mine.nu/epple2/download/epple2-latest.tar.gz">epple2.tar.gz</a></p></div>
|
|
<div class="paragraph"><p>System ROM (Demo): <a href="http://mosher.mine.nu/epple2/download/epple2sys-latest.tar.gz">epple2sys.tar.gz</a></p></div>
|
|
<div class="paragraph"><p>Card ROMs (stdin/stdout/clock): <a href="http://mosher.mine.nu/epple2/download/epple2cards-latest.tar.gz">epple2cards.tar.gz</a></p></div>
|
|
<div class="paragraph"><p>See <a href="#_building_from_source">Building</a> to build from sources.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_what_to_download">What To Download</h2>
|
|
<div class="sectionbody">
|
|
<div class="sect2">
|
|
<h3 id="_epple_program_mdash_the_hardware_emulated">Epple ][ Program—The Hardware (Emulated)</h3>
|
|
<div class="paragraph"><p>The <em>Epple ][ Program</em> package is the emulator itself, which emulates the
|
|
Apple ][ or Apple ][ plus <em>hardware</em>, as well as the
|
|
<a href="#cards">peripheral card</a> hardware. This is the main program, so you will
|
|
certainly need to download this package. To have a full functioning emulator,
|
|
you will also need System ROMs and Card ROMs, as described in the following
|
|
sections.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="firmware">System ROMs—The Main System Firmware (Demo or Real)</h3>
|
|
<div class="paragraph"><p>Since the Epple ][ program emulates only the hardware, you will also need to download some <em>system software</em>
|
|
for it to run. This is commonly called “firmware” or “ROMs,” because it is stored in the
|
|
read-only memory area of the emulated system. The original system software on the
|
|
Apple ][ machines is copyright by Apple, and is proprietary. If you own an actual
|
|
Apple ][ or Apple ][ plus machine, you can copy <span class="footnoteref"><br><a href="#_footnote_disclaimer">[disclaimer]</a><br></span> the firmware
|
|
from it ($D000-$FFFF) (into a file on your PC) and use it. Alternatively, you can
|
|
download <span class="footnoteref"><br><a href="#_footnote_disclaimer">[disclaimer]</a><br></span> the firmware images from the <a href="http://mosher.mine.nu/apple2/">Apple II Library</a>.</p></div>
|
|
<div class="paragraph"><p>If you do not want to download the proprietary firmware, you can still use the emulator (albeit
|
|
in a restricted manner) with the free (GPLv3) <em>System ROM (Demo)</em> package. Download
|
|
the file for your platform and
|
|
install as appropriate. You can choose either binary format (ready to run), or source if you want
|
|
to assemble it yourself (using the <a href="http://www.floodgap.com/retrotech/xa/">xa Assembler</a>).
|
|
The Demo System ROM only provides commands to dump or set memory bytes,
|
|
or run a program in memory. It is not compatible with any Apple software, nor can it read from disks.
|
|
It’s just a free simple demo system to make the emulator do something reasonable.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_card_roms_mdash_the_peripheral_card_firmware">Card ROMs—The Peripheral Card Firmware</h3>
|
|
<div class="paragraph"><p>If you are going to use the Disk ][ Controller peripheral card (which you almost certainly will, if
|
|
you want to read any floppy disk images), you will need to have to original ROMs from Apple.
|
|
No demo of the Disk ROMs are provided here; you will need to
|
|
use the original ROMs, which can be obtained from an original machine (by copying <span class="footnoteref"><br><a href="#_footnote_disclaimer">[disclaimer]</a><br></span>
|
|
it from $C600-$C6FF into a file on the PC), or by downloading <span class="footnoteref"><br><a href="#_footnote_disclaimer">[disclaimer]</a><br></span> it
|
|
from the <a href="http://mosher.mine.nu/apple2/">Apple II Library</a>.
|
|
(And, of course, you will need the real Apple System ROM, as noted in the previous section,
|
|
not the Demo System ROM.)</p></div>
|
|
<div class="paragraph"><p>If you are using any of the clock, the standard output, or the
|
|
standard input <a href="#cards">peripheral cards</a>, you will need to download their firmware as well,
|
|
which are contained in the <em>Card ROMs</em> package. You can choose either binary format
|
|
(ready to run) or source format (to assemble it yourself(using the
|
|
<a href="http://www.floodgap.com/retrotech/xa/">xa Assembler</a>).
|
|
If you are <em>not</em> going to use the stdin, stdout, or clock
|
|
cards, then you do not need to download this package.</p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_configuration">Configuration</h2>
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p>The Epple ][ Emulator is most useful when properly configured.
|
|
After downloading and installing the Epple ][ Program, some System ROM (demo or real), and
|
|
optionally the peripheral card ROMs you want to use, you will need to configure the program.
|
|
Configuring is concerned primarily with telling the program what peripheral cards to use,
|
|
and where the ROM files are located (and what memory addresses to load them at).</p></div>
|
|
<div class="sect2">
|
|
<h3 id="_epple2_conf">epple2.conf</h3>
|
|
<div class="paragraph"><p>The default configuration file for
|
|
the Epple ][ emulator is:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>/etc/epple2/epple2.conf</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>For Windows, the file will be:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>C:\Program Files\Epple2\etc\epple2\epple2.conf</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>The configuration file could be in a different location depending upon how
|
|
the distribution package is built.</p></div>
|
|
<div class="paragraph"><p>You can specify a different configuration file for the emulator to use by
|
|
specifying its name as the argument when running the epple2 program.</p></div>
|
|
<div class="paragraph"><p>The format of the configuration file is just lines of <a href="#_commands">commands</a>.
|
|
Comments begin with a hash <span class="monospaced">#</span> character, and continue to the end of the line.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_firmware">Firmware</h3>
|
|
<div class="paragraph"><p>Firmware, commonly called ROM images or ROMs, will need to be loaded
|
|
into the emulated ROM areas of the emulated Apple
|
|
in order for it to be able to boot the emulated Apple machine.
|
|
The firmware available is described <a href="#firmware">above</a>.
|
|
Once the firmware image
|
|
files are installed on your computer, you can use the <a href="#_import">import</a>
|
|
command in the configuration file to load the image files into the emulator.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_peripheral_cards">Peripheral Cards</h3>
|
|
<div class="paragraph"><p>Another primary concern for configuring the Epple ][ is the insertion of
|
|
peripheral cards into the Apple’s slots. The most useful card is probably the
|
|
Disk ][ Controller card; you will need to insert one of these cards if you want
|
|
to be able to load floppy disk images into the emulated Apple. The various
|
|
types of cards available are described on the <a href="#cards">peripheral cards</a> section.
|
|
You can use the <a href="#_slot">slot</a> command in the configuration file to insert
|
|
them into the Apple’s slots.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_sample_configuration_files">Sample Configuration Files</h3>
|
|
<div class="paragraph"><p>There are a number of configuration files provided with the distribution for
|
|
your convenience. They provide various common configurations of machines.
|
|
You can use one of these files directly, by specifying its path as the argument
|
|
to the program, or as a starting point for you own configuration file. These sample
|
|
files are in the same location as the default <span class="monospaced">epple2.conf</span> file.</p></div>
|
|
<div class="paragraph"><p>The Epple ][ Emulator can actually be run without a configuration file at all.
|
|
In this case, you will be able to “power on” the Apple and see the low-resolution
|
|
graphics display showing random RAM data. The system will not run, because
|
|
there is no firmware loaded, but the emulator will otherwise be functional.</p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_user_manual">User Manual</h2>
|
|
<div class="sectionbody">
|
|
<div class="sect2">
|
|
<h3 id="_overview">Overview</h3>
|
|
<div class="paragraph"><p>Epple ][ (the Emulated Apple ][ is a free (as in GPLv3), cross-platform
|
|
(Windows, Linux) emulator of the Apple ][ and Apple ][ plus computers
|
|
from Apple, Inc. It strives for accurate emulation of the original machines,
|
|
with a few extra features added.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_commands">Commands</h3>
|
|
<div class="paragraph"><p><span class="monospaced"><a href="#_slot">slot</a> <a href="#_import">import</a> <a href="#_load">load</a> <a href="#_unload">unload</a> <a href="#_save">save</a> <a href="#_cassette">cassette</a> <a href="#_revision">revision</a></span></p></div>
|
|
<div class="sect3">
|
|
<h4 id="_slot">slot</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">slot</span> command inserts a card into a peripheral slot of the emulated Apple.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>slot <slot> <card></pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><slot></span> Slot number, 0 through 7, to insert the card into.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><card></span> The type of <a href="#cards">card</a> to insert into the slot:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">language</span>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">firmware</span>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">disk</span>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">clock</span>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">stdout</span>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">stdin</span>
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">empty</span>
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">slot</span> command inserts a card into a peripheral slot. For example:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>slot 0 language</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>inserts a language card into slot zero. Use <span class="monospaced">empty</span> to remove a card:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>slot 0 empty</pre>
|
|
</div></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./note.png" alt="Note">
|
|
</td>
|
|
<td class="content">The emulated Apple should be <em>powered off</em> before inserting or removing cards.</td>
|
|
</tr></table>
|
|
</div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_import">import</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">import</span> command imports a binary image file into the emulated Apple’s memory.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>import slot <slot> { rom | rom7 | rombank } <base> <file-path>
|
|
import motherboard { rom | ram } <base> <file-path></pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><slot></span> Slot number, 0 through 7, of peripheral card to import the binary image into.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><base></span> Base address in hexadecimal within the given memory area at which to start loading the binary image.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><file-path></span> Path of the binary image to import.</p></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">import</span> command reads the binary image byte-for-byte from the given file-path
|
|
into an area of memory in the emulated Apple. You can load into either the motherboard or
|
|
a card in one of the slots. For the motherboard, you choose the RAM or ROM area. For a card
|
|
in a slot, you can choose either the normal ROM, the bank-switched ROM, or the so-called
|
|
“seventh ROM” area.</p></div>
|
|
<div class="paragraph"><p>You also have to specify the base address within the specific memory
|
|
area at which the image file will be loaded. Note that the base address is specified as the offset
|
|
within the specific memory area, and not necessarily as the actual memory address as seen
|
|
by the Apple. So for motherboard ROM, for example, specifying a base as 2DED will cause the
|
|
image to be loaded at offset 2DED in the ROM, which will be addressed by the Apple at
|
|
memory address $FDED (because motherboard ROM “starts” at address $D000).</p></div>
|
|
<div class="paragraph"><p>For peripheral cards, the ROM will be seen at locations $Cs00-$CsFF, where s is the slot
|
|
number (1 through 7). The “seventh ROM” can be seen as locations $C800-$CFFF; Jim Sather
|
|
describes this functionality in
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
on page 6-4, section “The Seventh ROM Chip.” The EPPLE ][ emulator handles this processing correctly. A card can
|
|
also have bank-switched ROM, which will show up at addresses $D000-$FFFF when switched in
|
|
(stealing that address range from motherboard ROM… see
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
p. 5-26 “The 16K RAM Card”).</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_load">load</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">load</span> command loads a (nibble) floppy disk image into one of the emulated disk drives.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>load slot <slot> drive <drive> <file-path></pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><slot></span> Slot number, 0 through 7, of Disk ][ controller card to load the nibble image into.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><drive></span> Drive number, 1 or 2, of the disk drive on the controller card to load the nibble image into.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><file-path></span> Path of the nibble floppy disk image to import.</p></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">load</span> command will load a nibble image into a disk drive. Specify the slot that
|
|
contains a Disk ][ controller peripheral card, and specify which drive number (1 or 2).</p></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./note.png" alt="Note">
|
|
</td>
|
|
<td class="content">The floppy disk image MUST be a NIBBLE DISK IMAGE.
|
|
Other formats (for example, DOS order, <span class="monospaced">.do</span>, PRODOS order,
|
|
<span class="monospaced">.po</span>, <span class="monospaced">.dsk</span>, or anything else) must first be converted to nibble format. A nibble image contains
|
|
all 35 tracks, in order 0-36, each track being 6656 ($1A00) bytes long. Nibble image files
|
|
will generally have a filetype of <span class="monospaced">.nib</span>.</td>
|
|
</tr></table>
|
|
</div>
|
|
<div class="paragraph"><p>The best floppy disk image conversion tool I’ve found is <a href="http://ciderpress.sourceforge.net/">CiderPress</a>,
|
|
for Windows (but it supposedly runs under Wine on Linux, too). Thanks to Andy McFadden.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_unload">unload</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">unload</span> command removes a floppy disk image from one of the emulated disk drives.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>unload slot <slot> drive <drive></pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><slot></span> Slot number, 0 through 7, of Disk ][ controller card to which the drive is attached.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><drive></span> Drive number, 1 or 2, of the disk drive on the controller card to remove the floppy disk image from.</p></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">unload</span> command removes the disk from the specified slot and drive.</p></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./warning.png" alt="Warning">
|
|
</td>
|
|
<td class="content">If the disk has been modified but not saved, the modifications will be DISCARDED.</td>
|
|
</tr></table>
|
|
</div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_save">save</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">save</span> command saves changes made on an emulated floppy disk back to the original image file.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>save slot <slot> drive <drive> <file-path></pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><slot></span> Slot number, 0 through 7, of Disk ][ controller card to which the drive is attached.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><drive></span> Drive number, 1 or 2, of the disk drive on the controller card to save.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced"><file-path></span> Path of the nibble floppy disk image to import.</p></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">save</span> command saves any changes that the emulated Apple ][ has made to the floppy
|
|
disk image. It is important to note that the emulator operates on the image only in memory, and does
|
|
not immediately write changes back to the real file. You need to issue the <span class="monospaced">save</span> command
|
|
in order to write changes back to the file. Note that the emulator will display a asterisk <span class="monospaced">*</span>
|
|
next to the file-name of a disk image if it has any unsaved changes.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_cassette">cassette</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">cassette</span> command performs various operations of the emulated cassette tape.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>cassette new <file-path>
|
|
cassette load <file-path>
|
|
cassette unload
|
|
cassette rewind
|
|
cassette save</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><file-path></span> File path of the (special format) cassette tape image file.</p></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">cassette</span> command allows the user to control the emulated cassette tape player.
|
|
See <a href="#_cassette_tape_interface">Cassette</a> for more information about operating the emulated
|
|
cassette player and cassette tape image files.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_revision">revision</h4>
|
|
<div class="paragraph"><p>The <span class="monospaced">revision</span> command specifies which revision of Apple ][ motherboard to use.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>revision <rev></pre>
|
|
</div></div>
|
|
<div class="paragraph"><p><span class="monospaced"><rev></span> Revision number of the motherboard. Currently, only two values make any difference in behavior: 0 or 1.</p></div>
|
|
<div class="paragraph"><p>The <span class="monospaced">revision</span> command chooses which revision of the Apple ][ motherboard to
|
|
use. The only revisions that make any difference (for now, at least) are 0 or 1. Zero
|
|
is the original (now quite rare) version of the motherboard, that only had two hi-res
|
|
colors (green and purple), and always displayed text with green and purple fringes.
|
|
Revision 1 and later motherboards are the ones we are more familiar with.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_display">Display</h3>
|
|
<div class="paragraph"><p>The orignal Apple ][s didn’t come with a display. The user needed to use either a standard
|
|
television, or a monitor, to see the computer’s output. The EPPLE ][ emulates a variety of
|
|
displays; you can cycle between the different types using <span class="monospaced">F2</span>.
|
|
There are two major types of displays: televisions and monitors. Monitors generally have
|
|
higher quality (sharper) displays. The displays show the normal visible area of the NTSC
|
|
video signal generated by the emulated Apple ][ machine.</p></div>
|
|
<div class="sect3">
|
|
<h4 id="_monitors">Monitors</h4>
|
|
<div class="paragraph"><p>The emulator provides a color monitor, and three monochrome monitors (white, green, and orange).
|
|
These emulate standard, no-frills NTSC monitors. The most noticeable characteristic of monitors
|
|
is the horizontal display of pixels. Monitors react faster than TVs, so two adjacent pixels will
|
|
not merge together; both will be distinctly visible, with blackness between them. For example,
|
|
type in the following Applesoft command, then cycle through the display types. The monitors
|
|
will show thin, vertical, green lines; TVs will show continuous horizontal lines.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>GR : COLOR=4 : HLIN 10,20 AT 10</pre>
|
|
</div></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_televisions">Televisions</h4>
|
|
<div class="paragraph"><p>There are two types of television displays, referred to as “old” and “new.” Each has color and
|
|
monochrome (commonly known as “black and white”) varieties. Televisions react more slowly to
|
|
changes in the incoming video signal than monitors do, and as a result, horizontal pixels will
|
|
merge together, forming a more uniform appearance. The “new” color TV display uses the pre-defined
|
|
color pallette (described below under “Colors”), and the black and white TV uses the same
|
|
pallette, but fully desaturated. The “old” color TV is the most interesting. It emulates the
|
|
signal decoding circuitry of a real television. This includes separating out the “chroma” portion
|
|
of the incoming NTSC video signal using a filter algorithm, and <em>calculating</em> the color to display.
|
|
It does not use the pre-defined colors.</p></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./note.png" alt="Note">
|
|
</td>
|
|
<td class="content">This mode is very CPU intensive, so your computer (that is, the one that EPPLE ][ is running on)
|
|
may not be able to run fast enough to run at the speed of the original Apple ][. The Apple ][ CPU
|
|
runs at about 1 MHz, but the video generator runs at 14 MHz; so the inner-most loop in the
|
|
EPPLE ][ must run 14 million times per second to keep up.</td>
|
|
</tr></table>
|
|
</div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_colors">Colors</h4>
|
|
<div class="paragraph"><p>The color palatte used for the
|
|
color monitor and new color TV is pre-defined, and was determined through observation of a real
|
|
Apple ][ machine on a standard TV, the colors being matched by eye. The old color TV, however,
|
|
uses <em>algorithms</em> to calculate the colors it displays.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_scan_lines">Scan Lines</h4>
|
|
<div class="paragraph"><p>NTSC displays (TVs or monitors) usually receive signals that are interlaced. However, the
|
|
Apple ][ doesn’t generate interlaced screens. This causes blank rows between each displayed
|
|
row of pixels. The EPPLE ][ emulates this behavior, but also allows you to “fill in” these
|
|
black rows with a copy of the row above it, for a more continuous display (vertically). Use
|
|
the F4 key to toggle between these two modes.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_resolution">Resolution</h4>
|
|
<div class="paragraph"><p>The Apple ][s are commonly documented as having a resolution of 280x192 pixels, and to an
|
|
extent this is true. Vertically there are 192 pixels, but since there is no interlacing,
|
|
it is more accurate to display them with one blank space between each. So the EPPLE ][ has
|
|
two times 192, or 384, vertical pixels in its display. Horizontally there are 280 pixels, but
|
|
each could also be shifted right one-half dot, allowing for two times 280, or 560, different
|
|
horizontal displayable positions. To emulate this, the EPPLE ][ shows each emulated pixel as
|
|
two pixels wide, and displays an emulated half-dot shift as an actual one pixel shift. So the
|
|
display area of the EPPLE ][ is 560x384. There is an informational area below and to the
|
|
right of the emulated display that shows various statistics of the emulator. So the total screen
|
|
area used by the EPPLE ][ is a standard 640x480 pixels.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_full_screen">Full Screen</h4>
|
|
<div class="paragraph"><p>The EPPLE ][ can run in either full-screen mode, or within a window. Use the <span class="monospaced">F3</span> key to toggle
|
|
between the two.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_informational_area">Informational Area</h4>
|
|
<div class="paragraph"><p>The area at the bottom and the right of the EPPLE ][ display show various information about
|
|
the emulator.</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
POWER light
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
current cards in SLOTS
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
CASSETTE tape information
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
emulated CPU speed (MHz)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
function-keys help
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_keyboard">Keyboard</h3>
|
|
<div class="paragraph"><p>The EPPLE ][ emulates the original Apple ][ keyboard. The original Apple ][
|
|
keyboard had symbols in different places than current common PC keyboards. For
|
|
example, Shift-2 on the Apple ][ produces a double quote, but on a PC keyboard
|
|
it produces an at-sign. For ease of typing, the EPPLE ][ emulator does not
|
|
mimic the positions of the original keys, but rather mimics the symbols on
|
|
the current PC keyboard. So, for example, if you type Shift-2 on the PC
|
|
keyboard into the EPPLE ][, it produces an at-sign, as you would normally expect.</p></div>
|
|
<div class="paragraph"><p>The Apple ][ keyboard didn’t produce lower-case letters; neither does the emulator.
|
|
Also, the Apple couldn’t produce an opening square bracket ([), braces, vertical
|
|
bar, backslash. There were no up- or down-arrow keys. You cannot type these into
|
|
the emulator, either. There are other, unusual, cases that are emulated correctly,
|
|
as well, such as typing Control in conjunction with a number key simply produces
|
|
that number. So typing a Control-3 is the same as just typing a 3. Also, typing
|
|
Shift-Control-2 produces the NUL character (ASCII $80).</p></div>
|
|
<div class="paragraph"><p>The Apple ][ keyboards didn’t automatically repeat typing characters when a
|
|
key was held down. Instead, the user would hold down the REPT (“repeat”) key
|
|
while holding down the key that was to be repeated. On the EPPLE ][, this
|
|
behavior is emulated, and the F10 key is used as the REPT key.</p></div>
|
|
<div class="paragraph"><p>The Apple ][ had no keyboard buffer (actually, it had a buffer of one character).
|
|
So if you typed several characters on the keyboard before the currently running
|
|
program had a chance to read them, they would get lost (only the final character
|
|
typed would be remembered). This behavior can be
|
|
toggled on or off in the EPPLE ][. By default, the EPPLE ][ will buffer up any
|
|
characters you type and deliver them to the emulated machine when it asks for
|
|
them. However, the Apple program must be written properly to allow this to work.
|
|
Some Apple ][ programs (like maybe some games) may not work correctly in this
|
|
respect, so you may want to turn off buffering in these cases. With buffering
|
|
turned off, the EPPLE ][ accurately emulates the original Apple ][. Use the F12
|
|
key to toggle the keyboard buffering. Note that pasting from the clipboard (with
|
|
the Insert key) will most definitely cause keys to be lost if the keyboard
|
|
buffer is turned off. So if you have a big Applesoft program in the clipboard
|
|
and you want to paste it into the EPPLE ][ correctly, make sure the keyboard
|
|
buffer is on.</p></div>
|
|
<div class="ulist"><div class="title">Special Keys</div><ul>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F1</span> Emulates the POWER switch on the back of the Apple ][.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F2</span> Cycles among different display types (TV, monitor, etc.).
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F3</span> Toggles between full-screen or window display.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F4</span> Toggles between showing scan lines on the display, or duplicating
|
|
each scan line to the following line, to fill-in the otherwise black line.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F5</span> Go to “command entry” mode.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F10</span> Emulates the REPT key.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F11</span> Toggles between running the emulator at authentic speed
|
|
(1.02 MHz CPU), or as fast as possible.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F12</span> Toggles the keyboard buffer.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">Break</span> Emulates the RESET key.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">Insert</span> Pastes characters from the clipboard into the emulated Apple
|
|
(as if they had been typed on the keyboard).
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">Print Screen</span> Save a bitmap file of the current EPPLE ][ screen.
|
|
The file will be in the default directory, named <span class="monospaced">ep2_YYYYMMDDHHMMSS.bmp</span>.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">End</span> Quit the EPPLE ][ program, immediately!
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./warning.png" alt="Warning">
|
|
</td>
|
|
<td class="content">If you have modification to any floppy images or cassette images, and you
|
|
press the <span class="monospaced">End</span> key, you will LOSE all those changes, unless you
|
|
save them first. See <a href="#_commands">Commands</a> for the <span class="monospaced">save</span> command.</td>
|
|
</tr></table>
|
|
</div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="cards">Peripheral Cards</h3>
|
|
<div class="sect3">
|
|
<h4 id="_disk_controller">Disk ][ Controller</h4>
|
|
<div class="paragraph"><p>The Disk ][ Controller card emulates the floppy disk controller card and associated
|
|
disk drives in the original Apple ][ systems. In the emulator, each card has two
|
|
drives attached to it, referred to as drive 1 and drive 2. The floppy disks
|
|
themselves are represented by a “nibble” image of the contents. The
|
|
emulator emulates the hardware, but to be of any use, you will need to provide
|
|
the firmware ROM code.</p></div>
|
|
<div class="paragraph"><p>To use a disk card and drives, add these lines to your epple2.conf file, for example:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>slot 6 disk
|
|
import slot 6 rom 0 /usr/lib/apple2/dos3x/16sector/controller/disk2.ex65</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>The first line uses the <a href="#_slot">slot</a> command to
|
|
insert a disk contoller card into slot 6, which is the standard
|
|
slot used for disk cards. The next line uses the <a href="#_import">import</a>
|
|
command to load the card’s ROM with the disk controller
|
|
firmware. This firmware is known as the “bootstrap” or “P5” ROM code.
|
|
It is seen by the Apple ][ at memory addresses $Cs00-$CsFF, where s is the
|
|
slot number (so in the common case of the card being in slot 6, the ROM is
|
|
at $C600-$C6FF). The firmware is copyright by Apple, and is available from
|
|
the <a href="http://mosher.mine.nu/apple2/">Apple II Library</a>.</p></div>
|
|
<div class="paragraph"><p>You can also load a floppy disk image (nibble format) into the drive,either by putting
|
|
the <a href="#_load">load</a> command into the <span class="monospaced">epple2.conf</span> file, or by using the command prompt
|
|
in the emulator (<span class="monospaced">F5</span> key). For example, you could load the DOS 3.3 system master into
|
|
slot 6, drive 1, with this command</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>load slot 6 drive 1 /usr/lib/apple2/dos3x/16sector/disks/dos330/clean330sysmas.nib</pre>
|
|
</div></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_language">Language</h4>
|
|
<div class="paragraph"><p>The language card emulates an Apple 16K RAM card, commonly called a Language Card.
|
|
To use a language card, add this line to your epple2.conf file:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>slot 0 language</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>Note that DOS and ProDOS will make use of a language card only if it is in slot <em>zero</em>.</p></div>
|
|
<div class="paragraph"><p>The language card has RAM at addresses $E000 through $FFFF, as well as two banks of RAM
|
|
at addresses $D000 through $DFFF. A program switches between these RAMs and/or the
|
|
motherboard ROM by using the I/O switches at $C080 through $C08F.</p></div>
|
|
<div class="paragraph"><p>The information area of the Epple ][ will show the current state of the
|
|
language card as follows:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">R</span> Read from card RAM (vs. motherboard ROM)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">W</span> Write to card RAM (vs. write-disabled)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">B1</span> Use $D000 bank 1
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">B2</span> Use $D000 bank 2
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="paragraph"><p>An overview of the I/O switches that control the language card
|
|
is provided by Jim Sather in
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
p. 5-30, Table 5.4, as follows:</p></div>
|
|
<table class="tableblock frame-all grid-all"
|
|
style="
|
|
width:100%;
|
|
">
|
|
<col style="width:25%;">
|
|
<col style="width:25%;">
|
|
<col style="width:25%;">
|
|
<col style="width:25%;">
|
|
<thead>
|
|
<tr>
|
|
<th class="tableblock halign-left valign-top" > BANK2 </th>
|
|
<th class="tableblock halign-left valign-top" > BANK1 </th>
|
|
<th class="tableblock halign-left valign-top" colspan="2" > ACTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C080</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C088</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">WRTCOUNT = 0*, WRITE DISABLE</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">READ ENABLE</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C084</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C08C</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC081</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC089</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">WRTCOUNT = WRTCOUNT + 1*</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">READ DISABLE</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC085</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC08D</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC081</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC089</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">WRTCOUNT = 0*</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">READ DISABLE</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC085</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC08D</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C082</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C08A</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">WRTCOUNT = 0*, WRITE DISABLE</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">READ DISABLE</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C086</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">C08E</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC083</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC08B</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">WRTCOUNT = WRTCOUNT + 1*</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">READ ENABLE</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC087</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">RC08F</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC083</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC08B</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">WRTCOUNT = 0*</p></td>
|
|
<td class="tableblock halign-left valign-top" rowspan="2" ><p class="tableblock monospaced">READ ENABLE</p></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC087</p></td>
|
|
<td class="tableblock halign-left valign-top" ><p class="tableblock monospaced">WC08F</p></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="paragraph"><p><sup>*</sup> Writing to expansion RAM is enabled when WRTCOUNT reaches 2.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_firmware_2">Firmware</h4>
|
|
<div class="paragraph"><p>The firmware card emulates a (modified) Apple Firmware card.
|
|
The firmware card is simply an alternate ROM, at addresses
|
|
$D000 through $FFFF, that is switched using the I/O switches
|
|
at addresses $C080 through $C08F. In order to make use of the
|
|
firmware card, you will need to load the ROM with a binary image
|
|
from a file on disk. For example, to insert an Integer BASIC
|
|
firmware card into the emulator, add these lines to your
|
|
<span class="monospaced">epple2.conf</span> file:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre># Firmware card with Integer BASIC and old Monitor
|
|
slot 0 firmware
|
|
import slot 0 rombank 1000 /usr/lib/apple2/system/intbasic/intbasic.ex65
|
|
import slot 0 rombank 2425 /usr/lib/apple2/system/other/other.ex65
|
|
import slot 0 rombank 2800 /usr/lib/apple2/system/monitor/apple2/monitor.ex65</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>For an Applesoft BASIC firmware card, use these:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre># Firmware card with Applesoft BASIC and Autostart Monitor
|
|
slot 0 firmware
|
|
import slot 0 rombank 0000 /usr/lib/apple2/system/applesoft/applesoft.ex65
|
|
import slot 0 rombank 2800 /usr/lib/apple2/system/monitor/apple2plus/monitor.ex65</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>Note that the addresses specified in the <span class="monospaced">epple2.conf</span> file for the
|
|
rombank are based on the beginning of the bank ROM itself. For example, specifying
|
|
<span class="monospaced">1000</span> (which is 1000 hex) represents the final memory address of $E000, because
|
|
the bank ROM is always based at address $D000.</p></div>
|
|
<div class="paragraph"><p>The idea is that you would load your motherboard with, for
|
|
example, Applesoft BASIC and the Autostart Monitor ROM (to emulate
|
|
an Apple ][ plus), and then install a firmware card with Integer
|
|
BASIC and the old Monitor. Booting with DOS 3.3, then, would allow
|
|
you to type <span class="monospaced">FP</span> to use Applesoft BASIC, or <span class="monospaced">INT</span> to switch to Integer BASIC.</p></div>
|
|
<div class="paragraph"><p>Note that DOS and ProDOS will make use of a firmware card only if it is in slot <em>zero</em>.</p></div>
|
|
<div class="paragraph"><p>Jim Sather, in
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
on pages 6-18 through 6-21, explains
|
|
how to modify a firmware card to allow independent switching of the $F800-$FFFF
|
|
ROM memory. This area is occupied by the Monitor, so it is primarily
|
|
intended to allow the user to switch between the old Monitor and the Autostart
|
|
Monitor, independent of switching between Integer and Applesoft BASIC. The EPPLE ][
|
|
firmware card emulates this behavior.</p></div>
|
|
<div class="paragraph"><p>The information area of the EPPLE ][ will show the current state of the
|
|
firmware card as follows:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">D</span> Read from firmware card $D000-$F7FF (vs. motherboard BASIC ROM)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">F8</span> Read from firmware card $F800-$FFFF (vs. motherboard Monitor ROM)
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_clock">Clock</h4>
|
|
<div class="paragraph"><p>The clock card emulates a ProDOS-compatible real-time clock card for the Apple ][.
|
|
To use a clock card, you will need to configure the EPPLE ][ to insert one into
|
|
a slot, typically slot 4. You will also need to load the card with its ROM code,
|
|
which is provided with the emulator in the clock.ex65 file.
|
|
For example, add this to your epple2.conf file:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>slot 4 clock
|
|
import slot 4 rom 0 /usr/lib/epple2/cards/clock.ex65</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>Of course you may need to adjust the path for your particular system.</p></div>
|
|
<div class="paragraph"><p>To verify that the clock card is working correctly, you can run the following Applesoft
|
|
program to retrieve the current time from the clock card and print it.
|
|
This program assumes the card is in slot 4.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>NEW
|
|
|
|
<span style="color: #993399">10</span> <span style="font-weight: bold"><span style="color: #0000FF">CALL</span></span> <span style="color: #990000">-</span><span style="color: #993399">15360</span> <span style="color: #990000">:</span> REM $C400 SLOT <span style="color: #993399">4</span> ENTRY POINT
|
|
<span style="color: #993399">20</span> A <span style="color: #990000">=</span> <span style="color: #993399">512</span> <span style="color: #990000">:</span> REM $<span style="color: #993399">0200</span> INPUT BUFFER
|
|
<span style="color: #993399">30</span> C <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">PEEK</span></span><span style="color: #990000">(</span>A<span style="color: #990000">)</span>
|
|
<span style="color: #993399">40</span> <span style="font-weight: bold"><span style="color: #0000FF">IF</span></span> C <span style="color: #990000"><</span> <span style="color: #993399">160</span> <span style="font-weight: bold"><span style="color: #0000FF">THEN</span></span> <span style="color: #993399">99</span>
|
|
<span style="color: #993399">50</span> PRINT CHR$<span style="color: #990000">(</span>C<span style="color: #990000">);</span>
|
|
<span style="color: #993399">60</span> A <span style="color: #990000">=</span> A<span style="color: #990000">+</span><span style="color: #993399">1</span>
|
|
<span style="color: #993399">70</span> GOTO <span style="color: #993399">30</span>
|
|
<span style="color: #993399">99</span> <span style="font-weight: bold"><span style="color: #0000FF">END</span></span>
|
|
|
|
RUN</tt></pre></div></div>
|
|
<div class="paragraph"><p>The card returns data (into the GETLN input buffer at $200) in
|
|
the following format:</p></div>
|
|
<div class="paragraph"><p><span class="monospaced">mm,ww,dd,hh,nn,ss,000,yyyy,Time Zone,v</span></p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">mm</span> Month, 01-12
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">ww</span> Weekday, 00=Monday… 06=Saturday
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">dd</span> Day, 01-31
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">hh</span> Hour, 00-23
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">nn</span> Minute, 00-59
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">ss</span> Second, 00-61
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">000</span> Milliseconds; always zero
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">yyyy</span> Year, e.g., 2008
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">Time Zone</span> time zone string (could contain lower-case characters,
|
|
which won’t display correctly)
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
<span class="monospaced">v</span> Daylight Saving Time in effect, 0=no, 1=yes
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="paragraph"><p>Note that only <span class="monospaced">mm,ww,dd,hh,nn</span> fields are used by ProDOS. The other
|
|
fields, <span class="monospaced">ss,000,yyyy,Time Zone,v</span>, are an EPPLE ][ extension. Also note
|
|
that ProDOS was not designed to work for years past 2007, so
|
|
ProDOS will show the incorrect year, but the other fields will be accurate.
|
|
I believe patches exist for ProDOS to fix this.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_standard_input">Standard Input</h4>
|
|
<div class="paragraph"><p>The “standard input” card doesn’t emulate a real piece of hardware; rather, it
|
|
reads characters from standard input (stdin) (of the EPPLE ][ emulator).</p></div>
|
|
<div class="paragraph"><p>To use a standard input card, add these lines to your <span class="monospaced">epple2.conf</span> file:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre># IN#2 reads from standard input
|
|
slot 2 stdin
|
|
import slot 2 rom 0 /usr/lib/epple2/cards/stdin.ex65</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>That will insert a stdin card into slot 2, and then load its
|
|
ROM image into the card.
|
|
The stdin ROM is provided with the EPPLE ][ distribution.</p></div>
|
|
<div class="paragraph"><p>For example, if you have a stdin card installed in slot 2, start
|
|
the EPPLE ][ emulator from the command line, and at the Applesoft
|
|
prompt, type <span class="monospaced">IN#2</span>. Then you can switch back to the
|
|
command shell, and whatever you type will be fed into the emulated
|
|
Apple. Use RESET or <span class="monospaced">IN#0</span> to go back to normal.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_standard_output">Standard Output</h4>
|
|
<div class="paragraph"><p>The “standard output” card doesn’t emulate a real piece of hardware; rather, it acts
|
|
similar to a printer card, but instead of sending characters to a printer, it sends
|
|
them to standard output (stdout) (of the EPPLE ][ emulator).</p></div>
|
|
<div class="paragraph"><p>To use a standard output card, add these lines to your <span class="monospaced">epple2.conf</span> file:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre># PR#1 prints to standard output
|
|
slot 1 stdout
|
|
import slot 1 rom 0 /usr/lib/epple2/cards/stdout.ex65</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>This will insert a stdout card into slot 1 (which is the typical
|
|
slot for a printer card), and then load its ROM image into the card.
|
|
The stdout ROM is provided with the EPPLE ][ distribution.</p></div>
|
|
<div class="paragraph"><p>For example, if you have a stdout card installed, at the Applesoft
|
|
prompt, type <span class="monospaced">PR#1</span>. Whatever you type next will be
|
|
echoed to standard output. Type <span class="monospaced">PR#0</span> to stop echoing.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_cassette_tape_interface">Cassette Tape Interface</h3>
|
|
<div class="paragraph"><p>The Apple ][ and Apple ][ plus machines had the ability to save and load binary
|
|
data to and from cassette tape. The user would attach a standard cassette tape
|
|
recorder to the jacks on the back of the Apple ][, and use the monitor <span class="monospaced">R</span> and <span class="monospaced">W</span>
|
|
commands, or the Applesoft BASIC commands <span class="monospaced">LOAD</span> and <span class="monospaced">SAVE</span>, to read and write data
|
|
on the cassette tape. The user would have to press the play and/or record buttons
|
|
on the player at the right time.</p></div>
|
|
<div class="paragraph"><p>The Epple ][ emulates the cassette interface, using a file to hold the
|
|
recorded portion of the tape. The file will grow in length as necessary
|
|
to hold data that the emulated Apple is writing to the “tape.”
|
|
The emulator will not overwrite existing data on a tape image.
|
|
The emulator will automatically “press” the play or record buttons that
|
|
would have been necessary when using the original machine.</p></div>
|
|
<div class="sect3">
|
|
<h4 id="_commands_2">Commands</h4>
|
|
<div class="paragraph"><p><span class="monospaced">cassette new <file-path></span></p></div>
|
|
<div class="paragraph"><p>This creates a new empty file (on the host computer) that represents a cassette tape image.
|
|
The file must not already exist.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced">cassette load <file-path></span></p></div>
|
|
<div class="paragraph"><p>This loads an existing file (from the host computer) containing a cassette tape image.
|
|
The tape is automatically positioned at its beginning (fully rewound).</p></div>
|
|
<div class="paragraph"><p><span class="monospaced">cassette unload</span></p></div>
|
|
<div class="paragraph"><p>This removes the file from the cassette tape. Note that you must manually save
|
|
the file using the <span class="monospaced">cassette save</span> command (described below).</p></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img src="./warning.png" alt="Warning">
|
|
</td>
|
|
<td class="content">Unloading an unsaved file will lose any changes made to the file, without warning.</td>
|
|
</tr></table>
|
|
</div>
|
|
<div class="paragraph"><p><span class="monospaced">cassette rewind</span></p></div>
|
|
<div class="paragraph"><p>This command “rewinds” the cassette tape, positioning it at the beginning
|
|
of the tape (for subsequent reading). You do not need to rewind the tape
|
|
before saving or unloading it, of course.</p></div>
|
|
<div class="paragraph"><p><span class="monospaced">cassette save</span></p></div>
|
|
<div class="paragraph"><p>This command saves the changed tape to the file. Note that the display will show
|
|
an asterisk <span class="monospaced">*</span> next to the file name if there are unsaved changes that need to
|
|
be saved. Unsaved changes will be lost without warning if the file is unloaded
|
|
or if you quit the program.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_example_of_saving_to_tape">Example of Saving to Tape</h4>
|
|
<div class="paragraph"><p>Start up the emulator with Applesoft ROMs for this tutorial.
|
|
Enter a simple Applesoft program, just as an example, that we
|
|
are going to save to a cassette tape image file.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt><span style="color: #990000">]</span>NEW
|
|
|
|
<span style="color: #990000">]</span><span style="color: #993399">10</span> PRINT <span style="color: #FF0000">"HELLO"</span>
|
|
|
|
<span style="color: #990000">]</span><span style="color: #993399">20</span> <span style="font-weight: bold"><span style="color: #0000FF">END</span></span>
|
|
|
|
<span style="color: #990000">]</span>LIST
|
|
|
|
<span style="color: #993399">10</span> PRINT <span style="color: #FF0000">"HELLO"</span>
|
|
<span style="color: #993399">20</span> <span style="font-weight: bold"><span style="color: #0000FF">END</span></span>
|
|
|
|
<span style="color: #990000">]</span>RUN
|
|
HELLO
|
|
|
|
<span style="color: #990000">]</span></tt></pre></div></div>
|
|
<div class="paragraph"><p>We first need to load a tape image file into the cassette machine.
|
|
Enter command mode by pressing <span class="monospaced">F5</span>, then make a new tape
|
|
image file.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>command: cassette new hello.tap</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>This will create a new, empty tape file image named <span class="monospaced">hello.tap</span>
|
|
in the current default directory. (We could have specified a full path
|
|
name for the file if we wanted to place it in a different directory.)
|
|
Notice that the emulator now displays the name of the tape image file,
|
|
along with the position and length of the tape image, which is now <span class="monospaced">0/0</span>.</p></div>
|
|
<div class="paragraph"><p>Next, we tell Applesoft to save the program to the cassette. For this,
|
|
we just use the <span class="monospaced">SAVE</span> command. Note that this is not the
|
|
DOS <span class="monospaced">SAVE</span> command; the DOS command has a file name after
|
|
<span class="monospaced">SAVE</span>. We just use <span class="monospaced">SAVE</span> with no file name.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>]SAVE
|
|
|
|
]</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>It will take 10 seconds or so for it to save. Notice that the
|
|
current position of the tape is counting up as the Apple saves
|
|
the program. When it is finished, you need to save the changes
|
|
to the file. Press <span class="monospaced">F5</span> and enter the emulator command to save
|
|
the tape image file.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>command: cassette save</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>We can now unload the file from the emulator (which is like ejecting
|
|
the tape from the cassette player).</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>command: cassette unload</pre>
|
|
</div></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_example_of_loading_from_tape">Example of Loading from Tape</h4>
|
|
<div class="paragraph"><p>To load the saved program (from the previous section) into the Apple again,
|
|
we will need to first load the tape image file back into the cassette machine.
|
|
Press <span class="monospaced">F5</span> to enter command mode and load the image file.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>command: cassette load hello.tap</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>This will load hello.tap (in the current default directory). Notice the
|
|
emulator now displays the name of the tape image file, along with the
|
|
position and length of the tape image, which in this case is <span class="monospaced">0/33481</span>.</p></div>
|
|
<div class="paragraph"><p>Next, we tell Applesoft to load the program from the cassette. For this,
|
|
we just use the <span class="monospaced">LOAD</span> command. Note that this is not the
|
|
DOS <span class="monospaced">LOAD</span> command; the DOS command has a file name after
|
|
<span class="monospaced">LOAD</span>. We just use <span class="monospaced">LOAD</span> with no file name.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>]LOAD
|
|
|
|
]</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>It will take 10 seconds or so for it to load. Notice that the
|
|
current position of the tape is counting up as the Apple loads
|
|
the program. When it is finished, the program will be loaded.</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt><span style="color: #990000">]</span>LIST
|
|
|
|
<span style="color: #993399">10</span> PRINT <span style="color: #FF0000">"HELLO"</span>
|
|
<span style="color: #993399">20</span> <span style="font-weight: bold"><span style="color: #0000FF">END</span></span>
|
|
|
|
<span style="color: #990000">]</span>RUN
|
|
HELLO
|
|
|
|
<span style="color: #990000">]</span></tt></pre></div></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_tape_image_file_format">Tape Image File Format</h4>
|
|
<div class="paragraph"><p>The format of the tape image file is unique to the Epple ][
|
|
It is stored in a low-level format that represents the waveform that the Apple writes
|
|
to the cassette tape.</p></div>
|
|
<div class="paragraph"><p>The file is a binary format. Each byte in the file represents the length of one half of one cycle
|
|
(of voltage level variation) written to the tape. The length is in 10-microsecond units.</p></div>
|
|
<div class="paragraph"><p>For example, a tape image file might have the following binary bytes (in decimal):
|
|
<span class="monospaced">65 65 65 65 65 20 25 50 50 25 25 25 25 50 50</span>
|
|
Since each byte represents a 10-microsecond unit, these bytes represent the following
|
|
half-cycle lengths in microseconds:
|
|
<span class="monospaced">650 650 650 650 650 200 250 500 500 250 250 250 250 500 500</span>
|
|
The meaning of these half-cycle lengths to the Apple is as follows:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content monospaced">
|
|
<pre>|-------HEADER------|--sync-|-1-bit-|-0-bit-|-0-bit-|-1-bit-|
|
|
| | | | | | |
|
|
|650 650 650 650 650|200 250|500 500|250 250|250 250|500 500|</pre>
|
|
</div></div>
|
|
<div class="paragraph"><p>where <span class="monospaced">HEADER</span> is a header section the Apple writes (to skip any
|
|
unrecordable leader section on a real cassette tape); <span class="monospaced">sync</span> is a
|
|
synchronization cycle; and the subsequent cycles are the actual
|
|
bits of data saved on the tape. A 500-microsecond cycle (which
|
|
is stored in the file as two 250 microsecond half-cycles)
|
|
represents a <strong>zero</strong> bit, and a 1-millisecond cycle (which is
|
|
stored in the file as two 500 microsecond half-cycles)
|
|
represents a <strong>one</strong> bit.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_paddles">Paddles</h3>
|
|
<div class="paragraph"><p>The Epple ][ provides two paddles to the Apple ][ machine.
|
|
One paddle is controlled by moving the mouse left and right; the other
|
|
paddle is controlled by moving the mouse up and down. The paddle buttons
|
|
are emulated by the mouse buttons (left and right click).</p></div>
|
|
<div class="paragraph"><p>In
|
|
<a href="http://www.scribd.com/doc/201423/Understanding-the-Apple-II-by-Jim-Sather-1983Quality-Software">Understanding the Apple II</a>,
|
|
on page 7-33, Jim Sather describes soldering fixed resistors across a game connector
|
|
to create two real-time clock references. This is emulated by the Epple ][. Paddle timers 2 and 3
|
|
are 100-microsecond and 1-millisecond references, respectively.</p></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_speaker">Speaker</h3>
|
|
<div class="paragraph"><p>The Apple ][ could generate sound via a speaker that generated square wave
|
|
audio. A program could read memory location $C030 to toggle the speaker and
|
|
generate a “click” sound.</p></div>
|
|
<div class="paragraph"><p>The Epple ][ emulator will generate sounds from the emulated Apple and
|
|
send them to the audio device. It generates 8-bit mono sound, with a 22,050 Hz
|
|
sampling rate.</p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_building_from_source">Building From Source</h2>
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p>The Epple ][ Emulator is written in C++, and can be built
|
|
using the standard <span class="monospaced">make</span> program.</p></div>
|
|
<div class="paragraph"><p>The primary dependency is
|
|
<a href="http://www.libsdl.org/">Simple DirectMedia Layer</a> (SDL).
|
|
Your linux distribution may provide a package. Or else
|
|
you can download it directly from SDL’s web site. In
|
|
either case, be sure to install the “Development Libraries”
|
|
for your particular platform.</p></div>
|
|
<div class="sect2">
|
|
<h3 id="_debian_linux_example">Debian Linux Example</h3>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>sudo apt-get install build-essential libsdl1<span style="color: #990000">.</span><span style="color: #993399">2</span>-dev <span style="font-style: italic"><span style="color: #9A1900"># <img src="./callouts/1.png" alt="1"></span></span>
|
|
cd
|
|
mkdir epple2
|
|
cd epple2
|
|
wget http<span style="color: #990000">:</span>//mosher<span style="color: #990000">.</span>mine<span style="color: #990000">.</span>nu/epple<span style="color: #993399">2</span>/download/epple<span style="color: #993399">2</span>-latest<span style="color: #990000">.</span>tar<span style="color: #990000">.</span>gz <span style="font-style: italic"><span style="color: #9A1900"># <img src="./callouts/2.png" alt="2"></span></span>
|
|
tar xzvf epple2-<span style="color: #993399">1.0</span><span style="color: #990000">.</span>tar<span style="color: #990000">.</span>gz
|
|
mkdir build <span style="font-style: italic"><span style="color: #9A1900"># <img src="./callouts/3.png" alt="3"></span></span>
|
|
cd build
|
|
<span style="color: #990000">..</span>/epple<span style="color: #993399">2</span>-<span style="color: #993399">1.0</span>/configure <span style="font-style: italic"><span style="color: #9A1900"># <img src="./callouts/4.png" alt="4"></span></span>
|
|
make <span style="font-style: italic"><span style="color: #9A1900"># <img src="./callouts/5.png" alt="5"></span></span>
|
|
sudo make install <span style="font-style: italic"><span style="color: #9A1900"># <img src="./callouts/6.png" alt="6"></span></span></tt></pre></div></div>
|
|
<div class="colist arabic"><table>
|
|
<tr><td><img src="./callouts/1.png" alt="1"></td><td>
|
|
Install dependencies: gcc, make, SDL
|
|
</td></tr>
|
|
<tr><td><img src="./callouts/2.png" alt="2"></td><td>
|
|
Retrieve the latest Epple ][ source distribution
|
|
</td></tr>
|
|
<tr><td><img src="./callouts/3.png" alt="3"></td><td>
|
|
Use this directory for a VPATH-style build
|
|
</td></tr>
|
|
<tr><td><img src="./callouts/4.png" alt="4"></td><td>
|
|
Run one-time configuration script for your system. Use <span class="monospaced">--help</span> for more information.
|
|
</td></tr>
|
|
<tr><td><img src="./callouts/5.png" alt="5"></td><td>
|
|
Compile and link. Program will be <span class="monospaced">src/epple2</span>
|
|
</td></tr>
|
|
<tr><td><img src="./callouts/6.png" alt="6"></td><td>
|
|
Install into standard system directories
|
|
</td></tr>
|
|
</table></div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_windows_msys_example">Windows/MSYS Example</h3>
|
|
<div class="sect3">
|
|
<h4 id="_install_mingw_msys">Install MinGW/MSYS</h4>
|
|
<div class="paragraph"><p>Install MSYS into <span class="monospaced">C:\msys\</span></p></div>
|
|
<div class="paragraph"><p>Install MinGW into <span class="monospaced">C:\msys\mingw\</span></p></div>
|
|
<div class="paragraph"><p>For more information on MinGW and MSYS, see <a href="http://www.mingw.org/">http://www.mingw.org/</a>.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_install_sdl">Install SDL</h4>
|
|
<div class="paragraph"><p>At <a href="http://www.libsdl.org/">http://www.libsdl.org/</a> find the download page.
|
|
Download the “Development Libraries” for Win32/mingw, for example:</p></div>
|
|
<div class="paragraph"><p><span class="monospaced">SDL-devel-1.2.13-mingw32.tar.gz</span> (Mingw32)</p></div>
|
|
<div class="paragraph"><p>and save it to your MSYS home directory (for example, <span class="monospaced">C:\msys\home\Administrator</span>).
|
|
Run MSYS, and at the bash prompt, go to your home directory and
|
|
untar the SDL archive to your home directory:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>$ cd
|
|
$ tar xzvf SDL-devel-<span style="color: #993399">1.2</span><span style="color: #990000">.</span><span style="color: #993399">13</span>-mingw<span style="color: #993399">32</span><span style="color: #990000">.</span>tar<span style="color: #990000">.</span>gz</tt></pre></div></div>
|
|
<div class="paragraph"><p>Then follow the instructions to install SDL, for example:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>$ cd SDL-<span style="color: #993399">1.2</span><span style="color: #990000">.</span><span style="color: #993399">13</span>
|
|
$ make native</tt></pre></div></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_untar_epple_source">Untar Epple ][ Source</h4>
|
|
<div class="paragraph"><p>Download the Epple ][ Source Distribution
|
|
and save it to your MSYS home directory (for example, <span class="monospaced">C:\msys\home\Administrator</span>).
|
|
Run MSYS, and at the bash prompt, go to your home directory and
|
|
untar the epple2 source distribution tar file. For example:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>$ cd
|
|
$ tar xzvf epple2-<span style="color: #993399">1.0</span><span style="color: #990000">.</span>tar<span style="color: #990000">.</span>gz</tt></pre></div></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_build_epple">Build Epple ][</h4>
|
|
<div class="paragraph"><p>Then build as follows. I recommend doing a VPATH build,
|
|
where you build into a different directory than the source
|
|
directory. To accomplish this, create a new directory for
|
|
building, somewhere, such as:</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>$ cd
|
|
$ mkdir buildepple2
|
|
$ cd buildepple2</tt></pre></div></div>
|
|
<div class="paragraph"><p>Then run <span class="monospaced">configure</span> from there. For the MSYS build to work,
|
|
you need some extra parameters to the build, and you could
|
|
also add some compiler options to optimize the build. For
|
|
example (from the <span class="monospaced">buildepple2</span> directory you just created):</p></div>
|
|
<div class="listingblock">
|
|
<div class="content"><!-- Generator: GNU source-highlight 3.1.6
|
|
by Lorenzo Bettini
|
|
http://www.lorenzobettini.it
|
|
http://www.gnu.org/software/src-highlite -->
|
|
<pre><tt>$ <span style="color: #990000">~</span>/epple<span style="color: #993399">2</span>/configure --prefix<span style="color: #990000">=</span> <span style="color: #990000">\</span>
|
|
<span style="color: #009900">CXXFLAGS</span><span style="color: #990000">=</span><span style="color: #FF0000">"-I/usr/include -O4 -msse3"</span> <span style="color: #990000">\</span>
|
|
<span style="color: #009900">CFLAGS</span><span style="color: #990000">=</span><span style="color: #FF0000">"-I/usr/include"</span> <span style="color: #990000">\</span>
|
|
<span style="color: #009900">LDFLAGS</span><span style="color: #990000">=</span><span style="color: #FF0000">"-L/usr/lib -mconsole -mthreads -mno-cygwin"</span>
|
|
$ make</tt></pre></div></div>
|
|
<div class="paragraph"><p>If all goes well, it will build without any errors.
|
|
If you get errors about not finding <span class="monospaced">SDL.h</span>, make sure
|
|
SDL is installed, and make sure the configure command
|
|
is correct. (If you just run configure without the
|
|
options shown above, you will get this error at build time.)
|
|
The result of the build (on Windows platform) is</p></div>
|
|
<div class="paragraph"><p><span class="monospaced">installer/epple2.msi</span></p></div>
|
|
<div class="paragraph"><p>which is an installable file for Windows. To install
|
|
epple2, just double-click on this file from Explorer.</p></div>
|
|
<hr>
|
|
<div class="paragraph"><p><span class="small">Copyright © 2009,2012, by
|
|
<a href="mailto:chris-keyword-epple2.4a8db3@mosher.mine.nu">Christopher A. Mosher</a>,
|
|
Shelton CT, USA.</span></p></div>
|
|
<div class="paragraph"><p><span class="image">
|
|
<img src="80x15.png" alt="Creative Commons Attribution-Noncommercial-Share Alike 3.0 USA License">
|
|
</span></p></div>
|
|
<div class="paragraph"><p><span class="small">This web site is licensed under the
|
|
<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/">Creative Commons Attribution-Noncommercial-Share Alike 3.0 USA License</a>.</span></p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="footnotes"><hr></div>
|
|
<div id="footer">
|
|
<div id="footer-text">
|
|
Last updated 2012-04-20 20:42:04 EDT
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|