@ -0,0 +1,189 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en" data-bs-theme="auto"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
|
|||
|
|||
|
|||
<link rel="shortcut icon" href="/img/favicon.ico"> |
|||
<title>RomWBW Documentation V3.6</title> |
|||
<link href="/css/bootstrap.min.css" rel="stylesheet"> |
|||
<link href="/css/fontawesome.min.css" rel="stylesheet"> |
|||
<link href="/css/brands.min.css" rel="stylesheet"> |
|||
<link href="/css/solid.min.css" rel="stylesheet"> |
|||
<link href="/css/v4-font-face.min.css" rel="stylesheet"> |
|||
<link href="/css/base.css" rel="stylesheet"> |
|||
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" disabled> |
|||
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
|||
<script>hljs.highlightAll();</script> |
|||
</head> |
|||
|
|||
<body> |
|||
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary"> |
|||
<div class="container"> |
|||
<a class="navbar-brand" href="/.">RomWBW Documentation V3.6</a> |
|||
<!-- Expander button --> |
|||
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation"> |
|||
<span class="navbar-toggler-icon"></span> |
|||
</button> |
|||
|
|||
<!-- Expanded navigation --> |
|||
<div id="navbar-collapse" class="navbar-collapse collapse"> |
|||
<!-- Main navigation --> |
|||
<ul class="nav navbar-nav"> |
|||
<li class="nav-item"> |
|||
<a href="/Introduction/" class="nav-link">Introduction</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="/UserGuide/" class="nav-link">User Guide</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="/SystemGuide/" class="nav-link">System Guide</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="/Applications/" class="nav-link">Applications</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="/Catalog/" class="nav-link">Catalog</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="/Hardware/" class="nav-link">Hardware</a> |
|||
</li> |
|||
</ul> |
|||
|
|||
<ul class="nav navbar-nav ms-md-auto"> |
|||
<li class="nav-item"> |
|||
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal"> |
|||
<i class="fa fa-search"></i> Search |
|||
</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="https://github.com/wwarthen/RomWBW" class="nav-link"><i class="fa-brands fa-github"></i> GitHub</a> |
|||
</li> |
|||
<li class="nav-item dropdown"> |
|||
<button id="theme-menu" aria-expanded="false" data-bs-toggle="dropdown" data-bs-display="static" aria-label="Toggle theme" class="nav-link dropdown-toggle"> |
|||
<i class="fa-solid fa-circle-half-stroke fa-fw"></i> |
|||
<span class="d-lg-none ms-2">Toggle theme</span> |
|||
</button> |
|||
<ul class="dropdown-menu dropdown-menu-end"> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false"> |
|||
<i class="fa-solid fa-sun fa-fw"></i> |
|||
<span class="ms-2">Light</span> |
|||
<i class="fa-solid fa-check ms-auto d-none"></i> |
|||
</button> |
|||
</li> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false"> |
|||
<i class="fa-solid fa-moon fa-fw"></i> |
|||
<span class="ms-2">Dark</span> |
|||
<i class="fa-solid fa-check ms-auto d-none"></i> |
|||
</button> |
|||
</li> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="auto" aria-pressed="true"> |
|||
<i class="fa-solid fa-circle-half-stroke fa-fw"></i> |
|||
<span class="ms-2">Auto</span> |
|||
<i class="fa-solid fa-check ms-auto"></i> |
|||
</button> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<script src="/js/darkmode.js"></script> |
|||
|
|||
<div class="container"> |
|||
<div class="row"> |
|||
|
|||
<div class="row-fluid"> |
|||
<div id="main-content" class="span12"> |
|||
<h1 id="404-page-not-found" style="text-align: center">404</h1> |
|||
<p style="text-align: center"><strong>Page not found</strong></p> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
</div> |
|||
</div> |
|||
|
|||
<footer class="col-md-12"> |
|||
<hr> |
|||
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p> |
|||
</footer> |
|||
<script src="/js/bootstrap.bundle.min.js"></script> |
|||
<script> |
|||
var base_url = "/", |
|||
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83}; |
|||
</script> |
|||
<script src="/js/base.js"></script> |
|||
<script src="/search/main.js"></script> |
|||
|
|||
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true"> |
|||
<div class="modal-dialog modal-lg"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title" id="searchModalLabel">Search</h4> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
<p>From here you can search these documents. Enter your search terms below.</p> |
|||
<form> |
|||
<div class="form-group"> |
|||
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here"> |
|||
</div> |
|||
</form> |
|||
<div id="mkdocs-search-results" data-no-results-text="No results found"></div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
<table class="table"> |
|||
<thead> |
|||
<tr> |
|||
<th style="width: 20%;">Keys</th> |
|||
<th>Action</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td class="help shortcut"><kbd>?</kbd></td> |
|||
<td>Open this help</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="next shortcut"><kbd>n</kbd></td> |
|||
<td>Next page</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="prev shortcut"><kbd>p</kbd></td> |
|||
<td>Previous page</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="search shortcut"><kbd>s</kbd></td> |
|||
<td>Search</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,691 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en" data-bs-theme="auto"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
|
|||
|
|||
|
|||
<link rel="shortcut icon" href="../img/favicon.ico"> |
|||
<title>Introduction - RomWBW Documentation V3.6</title> |
|||
<link href="../css/bootstrap.min.css" rel="stylesheet"> |
|||
<link href="../css/fontawesome.min.css" rel="stylesheet"> |
|||
<link href="../css/brands.min.css" rel="stylesheet"> |
|||
<link href="../css/solid.min.css" rel="stylesheet"> |
|||
<link href="../css/v4-font-face.min.css" rel="stylesheet"> |
|||
<link href="../css/base.css" rel="stylesheet"> |
|||
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" disabled> |
|||
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
|||
<script>hljs.highlightAll();</script> |
|||
</head> |
|||
|
|||
<body> |
|||
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary"> |
|||
<div class="container"> |
|||
<a class="navbar-brand" href="..">RomWBW Documentation V3.6</a> |
|||
<!-- Expander button --> |
|||
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation"> |
|||
<span class="navbar-toggler-icon"></span> |
|||
</button> |
|||
|
|||
<!-- Expanded navigation --> |
|||
<div id="navbar-collapse" class="navbar-collapse collapse"> |
|||
<!-- Main navigation --> |
|||
<ul class="nav navbar-nav"> |
|||
<li class="nav-item"> |
|||
<a href="./" class="nav-link active" aria-current="page">Introduction</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="../UserGuide/" class="nav-link">User Guide</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="../SystemGuide/" class="nav-link">System Guide</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="../Applications/" class="nav-link">Applications</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="../Catalog/" class="nav-link">Catalog</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="../Hardware/" class="nav-link">Hardware</a> |
|||
</li> |
|||
</ul> |
|||
|
|||
<ul class="nav navbar-nav ms-md-auto"> |
|||
<li class="nav-item"> |
|||
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal"> |
|||
<i class="fa fa-search"></i> Search |
|||
</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a rel="prev" class="nav-link disabled"> |
|||
<i class="fa fa-arrow-left"></i> Previous |
|||
</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a rel="next" href="../UserGuide/" class="nav-link"> |
|||
Next <i class="fa fa-arrow-right"></i> |
|||
</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="https://github.com/wwarthen/RomWBW" class="nav-link"><i class="fa-brands fa-github"></i> GitHub</a> |
|||
</li> |
|||
<li class="nav-item dropdown"> |
|||
<button id="theme-menu" aria-expanded="false" data-bs-toggle="dropdown" data-bs-display="static" aria-label="Toggle theme" class="nav-link dropdown-toggle"> |
|||
<i class="fa-solid fa-circle-half-stroke fa-fw"></i> |
|||
<span class="d-lg-none ms-2">Toggle theme</span> |
|||
</button> |
|||
<ul class="dropdown-menu dropdown-menu-end"> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false"> |
|||
<i class="fa-solid fa-sun fa-fw"></i> |
|||
<span class="ms-2">Light</span> |
|||
<i class="fa-solid fa-check ms-auto d-none"></i> |
|||
</button> |
|||
</li> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false"> |
|||
<i class="fa-solid fa-moon fa-fw"></i> |
|||
<span class="ms-2">Dark</span> |
|||
<i class="fa-solid fa-check ms-auto d-none"></i> |
|||
</button> |
|||
</li> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="auto" aria-pressed="true"> |
|||
<i class="fa-solid fa-circle-half-stroke fa-fw"></i> |
|||
<span class="ms-2">Auto</span> |
|||
<i class="fa-solid fa-check ms-auto"></i> |
|||
</button> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<script src="../js/darkmode.js"></script> |
|||
|
|||
<div class="container"> |
|||
<div class="row"> |
|||
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary"> |
|||
<div class="navbar-header"> |
|||
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents"> |
|||
<span class="fa fa-angle-down"></span> |
|||
</button> |
|||
</div> |
|||
|
|||
|
|||
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary"> |
|||
<ul class="nav flex-column"> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#overview" class="nav-link">Overview</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#description" class="nav-link">Description</a> |
|||
<ul class="nav flex-column"> |
|||
<li class="nav-item" data-bs-level="2"><a href="#primary-features" class="nav-link">Primary Features</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
<li class="nav-item" data-bs-level="2"><a href="#included-software" class="nav-link">Included Software</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
<li class="nav-item" data-bs-level="2"><a href="#rom-distribution" class="nav-link">ROM Distribution</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
<li class="nav-item" data-bs-level="2"><a href="#installation-operation" class="nav-link">Installation & Operation</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
<li class="nav-item" data-bs-level="2"><a href="#documentation" class="nav-link">Documentation</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#support" class="nav-link">Support</a> |
|||
<ul class="nav flex-column"> |
|||
<li class="nav-item" data-bs-level="2"><a href="#getting-assistance" class="nav-link">Getting Assistance</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#contributions" class="nav-link">Contributions</a> |
|||
<ul class="nav flex-column"> |
|||
<li class="nav-item" data-bs-level="2"><a href="#acknowledgments" class="nav-link">Acknowledgments</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
<li class="nav-item" data-bs-level="2"><a href="#related-projects" class="nav-link">Related Projects</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#licensing" class="nav-link">Licensing</a> |
|||
<ul class="nav flex-column"> |
|||
<li class="nav-item" data-bs-level="2"><a href="#license-terms" class="nav-link">License Terms</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div></div> |
|||
<div class="col-md-9" role="main"> |
|||
|
|||
<p><strong>RomWBW Introduction</strong> \ |
|||
Version 3.6 \ |
|||
Wayne Warthen (<a href="mailto:wwarthen@gmail.com">wwarthen@gmail.com</a>) \ |
|||
30 May 2025</p> |
|||
<h1 id="overview">Overview</h1> |
|||
<p>RomWBW software provides a complete, commercial quality implementation |
|||
of CP/M (and workalike) operating systems and applications for modern |
|||
Z80/180/280 retro-computing hardware systems.</p> |
|||
<p>A wide variety of platforms are supported including those produced by |
|||
these developer communities:</p> |
|||
<ul> |
|||
<li><a href="https://www.retrobrewcomputers.org">RetroBrew Computers</a> |
|||
(<a href="https://www.retrobrewcomputers.org">https://www.retrobrewcomputers.org</a>)</li> |
|||
<li><a href="https://rc2014.co.uk">RC2014</a> (<a href="https://rc2014.co.uk">https://rc2014.co.uk</a>),<br /> |
|||
<a href="https://groups.google.com/g/rc2014-z80">RC2014-Z80</a> |
|||
(<a href="https://groups.google.com/g/rc2014-z80">https://groups.google.com/g/rc2014-z80</a>)</li> |
|||
<li><a href="https://groups.google.com/g/retro-comp">Retro Computing</a> |
|||
(<a href="https://groups.google.com/g/retro-comp">https://groups.google.com/g/retro-comp</a>)</li> |
|||
<li><a href="https://smallcomputercentral.com/">Small Computer Central</a> |
|||
(<a href="https://smallcomputercentral.com/">https://smallcomputercentral.com/</a>)</li> |
|||
</ul> |
|||
<p>A complete list of the currently supported platforms is found in <a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Hardware.pdf">RomWBW |
|||
Hardware</a> |
|||
.</p> |
|||
<h1 id="description">Description</h1> |
|||
<h2 id="primary-features">Primary Features</h2> |
|||
<p>By design, RomWBW isolates all of the hardware specific functions in the |
|||
ROM chip itself. The ROM provides a hardware abstraction layer such that |
|||
all of the operating systems and applications on a disk will run on any |
|||
RomWBW-based system. To put it simply, you can take a disk (or CF/SD/USB |
|||
Card) and move it between systems transparently.</p> |
|||
<p>Supported hardware features of RomWBW include:</p> |
|||
<ul> |
|||
<li>Z80 Family CPUs including Z80, Z180, and Z280</li> |
|||
<li>Banked memory services for several banking designs</li> |
|||
<li>Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, |
|||
Iomega</li> |
|||
<li>Serial drivers including UART (16550-like), ASCI, ACIA, SIO</li> |
|||
<li>Video drivers including TMS9918, SY6545, MOS8563, HD6445</li> |
|||
<li>Keyboard (PS/2) drivers via VT8242 or PPI interfaces</li> |
|||
<li>Real time clock drivers including DS1302, BQ4845</li> |
|||
<li>Support for CP/NET networking using Wiznet, MT011 or Serial</li> |
|||
<li>Built-in VT-100 terminal emulation support</li> |
|||
</ul> |
|||
<p>A dynamic disk drive letter assignment mechanism allows mapping |
|||
operating system drive letters to any available disk media. |
|||
Additionally, mass storage devices (IDE Disk, CF Card, SD Card, etc.) |
|||
support the use of multiple slices (up to 256 per device). Each slice |
|||
contains a complete CP/M filesystem and can be mapped independently to |
|||
any drive letter. This overcomes the inherent size limitations in legacy |
|||
OSes and allows up to 2GB of addressable storage on a single device, |
|||
with up to 128MB accessible at any one time.</p> |
|||
<h2 id="included-software">Included Software</h2> |
|||
<p>Multiple disk images are provided in the distribution. Most disk images |
|||
contain a complete, bootable, ready-to-run implementation of a specific |
|||
operating system. A “combo” disk image contains multiple slices, each |
|||
with a full operating system implementation. If you use this disk image, |
|||
you can easily pick whichever operating system you want to boot without |
|||
changing media.</p> |
|||
<p>Some of the included software:</p> |
|||
<ul> |
|||
<li>Operating Systems (CP/M 2.2, ZSDOS, NZ-COM, CP/M 3, ZPM3, Z3PLUS, QPM |
|||
)</li> |
|||
<li>Support for other operating systems, p-System, FreeRTOS, and FUZIX.</li> |
|||
<li>Programming Tools (Z80ASM, Turbo Pascal, Forth, Cowgol)</li> |
|||
<li>C Compiler’s including Aztec-C, and HI-TECH C</li> |
|||
<li>Microsoft Basic Compiler, and Microsoft Fortran</li> |
|||
<li>Some games such as Colossal Cave, Zork, etc</li> |
|||
<li>Wordstar Word processing software</li> |
|||
</ul> |
|||
<p>Some of the provided software can be launched directly from the ROM |
|||
firmware itself:</p> |
|||
<ul> |
|||
<li>System Monitor</li> |
|||
<li>Operating Systems (CP/M 2.2, ZSDOS)</li> |
|||
<li>ROM BASIC (Nascom BASIC and Tasty BASIC)</li> |
|||
<li>ROM Forth</li> |
|||
</ul> |
|||
<p>A tool is provided that allows you to access a FAT-12/16/32 filesystem. |
|||
The FAT filesystem may be coresident on the same disk media as RomWBW |
|||
slices or on stand-alone media. This makes exchanging files with modern |
|||
OSes such as Windows, MacOS, and Linux very easy.</p> |
|||
<h2 id="rom-distribution">ROM Distribution</h2> |
|||
<p>The <a href="https://github.com/wwarthen/RomWBW">RomWBW Repository</a> |
|||
(<a href="https://github.com/wwarthen/RomWBW">https://github.com/wwarthen/RomWBW</a>) on GitHub is the official |
|||
distribution location for all project source and documentation.</p> |
|||
<p>RomWBW is distributed as both source code and pre-built ROM and disk |
|||
images.</p> |
|||
<p>The pre-built ROM images distributed with RomWBW are based on the |
|||
default system configurations as determined by the hardware |
|||
provider/designer. The pre-built ROM firmware images are generally |
|||
suitable for most users.</p> |
|||
<p>The fully-built distribution releases are available on the <a href="https://github.com/wwarthen/RomWBW/releases">RomWBW |
|||
Releases Page</a> |
|||
(<a href="https://github.com/wwarthen/RomWBW/releases">https://github.com/wwarthen/RomWBW/releases</a>) of the repository.</p> |
|||
<p>On this page, you will normally see a Development Snapshot as well as |
|||
recent stable releases. Unless you have a specific reason, I suggest you |
|||
stick to the most recent stable release.</p> |
|||
<p>The asset named RomWBW-vX.X.X-Package.zip includes all pre-built ROM and |
|||
Disk images as well as full source code. The other assets contain only |
|||
source code and do not have the pre-built ROM or disk images.</p> |
|||
<h4 id="distribution-directory-layout">Distribution Directory Layout</h4> |
|||
<p>The RomWBW distribution is a compressed zip archive file organized in a |
|||
set of directories. Each of these directories has its own ReadMe.txt |
|||
file describing the contents in detail. In summary, these directories |
|||
are:</p> |
|||
<table> |
|||
<thead> |
|||
<tr> |
|||
<th><strong>Directory</strong></th> |
|||
<th><strong>Description</strong></th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td><strong>Binary</strong></td> |
|||
<td>The final output files of the build process are placed here. Most importantly, the ROM images with the file names ending in “.rom” and disk images ending in .img.</td> |
|||
</tr> |
|||
<tr> |
|||
<td><strong>Doc</strong></td> |
|||
<td>Contains various detailed documentation, both RomWBW specifically as well as the operating systems and applications.</td> |
|||
</tr> |
|||
<tr> |
|||
<td><strong>Source</strong></td> |
|||
<td>Contains the source code files used to build the software and ROM images.</td> |
|||
</tr> |
|||
<tr> |
|||
<td><strong>Tools</strong></td> |
|||
<td>Contains the programs that are used by the build process or that may be useful in setting up your system.</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
<h4 id="building-from-source">Building from Source</h4> |
|||
<p>It is also very easy to modify and build custom ROM images that fully |
|||
tailor the firmware to your specific preferences. All tools required to |
|||
build custom ROM firmware under Windows are included – no need to |
|||
install assemblers, etc. The firmware can also be built using Linux or |
|||
MacOS after confirming a few standard tools have been installed.</p> |
|||
<h2 id="installation-operation">Installation & Operation</h2> |
|||
<p>In general, installation of RomWBW on your platform is very simple. You |
|||
just need to program your ROM with the correct ROM image from the RomWBW |
|||
distribution. Subsequently, you can write disk images on your disk |
|||
drives (IDE disk, CF Card, SD Card, etc.) which then provides even more |
|||
functionality.</p> |
|||
<p>Complete instructions for installation and operation of RomWBW are found |
|||
in the <a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20User%20Guide.pdf">RomWBW User |
|||
Guide</a>. |
|||
It is also a good idea to review the <a href="https://github.com/wwarthen/RomWBW/blob/master/RELEASE_NOTES.md">Release |
|||
Notes</a> |
|||
for helpful release-specific information.</p> |
|||
<h2 id="documentation">Documentation</h2> |
|||
<p>There are several documents that form the core of the RomWBW |
|||
documentation:</p> |
|||
<ul> |
|||
<li> |
|||
<p><a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20User%20Guide.pdf">RomWBW User |
|||
Guide</a> |
|||
is the main user guide for RomWBW, it covers the major topics of how |
|||
to install, manage and use RomWBW, and includes additional guidance to |
|||
the use of some of the operating systems supported by RomWBW</p> |
|||
</li> |
|||
<li> |
|||
<p><a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Hardware.pdf">RomWBW |
|||
Hardware</a> |
|||
contains a description of all the hardware platforms, and devices |
|||
supported by RomWBW.</p> |
|||
</li> |
|||
<li> |
|||
<p><a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Applications.pdf">RomWBW |
|||
Applications</a> |
|||
is a reference for the ROM-hosted and OS-hosted applications created |
|||
or customized to enhance the operation of RomWBW.</p> |
|||
</li> |
|||
<li> |
|||
<p><a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Disk%20Catalog.pdf">RomWBW Disk |
|||
Catalog</a> |
|||
is a reference for the contents of the disk images provided with |
|||
RomWBW, with a description of many of the files on each image</p> |
|||
</li> |
|||
<li> |
|||
<p><a href="https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20System%20Guide.pdf">RomWBW System |
|||
Guide</a> |
|||
discusses much of the internal design and construction of RomWBW. It |
|||
includes a reference for the RomWBW HBIOS API functions.</p> |
|||
</li> |
|||
</ul> |
|||
<p>Each of the operating systems and ROM applications included with RomWBW |
|||
are sophisticated tools in their own right. It is not reasonable to |
|||
fully document their usage. However, you will find complete manuals in |
|||
PDF format in the Doc directory of the distribution. The intention of |
|||
this documentation is to describe the operation of RomWBW and the ways |
|||
in which it enhances the operation of the included applications and |
|||
operating systems.</p> |
|||
<p>Since RomWBW is purely a software product for many different platforms, |
|||
the documentation does <strong>not</strong> cover hardware construction, |
|||
configuration, or troubleshooting – please see your hardware provider |
|||
for this information.</p> |
|||
<h1 id="support">Support</h1> |
|||
<h2 id="getting-assistance">Getting Assistance</h2> |
|||
<p>The best way to get assistance with RomWBW or any aspect of the |
|||
RetroBrew Computers projects is via one of the community forums:</p> |
|||
<ul> |
|||
<li><a href="https://www.retrobrewcomputers.org/forum/">RetroBrew Computers Forum</a></li> |
|||
<li><a href="https://groups.google.com/forum/#!forum/rc2014-z80">RC2014 Google |
|||
Group</a></li> |
|||
<li><a href="https://groups.google.com/forum/#!forum/retro-comp">retro-comp Google |
|||
Group</a></li> |
|||
</ul> |
|||
<p>Submission of issues and bugs are welcome at the <a href="https://github.com/wwarthen/RomWBW">RomWBW GitHub |
|||
Repository</a>.</p> |
|||
<p>Also feel free to email Wayne Warthen at <a href="mailto:wwarthen@gmail.com">wwarthen@gmail.com</a>. I am |
|||
happy to provide support adapting RomWBW to new or modified systems</p> |
|||
<h1 id="contributions">Contributions</h1> |
|||
<p>All source code and distributions are maintained on GitHub. |
|||
Contributions of all kinds to RomWBW are very welcome.</p> |
|||
<h2 id="acknowledgments">Acknowledgments</h2> |
|||
<p>I want to acknowledge that a great deal of the code and inspiration for |
|||
RomWBW has been provided by or derived from the work of others in the |
|||
RetroBrew Computers Community. I sincerely appreciate all of their |
|||
contributions. The list below is probably missing many names – please |
|||
let me know if I missed you!</p> |
|||
<ul> |
|||
<li> |
|||
<p>Andrew Lynch started it all when he created the N8VEM Z80 SBC which |
|||
became the first platform RomWBW supported. Some of his original code |
|||
can still be found in RomWBW.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dan Werner wrote much of the code from which RomWBW was originally |
|||
derived and he has always been a great source of knowledge and advice.</p> |
|||
</li> |
|||
<li> |
|||
<p>Douglas Goodall contributed code, time, testing, and advice in “the |
|||
early days”. He created an entire suite of application programs to |
|||
enhance the use of RomWBW. Unfortunately, they have become unusable |
|||
due to internal changes within RomWBW. As of RomWBW 2.6, these |
|||
applications are no longer provided.</p> |
|||
</li> |
|||
<li> |
|||
<p>Sergey Kiselev created several hardware platforms for RomWBW including |
|||
the very popular Zeta.</p> |
|||
</li> |
|||
<li> |
|||
<p>David Giles created support for the Z180 CSIO which is now included SD |
|||
Card driver.</p> |
|||
</li> |
|||
<li> |
|||
<p>Phil Summers contributed the Forth and BASIC adaptations in ROM, the |
|||
AY-3-8910 sound driver, DMA support, and a long list of general code |
|||
and documentation enhancements.</p> |
|||
</li> |
|||
<li> |
|||
<p>Ed Brindley contributed some of the code that supports the RCBus |
|||
platform.</p> |
|||
</li> |
|||
<li> |
|||
<p>Spencer Owen created the RC2014 series of hobbyist kit computers which |
|||
has exponentially increased RomWBW usage. Some of his kits include |
|||
RomWBW.</p> |
|||
</li> |
|||
<li> |
|||
<p>Stephen Cousins has likewise created a series of hobbyist kit |
|||
computers at Small Computer Central and is distributing RomWBW with |
|||
many of them.</p> |
|||
</li> |
|||
<li> |
|||
<p>Alan Cox has contributed some driver code and has provided a great |
|||
deal of advice.</p> |
|||
</li> |
|||
<li> |
|||
<p>The CP/NET client files were developed by Douglas Miller.</p> |
|||
</li> |
|||
<li> |
|||
<p>Phillip Stevens contributed support for FreeRTOS.</p> |
|||
</li> |
|||
<li> |
|||
<p>Curt Mayer contributed the original Linux / MacOS build process.</p> |
|||
</li> |
|||
<li> |
|||
<p>UNA BIOS and FDISK80 are the products of John Coffman.</p> |
|||
</li> |
|||
<li> |
|||
<p>FLASH4 is a product of Will Sowerbutts.</p> |
|||
</li> |
|||
<li> |
|||
<p>CLRDIR is a product of Max Scane.</p> |
|||
</li> |
|||
<li> |
|||
<p>Tasty Basic is a product of Dimitri Theulings.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dean Netherton contributed eZ80 CPU support, the sound driver |
|||
interface, and the SN76489 sound driver.</p> |
|||
</li> |
|||
<li> |
|||
<p>The RomWBW Disk Catalog document was produced by Mykl Orders.</p> |
|||
</li> |
|||
<li> |
|||
<p>Rob Prouse has created many of the supplemental disk images including |
|||
Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft BASIC Compiler, |
|||
Microsoft Fortran Compiler, and a Games compendium.</p> |
|||
</li> |
|||
<li> |
|||
<p>Martin R has provided substantial help reviewing and improving the |
|||
User Guide and Applications documents.</p> |
|||
</li> |
|||
<li> |
|||
<p>Mark Pruden has made a wide variety of contributions including:</p> |
|||
</li> |
|||
<li> |
|||
<p>significant content in the Disk Catalog and User Guide</p> |
|||
</li> |
|||
<li>creation of the Introduction and Hardware documents</li> |
|||
<li>Z3PLUS operating system disk image</li> |
|||
<li>COPYSL utility</li> |
|||
<li>SLABEL utility</li> |
|||
<li>a feature for RomWBW configuration by NVRAM</li> |
|||
<li> |
|||
<p>the /B bulk mode of disk assignment to the ASSIGN utility</p> |
|||
</li> |
|||
<li> |
|||
<p>Jacques Pelletier has contributed the DS1501 RTC driver code.</p> |
|||
</li> |
|||
<li> |
|||
<p>Jose Collado has contributed enhancements to the TMS driver including |
|||
compatibility with standard TMS register configuration.</p> |
|||
</li> |
|||
<li> |
|||
<p>Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).</p> |
|||
</li> |
|||
<li> |
|||
<p>Matt Carroll has contributed a fix to XM.COM that corrects the port |
|||
specification when doing a send.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dean Jenkins enhanced the build process to accommodate the Raspberry |
|||
Pi 4.</p> |
|||
</li> |
|||
<li> |
|||
<p>Tom Plano has contributed a new utility (HTALK) to allow talking |
|||
directly to HBIOS COM ports.</p> |
|||
</li> |
|||
<li> |
|||
<p>Lars Nelson has contributed several generic utilities such as a |
|||
universal (OS agnostic) UNARC application.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dylan Hall added support for specifying a secondary console.</p> |
|||
</li> |
|||
<li> |
|||
<p>Bill Shen has contributed boot loaders for several of his systems.</p> |
|||
</li> |
|||
<li> |
|||
<p>Laszlo Szolnoki has contributed an EF9345 video display controller |
|||
driver.</p> |
|||
</li> |
|||
<li> |
|||
<p>Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol |
|||
that leverages RomWBW memory banking.</p> |
|||
</li> |
|||
<li> |
|||
<p>Les Bird has contributed support for the NABU w/ Option Board</p> |
|||
</li> |
|||
</ul> |
|||
<h2 id="related-projects">Related Projects</h2> |
|||
<p>Outside of the hardware platforms adapted to RomWBW, there are a variety |
|||
of projects that either target RomWBW specifically or provide a |
|||
RomWBW-specific variation. These efforts are greatly appreciated and are |
|||
listed below. Please contact the author if there are any other such |
|||
projects that are not listed.</p> |
|||
<h4 id="z88dk">Z88DK</h4> |
|||
<p>Z88DK is a software powerful development kit for Z80 computers |
|||
supporting both C and assembly language. This kit now provides specific |
|||
library support for RomWBW HBIOS. The Z88DK project is hosted at |
|||
<a href="https://github.com/z88dk/z88dk">https://github.com/z88dk/z88dk</a>.</p> |
|||
<h4 id="paleo-editor">Paleo Editor</h4> |
|||
<p>Steve Garcia has created a Windows-hosted IDE that is tailored to |
|||
development of RomWBW. The project can be found at |
|||
<a href="https://github.com/alloidian/PaleoEditor">https://github.com/alloidian/PaleoEditor</a>.</p> |
|||
<h4 id="z80-fig-forth">Z80 fig-FORTH</h4> |
|||
<p>Dimitri Theulings’ implementation of fig-FORTH for the Z80 has a |
|||
RomWBW-specific variant. The project is hosted at |
|||
<a href="https://github.com/dimitrit/figforth">https://github.com/dimitrit/figforth</a>.</p> |
|||
<h4 id="assembly-language-programming-for-the-rc2014-zed">Assembly Language Programming for the RC2014 Zed</h4> |
|||
<p>Bruce Hall has written a very nice document that describes how to |
|||
develop assembly language applications on RomWBW. It begins with the |
|||
setup and configuration of a new RC2014 Zed system running RomWBW. It |
|||
describes not only generic CP/M application development, but also RomWBW |
|||
HBIOS programming and bare metal programming. The latest copy of this |
|||
document is hosted at <a href="http://w8bh.net/Assembly%20for%20RC2014Z.pdf">http://w8bh.net/Assembly for |
|||
RC2014Z.pdf</a>.</p> |
|||
<h1 id="licensing">Licensing</h1> |
|||
<h2 id="license-terms">License Terms</h2> |
|||
<p>RomWBW is free software: you can redistribute it and/or modify it under |
|||
the terms of the GNU General Public License as published by the Free |
|||
Software Foundation, either version 3 of the License, or (at your |
|||
option) any later version.</p> |
|||
<p>RomWBW is distributed in the hope that it will be useful, but WITHOUT |
|||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|||
more details.</p> |
|||
<p>You should have received a copy of the GNU General Public License along |
|||
with RomWBW. If not, see <a href="https://www.gnu.org/licenses/">https://www.gnu.org/licenses/</a>.</p> |
|||
<p>Portions of RomWBW were created by, contributed by, or derived from the |
|||
work of others. It is believed that these works are being used in |
|||
accordance with the intentions and/or licensing of their creators.</p> |
|||
<p>If anyone feels their work is being used outside of its intended |
|||
licensing, please notify:</p> |
|||
<blockquote> |
|||
<p>Wayne Warthen<br /> |
|||
<a href="mailto:wwarthen@gmail.com">wwarthen@gmail.com</a></p> |
|||
</blockquote> |
|||
<p>RomWBW is an aggregate work. It is composed of many individual, |
|||
standalone programs that are distributed as a whole to function as a |
|||
cohesive system. Each program may have its own licensing which may be |
|||
different from other programs within the aggregate.</p> |
|||
<p>In some cases, a single program (e.g., CP/M Operating System) is |
|||
composed of multiple components with different licenses. It is believed |
|||
that in all such cases the licenses are compatible with GPL version 3.</p> |
|||
<p>RomWBW encourages code contributions from others. Contributors may |
|||
assert their own copyright in their contributions by annotating the |
|||
contributed source code appropriately. Contributors are further |
|||
encouraged to submit their contributions via the RomWBW source code |
|||
control system to ensure their contributions are clearly documented.</p> |
|||
<p>All contributions to RomWBW are subject to this license.</p></div> |
|||
</div> |
|||
</div> |
|||
|
|||
<footer class="col-md-12"> |
|||
<hr> |
|||
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p> |
|||
</footer> |
|||
<script src="../js/bootstrap.bundle.min.js"></script> |
|||
<script> |
|||
var base_url = "..", |
|||
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83}; |
|||
</script> |
|||
<script src="../js/base.js"></script> |
|||
<script src="../search/main.js"></script> |
|||
|
|||
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true"> |
|||
<div class="modal-dialog modal-lg"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title" id="searchModalLabel">Search</h4> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
<p>From here you can search these documents. Enter your search terms below.</p> |
|||
<form> |
|||
<div class="form-group"> |
|||
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here"> |
|||
</div> |
|||
</form> |
|||
<div id="mkdocs-search-results" data-no-results-text="No results found"></div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
<table class="table"> |
|||
<thead> |
|||
<tr> |
|||
<th style="width: 20%;">Keys</th> |
|||
<th>Action</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td class="help shortcut"><kbd>?</kbd></td> |
|||
<td>Open this help</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="next shortcut"><kbd>n</kbd></td> |
|||
<td>Next page</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="prev shortcut"><kbd>p</kbd></td> |
|||
<td>Previous page</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="search shortcut"><kbd>s</kbd></td> |
|||
<td>Search</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</body> |
|||
</html> |
|||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,366 @@ |
|||
html { |
|||
/* The nav header is 3.5rem high, plus 20px for the margin-top of the |
|||
main container. */ |
|||
scroll-padding-top: calc(3.5rem + 20px); |
|||
} |
|||
|
|||
/* Replacement for `body { background-attachment: fixed; }`, which has |
|||
performance issues when scrolling on large displays. See #1394. */ |
|||
body::before { |
|||
content: ' '; |
|||
position: fixed; |
|||
width: 100%; |
|||
height: 100%; |
|||
top: 0; |
|||
left: 0; |
|||
background-color: var(--bs-body-bg); |
|||
background: url(../img/grid.png) repeat-x; |
|||
will-change: transform; |
|||
z-index: -1; |
|||
} |
|||
|
|||
body > .container { |
|||
margin-top: 20px; |
|||
min-height: 400px; |
|||
} |
|||
|
|||
.navbar.fixed-top { |
|||
position: -webkit-sticky; |
|||
position: sticky; |
|||
} |
|||
|
|||
.source-links { |
|||
float: right; |
|||
} |
|||
|
|||
.col-md-9 img { |
|||
max-width: 100%; |
|||
display: inline-block; |
|||
padding: 4px; |
|||
line-height: 1.428571429; |
|||
background-color: var(--bs-secondary-bg-subtle); |
|||
border: 1px solid var(--bs-secondary-border-subtle); |
|||
border-radius: 4px; |
|||
margin: 20px auto 30px auto; |
|||
} |
|||
|
|||
h1 { |
|||
color: inherit; |
|||
font-weight: 400; |
|||
font-size: 42px; |
|||
} |
|||
|
|||
h2, h3, h4, h5, h6 { |
|||
color: inherit; |
|||
font-weight: 300; |
|||
} |
|||
|
|||
hr { |
|||
border-top: 1px solid #aaa; |
|||
opacity: 1; |
|||
} |
|||
|
|||
pre, .rst-content tt { |
|||
max-width: 100%; |
|||
background-color: var(--bs-body-bg); |
|||
border: solid 1px var(--bs-border-color); |
|||
color: var(--bs-body-color); |
|||
overflow-x: auto; |
|||
} |
|||
|
|||
code.code-large, .rst-content tt.code-large { |
|||
font-size: 90%; |
|||
} |
|||
|
|||
code { |
|||
padding: 2px 5px; |
|||
background-color: rgba(var(--bs-body-bg-rgb), 0.75); |
|||
border: solid 1px var(--bs-border-color); |
|||
color: var(--bs-body-color); |
|||
white-space: pre-wrap; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
pre code { |
|||
display: block; |
|||
border: none; |
|||
white-space: pre; |
|||
word-wrap: normal; |
|||
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; |
|||
font-size: 12px; |
|||
} |
|||
|
|||
kbd { |
|||
padding: 2px 4px; |
|||
font-size: 90%; |
|||
color: var(--bs-secondary-text-emphasis); |
|||
background-color: var(--bs-secondary-bg-subtle); |
|||
border-radius: 3px; |
|||
-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); |
|||
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); |
|||
} |
|||
|
|||
a code { |
|||
color: inherit; |
|||
} |
|||
|
|||
a:hover code, a:focus code { |
|||
color: inherit; |
|||
} |
|||
|
|||
footer { |
|||
margin-top: 30px; |
|||
margin-bottom: 10px; |
|||
text-align: center; |
|||
font-weight: 200; |
|||
} |
|||
|
|||
.modal-dialog { |
|||
margin-top: 60px; |
|||
} |
|||
|
|||
/* |
|||
* Side navigation |
|||
* |
|||
* Scrollspy and affixed enhanced navigation to highlight sections and secondary |
|||
* sections of docs content. |
|||
*/ |
|||
|
|||
.bs-sidebar.affix { |
|||
position: -webkit-sticky; |
|||
position: sticky; |
|||
/* The nav header is 3.5rem high, plus 20px for the margin-top of the |
|||
main container. */ |
|||
top: calc(3.5rem + 20px); |
|||
} |
|||
|
|||
.bs-sidebar.card { |
|||
padding: 0; |
|||
max-height: 90%; |
|||
overflow-y: auto; |
|||
} |
|||
|
|||
/* Toggle (vertically flip) sidebar collapse icon */ |
|||
.bs-sidebar .navbar-toggler span { |
|||
-moz-transform: scale(1, -1); |
|||
-webkit-transform: scale(1, -1); |
|||
-o-transform: scale(1, -1); |
|||
-ms-transform: scale(1, -1); |
|||
transform: scale(1, -1); |
|||
} |
|||
|
|||
.bs-sidebar .navbar-toggler.collapsed span { |
|||
-moz-transform: scale(1, 1); |
|||
-webkit-transform: scale(1, 1); |
|||
-o-transform: scale(1, 1); |
|||
-ms-transform: scale(1, 1); |
|||
transform: scale(1, 1); |
|||
} |
|||
|
|||
/* First level of nav */ |
|||
.bs-sidebar > .navbar-collapse > .nav { |
|||
padding-top: 10px; |
|||
padding-bottom: 10px; |
|||
border-radius: 5px; |
|||
width: 100%; |
|||
} |
|||
|
|||
/* All levels of nav */ |
|||
.bs-sidebar .nav > li > a { |
|||
display: block; |
|||
padding: 5px 20px; |
|||
z-index: 1; |
|||
} |
|||
.bs-sidebar .nav > li > a:hover, |
|||
.bs-sidebar .nav > li > a:focus { |
|||
text-decoration: none; |
|||
border-right: 1px solid; |
|||
} |
|||
.bs-sidebar .nav > li > a.active, |
|||
.bs-sidebar .nav > li > a.active:hover, |
|||
.bs-sidebar .nav > li > a.active:focus { |
|||
font-weight: bold; |
|||
background-color: transparent; |
|||
border-right: 1px solid; |
|||
} |
|||
|
|||
.bs-sidebar .nav .nav .nav { |
|||
margin-left: 1em; |
|||
} |
|||
|
|||
.bs-sidebar .nav > li > a { |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.bs-sidebar .nav .nav > li > a { |
|||
font-weight: normal; |
|||
} |
|||
|
|||
.headerlink { |
|||
font-family: FontAwesome; |
|||
font-size: 14px; |
|||
display: none; |
|||
padding-left: .5em; |
|||
text-decoration: none; |
|||
vertical-align: middle; |
|||
} |
|||
|
|||
h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink { |
|||
display:inline-block; |
|||
} |
|||
|
|||
blockquote { |
|||
padding-left: 10px; |
|||
border-left: 4px solid #e6e6e6; |
|||
} |
|||
|
|||
.admonition, details { |
|||
padding: 15px; |
|||
margin-bottom: 20px; |
|||
border: 1px solid transparent; |
|||
border-radius: 4px; |
|||
text-align: left; |
|||
} |
|||
|
|||
.admonition.note, details.note { |
|||
color: var(--bs-primary-text-emphasis); |
|||
background-color: var(--bs-primary-bg-subtle); |
|||
border-color: var(--bs-primary-border-subtle); |
|||
} |
|||
|
|||
.admonition.note h1, .admonition.note h2, .admonition.note h3, |
|||
.admonition.note h4, .admonition.note h5, .admonition.note h6, |
|||
details.note h1, details.note h2, details.note h3, |
|||
details.note h4, details.note h5, details.note h6 { |
|||
color: var(--bs-primary-text-emphasis); |
|||
} |
|||
|
|||
.admonition.info, details.info { |
|||
color: var(--bs-info-text-emphasis); |
|||
background-color: var(--bs-info-bg-subtle); |
|||
border-color: var(--bs-info-border-subtle); |
|||
} |
|||
|
|||
.admonition.info h1, .admonition.info h2, .admonition.info h3, |
|||
.admonition.info h4, .admonition.info h5, .admonition.info h6, |
|||
details.info h1, details.info h2, details.info h3, |
|||
details.info h4, details.info h5, details.info h6 { |
|||
color: var(--bs-info-text-emphasis); |
|||
} |
|||
|
|||
.admonition.warning, details.warning { |
|||
color: var(--bs-warning-text-emphasis); |
|||
background-color: var(--bs-warning-bg-subtle); |
|||
border-color: var(--bs-warning-border-subtle); |
|||
} |
|||
|
|||
.admonition.warning h1, .admonition.warning h2, .admonition.warning h3, |
|||
.admonition.warning h4, .admonition.warning h5, .admonition.warning h6, |
|||
details.warning h1, details.warning h2, details.warning h3, |
|||
details.warning h4, details.warning h5, details.warning h6 { |
|||
color: var(--bs-warning-text-emphasis); |
|||
} |
|||
|
|||
.admonition.danger, details.danger { |
|||
color: var(--bs-danger-text-emphasis); |
|||
background-color: var(--bs-danger-bg-subtle); |
|||
border-color: var(--bs-danger-border-subtle); |
|||
} |
|||
|
|||
.admonition.danger h1, .admonition.danger h2, .admonition.danger h3, |
|||
.admonition.danger h4, .admonition.danger h5, .admonition.danger h6, |
|||
details.danger h1, details.danger h2, details.danger h3, |
|||
details.danger h4, details.danger h5, details.danger h6 { |
|||
color: var(--bs-danger-text-emphasis); |
|||
} |
|||
|
|||
.admonition, details { |
|||
color: var(--bs-light-text-emphasis); |
|||
background-color: var(--bs-light-bg-subtle); |
|||
border-color: var(--bs-light-border-subtle); |
|||
} |
|||
|
|||
.admonition h1, .admonition h2, .admonition h3, |
|||
.admonition h4, .admonition h5, .admonition h6, |
|||
details h1, details h2, details h3, |
|||
details h4, details h5, details h6 { |
|||
color: var(--bs-light-text-emphasis); |
|||
} |
|||
|
|||
.admonition-title, summary { |
|||
font-weight: bold; |
|||
text-align: left; |
|||
} |
|||
|
|||
.admonition>p:last-child, details>p:last-child { |
|||
margin-bottom: 0; |
|||
} |
|||
|
|||
@media (max-width: 991.98px) { |
|||
.navbar-collapse.show { |
|||
overflow-y: auto; |
|||
max-height: calc(100vh - 3.5rem); |
|||
} |
|||
} |
|||
|
|||
.dropdown-item.open { |
|||
color: var(--bs-dropdown-link-active-color); |
|||
background-color: var(--bs-dropdown-link-active-bg); |
|||
} |
|||
|
|||
.dropdown-submenu > .dropdown-menu { |
|||
margin: 0 0 0 1.5rem; |
|||
padding: 0; |
|||
border-width: 0; |
|||
} |
|||
|
|||
.dropdown-submenu > a::after { |
|||
display: block; |
|||
content: " "; |
|||
float: right; |
|||
width: 0; |
|||
height: 0; |
|||
border-color: transparent; |
|||
border-style: solid; |
|||
border-width: 5px 0 5px 5px; |
|||
border-left-color: var(--bs-dropdown-link-active-color); |
|||
margin-top: 5px; |
|||
margin-right: -10px; |
|||
} |
|||
|
|||
.dropdown-submenu:hover > a::after { |
|||
border-left-color: var(--bs-dropdown-link-active-color); |
|||
} |
|||
|
|||
@media (min-width: 992px) { |
|||
.dropdown-menu { |
|||
overflow-y: auto; |
|||
max-height: calc(100vh - 3.5rem); |
|||
} |
|||
|
|||
.dropdown-submenu { |
|||
position: relative; |
|||
} |
|||
|
|||
.dropdown-submenu > .dropdown-menu { |
|||
position: fixed !important; |
|||
margin-top: -9px; |
|||
margin-left: -2px; |
|||
border-width: 1px; |
|||
padding: 0.5rem 0; |
|||
} |
|||
|
|||
.dropdown-submenu.pull-left { |
|||
float: none; |
|||
} |
|||
|
|||
.dropdown-submenu.pull-left > .dropdown-menu { |
|||
left: -100%; |
|||
margin-left: 10px; |
|||
} |
|||
} |
|||
|
|||
@media print { |
|||
/* Remove sidebar when print */ |
|||
.col-md-3 { display: none; } |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
/*! |
|||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com |
|||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) |
|||
* Copyright 2023 Fonticons, Inc. |
|||
*/ |
|||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} |
|||
@ -0,0 +1,6 @@ |
|||
/*! |
|||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com |
|||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) |
|||
* Copyright 2023 Fonticons, Inc. |
|||
*/ |
|||
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} |
|||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,537 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en" data-bs-theme="auto"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
<meta name="description" content="None"> |
|||
|
|||
|
|||
<link rel="shortcut icon" href="img/favicon.ico"> |
|||
<title>RomWBW Documentation V3.6</title> |
|||
<link href="css/bootstrap.min.css" rel="stylesheet"> |
|||
<link href="css/fontawesome.min.css" rel="stylesheet"> |
|||
<link href="css/brands.min.css" rel="stylesheet"> |
|||
<link href="css/solid.min.css" rel="stylesheet"> |
|||
<link href="css/v4-font-face.min.css" rel="stylesheet"> |
|||
<link href="css/base.css" rel="stylesheet"> |
|||
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" disabled> |
|||
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
|||
<script>hljs.highlightAll();</script> |
|||
</head> |
|||
|
|||
<body class="homepage"> |
|||
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary"> |
|||
<div class="container"> |
|||
<a class="navbar-brand" href=".">RomWBW Documentation V3.6</a> |
|||
<!-- Expander button --> |
|||
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation"> |
|||
<span class="navbar-toggler-icon"></span> |
|||
</button> |
|||
|
|||
<!-- Expanded navigation --> |
|||
<div id="navbar-collapse" class="navbar-collapse collapse"> |
|||
<!-- Main navigation --> |
|||
<ul class="nav navbar-nav"> |
|||
<li class="nav-item"> |
|||
<a href="Introduction/" class="nav-link">Introduction</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="UserGuide/" class="nav-link">User Guide</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="SystemGuide/" class="nav-link">System Guide</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="Applications/" class="nav-link">Applications</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="Catalog/" class="nav-link">Catalog</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="Hardware/" class="nav-link">Hardware</a> |
|||
</li> |
|||
</ul> |
|||
|
|||
<ul class="nav navbar-nav ms-md-auto"> |
|||
<li class="nav-item"> |
|||
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal"> |
|||
<i class="fa fa-search"></i> Search |
|||
</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a href="https://github.com/wwarthen/RomWBW" class="nav-link"><i class="fa-brands fa-github"></i> GitHub</a> |
|||
</li> |
|||
<li class="nav-item dropdown"> |
|||
<button id="theme-menu" aria-expanded="false" data-bs-toggle="dropdown" data-bs-display="static" aria-label="Toggle theme" class="nav-link dropdown-toggle"> |
|||
<i class="fa-solid fa-circle-half-stroke fa-fw"></i> |
|||
<span class="d-lg-none ms-2">Toggle theme</span> |
|||
</button> |
|||
<ul class="dropdown-menu dropdown-menu-end"> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false"> |
|||
<i class="fa-solid fa-sun fa-fw"></i> |
|||
<span class="ms-2">Light</span> |
|||
<i class="fa-solid fa-check ms-auto d-none"></i> |
|||
</button> |
|||
</li> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false"> |
|||
<i class="fa-solid fa-moon fa-fw"></i> |
|||
<span class="ms-2">Dark</span> |
|||
<i class="fa-solid fa-check ms-auto d-none"></i> |
|||
</button> |
|||
</li> |
|||
<li> |
|||
<button class="dropdown-item d-flex align-items-center" data-bs-theme-value="auto" aria-pressed="true"> |
|||
<i class="fa-solid fa-circle-half-stroke fa-fw"></i> |
|||
<span class="ms-2">Auto</span> |
|||
<i class="fa-solid fa-check ms-auto"></i> |
|||
</button> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<script src="js/darkmode.js"></script> |
|||
|
|||
<div class="container"> |
|||
<div class="row"> |
|||
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary"> |
|||
<div class="navbar-header"> |
|||
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents"> |
|||
<span class="fa fa-angle-down"></span> |
|||
</button> |
|||
</div> |
|||
|
|||
|
|||
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary"> |
|||
<ul class="nav flex-column"> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#overview" class="nav-link">Overview</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#acquiring-romwbw" class="nav-link">Acquiring RomWBW</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#installation-operation" class="nav-link">Installation & Operation</a> |
|||
<ul class="nav flex-column"> |
|||
<li class="nav-item" data-bs-level="2"><a href="#documentation" class="nav-link">Documentation</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#acknowledgments" class="nav-link">Acknowledgments</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#licensing" class="nav-link">Licensing</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="nav-item" data-bs-level="1"><a href="#getting-assistance" class="nav-link">Getting Assistance</a> |
|||
<ul class="nav flex-column"> |
|||
</ul> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div></div> |
|||
<div class="col-md-9" role="main"> |
|||
|
|||
<p>$define{doc_title}{ReadMe}$ |
|||
$include{"Basic.h"}$</p> |
|||
<h1 id="overview">Overview</h1> |
|||
<p>RomWBW software provides a complete, commercial quality |
|||
implementation of CP/M (and workalike) operating systems and |
|||
applications for modern Z80/180/280 retro-computing hardware systems.</p> |
|||
<p>A wide variety of platforms are supported including those |
|||
produced by these developer communities:</p> |
|||
<ul> |
|||
<li><a href="https://www.retrobrewcomputers.org">RetroBrew Computers</a> |
|||
(<a href="https://www.retrobrewcomputers.org">https://www.retrobrewcomputers.org</a>)</li> |
|||
<li><a href="https://rc2014.co.uk">RC2014</a> (<a href="https://rc2014.co.uk">https://rc2014.co.uk</a>), \ |
|||
<a href="https://groups.google.com/g/rc2014-z80">RC2014-Z80</a> |
|||
(<a href="https://groups.google.com/g/rc2014-z80">https://groups.google.com/g/rc2014-z80</a>)</li> |
|||
<li><a href="https://groups.google.com/g/retro-comp">Retro Computing</a> |
|||
(<a href="https://groups.google.com/g/retro-comp">https://groups.google.com/g/retro-comp</a>)</li> |
|||
<li><a href="https://smallcomputercentral.com/">Small Computer Central</a> |
|||
(<a href="https://smallcomputercentral.com/">https://smallcomputercentral.com/</a>)</li> |
|||
</ul> |
|||
<p>A complete list of the currently supported platforms is found in the |
|||
[Installation] section.</p> |
|||
<p>Supported hardware features of RomWBW include:</p> |
|||
<ul> |
|||
<li>Z80 Family CPUs including Z80, Z180, and Z280</li> |
|||
<li>Banked memory services for several banking designs</li> |
|||
<li>Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, Iomega</li> |
|||
<li>Serial drivers including UART (16550-like), ASCI, ACIA, SIO</li> |
|||
<li>Video drivers including TMS9918, SY6545, MOS8563, HD6445</li> |
|||
<li>Keyboard (PS/2) drivers via VT8242 or PPI interfaces</li> |
|||
<li>Real time clock drivers including DS1302, BQ4845</li> |
|||
<li>Support for CP/NET networking using Wiznet, MT011 or Serial</li> |
|||
<li>Built-in VT-100 terminal emulation support</li> |
|||
</ul> |
|||
<p>RomWBW is distributed as both source code and pre-built ROM and disk |
|||
images. Some of the provided software can be launched directly from the |
|||
ROM firmware itself:</p> |
|||
<ul> |
|||
<li>System Monitor</li> |
|||
<li>Operating Systems (CP/M 2.2, ZSDOS)</li> |
|||
<li>ROM BASIC (Nascom BASIC and Tasty BASIC)</li> |
|||
<li>ROM Forth</li> |
|||
</ul> |
|||
<p>A dynamic disk drive letter assignment mechanism allows mapping |
|||
operating system drive letters to any available disk media. |
|||
Additionally, mass storage devices (IDE Disk, CF Card, SD Card, etc.) |
|||
support the use of multiple slices (up to 256 per device). Each slice |
|||
contains a complete CP/M filesystem and can be mapped independently to |
|||
any drive letter. This overcomes the inherent size limitations in legacy |
|||
OSes and allows up to 2GB of accessible storage on a single device, |
|||
with up to 128MB accessible at any one time.</p> |
|||
<p>The pre-built ROM firmware images are generally suitable for most |
|||
users. However, it is also very easy to modify and build custom ROM |
|||
images that fully tailor the firmware to your specific preferences. |
|||
All tools required to build custom ROM firmware under Windows are |
|||
included -- no need to install assemblers, etc. The firmware can also |
|||
be built using Linux or MacOS after confirming a few standard tools |
|||
have been installed.</p> |
|||
<p>Multiple disk images are provided in the distribution. Most disk |
|||
images contain a complete, bootable, ready-to-run implementation of a |
|||
specific operating system. A "combo" disk image contains multiple |
|||
slices, each with a full operating system implementation. If you use |
|||
this disk image, you can easily pick whichever operating system you |
|||
want to boot without changing media.</p> |
|||
<p>By design, RomWBW isolates all of the hardware specific functions in |
|||
the ROM chip itself. The ROM provides a hardware abstraction layer |
|||
such that all of the operating systems and applications on a disk |
|||
will run on any RomWBW-based system. To put it simply, you can take |
|||
a disk (or CF/SD/USB Card) and move it between systems transparently.</p> |
|||
<p>A tool is provided that allows you to access a FAT-12/16/32 filesystem. |
|||
The FAT filesystem may be coresident on the same disk media as RomWBW |
|||
slices or on stand-alone media. This makes exchanging files with modern |
|||
OSes such as Windows, MacOS, and Linux very easy.</p> |
|||
<h1 id="acquiring-romwbw">Acquiring RomWBW</h1> |
|||
<p>The <a href="https://github.com/wwarthen/RomWBW">RomWBW Repository</a> |
|||
(<a href="https://github.com/wwarthen/RomWBW">https://github.com/wwarthen/RomWBW</a>) on GitHub is the official |
|||
distribution location for all project source and documentation. |
|||
The fully-built distribution releases are available on the |
|||
<a href="https://github.com/wwarthen/RomWBW/releases">RomWBW Releases Page</a> |
|||
(<a href="https://github.com/wwarthen/RomWBW/releases">https://github.com/wwarthen/RomWBW/releases</a>) of the repository. |
|||
On this page, you will normally see a Development Snapshot as well as |
|||
recent stable releases. Unless you have a specific reason, I suggest you |
|||
stick to the most recent stable release.</p> |
|||
<p>The asset named RomWBW-vX.X.X-Package.zip includes all pre-built ROM |
|||
and Disk images as well as full source code. The other assets contain |
|||
only source code and do not have the pre-built ROM or disk images.</p> |
|||
<p>All source code and distributions are maintained on GitHub. Code |
|||
contributions are very welcome.</p> |
|||
<h1 id="installation-operation">Installation & Operation</h1> |
|||
<p>In general, installation of RomWBW on your platform is very simple. You |
|||
just need to program your ROM with the correct ROM image from the RomWBW |
|||
distribution. Subsequently, you can write disk images on your disk |
|||
drives (IDE disk, CF Card, SD Card, etc.) which then provides even more |
|||
functionality.</p> |
|||
<p>Complete instructions for installation and operation of RomWBW are |
|||
found in the $doc_user$. It is also a good idea to review the |
|||
<a href="https://github.com/wwarthen/RomWBW/blob/master/RELEASE_NOTES.md">Release Notes</a> |
|||
for helpful release-specific information.</p> |
|||
<h2 id="documentation">Documentation</h2> |
|||
<p>Documentation for $doc_product$ includes:</p> |
|||
<ul> |
|||
<li>$doc_intro$</li> |
|||
<li>$doc_user$</li> |
|||
<li>$doc_sys$</li> |
|||
<li>$doc_apps$</li> |
|||
<li>$doc_catalog$</li> |
|||
<li>$doc_hardware$</li> |
|||
</ul> |
|||
<h1 id="acknowledgments">Acknowledgments</h1> |
|||
<p>I want to acknowledge that a great deal of the code and inspiration |
|||
for RomWBW has been provided by or derived from the work of others |
|||
in the RetroBrew Computers Community. I sincerely appreciate all of |
|||
their contributions. The list below is probably missing many names -- |
|||
please let me know if I missed you!</p> |
|||
<ul> |
|||
<li> |
|||
<p>Andrew Lynch started it all when he created the N8VEM Z80 SBC |
|||
which became the first platform RomWBW supported. Some of his |
|||
original code can still be found in RomWBW.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dan Werner wrote much of the code from which RomWBW was originally |
|||
derived and he has always been a great source of knowledge and |
|||
advice.</p> |
|||
</li> |
|||
<li> |
|||
<p>Douglas Goodall contributed code, time, testing, and advice in "the |
|||
early days". He created an entire suite of application programs to |
|||
enhance the use of RomWBW. Unfortunately, they have become unusable |
|||
due to internal changes within RomWBW. As of RomWBW 2.6, these |
|||
applications are no longer provided.</p> |
|||
</li> |
|||
<li> |
|||
<p>Sergey Kiselev created several hardware platforms for RomWBW |
|||
including the very popular Zeta.</p> |
|||
</li> |
|||
<li> |
|||
<p>David Giles created support for the Z180 CSIO which is now included |
|||
SD Card driver.</p> |
|||
</li> |
|||
<li> |
|||
<p>Phil Summers contributed the Forth and BASIC adaptations in ROM, the |
|||
AY-3-8910 sound driver, DMA support, and a long list of general code |
|||
and documentation enhancements.</p> |
|||
</li> |
|||
<li> |
|||
<p>Ed Brindley contributed some of the code that supports the RCBus |
|||
platform.</p> |
|||
</li> |
|||
<li> |
|||
<p>Spencer Owen created the RC2014 series of hobbyist kit computers |
|||
which has exponentially increased RomWBW usage. Some of his kits |
|||
include RomWBW.</p> |
|||
</li> |
|||
<li> |
|||
<p>Stephen Cousins has likewise created a series of hobbyist kit |
|||
computers at Small Computer Central and is distributing RomWBW |
|||
with many of them.</p> |
|||
</li> |
|||
<li> |
|||
<p>Alan Cox has contributed some driver code and has provided a great |
|||
deal of advice.</p> |
|||
</li> |
|||
<li> |
|||
<p>The CP/NET client files were developed by Douglas Miller.</p> |
|||
</li> |
|||
<li> |
|||
<p>Phillip Stevens contributed support for FreeRTOS.</p> |
|||
</li> |
|||
<li> |
|||
<p>Curt Mayer contributed the original Linux / MacOS build process.</p> |
|||
</li> |
|||
<li> |
|||
<p>UNA BIOS and FDISK80 are the products of John Coffman.</p> |
|||
</li> |
|||
<li> |
|||
<p>FLASH4 is a product of Will Sowerbutts.</p> |
|||
</li> |
|||
<li> |
|||
<p>CLRDIR is a product of Max Scane.</p> |
|||
</li> |
|||
<li> |
|||
<p>Tasty Basic is a product of Dimitri Theulings.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dean Netherton contributed eZ80 CPU support, the sound driver |
|||
interface, and the SN76489 sound driver.</p> |
|||
</li> |
|||
<li> |
|||
<p>The RomWBW Disk Catalog document was produced by Mykl Orders.</p> |
|||
</li> |
|||
<li> |
|||
<p>Rob Prouse has created many of the supplemental disk images |
|||
including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft |
|||
BASIC Compiler, Microsoft Fortran Compiler, and a Games |
|||
compendium.</p> |
|||
</li> |
|||
<li> |
|||
<p>Martin R has provided substantial help reviewing and improving the |
|||
User Guide and Applications documents.</p> |
|||
</li> |
|||
<li> |
|||
<p>Mark Pruden has made a wide variety of contributions including:</p> |
|||
</li> |
|||
<li>significant content in the Disk Catalog and User Guide</li> |
|||
<li>creation of the Introduction and Hardware documents</li> |
|||
<li>Z3PLUS operating system disk image</li> |
|||
<li>COPYSL and SLABEL utility</li> |
|||
<li>a feature for RomWBW configuration by NVRAM</li> |
|||
<li> |
|||
<p>the /B bulk mode of disk assignment to the ASSIGN utility</p> |
|||
</li> |
|||
<li> |
|||
<p>Jacques Pelletier has contributed the DS1501 RTC driver code.</p> |
|||
</li> |
|||
<li> |
|||
<p>Jose Collado has contributed enhancements to the TMS driver |
|||
including compatibility with standard TMS register configuration.</p> |
|||
</li> |
|||
<li> |
|||
<p>Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).</p> |
|||
</li> |
|||
<li> |
|||
<p>Matt Carroll has contributed a fix to XM.COM that corrects the |
|||
port specification when doing a send.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dean Jenkins enhanced the build process to accommodate the |
|||
Raspberry Pi 4.</p> |
|||
</li> |
|||
<li> |
|||
<p>Tom Plano has contributed a new utility (HTALK) to allow talking |
|||
directly to HBIOS COM ports.</p> |
|||
</li> |
|||
<li> |
|||
<p>Lars Nelson has contributed several generic utilities such as |
|||
a universal (OS agnostic) UNARC application.</p> |
|||
</li> |
|||
<li> |
|||
<p>Dylan Hall added support for specifying a secondary console.</p> |
|||
</li> |
|||
<li> |
|||
<p>Bill Shen has contributed boot loaders for several of his |
|||
systems.</p> |
|||
</li> |
|||
<li> |
|||
<p>Laszlo Szolnoki has contributed an EF9345 video display |
|||
controller driver.</p> |
|||
</li> |
|||
<li> |
|||
<p>Ladislau Szilagyi has contributed an enhanced version of |
|||
CP/M Cowgol that leverages RomWBW memory banking.</p> |
|||
</li> |
|||
<li> |
|||
<p>Les Bird has contributed support for the NABU w/ Option Board</p> |
|||
</li> |
|||
</ul> |
|||
<p>Contributions of all kinds to RomWBW are very welcome.</p> |
|||
<h1 id="licensing">Licensing</h1> |
|||
<p>RomWBW is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version.</p> |
|||
<p>RomWBW is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details.</p> |
|||
<p>You should have received a copy of the GNU General Public License |
|||
along with RomWBW. If not, see <a href="https://www.gnu.org/licenses/">https://www.gnu.org/licenses/</a>.</p> |
|||
<p>Portions of RomWBW were created by, contributed by, or derived from |
|||
the work of others. It is believed that these works are being used |
|||
in accordance with the intentions and/or licensing of their creators.</p> |
|||
<p>If anyone feels their work is being used outside of its intended |
|||
licensing, please notify:</p> |
|||
<blockquote> |
|||
<p>$doc_author$ \ |
|||
<a href="mailto:$doc_authmail$">$doc_authmail$</a></p> |
|||
</blockquote> |
|||
<p>RomWBW is an aggregate work. It is composed of many individual, |
|||
standalone programs that are distributed as a whole to function as |
|||
a cohesive system. Each program may have its own licensing which |
|||
may be different from other programs within the aggregate.</p> |
|||
<p>In some cases, a single program (e.g., CP/M Operating System) is |
|||
composed of multiple components with different licenses. It is |
|||
believed that in all such cases the licenses are compatible with |
|||
GPL version 3.</p> |
|||
<p>RomWBW encourages code contributions from others. Contributors |
|||
may assert their own copyright in their contributions by |
|||
annotating the contributed source code appropriately. Contributors |
|||
are further encouraged to submit their contributions via the RomWBW |
|||
source code control system to ensure their contributions are clearly |
|||
documented.</p> |
|||
<p>All contributions to RomWBW are subject to this license.</p> |
|||
<h1 id="getting-assistance">Getting Assistance</h1> |
|||
<p>The best way to get assistance with RomWBW or any aspect of the |
|||
RetroBrew Computers projects is via one of the community forums:</p> |
|||
<ul> |
|||
<li><a href="https://www.retrobrewcomputers.org/forum/">RetroBrew Computers Forum</a></li> |
|||
<li><a href="https://groups.google.com/forum/#!forum/rc2014-z80">RC2014 Google Group</a></li> |
|||
<li><a href="https://groups.google.com/forum/#!forum/retro-comp">retro-comp Google Group</a></li> |
|||
</ul> |
|||
<p>Submission of issues and bugs are welcome at the |
|||
<a href="https://github.com/wwarthen/RomWBW">RomWBW GitHub Repository</a>.</p> |
|||
<p>Also feel free to email $doc_author$ at <a href="mailto:$doc_authmail$">$doc_authmail$</a>.</p></div> |
|||
</div> |
|||
</div> |
|||
|
|||
<footer class="col-md-12"> |
|||
<hr> |
|||
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p> |
|||
</footer> |
|||
<script src="js/bootstrap.bundle.min.js"></script> |
|||
<script> |
|||
var base_url = ".", |
|||
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83}; |
|||
</script> |
|||
<script src="js/base.js"></script> |
|||
<script src="search/main.js"></script> |
|||
|
|||
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true"> |
|||
<div class="modal-dialog modal-lg"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title" id="searchModalLabel">Search</h4> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
<p>From here you can search these documents. Enter your search terms below.</p> |
|||
<form> |
|||
<div class="form-group"> |
|||
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here"> |
|||
</div> |
|||
</form> |
|||
<div id="mkdocs-search-results" data-no-results-text="No results found"></div> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true"> |
|||
<div class="modal-dialog"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body"> |
|||
<table class="table"> |
|||
<thead> |
|||
<tr> |
|||
<th style="width: 20%;">Keys</th> |
|||
<th>Action</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td class="help shortcut"><kbd>?</kbd></td> |
|||
<td>Open this help</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="next shortcut"><kbd>n</kbd></td> |
|||
<td>Next page</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="prev shortcut"><kbd>p</kbd></td> |
|||
<td>Previous page</td> |
|||
</tr> |
|||
<tr> |
|||
<td class="search shortcut"><kbd>s</kbd></td> |
|||
<td>Search</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
<div class="modal-footer"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</body> |
|||
</html> |
|||
|
|||
<!-- |
|||
MkDocs version : 1.6.1 |
|||
Build Date UTC : 2025-05-30 20:49:03.030937+00:00 |
|||
--> |
|||
@ -0,0 +1,287 @@ |
|||
function getSearchTerm() { |
|||
var sPageURL = window.location.search.substring(1); |
|||
var sURLVariables = sPageURL.split('&'); |
|||
for (var i = 0; i < sURLVariables.length; i++) { |
|||
var sParameterName = sURLVariables[i].split('='); |
|||
if (sParameterName[0] == 'q') { |
|||
return sParameterName[1]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
function applyTopPadding() { |
|||
// Update various absolute positions to match where the main container
|
|||
// starts. This is necessary for handling multi-line nav headers, since
|
|||
// that pushes the main container down.
|
|||
var container = document.querySelector('body > .container'); |
|||
var offset = container.offsetTop; |
|||
|
|||
document.documentElement.style.scrollPaddingTop = offset + 'px'; |
|||
document.querySelectorAll('.bs-sidebar.affix').forEach(function(sidebar) { |
|||
sidebar.style.top = offset + 'px'; |
|||
}); |
|||
} |
|||
|
|||
document.addEventListener("DOMContentLoaded", function () { |
|||
var search_term = getSearchTerm(); |
|||
var search_modal = new bootstrap.Modal(document.getElementById('mkdocs_search_modal')); |
|||
var keyboard_modal = new bootstrap.Modal(document.getElementById('mkdocs_keyboard_modal')); |
|||
|
|||
if (search_term) { |
|||
search_modal.show(); |
|||
} |
|||
|
|||
// make sure search input gets autofocus every time modal opens.
|
|||
document.getElementById('mkdocs_search_modal').addEventListener('shown.bs.modal', function() { |
|||
document.getElementById('mkdocs-search-query').focus(); |
|||
}); |
|||
|
|||
// Close search modal when result is selected
|
|||
// The links get added later so listen to parent
|
|||
document.getElementById('mkdocs-search-results').addEventListener('click', function(e) { |
|||
if (e.target.tagName === 'A') { |
|||
search_modal.hide(); |
|||
} |
|||
}); |
|||
|
|||
// Populate keyboard modal with proper Keys
|
|||
document.querySelector('.help.shortcut kbd').innerHTML = keyCodes[shortcuts.help]; |
|||
document.querySelector('.prev.shortcut kbd').innerHTML = keyCodes[shortcuts.previous]; |
|||
document.querySelector('.next.shortcut kbd').innerHTML = keyCodes[shortcuts.next]; |
|||
document.querySelector('.search.shortcut kbd').innerHTML = keyCodes[shortcuts.search]; |
|||
|
|||
// Keyboard navigation
|
|||
document.addEventListener("keydown", function(e) { |
|||
if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return true; |
|||
var key = e.which || e.keyCode || window.event && window.event.keyCode; |
|||
var page; |
|||
switch (key) { |
|||
case shortcuts.next: |
|||
page = document.querySelector('.navbar a[rel="next"]'); |
|||
break; |
|||
case shortcuts.previous: |
|||
page = document.querySelector('.navbar a[rel="prev"]'); |
|||
break; |
|||
case shortcuts.search: |
|||
e.preventDefault(); |
|||
keyboard_modal.hide(); |
|||
search_modal.show(); |
|||
document.getElementById('mkdocs-search-query').focus(); |
|||
break; |
|||
case shortcuts.help: |
|||
search_modal.hide(); |
|||
keyboard_modal.show(); |
|||
break; |
|||
default: break; |
|||
} |
|||
if (page && page.hasAttribute('href')) { |
|||
keyboard_modal.hide(); |
|||
window.location.href = page.getAttribute('href'); |
|||
} |
|||
}); |
|||
|
|||
document.querySelectorAll('table').forEach(function(table) { |
|||
table.classList.add('table', 'table-striped', 'table-hover'); |
|||
}); |
|||
|
|||
function showInnerDropdown(item) { |
|||
var popup = item.nextElementSibling; |
|||
popup.classList.add('show'); |
|||
item.classList.add('open'); |
|||
|
|||
// First, close any sibling dropdowns.
|
|||
var container = item.parentElement.parentElement; |
|||
container.querySelectorAll(':scope > .dropdown-submenu > a').forEach(function(el) { |
|||
if (el !== item) { |
|||
hideInnerDropdown(el); |
|||
} |
|||
}); |
|||
|
|||
var popupMargin = 10; |
|||
var maxBottom = window.innerHeight - popupMargin; |
|||
var bounds = item.getBoundingClientRect(); |
|||
|
|||
popup.style.left = bounds.right + 'px'; |
|||
if (bounds.top + popup.clientHeight > maxBottom && |
|||
bounds.top > window.innerHeight / 2) { |
|||
popup.style.top = (bounds.bottom - popup.clientHeight) + 'px'; |
|||
popup.style.maxHeight = (bounds.bottom - popupMargin) + 'px'; |
|||
} else { |
|||
popup.style.top = bounds.top + 'px'; |
|||
popup.style.maxHeight = (maxBottom - bounds.top) + 'px'; |
|||
} |
|||
} |
|||
|
|||
function hideInnerDropdown(item) { |
|||
var popup = item.nextElementSibling; |
|||
popup.classList.remove('show'); |
|||
item.classList.remove('open'); |
|||
|
|||
popup.scrollTop = 0; |
|||
var menu = popup.querySelector('.dropdown-menu'); |
|||
if (menu) { |
|||
menu.scrollTop = 0; |
|||
} |
|||
var dropdown = popup.querySelector('.dropdown-submenu > a'); |
|||
if (dropdown) { |
|||
dropdown.classList.remove('open'); |
|||
} |
|||
} |
|||
|
|||
document.querySelectorAll('.dropdown-submenu > a').forEach(function(item) { |
|||
item.addEventListener('click', function(e) { |
|||
if (item.nextElementSibling.classList.contains('show')) { |
|||
hideInnerDropdown(item); |
|||
} else { |
|||
showInnerDropdown(item); |
|||
} |
|||
|
|||
e.stopPropagation(); |
|||
e.preventDefault(); |
|||
}); |
|||
}); |
|||
|
|||
document.querySelectorAll('.dropdown-menu').forEach(function(menu) { |
|||
menu.parentElement.addEventListener('hide.bs.dropdown', function() { |
|||
menu.scrollTop = 0; |
|||
var dropdown = menu.querySelector('.dropdown-submenu > a'); |
|||
if (dropdown) { |
|||
dropdown.classList.remove('open'); |
|||
} |
|||
menu.querySelectorAll('.dropdown-menu .dropdown-menu').forEach(function(submenu) { |
|||
submenu.classList.remove('show'); |
|||
}); |
|||
}); |
|||
}); |
|||
|
|||
applyTopPadding(); |
|||
}); |
|||
|
|||
window.addEventListener('resize', applyTopPadding); |
|||
|
|||
var scrollSpy = new bootstrap.ScrollSpy(document.body, { |
|||
target: '.bs-sidebar' |
|||
}); |
|||
|
|||
/* Prevent disabled links from causing a page reload */ |
|||
document.querySelectorAll("li.disabled a").forEach(function(item) { |
|||
item.addEventListener("click", function(event) { |
|||
event.preventDefault(); |
|||
}); |
|||
}); |
|||
|
|||
// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
|
|||
// We only list common keys below. Obscure keys are omitted and their use is discouraged.
|
|||
var keyCodes = { |
|||
8: 'backspace', |
|||
9: 'tab', |
|||
13: 'enter', |
|||
16: 'shift', |
|||
17: 'ctrl', |
|||
18: 'alt', |
|||
19: 'pause/break', |
|||
20: 'caps lock', |
|||
27: 'escape', |
|||
32: 'spacebar', |
|||
33: 'page up', |
|||
34: 'page down', |
|||
35: 'end', |
|||
36: 'home', |
|||
37: '←', |
|||
38: '↑', |
|||
39: '→', |
|||
40: '↓', |
|||
45: 'insert', |
|||
46: 'delete', |
|||
48: '0', |
|||
49: '1', |
|||
50: '2', |
|||
51: '3', |
|||
52: '4', |
|||
53: '5', |
|||
54: '6', |
|||
55: '7', |
|||
56: '8', |
|||
57: '9', |
|||
65: 'a', |
|||
66: 'b', |
|||
67: 'c', |
|||
68: 'd', |
|||
69: 'e', |
|||
70: 'f', |
|||
71: 'g', |
|||
72: 'h', |
|||
73: 'i', |
|||
74: 'j', |
|||
75: 'k', |
|||
76: 'l', |
|||
77: 'm', |
|||
78: 'n', |
|||
79: 'o', |
|||
80: 'p', |
|||
81: 'q', |
|||
82: 'r', |
|||
83: 's', |
|||
84: 't', |
|||
85: 'u', |
|||
86: 'v', |
|||
87: 'w', |
|||
88: 'x', |
|||
89: 'y', |
|||
90: 'z', |
|||
91: 'Left Windows Key / Left ⌘', |
|||
92: 'Right Windows Key', |
|||
93: 'Windows Menu / Right ⌘', |
|||
96: 'numpad 0', |
|||
97: 'numpad 1', |
|||
98: 'numpad 2', |
|||
99: 'numpad 3', |
|||
100: 'numpad 4', |
|||
101: 'numpad 5', |
|||
102: 'numpad 6', |
|||
103: 'numpad 7', |
|||
104: 'numpad 8', |
|||
105: 'numpad 9', |
|||
106: 'multiply', |
|||
107: 'add', |
|||
109: 'subtract', |
|||
110: 'decimal point', |
|||
111: 'divide', |
|||
112: 'f1', |
|||
113: 'f2', |
|||
114: 'f3', |
|||
115: 'f4', |
|||
116: 'f5', |
|||
117: 'f6', |
|||
118: 'f7', |
|||
119: 'f8', |
|||
120: 'f9', |
|||
121: 'f10', |
|||
122: 'f11', |
|||
123: 'f12', |
|||
124: 'f13', |
|||
125: 'f14', |
|||
126: 'f15', |
|||
127: 'f16', |
|||
128: 'f17', |
|||
129: 'f18', |
|||
130: 'f19', |
|||
131: 'f20', |
|||
132: 'f21', |
|||
133: 'f22', |
|||
134: 'f23', |
|||
135: 'f24', |
|||
144: 'num lock', |
|||
145: 'scroll lock', |
|||
186: ';', |
|||
187: '=', |
|||
188: ',', |
|||
189: '‐', |
|||
190: '.', |
|||
191: '?', |
|||
192: '`', |
|||
219: '[', |
|||
220: '\', |
|||
221: ']', |
|||
222: ''', |
|||
}; |
|||
@ -0,0 +1,65 @@ |
|||
function setColorMode(mode) { |
|||
// Switch between light/dark theme. `mode` is a string value of either 'dark' or 'light'.
|
|||
var hljs_light = document.getElementById('hljs-light'), |
|||
hljs_dark = document.getElementById('hljs-dark'); |
|||
document.documentElement.setAttribute('data-bs-theme', mode); |
|||
if (mode == 'dark') { |
|||
hljs_light.disabled = true; |
|||
hljs_dark.disabled = false; |
|||
} else { |
|||
hljs_dark.disabled = true; |
|||
hljs_light.disabled = false; |
|||
} |
|||
} |
|||
|
|||
function updateModeToggle(mode) { |
|||
// Update icon and toggle checkmarks of color mode selector.
|
|||
var menu = document.getElementById('theme-menu'); |
|||
document.querySelectorAll('[data-bs-theme-value]') |
|||
.forEach(function(toggle) { |
|||
if (mode == toggle.getAttribute('data-bs-theme-value')) { |
|||
toggle.setAttribute('aria-pressed', 'true'); |
|||
toggle.lastElementChild.classList.remove('d-none'); |
|||
menu.firstElementChild.setAttribute('class', toggle.firstElementChild.getAttribute('class')); |
|||
} else { |
|||
toggle.setAttribute('aria-pressed', 'false'); |
|||
toggle.lastElementChild.classList.add('d-none'); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
function onSystemColorSchemeChange(event) { |
|||
// Update site color mode to match system color mode.
|
|||
setColorMode(event.matches ? 'dark' : 'light'); |
|||
} |
|||
|
|||
var mql = window.matchMedia('(prefers-color-scheme: dark)'), |
|||
defaultMode = document.documentElement.getAttribute('data-bs-theme'), |
|||
storedMode = localStorage.getItem('mkdocs-colormode'); |
|||
if (storedMode && storedMode != 'auto') { |
|||
setColorMode(storedMode); |
|||
updateModeToggle(storedMode); |
|||
} else if (storedMode == 'auto' || defaultMode == 'auto') { |
|||
setColorMode(mql.matches ? 'dark' : 'light'); |
|||
updateModeToggle('auto'); |
|||
mql.addEventListener('change', onSystemColorSchemeChange); |
|||
} else { |
|||
setColorMode(defaultMode); |
|||
updateModeToggle(defaultMode); |
|||
} |
|||
|
|||
document.querySelectorAll('[data-bs-theme-value]') |
|||
.forEach(function(toggle) { |
|||
toggle.addEventListener('click', function (e) { |
|||
var mode = e.currentTarget.getAttribute('data-bs-theme-value'); |
|||
localStorage.setItem('mkdocs-colormode', mode); |
|||
if (mode == 'auto') { |
|||
setColorMode(mql.matches ? 'dark' : 'light'); |
|||
mql.addEventListener('change', onSystemColorSchemeChange); |
|||
} else { |
|||
setColorMode(mode); |
|||
mql.removeEventListener('change', onSystemColorSchemeChange); |
|||
} |
|||
updateModeToggle(mode); |
|||
}); |
|||
}); |
|||
@ -0,0 +1,109 @@ |
|||
function getSearchTermFromLocation() { |
|||
var sPageURL = window.location.search.substring(1); |
|||
var sURLVariables = sPageURL.split('&'); |
|||
for (var i = 0; i < sURLVariables.length; i++) { |
|||
var sParameterName = sURLVariables[i].split('='); |
|||
if (sParameterName[0] == 'q') { |
|||
return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); |
|||
} |
|||
} |
|||
} |
|||
|
|||
function joinUrl (base, path) { |
|||
if (path.substring(0, 1) === "/") { |
|||
// path starts with `/`. Thus it is absolute.
|
|||
return path; |
|||
} |
|||
if (base.substring(base.length-1) === "/") { |
|||
// base ends with `/`
|
|||
return base + path; |
|||
} |
|||
return base + "/" + path; |
|||
} |
|||
|
|||
function escapeHtml (value) { |
|||
return value.replace(/&/g, '&') |
|||
.replace(/"/g, '"') |
|||
.replace(/</g, '<') |
|||
.replace(/>/g, '>'); |
|||
} |
|||
|
|||
function formatResult (location, title, summary) { |
|||
return '<article><h3><a href="' + joinUrl(base_url, location) + '">'+ escapeHtml(title) + '</a></h3><p>' + escapeHtml(summary) +'</p></article>'; |
|||
} |
|||
|
|||
function displayResults (results) { |
|||
var search_results = document.getElementById("mkdocs-search-results"); |
|||
while (search_results.firstChild) { |
|||
search_results.removeChild(search_results.firstChild); |
|||
} |
|||
if (results.length > 0){ |
|||
for (var i=0; i < results.length; i++){ |
|||
var result = results[i]; |
|||
var html = formatResult(result.location, result.title, result.summary); |
|||
search_results.insertAdjacentHTML('beforeend', html); |
|||
} |
|||
} else { |
|||
var noResultsText = search_results.getAttribute('data-no-results-text'); |
|||
if (!noResultsText) { |
|||
noResultsText = "No results found"; |
|||
} |
|||
search_results.insertAdjacentHTML('beforeend', '<p>' + noResultsText + '</p>'); |
|||
} |
|||
} |
|||
|
|||
function doSearch () { |
|||
var query = document.getElementById('mkdocs-search-query').value; |
|||
if (query.length > min_search_length) { |
|||
if (!window.Worker) { |
|||
displayResults(search(query)); |
|||
} else { |
|||
searchWorker.postMessage({query: query}); |
|||
} |
|||
} else { |
|||
// Clear results for short queries
|
|||
displayResults([]); |
|||
} |
|||
} |
|||
|
|||
function initSearch () { |
|||
var search_input = document.getElementById('mkdocs-search-query'); |
|||
if (search_input) { |
|||
search_input.addEventListener("keyup", doSearch); |
|||
} |
|||
var term = getSearchTermFromLocation(); |
|||
if (term) { |
|||
search_input.value = term; |
|||
doSearch(); |
|||
} |
|||
} |
|||
|
|||
function onWorkerMessage (e) { |
|||
if (e.data.allowSearch) { |
|||
initSearch(); |
|||
} else if (e.data.results) { |
|||
var results = e.data.results; |
|||
displayResults(results); |
|||
} else if (e.data.config) { |
|||
min_search_length = e.data.config.min_search_length-1; |
|||
} |
|||
} |
|||
|
|||
if (!window.Worker) { |
|||
console.log('Web Worker API not supported'); |
|||
// load index in main thread
|
|||
$.getScript(joinUrl(base_url, "search/worker.js")).done(function () { |
|||
console.log('Loaded worker'); |
|||
init(); |
|||
window.postMessage = function (msg) { |
|||
onWorkerMessage({data: msg}); |
|||
}; |
|||
}).fail(function (jqxhr, settings, exception) { |
|||
console.error('Could not load worker.js'); |
|||
}); |
|||
} else { |
|||
// Wrap search in a web worker
|
|||
var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); |
|||
searchWorker.postMessage({init: true}); |
|||
searchWorker.onmessage = onWorkerMessage; |
|||
} |
|||
@ -0,0 +1,133 @@ |
|||
var base_path = 'function' === typeof importScripts ? '.' : '/search/'; |
|||
var allowSearch = false; |
|||
var index; |
|||
var documents = {}; |
|||
var lang = ['en']; |
|||
var data; |
|||
|
|||
function getScript(script, callback) { |
|||
console.log('Loading script: ' + script); |
|||
$.getScript(base_path + script).done(function () { |
|||
callback(); |
|||
}).fail(function (jqxhr, settings, exception) { |
|||
console.log('Error: ' + exception); |
|||
}); |
|||
} |
|||
|
|||
function getScriptsInOrder(scripts, callback) { |
|||
if (scripts.length === 0) { |
|||
callback(); |
|||
return; |
|||
} |
|||
getScript(scripts[0], function() { |
|||
getScriptsInOrder(scripts.slice(1), callback); |
|||
}); |
|||
} |
|||
|
|||
function loadScripts(urls, callback) { |
|||
if( 'function' === typeof importScripts ) { |
|||
importScripts.apply(null, urls); |
|||
callback(); |
|||
} else { |
|||
getScriptsInOrder(urls, callback); |
|||
} |
|||
} |
|||
|
|||
function onJSONLoaded () { |
|||
data = JSON.parse(this.responseText); |
|||
var scriptsToLoad = ['lunr.js']; |
|||
if (data.config && data.config.lang && data.config.lang.length) { |
|||
lang = data.config.lang; |
|||
} |
|||
if (lang.length > 1 || lang[0] !== "en") { |
|||
scriptsToLoad.push('lunr.stemmer.support.js'); |
|||
if (lang.length > 1) { |
|||
scriptsToLoad.push('lunr.multi.js'); |
|||
} |
|||
if (lang.includes("ja") || lang.includes("jp")) { |
|||
scriptsToLoad.push('tinyseg.js'); |
|||
} |
|||
for (var i=0; i < lang.length; i++) { |
|||
if (lang[i] != 'en') { |
|||
scriptsToLoad.push(['lunr', lang[i], 'js'].join('.')); |
|||
} |
|||
} |
|||
} |
|||
loadScripts(scriptsToLoad, onScriptsLoaded); |
|||
} |
|||
|
|||
function onScriptsLoaded () { |
|||
console.log('All search scripts loaded, building Lunr index...'); |
|||
if (data.config && data.config.separator && data.config.separator.length) { |
|||
lunr.tokenizer.separator = new RegExp(data.config.separator); |
|||
} |
|||
|
|||
if (data.index) { |
|||
index = lunr.Index.load(data.index); |
|||
data.docs.forEach(function (doc) { |
|||
documents[doc.location] = doc; |
|||
}); |
|||
console.log('Lunr pre-built index loaded, search ready'); |
|||
} else { |
|||
index = lunr(function () { |
|||
if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) { |
|||
this.use(lunr[lang[0]]); |
|||
} else if (lang.length > 1) { |
|||
this.use(lunr.multiLanguage.apply(null, lang)); // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility
|
|||
} |
|||
this.field('title'); |
|||
this.field('text'); |
|||
this.ref('location'); |
|||
|
|||
for (var i=0; i < data.docs.length; i++) { |
|||
var doc = data.docs[i]; |
|||
this.add(doc); |
|||
documents[doc.location] = doc; |
|||
} |
|||
}); |
|||
console.log('Lunr index built, search ready'); |
|||
} |
|||
allowSearch = true; |
|||
postMessage({config: data.config}); |
|||
postMessage({allowSearch: allowSearch}); |
|||
} |
|||
|
|||
function init () { |
|||
var oReq = new XMLHttpRequest(); |
|||
oReq.addEventListener("load", onJSONLoaded); |
|||
var index_path = base_path + '/search_index.json'; |
|||
if( 'function' === typeof importScripts ){ |
|||
index_path = 'search_index.json'; |
|||
} |
|||
oReq.open("GET", index_path); |
|||
oReq.send(); |
|||
} |
|||
|
|||
function search (query) { |
|||
if (!allowSearch) { |
|||
console.error('Assets for search still loading'); |
|||
return; |
|||
} |
|||
|
|||
var resultDocuments = []; |
|||
var results = index.search(query); |
|||
for (var i=0; i < results.length; i++){ |
|||
var result = results[i]; |
|||
doc = documents[result.ref]; |
|||
doc.summary = doc.text.substring(0, 200); |
|||
resultDocuments.push(doc); |
|||
} |
|||
return resultDocuments; |
|||
} |
|||
|
|||
if( 'function' === typeof importScripts ) { |
|||
onmessage = function (e) { |
|||
if (e.data.init) { |
|||
init(); |
|||
} else if (e.data.query) { |
|||
postMessage({ results: search(e.data.query) }); |
|||
} else { |
|||
console.error("Worker - Unrecognized message: " + e); |
|||
} |
|||
}; |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> |
|||
</urlset> |
|||