mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Compare commits
1 Commits
v3.5.1-rc.
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a94560458e |
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -7,7 +7,5 @@ BEFORE YOU CREATE A PULL REQUEST:
|
||||
|
||||
Thank you for contributing to RomWBW! I will review your pull request as soon as possible.
|
||||
|
||||
-Wayne
|
||||
|
||||
DELETE EVERYTHING IN THIS COMMENT BLOCK AND REPLACE WITH YOUR COMMENTS
|
||||
-->
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -31,8 +31,6 @@ jobs:
|
||||
echo "Tag: ${{github.ref_name}}"
|
||||
if grep -q "dev" <<< "${{github.ref_name}}"; then
|
||||
TITLE="RomWBW Development Snapshot"
|
||||
elif grep -q "beta" <<< "${{github.ref_name}}"; then
|
||||
TITLE="RomWBW Beta Release"
|
||||
elif grep -q "pre" <<< "${{github.ref_name}}"; then
|
||||
TITLE="RomWBW Prerelease"
|
||||
elif grep -q "rc" <<< "${{github.ref_name}}"; then
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -20,9 +20,12 @@
|
||||
|
||||
Binary/**/*.mym
|
||||
Binary/**/*.pt3
|
||||
!Binary/CPNET/NetBoot/*/cpnos.sys
|
||||
!Binary/CPNET/NetBoot/cpnos-wbw.sys
|
||||
|
||||
Source/Images
|
||||
Source/RomDsk
|
||||
Source/**/eeprom
|
||||
Binary/Apps/copysl.doc
|
||||
Source/Apps/Assign.com
|
||||
Source/Apps/FDU/FDU.COM
|
||||
Source/Apps/Format.com
|
||||
@@ -98,7 +101,6 @@ Tools/unix/zx/zx
|
||||
!Source/ZSDOS/*.[Cc][Oo][Mm]
|
||||
!Source/ZRC/*.bin
|
||||
!Source/ZRC512/*.bin
|
||||
!Source/EZ512/*.bin
|
||||
!Source/Z1RCC/*.bin
|
||||
!Source/ZZRCC/*.bin
|
||||
!Source/FZ80/*.bin
|
||||
|
||||
@@ -9,8 +9,5 @@ if exist Tunes\*.pt? del Tunes\*.pt?
|
||||
if exist Tunes\*.mym del Tunes\*.mym
|
||||
if exist Tunes\*.vgm del Tunes\*.vgm
|
||||
if exist bbcbasic.txt del bbcbasic.txt
|
||||
if exist *.cfg del *.cfg
|
||||
if exist *.fon del *.fon
|
||||
|
||||
pushd Test && call Clean || exit /b 1 & popd
|
||||
pushd ZDE && call Clean || exit /b 1 & popd
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
TOOLS = ../../Tools
|
||||
MOREDIFF := $(shell $(TOOLS)/unix/casefn.sh *.com)
|
||||
SUBDIRS = Test ZDE
|
||||
SUBDIRS = Test
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
@@ -8,4 +8,4 @@ all::
|
||||
mkdir -p Tunes
|
||||
|
||||
clean::
|
||||
@rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom *.ovr *.hlp *.doc *.COM *.BIN Tunes/*.mym Tunes/*.pt? Tunes/*.vgm bbcbasic.txt *.cfg *.fon
|
||||
@rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom *.ovr *.hlp *.doc *.COM *.BIN Tunes/*.mym Tunes/*.pt? Tunes/*.vgm bbcbasic.txt
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if exist *.com del *.com
|
||||
@@ -1,6 +0,0 @@
|
||||
TOOLS = ../../../Tools
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
clean::
|
||||
@rm -f *.com
|
||||
@@ -1,10 +0,0 @@
|
||||
***********************************************************************
|
||||
*** ***
|
||||
*** R o m W B W ***
|
||||
*** ***
|
||||
*** Z80/Z180 System Software ***
|
||||
*** ***
|
||||
***********************************************************************
|
||||
|
||||
This directory contains the ZDE executable binaries. They are
|
||||
in their original, unconfigured state.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary/PEGASUS_std.upd
Normal file
BIN
Binary/PEGASUS_std.upd
Normal file
Binary file not shown.
BIN
Binary/Z80RETRO_std.upd
Normal file
BIN
Binary/Z80RETRO_std.upd
Normal file
Binary file not shown.
@@ -1,12 +1,3 @@
|
||||
Version 3.5.1
|
||||
-------------
|
||||
- WBW: Fix CPMLDR.SYS & ZPMLDR.SYS for SYSCOPY (reported by Guido Santer)
|
||||
- MAP: Enhanced SLR Tools Disk Image with Plus versions
|
||||
- WBW: Add missing BCLOAD file to MS BASIC Compiler Disk Image (reported by Marshall Gates)
|
||||
- WBW: Doc improvements (per Fraser and Rob Gowin)
|
||||
- WBW: Correct ZMP application crash
|
||||
- MAP: Contribution of the SLABEL.COM tool for displaying and changing slice labels.
|
||||
|
||||
Version 3.5
|
||||
-----------
|
||||
- M?F: Fix for hours display in HBRTC application
|
||||
@@ -47,8 +38,8 @@ Version 3.5
|
||||
- WBW: Add CPU speed selection for HEATH platform to HBIOS
|
||||
- WBW: Add Warm/Cold reboot options to CPUSPD utility
|
||||
- D?N: Added support for eZ80 CPU
|
||||
- MAP: Contributed COPYSL utility that allows disk slices to be copied
|
||||
- MAP: Added new HBIOS function EXT_SLICE, extended disk slice info
|
||||
- MAP: Contributed COPYSL utility
|
||||
- MAP: Added new HBIOS function EXT_SLICE (orginally SYSGET_DIOMED)
|
||||
- MAP: ROMLDR now uses EXT_SLICE to get Slice Sector for boot
|
||||
- MAP: CBIOS now uses EXT_SLICE during drive selection
|
||||
- MAP: CPM3 Boot Loader, and BIOS (drive select) now use EXT_SLICE
|
||||
@@ -56,17 +47,7 @@ Version 3.5
|
||||
- MAP: Significant improvement in Disk Catalog document
|
||||
- MAP: Added Disk Image for the Z3PLUS (Z-System for CP/M-Plus) os.
|
||||
- H?H: Fix XModem 12.3 WRERR to put CAN char in proper register to send.
|
||||
- MAP: Added support for dynamic HBIOS config via (RTC) NVRAM
|
||||
- MAP: Added boot application to allow config of NVRAM options
|
||||
- MAP: Configuration of autoboot disk/app added to NVRAM config
|
||||
- WBW: Autoboot is now handled in separate prompt during RomWBW startup
|
||||
- MAP: Added additional tools (Linker/Disasembler) to the Z80ASM Disk Image
|
||||
- PMS: Support interrupt-driven PS2 Keyboard Interface
|
||||
- D?M: Added NetBoot support for Duodyne
|
||||
- WBW: Add options to TUNE/HBIOS to force detection of MSX and RC AY/YM standard PSG ports
|
||||
- MAP: Added /B=OPTIONS for automated drive assignment to ASSIGN.COM
|
||||
- WBW: Added TE Editor (Ladislau Szilagyi)
|
||||
- WBW: Refrech Cowgol disk image (Ladislau Szilagyi)
|
||||
- MAP: Initial NVRAM configuration infrastructure
|
||||
|
||||
Version 3.4
|
||||
-----------
|
||||
|
||||
BIN
Doc/Language/Cowgol Language.pdf
Normal file
BIN
Doc/Language/Cowgol Language.pdf
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -31,9 +31,9 @@ Log of changes in RomWBW by version.
|
||||
RomWBW User Guide ("RomWBW User Guide.pdf")
|
||||
RomWBW System Guide ("RomWBW System Guide.pdf")
|
||||
RomWBW Applications ("RomWBW Applications.pdf")
|
||||
RomWBW ROM Applications ("RomWBW ROM Applications.pdf")
|
||||
RomWBW Disk Catalog ("RomWBW Disk Catalog.pdf")
|
||||
RomWBW Hardware ("RomWBW Hardware.pdf")
|
||||
|
||||
RomWBW Errata ("RomWBW Errata.pdf")
|
||||
-------------------------------------------------------
|
||||
|
||||
Documentation set for RomWBW. The primary document is the
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
Doc/RomWBW Errata.pdf
Normal file
BIN
Doc/RomWBW Errata.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,98 +0,0 @@
|
||||
# RomWBW Release Notes
|
||||
|
||||
This file contains information useful to those upgrading to a new
|
||||
release of RomWBW.
|
||||
|
||||
## All Versions
|
||||
|
||||
- **Please** review the "Upgrading" Section of the RomWBW User Guide.
|
||||
|
||||
- The RomWBW ROM and the RomWBW disk images are intended to be a
|
||||
matched set. After upgrading your ROM, it is important to update
|
||||
the OS boot tracks of your disks as well as the RomWBW-specific
|
||||
applications. This is discussed in the "Upgrading" section of the
|
||||
RomWBW User Guide.
|
||||
|
||||
## Version 3.5
|
||||
|
||||
### Upgrade Notes
|
||||
|
||||
- RomWBW is now more strict with respect to hard disk partition
|
||||
tables. If your hard disk media was created using any of the
|
||||
pre-built disk image files, this will **not** affect you. Otherwise,
|
||||
you may find you are unable to access slices beyond the first
|
||||
slice. If so, use `FDISK80` to reset the partition table on the
|
||||
disk. This will restore normal access to all slices. **Only** do
|
||||
this if you are having an issue.
|
||||
|
||||
- For those building custom ROMs that are overriding `DEFSERCFG`, note
|
||||
that this setting has been moved to a `#DEFINE` instead of an equate
|
||||
(`.SET` or `.EQU`). You will find this `#DEFINE` at the top of all
|
||||
standard config files. You will need to change your setting to a
|
||||
`#DEFINE` at the top of your config file and remove any `.SET` or
|
||||
`.EQU` lines for `DEFSERCFG`.
|
||||
|
||||
- Combining config settings `AUTOCON` and `VDAEMU_SERKBD` causes issues
|
||||
at the boot loader prompt. So, all config files have been changed to
|
||||
consistently enable `AUTOCON` and disable `VDAEMU_SERKBD` (`$FF`). If
|
||||
are want to use `VDAEMU_SERKBD`, you need to set it in your config
|
||||
file as well as disabling AUTOCON.
|
||||
|
||||
### New Features
|
||||
|
||||
- RC2014 Front Panel and LCD Screen support.
|
||||
|
||||
- Console "takeover" support at Boot Loader prompt by pressing the
|
||||
<space> key twice on an alternate console device.
|
||||
|
||||
- Cowgol disk image based on the work of Ladislau Szilagyi.
|
||||
|
||||
- TMS video is automatically reset after an OS warm boot which
|
||||
allows OS to recover from applications that reprogram the TMS
|
||||
video display controller.
|
||||
|
||||
- Implemented "application" RAM banks that can be discovered via
|
||||
the HBIOS API.
|
||||
|
||||
- Documentation improvements (Mark Pruden), including:
|
||||
|
||||
- Reorganization into multiple directories.
|
||||
- Improved Disk Management section in User Guide.
|
||||
- Overhaul of Disk Catalog.
|
||||
|
||||
- Disk image for Z3PLUS (Mark Pruden).
|
||||
|
||||
- `REBOOT` application added (Martin R). Also, reboot capability
|
||||
added to `CPUSPD` utility.
|
||||
|
||||
- `COPYSL` slice copy application (Mark Pruden).
|
||||
|
||||
- `SLABEL` slice label display/edit tool (Mark Pruden).
|
||||
|
||||
- Improved disk slice management and protection (Mark Pruden).
|
||||
|
||||
- Initial NVRAM configuration support (Mark Pruden).
|
||||
|
||||
- Enhancements to ASSIGN command to automatically assign drives
|
||||
(Mark Pruden).
|
||||
|
||||
|
||||
### New Hardware Support
|
||||
|
||||
- NABU w/ RomWBW Option Board.
|
||||
|
||||
- EF9345 video display controller driver (Laszlo Szolnoki).
|
||||
|
||||
- Duodyne Disk I/O (CP/NET) and Media boards.
|
||||
|
||||
- PS/2 keyboard interface on RCBus systems.
|
||||
|
||||
- S100 FPGA-based Z80 including console, SD Cards, and RTC.
|
||||
|
||||
- Support for 16C550-family UART support on additional platforms.
|
||||
|
||||
- Genesis STD Bus Z180 platform (Doug Jackson).
|
||||
|
||||
- Support for Dinoboard eZ80 CPU board provided by Dean Netherton.
|
||||
|
||||
- Added interrupt support to PS/2 keyboard driver by Phil Summers.
|
||||
271
ReadMe.md
271
ReadMe.md
@@ -1,22 +1,17 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**RomWBW Introduction** \
|
||||
**RomWBW ReadMe** \
|
||||
Version 3.5 \
|
||||
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
|
||||
08 May 2025
|
||||
08 Nov 2024
|
||||
|
||||
# Overview
|
||||
|
||||
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.
|
||||
|
||||
A wide variety of platforms are supported including those produced by
|
||||
these developer communities:
|
||||
Z80/180/280 retro-computing hardware systems. A wide variety of
|
||||
platforms are supported including those produced by these developer
|
||||
communities:
|
||||
|
||||
- [RetroBrew Computers](https://www.retrobrewcomputers.org)
|
||||
(<https://www.retrobrewcomputers.org>)
|
||||
@@ -28,21 +23,10 @@ these developer communities:
|
||||
- [Small Computer Central](https://smallcomputercentral.com/)
|
||||
(<https://smallcomputercentral.com/>)
|
||||
|
||||
A complete list of the currently supported platforms is found in [RomWBW
|
||||
Hardware](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Hardware.pdf)
|
||||
.
|
||||
A complete list of the currently supported platforms is found in the
|
||||
\[Installation\] section.
|
||||
|
||||
# Description
|
||||
|
||||
## Primary Features
|
||||
|
||||
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.
|
||||
|
||||
Supported hardware features of RomWBW include:
|
||||
General features include:
|
||||
|
||||
- Z80 Family CPUs including Z80, Z180, and Z280
|
||||
- Banked memory services for several banking designs
|
||||
@@ -52,19 +36,34 @@ Supported hardware features of RomWBW include:
|
||||
- Video drivers including TMS9918, SY6545, MOS8563, HD6445
|
||||
- Keyboard (PS/2) drivers via VT8242 or PPI interfaces
|
||||
- Real time clock drivers including DS1302, BQ4845
|
||||
- Support for CP/NET networking using Wiznet, MT011 or Serial
|
||||
- OSes: CP/M 2.2, ZSDOS, CP/M 3, NZ-COM, ZPM3, QPM, p-System, and
|
||||
FreeRTOS
|
||||
- Built-in VT-100 terminal emulation support
|
||||
|
||||
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:
|
||||
|
||||
- System Monitor
|
||||
- Operating Systems (CP/M 2.2, ZSDOS)
|
||||
- ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
- ROM Forth
|
||||
|
||||
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.
|
||||
OSes and allows up to 2GB of accessible storage on a single device.
|
||||
|
||||
## Included Software
|
||||
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.
|
||||
|
||||
Multiple disk images are provided in the distribution. Most disk images
|
||||
contain a complete, bootable, ready-to-run implementation of a specific
|
||||
@@ -73,79 +72,37 @@ 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.
|
||||
|
||||
Some of the included software:
|
||||
|
||||
- Operating Systems (CP/M 2.2, ZSDOS, NZ-COM, CP/M 3, ZPM3, Z3PLUS, QPM
|
||||
)
|
||||
- Support for other operating systems, p-System, FreeRTOS, and FUZIX.
|
||||
- Programming Tools (Z80ASM, Turbo Pascal, Forth, Cowgol)
|
||||
- C Compiler’s including Aztec-C, and HI-TECH C
|
||||
- Microsoft Basic Compiler, and Microsoft Fortran
|
||||
- Some games such as Colossal Cave, Zork, etc
|
||||
- Wordstar Word processing software
|
||||
|
||||
Some of the provided software can be launched directly from the ROM
|
||||
firmware itself:
|
||||
|
||||
- System Monitor
|
||||
- Operating Systems (CP/M 2.2, ZSDOS)
|
||||
- ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
- ROM Forth
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
## ROM Distribution
|
||||
# Acquiring RomWBW
|
||||
|
||||
The [RomWBW Repository](https://github.com/wwarthen/RomWBW)
|
||||
(<https://github.com/wwarthen/RomWBW>) on GitHub is the official
|
||||
distribution location for all project source and documentation.
|
||||
|
||||
RomWBW is distributed as both source code and pre-built ROM and disk
|
||||
images.
|
||||
|
||||
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.
|
||||
|
||||
The fully-built distribution releases are available on the [RomWBW
|
||||
Releases Page](https://github.com/wwarthen/RomWBW/releases)
|
||||
(<https://github.com/wwarthen/RomWBW/releases>) of the repository.
|
||||
|
||||
On this page, you will normally see a Development Snapshot as well as
|
||||
distribution location for all project source and documentation. The
|
||||
fully-built distribution releases are available on the [RomWBW Releases
|
||||
Page](https://github.com/wwarthen/RomWBW/releases)
|
||||
(<https://github.com/wwarthen/RomWBW/releases>) 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.
|
||||
stick to the most recent stable release. Expand the “Assets” drop-down
|
||||
for the release you want to download, then select the asset named
|
||||
RomWBW-vX.X.X-Package.zip. The Package asset 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.
|
||||
|
||||
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.
|
||||
All source code and distributions are maintained on GitHub. Code
|
||||
contributions are very welcome.
|
||||
|
||||
#### Distribution Directory Layout
|
||||
|
||||
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:
|
||||
|
||||
| **Directory** | **Description** |
|
||||
|----|----|
|
||||
| **Binary** | 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. |
|
||||
| **Doc** | Contains various detailed documentation, both RomWBW specifically as well as the operating systems and applications. |
|
||||
| **Source** | Contains the source code files used to build the software and ROM images. |
|
||||
| **Tools** | Contains the programs that are used by the build process or that may be useful in setting up your system. |
|
||||
|
||||
#### Building from Source
|
||||
|
||||
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.
|
||||
|
||||
## Installation & Operation
|
||||
# Installation & Operation
|
||||
|
||||
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
|
||||
@@ -156,79 +113,21 @@ functionality.
|
||||
Complete instructions for installation and operation of RomWBW are found
|
||||
in the [RomWBW User
|
||||
Guide](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20User%20Guide.pdf).
|
||||
It is also a good idea to review the [Release
|
||||
Notes](https://github.com/wwarthen/RomWBW/blob/master/RELEASE_NOTES.md)
|
||||
for helpful release-specific information.
|
||||
|
||||
## Documentation
|
||||
|
||||
There are several documents that form the core of the RomWBW
|
||||
documentation:
|
||||
Documentation for RomWBW includes:
|
||||
|
||||
- [RomWBW User
|
||||
Guide](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20User%20Guide.pdf)
|
||||
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
|
||||
|
||||
- [RomWBW
|
||||
Hardware](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Hardware.pdf)
|
||||
contains a description of all the hardware platforms, and devices
|
||||
supported by RomWBW.
|
||||
|
||||
- [RomWBW
|
||||
Applications](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Applications.pdf)
|
||||
is a reference for the ROM-hosted and OS-hosted applications created
|
||||
or customized to enhance the operation of RomWBW.
|
||||
|
||||
- [RomWBW Disk
|
||||
Catalog](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Disk%20Catalog.pdf)
|
||||
is a reference for the contents of the disk images provided with
|
||||
RomWBW, with a description of many of the files on each image
|
||||
|
||||
- [RomWBW System
|
||||
Guide](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20System%20Guide.pdf)
|
||||
discusses much of the internal design and construction of RomWBW. It
|
||||
includes a reference for the RomWBW HBIOS API functions.
|
||||
- [RomWBW
|
||||
Applications](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Applications.pdf)
|
||||
- [RomWBW
|
||||
Errata](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Errata.pdf)
|
||||
|
||||
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.
|
||||
|
||||
Since RomWBW is purely a software product for many different platforms,
|
||||
the documentation does **not** cover hardware construction,
|
||||
configuration, or troubleshooting – please see your hardware provider
|
||||
for this information.
|
||||
|
||||
# Support
|
||||
|
||||
## Getting Assistance
|
||||
|
||||
The best way to get assistance with RomWBW or any aspect of the
|
||||
RetroBrew Computers projects is via one of the community forums:
|
||||
|
||||
- [RetroBrew Computers Forum](https://www.retrobrewcomputers.org/forum/)
|
||||
- [RC2014 Google
|
||||
Group](https://groups.google.com/forum/#!forum/rc2014-z80)
|
||||
- [retro-comp Google
|
||||
Group](https://groups.google.com/forum/#!forum/retro-comp)
|
||||
|
||||
Submission of issues and bugs are welcome at the [RomWBW GitHub
|
||||
Repository](https://github.com/wwarthen/RomWBW).
|
||||
|
||||
Also feel free to email Wayne Warthen at <wwarthen@gmail.com>. I am
|
||||
happy to provide support adapting RomWBW to new or modified systems
|
||||
|
||||
# Contributions
|
||||
|
||||
All source code and distributions are maintained on GitHub.
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
## Acknowledgments
|
||||
# Acknowledgments
|
||||
|
||||
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
|
||||
@@ -299,14 +198,9 @@ let me know if I missed you!
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide and Applications documents.
|
||||
|
||||
- Mark Pruden has made a wide variety of contributions including:
|
||||
|
||||
- significant content in the Disk Catalog and User Guide
|
||||
- creation of the Introduction and Hardware documents
|
||||
- Z3PLUS operating system disk image
|
||||
- COPYSL utility
|
||||
- a feature for RomWBW configuration by NVRAM
|
||||
- the /B bulk mode of disk assignment to the ASSIGN utility
|
||||
- Mark Pruden has also contributed a great deal of content to the Disk
|
||||
Catalog, User Guide as well as contributing the disk image for the
|
||||
Z3PLUS operating system, and the COPYSL utility.
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
@@ -339,47 +233,10 @@ let me know if I missed you!
|
||||
|
||||
- Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
## Related Projects
|
||||
|
||||
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.
|
||||
|
||||
#### Z88DK
|
||||
|
||||
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
|
||||
<https://github.com/z88dk/z88dk>.
|
||||
|
||||
#### Paleo Editor
|
||||
|
||||
Steve Garcia has created a Windows-hosted IDE that is tailored to
|
||||
development of RomWBW. The project can be found at
|
||||
<https://github.com/alloidian/PaleoEditor>.
|
||||
|
||||
#### Z80 fig-FORTH
|
||||
|
||||
Dimitri Theulings’ implementation of fig-FORTH for the Z80 has a
|
||||
RomWBW-specific variant. The project is hosted at
|
||||
<https://github.com/dimitrit/figforth>.
|
||||
|
||||
#### Assembly Language Programming for the RC2014 Zed
|
||||
|
||||
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 [http://w8bh.net/Assembly for
|
||||
RC2014Z.pdf](http://w8bh.net/Assembly%20for%20RC2014Z.pdf).
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
## License Terms
|
||||
|
||||
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
|
||||
@@ -419,3 +276,19 @@ encouraged to submit their contributions via the RomWBW source code
|
||||
control system to ensure their contributions are clearly documented.
|
||||
|
||||
All contributions to RomWBW are subject to this license.
|
||||
|
||||
# Getting Assistance
|
||||
|
||||
The best way to get assistance with RomWBW or any aspect of the
|
||||
RetroBrew Computers projects is via one of the community forums:
|
||||
|
||||
- [RetroBrew Computers Forum](https://www.retrobrewcomputers.org/forum/)
|
||||
- [RC2014 Google
|
||||
Group](https://groups.google.com/forum/#!forum/rc2014-z80)
|
||||
- [retro-comp Google
|
||||
Group](https://groups.google.com/forum/#!forum/retro-comp)
|
||||
|
||||
Submission of issues and bugs are welcome at the [RomWBW GitHub
|
||||
Repository](https://github.com/wwarthen/RomWBW).
|
||||
|
||||
Also feel free to email Wayne Warthen at <wwarthen@gmail.com>.
|
||||
|
||||
437
ReadMe.txt
437
ReadMe.txt
@@ -1,9 +1,6 @@
|
||||
RomWBW Introduction
|
||||
RomWBW ReadMe
|
||||
Wayne Warthen (wwarthen@gmail.com)
|
||||
08 May 2025
|
||||
|
||||
|
||||
|
||||
08 Nov 2024
|
||||
|
||||
|
||||
|
||||
@@ -12,45 +9,41 @@ OVERVIEW
|
||||
|
||||
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.
|
||||
Z80/180/280 retro-computing hardware systems. A wide variety of
|
||||
platforms are supported including those produced by these developer
|
||||
communities:
|
||||
|
||||
A wide variety of platforms are supported including those produced by
|
||||
these developer communities:
|
||||
- RetroBrew Computers (https://www.retrobrewcomputers.org)
|
||||
- RC2014 (https://rc2014.co.uk),
|
||||
RC2014-Z80 (https://groups.google.com/g/rc2014-z80)
|
||||
- Retro Computing (https://groups.google.com/g/retro-comp)
|
||||
- Small Computer Central (https://smallcomputercentral.com/)
|
||||
|
||||
- RetroBrew Computers (https://www.retrobrewcomputers.org)
|
||||
- RC2014 (https://rc2014.co.uk),
|
||||
RC2014-Z80 (https://groups.google.com/g/rc2014-z80)
|
||||
- Retro Computing (https://groups.google.com/g/retro-comp)
|
||||
- Small Computer Central (https://smallcomputercentral.com/)
|
||||
A complete list of the currently supported platforms is found in the
|
||||
[Installation] section.
|
||||
|
||||
A complete list of the currently supported platforms is found in RomWBW
|
||||
Hardware .
|
||||
General features include:
|
||||
|
||||
- Z80 Family CPUs including Z80, Z180, and Z280
|
||||
- Banked memory services for several banking designs
|
||||
- Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip,
|
||||
Iomega
|
||||
- Serial drivers including UART (16550-like), ASCI, ACIA, SIO
|
||||
- Video drivers including TMS9918, SY6545, MOS8563, HD6445
|
||||
- Keyboard (PS/2) drivers via VT8242 or PPI interfaces
|
||||
- Real time clock drivers including DS1302, BQ4845
|
||||
- OSes: CP/M 2.2, ZSDOS, CP/M 3, NZ-COM, ZPM3, QPM, p-System, and
|
||||
FreeRTOS
|
||||
- Built-in VT-100 terminal emulation support
|
||||
|
||||
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:
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
|
||||
Primary Features
|
||||
|
||||
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.
|
||||
|
||||
Supported hardware features of RomWBW include:
|
||||
|
||||
- Z80 Family CPUs including Z80, Z180, and Z280
|
||||
- Banked memory services for several banking designs
|
||||
- Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip,
|
||||
Iomega
|
||||
- Serial drivers including UART (16550-like), ASCI, ACIA, SIO
|
||||
- Video drivers including TMS9918, SY6545, MOS8563, HD6445
|
||||
- Keyboard (PS/2) drivers via VT8242 or PPI interfaces
|
||||
- Real time clock drivers including DS1302, BQ4845
|
||||
- Support for CP/NET networking using Wiznet, MT011 or Serial
|
||||
- Built-in VT-100 terminal emulation support
|
||||
- System Monitor
|
||||
- Operating Systems (CP/M 2.2, ZSDOS)
|
||||
- ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
- ROM Forth
|
||||
|
||||
A dynamic disk drive letter assignment mechanism allows mapping
|
||||
operating system drive letters to any available disk media.
|
||||
@@ -58,11 +51,15 @@ 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.
|
||||
OSes and allows up to 2GB of accessible storage on a single device.
|
||||
|
||||
|
||||
Included Software
|
||||
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.
|
||||
|
||||
Multiple disk images are provided in the distribution. Most disk images
|
||||
contain a complete, bootable, ready-to-run implementation of a specific
|
||||
@@ -71,24 +68,11 @@ 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.
|
||||
|
||||
Some of the included software:
|
||||
|
||||
- Operating Systems (CP/M 2.2, ZSDOS, NZ-COM, CP/M 3, ZPM3, Z3PLUS, QPM
|
||||
)
|
||||
- Support for other operating systems, p-System, FreeRTOS, and FUZIX.
|
||||
- Programming Tools (Z80ASM, Turbo Pascal, Forth, Cowgol)
|
||||
- C Compiler’s including Aztec-C, and HI-TECH C
|
||||
- Microsoft Basic Compiler, and Microsoft Fortran
|
||||
- Some games such as Colossal Cave, Zork, etc
|
||||
- Wordstar Word processing software
|
||||
|
||||
Some of the provided software can be launched directly from the ROM
|
||||
firmware itself:
|
||||
|
||||
- System Monitor
|
||||
- Operating Systems (CP/M 2.2, ZSDOS)
|
||||
- ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
- ROM Forth
|
||||
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.
|
||||
|
||||
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
|
||||
@@ -96,67 +80,30 @@ slices or on stand-alone media. This makes exchanging files with modern
|
||||
OSes such as Windows, MacOS, and Linux very easy.
|
||||
|
||||
|
||||
ROM Distribution
|
||||
|
||||
ACQUIRING ROMWBW
|
||||
|
||||
|
||||
The RomWBW Repository (https://github.com/wwarthen/RomWBW) on GitHub is
|
||||
the official distribution location for all project source and
|
||||
documentation.
|
||||
documentation. The fully-built distribution releases are available on
|
||||
the RomWBW Releases Page (https://github.com/wwarthen/RomWBW/releases)
|
||||
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. Expand
|
||||
the “Assets” drop-down for the release you want to download, then select
|
||||
the asset named RomWBW-vX.X.X-Package.zip. The Package asset 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.
|
||||
|
||||
RomWBW is distributed as both source code and pre-built ROM and disk
|
||||
images.
|
||||
|
||||
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.
|
||||
|
||||
The fully-built distribution releases are available on the RomWBW
|
||||
Releases Page (https://github.com/wwarthen/RomWBW/releases) 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.
|
||||
|
||||
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.
|
||||
|
||||
Distribution Directory Layout
|
||||
|
||||
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:
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
DIRECTORY DESCRIPTION
|
||||
----------- -------------------------------------------------------------
|
||||
BINARY 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.
|
||||
|
||||
DOC Contains various detailed documentation, both RomWBW
|
||||
specifically as well as the operating systems and
|
||||
applications.
|
||||
|
||||
SOURCE Contains the source code files used to build the software and
|
||||
ROM images.
|
||||
|
||||
TOOLS Contains the programs that are used by the build process or
|
||||
that may be useful in setting up your system.
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Building from Source
|
||||
|
||||
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.
|
||||
All source code and distributions are maintained on GitHub. Code
|
||||
contributions are very welcome.
|
||||
|
||||
|
||||
Installation & Operation
|
||||
|
||||
INSTALLATION & OPERATION
|
||||
|
||||
|
||||
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
|
||||
@@ -165,231 +112,136 @@ drives (IDE disk, CF Card, SD Card, etc.) which then provides even more
|
||||
functionality.
|
||||
|
||||
Complete instructions for installation and operation of RomWBW are found
|
||||
in the RomWBW User Guide. It is also a good idea to review the Release
|
||||
Notes for helpful release-specific information.
|
||||
in the RomWBW User Guide.
|
||||
|
||||
|
||||
Documentation
|
||||
|
||||
There are several documents that form the core of the RomWBW
|
||||
documentation:
|
||||
Documentation for RomWBW includes:
|
||||
|
||||
- RomWBW User Guide 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
|
||||
|
||||
- RomWBW Hardware contains a description of all the hardware platforms,
|
||||
and devices supported by RomWBW.
|
||||
|
||||
- RomWBW Applications is a reference for the ROM-hosted and OS-hosted
|
||||
applications created or customized to enhance the operation of RomWBW.
|
||||
|
||||
- RomWBW Disk Catalog is a reference for the contents of the disk images
|
||||
provided with RomWBW, with a description of many of the files on each
|
||||
image
|
||||
|
||||
- RomWBW System Guide discusses much of the internal design and
|
||||
construction of RomWBW. It includes a reference for the RomWBW HBIOS
|
||||
API functions.
|
||||
|
||||
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.
|
||||
|
||||
Since RomWBW is purely a software product for many different platforms,
|
||||
the documentation does NOT cover hardware construction, configuration,
|
||||
or troubleshooting – please see your hardware provider for this
|
||||
information.
|
||||
- RomWBW User Guide
|
||||
- RomWBW System Guide
|
||||
- RomWBW Applications
|
||||
- RomWBW Errata
|
||||
|
||||
|
||||
|
||||
SUPPORT
|
||||
ACKNOWLEDGMENTS
|
||||
|
||||
|
||||
Getting Assistance
|
||||
|
||||
The best way to get assistance with RomWBW or any aspect of the
|
||||
RetroBrew Computers projects is via one of the community forums:
|
||||
|
||||
- RetroBrew Computers Forum
|
||||
- RC2014 Google Group
|
||||
- retro-comp Google Group
|
||||
|
||||
Submission of issues and bugs are welcome at the RomWBW GitHub
|
||||
Repository.
|
||||
|
||||
Also feel free to email Wayne Warthen at wwarthen@gmail.com. I am happy
|
||||
to provide support adapting RomWBW to new or modified systems
|
||||
|
||||
|
||||
|
||||
CONTRIBUTIONS
|
||||
|
||||
|
||||
All source code and distributions are maintained on GitHub.
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
|
||||
Acknowledgments
|
||||
|
||||
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!
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
- Sergey Kiselev created several hardware platforms for RomWBW including
|
||||
the very popular Zeta.
|
||||
- Sergey Kiselev created several hardware platforms for RomWBW
|
||||
including the very popular Zeta.
|
||||
|
||||
- David Giles created support for the Z180 CSIO which is now included SD
|
||||
Card driver.
|
||||
- David Giles created support for the Z180 CSIO which is now included
|
||||
SD Card driver.
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
- Ed Brindley contributed some of the code that supports the RCBus
|
||||
platform.
|
||||
- Ed Brindley contributed some of the code that supports the RCBus
|
||||
platform.
|
||||
|
||||
- Spencer Owen created the RC2014 series of hobbyist kit computers which
|
||||
has exponentially increased RomWBW usage. Some of his kits include
|
||||
RomWBW.
|
||||
- Spencer Owen created the RC2014 series of hobbyist kit computers
|
||||
which has exponentially increased RomWBW usage. Some of his kits
|
||||
include RomWBW.
|
||||
|
||||
- Stephen Cousins has likewise created a series of hobbyist kit
|
||||
computers at Small Computer Central and is distributing RomWBW with
|
||||
many of them.
|
||||
- Stephen Cousins has likewise created a series of hobbyist kit
|
||||
computers at Small Computer Central and is distributing RomWBW with
|
||||
many of them.
|
||||
|
||||
- Alan Cox has contributed some driver code and has provided a great
|
||||
deal of advice.
|
||||
- Alan Cox has contributed some driver code and has provided a great
|
||||
deal of advice.
|
||||
|
||||
- The CP/NET client files were developed by Douglas Miller.
|
||||
- The CP/NET client files were developed by Douglas Miller.
|
||||
|
||||
- Phillip Stevens contributed support for FreeRTOS.
|
||||
- Phillip Stevens contributed support for FreeRTOS.
|
||||
|
||||
- Curt Mayer contributed the original Linux / MacOS build process.
|
||||
- Curt Mayer contributed the original Linux / MacOS build process.
|
||||
|
||||
- UNA BIOS and FDISK80 are the products of John Coffman.
|
||||
- UNA BIOS and FDISK80 are the products of John Coffman.
|
||||
|
||||
- FLASH4 is a product of Will Sowerbutts.
|
||||
- FLASH4 is a product of Will Sowerbutts.
|
||||
|
||||
- CLRDIR is a product of Max Scane.
|
||||
- CLRDIR is a product of Max Scane.
|
||||
|
||||
- Tasty Basic is a product of Dimitri Theulings.
|
||||
- Tasty Basic is a product of Dimitri Theulings.
|
||||
|
||||
- Dean Netherton contributed eZ80 CPU support, the sound driver
|
||||
interface, and the SN76489 sound driver.
|
||||
- Dean Netherton contributed eZ80 CPU support, the sound driver
|
||||
interface, and the SN76489 sound driver.
|
||||
|
||||
- The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
- The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide and Applications documents.
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide and Applications documents.
|
||||
|
||||
- Mark Pruden has made a wide variety of contributions including:
|
||||
- Mark Pruden has also contributed a great deal of content to the Disk
|
||||
Catalog, User Guide as well as contributing the disk image for the
|
||||
Z3PLUS operating system, and the COPYSL utility.
|
||||
|
||||
- significant content in the Disk Catalog and User Guide
|
||||
- creation of the Introduction and Hardware documents
|
||||
- Z3PLUS operating system disk image
|
||||
- COPYSL utility
|
||||
- a feature for RomWBW configuration by NVRAM
|
||||
- the /B bulk mode of disk assignment to the ASSIGN utility
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
- Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
- Jose Collado has contributed enhancements to the TMS driver including
|
||||
compatibility with standard TMS register configuration.
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility
|
||||
(WDATE).
|
||||
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
- Bill Shen has contributed boot loaders for several of his systems.
|
||||
|
||||
- Bill Shen has contributed boot loaders for several of his systems.
|
||||
- Laszlo Szolnoki has contributed an EF9345 video display controller
|
||||
driver.
|
||||
|
||||
- Laszlo Szolnoki has contributed an EF9345 video display controller
|
||||
driver.
|
||||
- Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol
|
||||
that leverages RomWBW memory banking.
|
||||
|
||||
- Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol
|
||||
that leverages RomWBW memory banking.
|
||||
- Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
- Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
|
||||
Related Projects
|
||||
|
||||
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.
|
||||
|
||||
Z88DK
|
||||
|
||||
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
|
||||
https://github.com/z88dk/z88dk.
|
||||
|
||||
Paleo Editor
|
||||
|
||||
Steve Garcia has created a Windows-hosted IDE that is tailored to
|
||||
development of RomWBW. The project can be found at
|
||||
https://github.com/alloidian/PaleoEditor.
|
||||
|
||||
Z80 fig-FORTH
|
||||
|
||||
Dimitri Theulings’ implementation of fig-FORTH for the Z80 has a
|
||||
RomWBW-specific variant. The project is hosted at
|
||||
https://github.com/dimitrit/figforth.
|
||||
|
||||
Assembly Language Programming for the RC2014 Zed
|
||||
|
||||
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 http://w8bh.net/Assembly for RC2014Z.pdf.
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
|
||||
|
||||
LICENSING
|
||||
|
||||
|
||||
License Terms
|
||||
|
||||
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
|
||||
@@ -429,3 +281,20 @@ encouraged to submit their contributions via the RomWBW source code
|
||||
control system to ensure their contributions are clearly documented.
|
||||
|
||||
All contributions to RomWBW are subject to this license.
|
||||
|
||||
|
||||
|
||||
GETTING ASSISTANCE
|
||||
|
||||
|
||||
The best way to get assistance with RomWBW or any aspect of the
|
||||
RetroBrew Computers projects is via one of the community forums:
|
||||
|
||||
- RetroBrew Computers Forum
|
||||
- RC2014 Google Group
|
||||
- retro-comp Google Group
|
||||
|
||||
Submission of issues and bugs are welcome at the RomWBW GitHub
|
||||
Repository.
|
||||
|
||||
Also feel free to email Wayne Warthen at wwarthen@gmail.com.
|
||||
|
||||
@@ -1,21 +1,16 @@
|
||||
This is a RomWBW HBIOS adaptation of BBCBASIC v5.00 by R.T.Russell.
|
||||
This implementation was adapted from the source code found at
|
||||
https://github.com/rtrussell/BBCZ80.
|
||||
|
||||
The cursor and screen management assumes the use of an ANSI/VT-100
|
||||
terminal which is generally correct for RomWBW. Support for a hardware
|
||||
system timer is also implemented. If your system does not have a
|
||||
hardware timer, the TIME function will always return 0 and the timeout
|
||||
This is a RomWBW HBIOS adaptation of BBCBASIC v5.00. The
|
||||
cursor and screen management assumes the use of an ANSI/VT-100 terminal
|
||||
which is generally correct for RomWBW. Support for a hardware system
|
||||
timer is also implemented. If your system does not have a hardware
|
||||
timer, the TIME function will always return 0 and the timeout
|
||||
parameter of the INKEY(n) function will not be observed (will never
|
||||
timeout).
|
||||
|
||||
What follows is some basic information on BBCBASIC from the
|
||||
distribution. Note that it starts with the v3.00 information and
|
||||
later on provides information on the changes in v5.00. Complete
|
||||
documentation for the BBC BASIC (Z80) is found online at
|
||||
https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
later on provides information on the changes in v5.00.
|
||||
|
||||
-- WBW 4:21 PM 2/17/2025
|
||||
-- WBW 1:15 PM 5/30/2024
|
||||
|
||||
|
||||
|
||||
@@ -28,55 +23,55 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
|
||||
1. INTRODUCTION
|
||||
|
||||
BBC BASIC (Z80) has been designed to be as compatible as possible with
|
||||
Version 4 of the 6502 BBC BASIC resident in the BBC Micro Master series.
|
||||
The language syntax is not always identical to that of the 6502 version,
|
||||
BBC BASIC (Z80) has been designed to be as compatible as possible with
|
||||
Version 4 of the 6502 BBC BASIC resident in the BBC Micro Master series.
|
||||
The language syntax is not always identical to that of the 6502 version,
|
||||
but in most cases the Z80 version is more tolerant.
|
||||
|
||||
BBC BASIC (Z80) is as machine independent as possible and, as supplied,
|
||||
it will run on any CP/M 2.2 (or later) system using a Z80 processor
|
||||
(checks are carried out to ensure that the processor is a Z80 and that
|
||||
the version of CP/M is at least 2.2). It is minimally configured for an
|
||||
BBC BASIC (Z80) is as machine independent as possible and, as supplied,
|
||||
it will run on any CP/M 2.2 (or later) system using a Z80 processor
|
||||
(checks are carried out to ensure that the processor is a Z80 and that
|
||||
the version of CP/M is at least 2.2). It is minimally configured for an
|
||||
ADM3a-compatible VDU.
|
||||
|
||||
Few CP/M systems offer colour graphics of the quality provided as
|
||||
standard on the BBC Microcomputer, and no software can provide colour
|
||||
high-resolution graphics from a monochrome character-orientated computer.
|
||||
However, many CP/M system users are interested in the advanced program
|
||||
structures available from BBC BASIC and, within the limitations of the
|
||||
host computer, BBC BASIC (Z80) provides the programming structures and
|
||||
Few CP/M systems offer colour graphics of the quality provided as
|
||||
standard on the BBC Microcomputer, and no software can provide colour
|
||||
high-resolution graphics from a monochrome character-orientated computer.
|
||||
However, many CP/M system users are interested in the advanced program
|
||||
structures available from BBC BASIC and, within the limitations of the
|
||||
host computer, BBC BASIC (Z80) provides the programming structures and
|
||||
the non-graphic commands and functions specified for BBC BASIC.
|
||||
|
||||
In order to make full use of the facilities available in BBC BASIC (Z80)
|
||||
it is necessary to install a small patch to adapt it to the capabilities
|
||||
of the host computer. The source code of the patch present in the
|
||||
In order to make full use of the facilities available in BBC BASIC (Z80)
|
||||
it is necessary to install a small patch to adapt it to the capabilities
|
||||
of the host computer. The source code of the patch present in the
|
||||
distribution version is supplied as BBCDIST.MAC.
|
||||
|
||||
This documentation should be read in conjunction with a standard BBC
|
||||
BASIC manual. Only those features which differ from the standard Acorn
|
||||
This documentation should be read in conjunction with a standard BBC
|
||||
BASIC manual. Only those features which differ from the standard Acorn
|
||||
versions are documented here.
|
||||
|
||||
|
||||
2. MEMORY UTILISATION
|
||||
|
||||
BBC BASIC (Z80) requires about 16 Kbytes of code space, resulting in a
|
||||
value of PAGE of about &3E00. The remainder of the user memory is
|
||||
available for BASIC programs, variables (heap) and stack. Depending on
|
||||
BBC BASIC (Z80) requires about 16 Kbytes of code space, resulting in a
|
||||
value of PAGE of about &3E00. The remainder of the user memory is
|
||||
available for BASIC programs, variables (heap) and stack. Depending on
|
||||
the system configuration, HIMEM can have a value up to &FE00.
|
||||
|
||||
|
||||
3. COMMANDS, STATEMENTS AND FUNCTIONS
|
||||
|
||||
The syntax of BASIC commands, statements and functions is in most cases
|
||||
identical to that of the BBC Micro version (BASIC 4). The few
|
||||
The syntax of BASIC commands, statements and functions is in most cases
|
||||
identical to that of the BBC Micro version (BASIC 4). The few
|
||||
differences are documented here:
|
||||
|
||||
ADVAL
|
||||
This function is not implemented.
|
||||
|
||||
CALL
|
||||
CALL sets up a table in RAM containing details of the parameters; the
|
||||
processor's IX register is set to the address of this parameter table.
|
||||
CALL sets up a table in RAM containing details of the parameters; the
|
||||
processor's IX register is set to the address of this parameter table.
|
||||
The other processor registers are initialised as follows:
|
||||
|
||||
A is initialised to the least significant byte of A%
|
||||
@@ -97,7 +92,7 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
128 Fixed string $A%
|
||||
129 Movable string A$
|
||||
|
||||
On entry to the subroutine the parameter table contains the following
|
||||
On entry to the subroutine the parameter table contains the following
|
||||
values:
|
||||
|
||||
Number of parameters 1 byte (at IX)
|
||||
@@ -108,29 +103,29 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
Parameter type ) repeated as often as necessary
|
||||
Parameter address )
|
||||
|
||||
Except in the case of a movable string (normal string variable), the
|
||||
parameter address given is the absolute address at which the item is
|
||||
stored. In the case of movable strings (type 129) it is the address of a
|
||||
4-byte parameter block containing the current length, the maximum length
|
||||
Except in the case of a movable string (normal string variable), the
|
||||
parameter address given is the absolute address at which the item is
|
||||
stored. In the case of movable strings (type 129) it is the address of a
|
||||
4-byte parameter block containing the current length, the maximum length
|
||||
and the start address of the string (LSB first) in that order.
|
||||
|
||||
Integer variables are stored in twos complement form with their least
|
||||
Integer variables are stored in twos complement form with their least
|
||||
significant byte first.
|
||||
|
||||
Fixed strings are stored as the characters of the string followed by a
|
||||
Fixed strings are stored as the characters of the string followed by a
|
||||
carriage return (&0D).
|
||||
|
||||
Floating point variables are stored in binary floating point format with
|
||||
their least significant byte first; the fifth byte is the exponent. The
|
||||
mantissa is stored as a binary fraction in sign and magnitude format.
|
||||
Bit 7 of the most significant byte is the sign bit and, for the purposes
|
||||
of calculating the magnitude of the number, this bit is assumed to be set
|
||||
to one. The exponent is stored as an integer in excess 127 format (to
|
||||
Floating point variables are stored in binary floating point format with
|
||||
their least significant byte first; the fifth byte is the exponent. The
|
||||
mantissa is stored as a binary fraction in sign and magnitude format.
|
||||
Bit 7 of the most significant byte is the sign bit and, for the purposes
|
||||
of calculating the magnitude of the number, this bit is assumed to be set
|
||||
to one. The exponent is stored as an integer in excess 127 format (to
|
||||
find the exponent subtract 127 from the value in the fifth byte).
|
||||
|
||||
If the exponent byte of a floating point number is zero, the number is an
|
||||
integer stored in integer format in the mantissa bytes. Thus an integer
|
||||
can be represented in two different ways in a real variable. For example
|
||||
If the exponent byte of a floating point number is zero, the number is an
|
||||
integer stored in integer format in the mantissa bytes. Thus an integer
|
||||
can be represented in two different ways in a real variable. For example
|
||||
the value +5 can be stored as:
|
||||
|
||||
05 00 00 00 00 Integer 5
|
||||
@@ -143,15 +138,15 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
This statement is not implemented.
|
||||
|
||||
EDIT
|
||||
A command to edit or concatenate and edit the specified program line(s).
|
||||
The specified lines (including their line numbers) are listed as a single
|
||||
line. By changing only the line number you can use EDIT to duplicate a
|
||||
A command to edit or concatenate and edit the specified program line(s).
|
||||
The specified lines (including their line numbers) are listed as a single
|
||||
line. By changing only the line number you can use EDIT to duplicate a
|
||||
line.
|
||||
|
||||
EDIT 230
|
||||
EDIT 200,230
|
||||
|
||||
The following control functions are active both in the EDIT mode and in
|
||||
The following control functions are active both in the EDIT mode and in
|
||||
the immediate entry mode (i.e. at the BASIC prompt):
|
||||
|
||||
Move the cursor one character position to the left
|
||||
@@ -164,8 +159,8 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
Delete all characters to the left of the cursor
|
||||
Delete all characters from the cursor to the end of the line
|
||||
|
||||
The choice of which keys activate these functions is made when BBC BASIC
|
||||
is configured for a particular system. The distribution version uses ^H,
|
||||
The choice of which keys activate these functions is made when BBC BASIC
|
||||
is configured for a particular system. The distribution version uses ^H,
|
||||
^I, ^K, ^J, ^A, ^E, DEL (&7F), ^L and ^X.
|
||||
|
||||
To exit EDIT mode and replace the edited line, type RETURN (ENTER).
|
||||
@@ -176,28 +171,28 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
This statement is not implemented.
|
||||
|
||||
GET
|
||||
This function waits for a character to be typed at the keyboard, and
|
||||
This function waits for a character to be typed at the keyboard, and
|
||||
returns the ASCII code.
|
||||
|
||||
GET can also be used to read data from a processor I/O port; full 16-bit
|
||||
GET can also be used to read data from a processor I/O port; full 16-bit
|
||||
port addressing is available:
|
||||
|
||||
N% = GET(X%) : REM input from port X%
|
||||
|
||||
INKEY
|
||||
This function waits for a specified maximum number of centiseconds for a
|
||||
character to be typed at the keyboard. If no character is typed in that
|
||||
time, the value -1 is returned. In the distribution version the delay is
|
||||
determined by a simple software timing loop, and may be very inaccurate.
|
||||
The customisation patch allows this to be adjusted to suit the system in
|
||||
This function waits for a specified maximum number of centiseconds for a
|
||||
character to be typed at the keyboard. If no character is typed in that
|
||||
time, the value -1 is returned. In the distribution version the delay is
|
||||
determined by a simple software timing loop, and may be very inaccurate.
|
||||
The customisation patch allows this to be adjusted to suit the system in
|
||||
use.
|
||||
|
||||
INPUT#
|
||||
The format of data files is different from that used by the BBC Micro, in
|
||||
part to improve compatibility with standard CP/M files. Numeric values
|
||||
are stored as five bytes in the format documented under CALL; if the
|
||||
fifth byte is zero the value is an integer. Strings are stored as the
|
||||
characters of the string (in the correct order!) followed by a carriage
|
||||
The format of data files is different from that used by the BBC Micro, in
|
||||
part to improve compatibility with standard CP/M files. Numeric values
|
||||
are stored as five bytes in the format documented under CALL; if the
|
||||
fifth byte is zero the value is an integer. Strings are stored as the
|
||||
characters of the string (in the correct order!) followed by a carriage
|
||||
return (&0D).
|
||||
|
||||
MODE
|
||||
@@ -213,15 +208,15 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
This function is not implemented.
|
||||
|
||||
PRINT#
|
||||
The format of data files is different from that used by the BBC Micro, in
|
||||
part to improve compatibility with standard CP/M files. Numeric values
|
||||
are stored as five bytes in the format documented under CALL; if the
|
||||
fifth byte is zero the value is an integer. Strings are stored as the
|
||||
characters of the string (in the correct order!) followed by a carriage
|
||||
The format of data files is different from that used by the BBC Micro, in
|
||||
part to improve compatibility with standard CP/M files. Numeric values
|
||||
are stored as five bytes in the format documented under CALL; if the
|
||||
fifth byte is zero the value is an integer. Strings are stored as the
|
||||
characters of the string (in the correct order!) followed by a carriage
|
||||
return (&0D).
|
||||
|
||||
PUT
|
||||
A statement to output data to a processor port. Full 16-bit addressing
|
||||
A statement to output data to a processor port. Full 16-bit addressing
|
||||
is available.
|
||||
|
||||
PUT A%,N% : REM Output N% to port A%
|
||||
@@ -230,7 +225,7 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
This statement is not implemented.
|
||||
|
||||
TIME
|
||||
This pseudo-variable is not implemented in the distribution version, but
|
||||
This pseudo-variable is not implemented in the distribution version, but
|
||||
can be supported by means of the customisation patch. See BBCDIST.MAC.
|
||||
|
||||
USR
|
||||
@@ -245,34 +240,34 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
H is initialised to the least significant byte of H%
|
||||
L is initialised to the least significant byte of L%
|
||||
|
||||
USR returns a 32-bit integer result composed of the processor's H, L, H'
|
||||
USR returns a 32-bit integer result composed of the processor's H, L, H'
|
||||
and L' registers, with H being the most significant.
|
||||
|
||||
|
||||
4. RESIDENT Z80 ASSEMBLER
|
||||
|
||||
The in-line assembler is accessed in exactly the same way as the 6502
|
||||
assembler in the BBC Micro version of BBC BASIC. That is, '[' enters
|
||||
The in-line assembler is accessed in exactly the same way as the 6502
|
||||
assembler in the BBC Micro version of BBC BASIC. That is, '[' enters
|
||||
assembler mode and ']' exits assembler mode.
|
||||
|
||||
All standard Zilog mnemonics are accepted: ADD, ADC and SBC must be
|
||||
followed by A or HL. For example, ADD A,C is accepted but ADD C is not.
|
||||
However, the brackets around the port number in IN and OUT are optional.
|
||||
Thus both OUT (5),A and OUT 5,A are accepted. The instruction IN F,(C)
|
||||
All standard Zilog mnemonics are accepted: ADD, ADC and SBC must be
|
||||
followed by A or HL. For example, ADD A,C is accepted but ADD C is not.
|
||||
However, the brackets around the port number in IN and OUT are optional.
|
||||
Thus both OUT (5),A and OUT 5,A are accepted. The instruction IN F,(C)
|
||||
is not accepted, but the equivalent code is produced from IN (HL),C
|
||||
|
||||
The pseudo-ops DEFB, DEFW and DEFM are included. DEFM works like EQUS in
|
||||
The pseudo-ops DEFB, DEFW and DEFM are included. DEFM works like EQUS in
|
||||
the 6502 version.
|
||||
|
||||
|
||||
5. OPERATING SYSTEM INTERFACE
|
||||
|
||||
The following resident Operating System ("star") commands are
|
||||
implemented. They may be accessed directly (e.g. *BYE) or via the OSCLI
|
||||
The following resident Operating System ("star") commands are
|
||||
implemented. They may be accessed directly (e.g. *BYE) or via the OSCLI
|
||||
statement (OSCLI "BYE").
|
||||
|
||||
Control characters, lower-case characters, DEL and quotation marks may be
|
||||
incorporated in filenames by using the 'escape' character '|'. However,
|
||||
Control characters, lower-case characters, DEL and quotation marks may be
|
||||
incorporated in filenames by using the 'escape' character '|'. However,
|
||||
there is no equivalent to the BBC Microcomputer's '|!' to set bit 7.
|
||||
|
||||
*BYE
|
||||
@@ -283,7 +278,7 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
|
||||
*. [filespec]
|
||||
*DIR [filespec]
|
||||
List the files which match the (optional) ambiguous filespec. If the
|
||||
List the files which match the (optional) ambiguous filespec. If the
|
||||
filespec is omitted, all .BBC files are listed:
|
||||
*DIR List all .BBC files on the disk
|
||||
*DIR B:*.* List all files on disk B:
|
||||
@@ -293,53 +288,53 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
Select drive d as the default drive for subsequent disk operations.
|
||||
|
||||
*ERA filespec
|
||||
Erase (delete) the specified disk file or files. The extension defaults
|
||||
Erase (delete) the specified disk file or files. The extension defaults
|
||||
to .BBC if omitted.
|
||||
|
||||
*ESC [ON|OFF]
|
||||
*ESC OFF disables the abort action of the ESCape key; after *ESC OFF the
|
||||
ESCape key simply returns the ASCII code ESC (27). *ESC ON, or *ESC,
|
||||
*ESC OFF disables the abort action of the ESCape key; after *ESC OFF the
|
||||
ESCape key simply returns the ASCII code ESC (27). *ESC ON, or *ESC,
|
||||
restores the normal action of the ESCape key.
|
||||
|
||||
*EXEC filespec
|
||||
Accept console input from the specified file instead of from the
|
||||
Accept console input from the specified file instead of from the
|
||||
keyboard. If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*LOAD filespec aaaa
|
||||
Loads the specified file into memory at address aaaa. The load address
|
||||
Loads the specified file into memory at address aaaa. The load address
|
||||
must be specified. If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*OPT [n]
|
||||
Select the destination for console output characters. The value n is in
|
||||
Select the destination for console output characters. The value n is in
|
||||
the range 0 to 2, as follows:
|
||||
|
||||
|
||||
0 Send characters to the console output
|
||||
1 Send characters to the auxiliary output
|
||||
2 Send characters to the printer (list) output
|
||||
|
||||
*REN newfile=oldfile
|
||||
*RENAME newfile=oldfile
|
||||
Renames 'oldfile' as 'newfile'. If the extension is omitted, .BBC is
|
||||
Renames 'oldfile' as 'newfile'. If the extension is omitted, .BBC is
|
||||
assumed.
|
||||
|
||||
*RESET
|
||||
Rest the disk system (CP/M function 13). This command does not close any
|
||||
files nor does it perform any other housekeeping function. You should
|
||||
Rest the disk system (CP/M function 13). This command does not close any
|
||||
files nor does it perform any other housekeeping function. You should
|
||||
use *RESET after you have changed a disk.
|
||||
|
||||
*SAVE filespec aaaa bbbb
|
||||
*SAVE filespec aaaa +llll
|
||||
This command saves a specified range of memory to disk. The address range
|
||||
is specified either as start (aaaa) and end+1 (bbbb) or as start (aaaa)
|
||||
This command saves a specified range of memory to disk. The address range
|
||||
is specified either as start (aaaa) and end+1 (bbbb) or as start (aaaa)
|
||||
and length (llll). If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*SPOOL [filespec]
|
||||
Copy all subsequent console output to the specified file. If the filename
|
||||
is omitted, any current spool file is closed and spooling is terminated.
|
||||
Copy all subsequent console output to the specified file. If the filename
|
||||
is omitted, any current spool file is closed and spooling is terminated.
|
||||
If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*TYPE filespec
|
||||
Type the specified file to the screen. If the extension is omitted, .BBC
|
||||
Type the specified file to the screen. If the extension is omitted, .BBC
|
||||
is assumed.
|
||||
|
||||
*| comment
|
||||
@@ -357,7 +352,7 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
Trappable - BASIC:
|
||||
|
||||
1 Out of range 24 Exp range
|
||||
2 25
|
||||
2 25
|
||||
3 26 No such variable
|
||||
4 Mistake 27 Missing )
|
||||
5 Missing , 28 Bad HEX
|
||||
@@ -388,9 +383,9 @@ https://www.bbcbasic.co.uk/bbcbasic/mancpm/index.html.
|
||||
198 Disk full 254 Bad command
|
||||
200 Close error 255 CP/M error
|
||||
204 Bad name
|
||||
|
||||
|
||||
|
||||
New features in BBC BASIC (Z80) version 5.00, January 2025:
|
||||
New features in BBC BASIC (Z80) version 5.00, May 2024:
|
||||
|
||||
1. BASIC V statements
|
||||
|
||||
@@ -399,7 +394,7 @@ New features in BBC BASIC (Z80) version 5.00, January 2025:
|
||||
1.3 CASE...WHEN...OTHERWISE...ENDCASE
|
||||
1.4 LOCAL DATA / RESTORE DATA
|
||||
1.5 ON ERROR LOCAL / RESTORE ERROR
|
||||
1.6 DIM var LOCAL size
|
||||
1.6 DIM var LOCAL size
|
||||
1.7 ERROR err, message$
|
||||
1.8 RESTORE +n
|
||||
1.9 SWAP var1,var2
|
||||
@@ -413,10 +408,10 @@ New features in BBC BASIC (Z80) version 5.00, January 2025:
|
||||
2.3 REPORT$
|
||||
2.4 Binary constants
|
||||
2.5 LEFT$ & RIGHT$ with last parameter omitted
|
||||
2.6 MOD(array())
|
||||
2.7 SUM(array())
|
||||
2.8 SUMLEN(array())
|
||||
2.9 GET$#file
|
||||
2.6 MOD(array)
|
||||
2.7 SUM(array)
|
||||
2.8 SUMLEN(array)
|
||||
2.9 GET$#file
|
||||
|
||||
3. BASIC V whole array operations
|
||||
|
||||
@@ -428,12 +423,9 @@ New features in BBC BASIC (Z80) version 5.00, January 2025:
|
||||
3.6 Array initialisation lists
|
||||
3.7 Array compound assignment (+= etc.)
|
||||
3.8 Make a whole array LOCAL
|
||||
3.9 DIM a LOCAL array (on the stack) +
|
||||
|
||||
* String array expressions are not currently supported, instead of using
|
||||
a$() = b$() + c$() use a$() = b$() : a$() += c$()
|
||||
The use of EVAL with whole-array expressions is not currently supported.
|
||||
3.9 DIM a LOCAL array (on the stack) +
|
||||
|
||||
* String array expressions A$() = B$() + C$() are not currently supported.
|
||||
+ LOCAL string arrays should be initialised to their maximum needed length
|
||||
to eliminate the risk of a memory leak each time the PROC/FN is called:
|
||||
LOCAL a$() : DIM a$(size%) : a$() = STRING$(max%, "a") : a$() = ""
|
||||
@@ -442,27 +434,22 @@ New features in BBC BASIC (Z80) version 5.00, January 2025:
|
||||
|
||||
4.1 Bit-shifts <<, >>, >>>
|
||||
4.2 Floating-point indirection (|)
|
||||
4.3 Additional VDU delimiter '|'
|
||||
4.4 RETURNed parameters from FN/PROC
|
||||
4.5 Compound assignment (+=, -=, *=, /= etc.)
|
||||
4.6 Assigning to a sub-string: LEFT$()=, MID$()= , RIGHT$()=
|
||||
4.7 Hooks for CIRCLE, ELLIPSE, FILL, LINE, ORIGIN, RECTANGLE (graphics)
|
||||
4.8 Hooks for MOUSE, OFF, ON, SYS, TINT, WAIT (statements)
|
||||
4.9 Hooks for MODE function, TINT function, WIDTH function
|
||||
4.3 RETURNed parameters from FN/PROC
|
||||
4.4 Compound assignment (+=, -=, *=, /= etc.)
|
||||
4.5 Assigning to a sub-string: LEFT$()=, MID$()= , RIGHT$()=
|
||||
4.6 Hooks for CIRCLE,ELLIPSE,FILL,LINE,MOUSE,ORIGIN,RECTANGLE,TINT,SYS,WAIT
|
||||
4.7 Hooks for WIDTH function, TINT function, MODE function
|
||||
|
||||
5. Extensions to Acorn's BASIC V, compatible with BB4W, BBCSDL and BBCTTY
|
||||
|
||||
5.1 EXIT REPEAT / WHILE / FOR [var]
|
||||
5.2 Address-of operator (^)
|
||||
5.3 Byte (unsigned 8-bit) variables and arrays (& suffix)
|
||||
5.2 Address-of operator ^
|
||||
5.3 Byte variables and arrays (& suffix)
|
||||
5.4 'BY len' and 'TO term' qualifiers to GET$#file
|
||||
5.5 ELSE IF <condition> THEN; (trailing semicolon)
|
||||
5.6 == synonymous with = in comparisons
|
||||
5.7 DIM a global array inside a FN/PROC (use RETURN)
|
||||
5.8 DIM var LOCAL -1 returns the stack pointer, even outside a FN/PROC
|
||||
5.9 RESTORE LOCAL restores local variables without exiting the FN/PROC
|
||||
|
||||
Note: The token for PUT has changed from &CE in version 3 to &0E in version 5.
|
||||
If this token is present in existing programs it will list as ENDWHILE rather
|
||||
than PUT, and the programs will need to be modified to restore functionality.
|
||||
|
||||
than PUT, and the programs will need to be modified to restore functionality.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,68 +1,64 @@
|
||||
NAME ('HOOK')
|
||||
;
|
||||
GLOBAL CLG
|
||||
GLOBAL COLOUR
|
||||
GLOBAL DRAW
|
||||
GLOBAL ENVEL
|
||||
GLOBAL GCOL
|
||||
GLOBAL MODE
|
||||
GLOBAL MOVE
|
||||
GLOBAL PLOT
|
||||
GLOBAL SOUND
|
||||
GLOBAL PUTIMS
|
||||
GLOBAL CIRCLE
|
||||
GLOBAL ELLIPS
|
||||
GLOBAL FILL
|
||||
GLOBAL MOUSE
|
||||
GLOBAL ORIGIN
|
||||
GLOBAL RECTAN
|
||||
GLOBAL LINE
|
||||
GLOBAL TINT
|
||||
GLOBAL WAIT
|
||||
GLOBAL SYS
|
||||
GLOBAL CSRON
|
||||
GLOBAL CSROFF
|
||||
;
|
||||
GLOBAL ADVAL
|
||||
GLOBAL POINT
|
||||
GLOBAL GETIMS
|
||||
GLOBAL TINTFN
|
||||
GLOBAL MODEFN
|
||||
GLOBAL WIDFN
|
||||
;
|
||||
EXTRN EXTERR
|
||||
;
|
||||
CLG:
|
||||
COLOUR:
|
||||
DRAW:
|
||||
ENVEL:
|
||||
GCOL:
|
||||
MODE:
|
||||
MOVE:
|
||||
PLOT:
|
||||
SOUND:
|
||||
ADVAL:
|
||||
POINT:
|
||||
GETIMS:
|
||||
PUTIMS:
|
||||
CIRCLE:
|
||||
ELLIPS:
|
||||
FILL:
|
||||
MOUSE:
|
||||
ORIGIN:
|
||||
RECTAN:
|
||||
LINE:
|
||||
TINT:
|
||||
TINTFN:
|
||||
MODEFN:
|
||||
WIDFN:
|
||||
WAIT:
|
||||
SYS:
|
||||
CSRON:
|
||||
CSROFF:
|
||||
XOR A
|
||||
CALL EXTERR
|
||||
DEFM 'Sorry'
|
||||
DEFB 0
|
||||
;
|
||||
END
|
||||
NAME ('HOOK')
|
||||
;
|
||||
GLOBAL CLG
|
||||
GLOBAL COLOUR
|
||||
GLOBAL DRAW
|
||||
GLOBAL ENVEL
|
||||
GLOBAL GCOL
|
||||
GLOBAL MODE
|
||||
GLOBAL MOVE
|
||||
GLOBAL PLOT
|
||||
GLOBAL SOUND
|
||||
GLOBAL PUTIMS
|
||||
GLOBAL CIRCLE
|
||||
GLOBAL ELLIPSE
|
||||
GLOBAL FILL
|
||||
GLOBAL MOUSE
|
||||
GLOBAL ORIGIN
|
||||
GLOBAL RECTAN
|
||||
GLOBAL LINE
|
||||
GLOBAL TINT
|
||||
GLOBAL WAIT
|
||||
GLOBAL SYS
|
||||
;
|
||||
GLOBAL ADVAL
|
||||
GLOBAL POINT
|
||||
GLOBAL GETIMS
|
||||
GLOBAL TINTFN
|
||||
GLOBAL MODEFN
|
||||
GLOBAL WIDFN
|
||||
;
|
||||
EXTRN EXTERR
|
||||
;
|
||||
CLG:
|
||||
COLOUR:
|
||||
DRAW:
|
||||
ENVEL:
|
||||
GCOL:
|
||||
MODE:
|
||||
MOVE:
|
||||
PLOT:
|
||||
SOUND:
|
||||
ADVAL:
|
||||
POINT:
|
||||
GETIMS:
|
||||
PUTIMS:
|
||||
CIRCLE:
|
||||
ELLIPSE:
|
||||
FILL:
|
||||
MOUSE:
|
||||
ORIGIN:
|
||||
RECTAN:
|
||||
LINE:
|
||||
TINT:
|
||||
TINTFN:
|
||||
MODEFN:
|
||||
WIDFN:
|
||||
WAIT:
|
||||
SYS:
|
||||
XOR A
|
||||
CALL EXTERR
|
||||
DEFM 'Sorry'
|
||||
DEFB 0
|
||||
;
|
||||
END
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
Copyright (c) 2024, Richard T. Russell, http://www.rtrussell.co.uk/
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -29,8 +29,6 @@ call :build Survey || exit /b
|
||||
call :build HTalk || exit /b
|
||||
call :build BBCBASIC || exit /b
|
||||
call :build copysl || exit /b
|
||||
call :build slabel || exit /b
|
||||
call :build ZDE || exit /b
|
||||
|
||||
goto :eof
|
||||
|
||||
|
||||
@@ -24,8 +24,6 @@ call :clean Survey || exit /b
|
||||
call :clean HTalk || exit /b
|
||||
call :clean BBCBASIC || exit /b
|
||||
call :clean copysl || exit /b
|
||||
call :clean slabel || exit /b
|
||||
call :clean ZDE || exit /b
|
||||
|
||||
goto :eof
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
SUBDIRS = HTalk XM FDU FAT Tune Test ZMP ZMD Dev VGM cpuspd reboot Survey BBCBASIC copysl \
|
||||
slabel sysgen syscopy assign format talk mode rtc timer ZDE
|
||||
sysgen syscopy assign format talk mode rtc timer
|
||||
TOOLS =../../Tools
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
@@ -362,7 +362,7 @@ SPDDISP:LD DE,DMA_SPD_STR
|
||||
CALL PRTIDXDEA
|
||||
;
|
||||
call PRTSTRD
|
||||
.db "\n\rTransfer Mode: $" ; DISPLAY TRANSFER
|
||||
.db "\n\rTransfer Mode: $" ; DIPLAY TRANSFER
|
||||
LD a,(dmaxfer) ; MODE
|
||||
LD DE,DMA_XFRMODE
|
||||
CALL PRTIDXDEA
|
||||
|
||||
@@ -23,26 +23,6 @@ CLI_HAVE_HBIOS_SWITCH1 ; NOT MATCHED --HBIOS
|
||||
LD (HBIOSMD), A
|
||||
RET
|
||||
|
||||
CLI_PORTS:
|
||||
LD HL, CLIARGS ; TEST FOR -MSX ON COMMAND LINE
|
||||
LD DE, OPT_MSX
|
||||
CALL STRINDEX
|
||||
JR NZ, CLI_PORTS1
|
||||
LD A,PORTS_MSX
|
||||
JR CLI_PORTS_Z
|
||||
CLI_PORTS1:
|
||||
LD HL, CLIARGS ; TEST FOR -RC ON COMMAND LINE
|
||||
LD DE, OPT_RC
|
||||
CALL STRINDEX
|
||||
JR NZ, CLI_PORTS2
|
||||
LD A,PORTS_RC
|
||||
JR CLI_PORTS_Z
|
||||
CLI_PORTS2:
|
||||
LD A,PORTS_AUTO ; USE AUTO PORT SELECTION
|
||||
CLI_PORTS_Z:
|
||||
LD (USEPORTS),A ; SAVE PORTS SELECTION
|
||||
RET
|
||||
|
||||
CLI_ABRT_UNSUPPFILTYP:
|
||||
PUSH AF
|
||||
ISHBIOS
|
||||
@@ -99,8 +79,6 @@ CLI_OCTAVE_ADJST5:
|
||||
LD (OCTAVEADJ), A
|
||||
RET
|
||||
|
||||
OPT_MSX .DB "-MSX", 0 ; USE MSX PORTS
|
||||
OPT_RC .DB "-RC", 0 ; USE RC PORTS
|
||||
HBIOSOPT: .DB "--HBIOS", 0
|
||||
DOWN1 .DB "-t1", 0 ; DOWN AN OCTAVE
|
||||
DOWN2 .DB "-t2", 0 ; DOWN TWO OCTAVE
|
||||
|
||||
@@ -52,7 +52,6 @@
|
||||
; 2024-07-08 [WBW] Add support for Les Bird's Graphics, Sound, Joystick
|
||||
; 2024-07-11 [WBW] Updated, Les Bird's module now uses same settings as EB6
|
||||
; 2024-09-17 [WBW] Add support for HEATH H8 with Les Bird's MSX Card
|
||||
; 2024-12-12 [WBW] Add options to force standard MSX or RC ports
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
@@ -74,10 +73,6 @@ TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file
|
||||
TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file
|
||||
TYPMYM .EQU 3 ; FILTYP value for MYM sound file
|
||||
;
|
||||
PORTS_AUTO .EQU 0 ; AUTO select audio chip ports
|
||||
PORTS_MSX .EQU 1 ; force MSX audio chip ports
|
||||
PORTS_RC .EQU 2 ; force RCBUS audio chip ports
|
||||
;
|
||||
; HIGH SPEED CPU CONTROL
|
||||
;
|
||||
SBCV2004 .EQU 0 ; ENABLE SBC-V2-004 HALF CLOCK DIVIDER
|
||||
@@ -111,7 +106,6 @@ Id .EQU 1 ; 5) Insert official identificator
|
||||
PRTSTRDE(MSGBAN) ; Print to banner message
|
||||
|
||||
CALL CLI_ABRT_IF_OPT_FIRST
|
||||
CALL CLI_PORTS
|
||||
CALL CLI_HAVE_HBIOS_SWITCH
|
||||
CALL CLI_OCTAVE_ADJST
|
||||
JP CONTINUE
|
||||
@@ -131,22 +125,6 @@ CONTINUE:
|
||||
OR A
|
||||
JR NZ, TSTTIMER ; skip hardware check if using hbios
|
||||
|
||||
LD A, (USEPORTS) ; get ports option
|
||||
LD HL,MSXPORTS ; assume MSX
|
||||
CP PORTS_MSX ; use MSX?
|
||||
JR Z,FORCE
|
||||
LD HL,RCPORTS ; asssume RC
|
||||
CP PORTS_RC ; use RC?
|
||||
JR Z,FORCE
|
||||
JR AUTOSEL ; otherwise do auto select
|
||||
|
||||
FORCE:
|
||||
LD BC,CFGSIZ ; Size of one entry
|
||||
LD DE,CFG ; Active config structure
|
||||
LDIR ; Update active config structure
|
||||
JR MAT ; Continue
|
||||
|
||||
AUTOSEL:
|
||||
LD HL,CFGTBL ; Point to start of config table
|
||||
CFGSEL:
|
||||
LD A,$FF ; End of table marker
|
||||
@@ -668,17 +646,6 @@ CFGSIZ .EQU $ - CFGTBL
|
||||
;
|
||||
.DB $FF ; END OF TABLE MARKER
|
||||
;
|
||||
; The following are table entries (like above), but not part of auto
|
||||
; detection searching. They are selected byh command line options.
|
||||
;
|
||||
MSXPORTS:
|
||||
.DB $FF, $A0, $A1, $FF, $FF, $FF, $FF ; GENERIC MSX
|
||||
.DW HWSTR_MSX
|
||||
;
|
||||
RCPORTS:
|
||||
.DB $FF, $D8, $D0, $FF, $FF, $FF, $FF ; GENERIC RC
|
||||
.DW HWSTR_RC
|
||||
;
|
||||
CFG: ; ACTIVE CONFIG VALUES (FROM SELECTED CFGTBL ENTRY)
|
||||
PLT .DB 0 ; RomWBW HBIOS platform id
|
||||
PORTS:
|
||||
@@ -705,13 +672,11 @@ TMP .DB 0 ; work around use of undocumented Z80
|
||||
HBIOSMD .DB 0 ; NON-ZERO IF USING HBIOS SOUND DRIVER, ZERO OTHERWISE
|
||||
OCTAVEADJ .DB 0 ; AMOUNT TO ADJUST OCTAVE UP OR DOWN
|
||||
|
||||
USEPORTS .DB 0 ; AUDIO CHIP PORT SELECTION MODE
|
||||
|
||||
MSGBAN .DB "Tune Player for RomWBW v3.12, 12-Dec-2024",0
|
||||
MSGBAN .DB "Tune Player for RomWBW v3.11, 17-Sep-2024",0
|
||||
MSGUSE .DB "Copyright (C) 2024, Wayne Warthen, GNU GPL v3",13,10
|
||||
.DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10
|
||||
.DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10
|
||||
.DB "Usage: TUNE <filename>.[PT2|PT3|MYM] [-msx|-rc] [--hbios] [+tn|-tn]",0
|
||||
.DB "Usage: TUNE <filename>.[PT2|PT3|MYM] [--hbios] [+tn|-tn]",0
|
||||
MSGBIO .DB "Incompatible BIOS or version, "
|
||||
.DB "HBIOS v", '0' + RMJ, ".", '0' + RMN, " required",0
|
||||
MSGPLT .DB "Hardware error, system not supported!",0
|
||||
@@ -735,8 +700,6 @@ HWSTR_MBC .DB "NHYODYNE Sound Module",0
|
||||
HWSTR_DUO .DB "DUODYNE Sound Module",0
|
||||
HWSTR_NABU .DB "NABU Onboard Sound",0
|
||||
HWSTR_HEATH .DB "HEATH H8 MSX Module",0
|
||||
HWSTR_MSX .DB "MSX Standard Ports (A0H/A1H)",0
|
||||
HWSTR_RC .DB "RCBus Standard Ports (D8H/D0H)",0
|
||||
|
||||
MSGUNSUP .db "MYM files not supported with HBIOS yet!\r\n", 0
|
||||
|
||||
|
||||
@@ -146,13 +146,6 @@ MINIT_UB1:
|
||||
LD A,E ; Put in A
|
||||
LD (CPUSPD),A ; Save it
|
||||
;
|
||||
LD A,(UNIT) ; get current unit specified
|
||||
CP 0FFH ; check for undefined
|
||||
JR NZ,MINIT_UB2 ; if already specified, go ahead
|
||||
XOR A ; default is unit 0
|
||||
LD (UNIT),A ; and save it
|
||||
;
|
||||
MINIT_UB2:
|
||||
JP UB_INIT ; UNA BIOS init
|
||||
;
|
||||
MINIT_RET:
|
||||
@@ -291,7 +284,7 @@ EXTRA3:
|
||||
BIOID DB 0 ; BIOS ID, 1=HBIOS, 2=UBIOS
|
||||
CPUSPD DB 10 ; CPU speed in MHz
|
||||
RCVSCL DW 6600 ; RECV loop timeout scalar
|
||||
UNIT DB 0FFH ; BIOS serial device unit number
|
||||
UNIT DB 0 ; BIOS serial device unit number
|
||||
BIOSBID DB 00H ; BIOS bank id
|
||||
;
|
||||
TAG DB "RomWBW, 30-May-2020$"
|
||||
@@ -330,7 +323,7 @@ HB_JPTBL:
|
||||
JP HB_GETCHR ; get character from modem
|
||||
JP HB_RCVRDY ; check receive ready
|
||||
JP HB_SNDRDY ; check send ready
|
||||
JP HB_SPEED ; get speed value for file transfer time
|
||||
JP HB_SPEED ; get speed value for file transfer time
|
||||
;
|
||||
;-----------------------------------------------------------------------
|
||||
;
|
||||
@@ -542,10 +535,8 @@ UB_SENDR:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0012H ; unit 0, func 12h (write char)
|
||||
LD E,A ; character to E
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,12H ; func 12h (write char)
|
||||
RST 08
|
||||
POP HL
|
||||
POP DE
|
||||
@@ -577,9 +568,7 @@ UB_MDIN:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,11H ; func 11h (read char)
|
||||
LD BC,0011H ; unit 0, func 12h (write char)
|
||||
RST 08
|
||||
LD A,E ; byte received to A
|
||||
POP HL
|
||||
@@ -597,14 +586,12 @@ UB_RCVRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,13H ; func 13h (input stat)
|
||||
LD BC,0013H ; unit 0, func 13h (input stat)
|
||||
RST 08
|
||||
LD A,E ; move char count to accum
|
||||
SUB 1 ; CF set IFF zero
|
||||
RL A ; CF to bit 0 of A
|
||||
AND 01H ; set Z flag as needed
|
||||
XOR A ; zero accum ; 4
|
||||
CP E ; CF means not zero ; 4
|
||||
CCF ; CF means zero ; 4
|
||||
RLA ; ZF means not zero ; 4
|
||||
LD A,0 ; report no line errors
|
||||
POP HL
|
||||
POP DE
|
||||
@@ -619,14 +606,12 @@ UB_SNDRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,14H ; func 14h (output stat)
|
||||
LD BC,0014H ; unit 0, func 14h (output stat)
|
||||
RST 08
|
||||
LD A,E ; char avail to send to accum
|
||||
SUB 1 ; CF set IFF zero
|
||||
RL A ; CF to bit 0 of A
|
||||
AND 01H ; set Z flag as needed
|
||||
XOR A ; zero accum ; 4
|
||||
CP E ; CF means not zero ; 4
|
||||
CCF ; CF means zero ; 4
|
||||
RLA ; ZF means not zero ; 4
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
@@ -819,6 +804,7 @@ UF_INIT:
|
||||
; Send character on top of stack
|
||||
;
|
||||
UF_SENDR:
|
||||
|
||||
POP AF ; get character to send from stack
|
||||
OUT (0FFH),A ; write to fifo
|
||||
UF_SCDP EQU $-1 ; data port
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
set TOOLS=../../../Tools
|
||||
|
||||
set PATH=%TOOLS%\tasm32;%TOOLS%\zxcc;%PATH%
|
||||
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
set CPMDIR80=%TOOLS%/cpm/
|
||||
|
||||
:: These variations of ZDE are built here as reference copies. They
|
||||
:: are not copied anywhere else during the build.
|
||||
:: The resulting .COM files are manually
|
||||
:: copied to /Source/Images/d_ws/u1 as needed.
|
||||
|
||||
zxcc ZMAC -ZDE16 -/P -/H || exit /b
|
||||
zxcc MLOAD25 ZDE16 || exit /b
|
||||
copy /Y zde16.com ..\..\..\Binary\Apps\ZDE\ || exit /b
|
||||
|
||||
zxcc ZMAC ZDE16A.PAT -/H || exit /b
|
||||
zxcc MLOAD25 ZDE16A=ZDE16.COM,ZDE16A.HEX || exit /b
|
||||
copy /Y zde16a.com ..\..\..\Binary\Apps\ZDE\ || exit /b
|
||||
|
||||
zxcc ZMAC -ZDE17 -/P -/H || exit /b
|
||||
zxcc MLOAD25 ZDE17 || exit /b
|
||||
copy /Y zde17.com ..\..\..\Binary\Apps\ZDE\ || exit /b
|
||||
|
||||
zxcc ZMAC -ZDE18 -/P -/H || exit /b
|
||||
zxcc MLOAD25 ZDE18 || exit /b
|
||||
copy /Y zde18.com ..\..\..\Binary\Apps\ZDE\ || exit /b
|
||||
|
||||
zxcc ZMAC -ZDE19 -/P -/H || exit /b
|
||||
zxcc MLOAD25 ZDE19 || exit /b
|
||||
copy /Y zde19.com ..\..\..\Binary\Apps\ZDE\ || exit /b
|
||||
@@ -1,9 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if exist *.prn del *.prn
|
||||
if exist *.err del *.err
|
||||
if exist *.rel del *.rel
|
||||
if exist *.com del *.com
|
||||
if exist *.hex del *.hex
|
||||
if exist *.sym del *.sym
|
||||
@@ -1,15 +0,0 @@
|
||||
# These variations of ZDE are built here as reference copies. They
|
||||
# are not copied anywhere else during the build.
|
||||
# The resulting .COM files are manually
|
||||
# copied to /Source/Images/d_ws/u1 as needed.
|
||||
|
||||
OBJECTS = zde16.com zde16a.com zde17.com zde18.com zde19.com
|
||||
DEST = ../../../Binary/Apps/ZDE
|
||||
TOOLS = ../../../Tools
|
||||
OTHERS = *.hex
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
zde16a.com: zde16.com zde16a.pat
|
||||
$(ZXCC) ZMAC zde16a.pat -/H
|
||||
$(ZXCC) MLOAD25 zde16a=zde16.com,zde16a.hex || exit /b
|
||||
@@ -1,38 +0,0 @@
|
||||
# ZDE 1.6 (Z-System Display Editor) reconstituted source - MECPARTS
|
||||
11/19/2020
|
||||
|
||||
Using the source code of [VDE 2.67]
|
||||
(http://www.classiccmp.org/cpmarchives/cpm/Software/WalnutCD/enterprs/cpm/utils/s/vde267sc.lbr)
|
||||
as a guide, I've reconstituted the source code for [ZDE 1.6](http://www.classiccmp.org/cpmarchives/cpm/Software/WalnutCD/cpm/editor/zde16.lbr).
|
||||
The resulting source code is available from the GitHub repository
|
||||
https://github.com/mecparts/zde.
|
||||
|
||||
The source has been assembled with:
|
||||
|
||||
* Al Hawley's ZMAC: assemble as is.
|
||||
* MicroSoft's M80: rename to ZDE16.MAC, un-comment the first two lines
|
||||
and assemble. Use RELHEX to create ZDE16.HEX.
|
||||
* ZASM (Cromemco's ASMB): Rename to ZDE16.Z80 and assemble. Use RELHEX
|
||||
to create ZDE16.HEX.
|
||||
|
||||
Use MLOAD to create ZDE16.COM.
|
||||
|
||||
There are still a couple of routines new to ZDE that I haven't figured
|
||||
out (yet). But most of them have been sussed out.
|
||||
|
||||
## ZDE 1.7 - MECPARTS 11/24/2020
|
||||
|
||||
I've fixed the "doesn't preserve timestamps for files larger than a
|
||||
single extent under ZSDOS" bug that was present in v1.6. The existing
|
||||
ZDENST16.COM program will work with the 1.7 to set the program up for
|
||||
your terminal and printer.
|
||||
|
||||
## ZDE 1.8 - Lars Nelson 12/3/2022
|
||||
|
||||
Added routine to save create time stamp under CP/M Plus since
|
||||
CP/M Plus, unlike ZSDOS, has no native ability to set time stamps.
|
||||
|
||||
## ZDE 1.9 - Peter Onion 03/27/2025
|
||||
|
||||
- Added support for ANSI PgUp, PgDn, Home, & End.
|
||||
- Support ANSI F1 key for menu/error escape.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,102 +0,0 @@
|
||||
; This patch file modifies the officially-distributed .COM file
|
||||
; for ZDE Ver 1.6 (copyright by Carson Wilson) to:
|
||||
; - Correct a bug which did not preserve create times when
|
||||
; editing files > 1 extent.
|
||||
; - Use an apparently 'dead' byte in the configuration area as
|
||||
; a configuration flag to allow disabling the 'Auto-Indent'
|
||||
; feature which was always 'on' in ZDE1.6.
|
||||
;
|
||||
; With the second change, you may configure the 'Auto-Indent'
|
||||
; feature to be active (as distributed) or disabled (as this patch
|
||||
; is configured) by altering the DB at label 'AIDflt' in the
|
||||
; second part of this patch file below.
|
||||
;
|
||||
; Assemble this file to a .HEX file (example uses ZMAC) as:
|
||||
;
|
||||
; ZMAC ZDE16A.PAT /H
|
||||
;
|
||||
; then overlay the resulting ZDE16.HEX onto ZDE16.COM with MYLOAD
|
||||
; (or equivalent) as:
|
||||
;
|
||||
; MYLOAD ZDE.COM=ZDE.COM,ZDE16.HEX
|
||||
;
|
||||
; The resulting ZDE.COM will be identified as 'ZDE 1.6a' in the
|
||||
; text identification string near the beginning of the .COM file.
|
||||
;
|
||||
; Harold F. Bower, 18 July 2001.
|
||||
;
|
||||
; CP/M Standard Equates
|
||||
;
|
||||
BDOS EQU 0005H
|
||||
FCB EQU 005CH
|
||||
DMA EQU 0080H
|
||||
TPA EQU 0100H
|
||||
;
|
||||
SDMA EQU 26 ; CP/M Function to set DMA Address
|
||||
;
|
||||
; Needed locations within ZDE 1.6
|
||||
;
|
||||
Fill EQU TPA+0F8BH ; For Date Patch
|
||||
TimBuf EQU TPA+3B3FH ; " " "
|
||||
;
|
||||
VTFlg EQU TPA+3ADAH ; For Auto-Ins Patch
|
||||
HCRFlg EQU TPA+3AE3H ; " " " "
|
||||
LfMarg EQU TPA+3AFDH ; " " " "
|
||||
;
|
||||
; ----------- Begin Patch File -----------
|
||||
;
|
||||
; --- Fix Create Time Stamp Preservation Error ---
|
||||
|
||||
ORG TPA+0029H
|
||||
; was:
|
||||
DB 'a, (C)' ; DB ', Copr.'
|
||||
ORG TPA+2461H
|
||||
; was:
|
||||
LD (FCB+13),A ; CALL ClUsrF
|
||||
;
|
||||
ORG TPA+2F10H
|
||||
; was:
|
||||
LD B,4 ; CALL ClUsrF
|
||||
CALL ClUsrF ; LD DE,TimBuf
|
||||
LD DE,TimBuf ; LD C,SDMA
|
||||
CALL SetDMA ; CALL BDOS
|
||||
;
|
||||
ORG TPA+30AAH
|
||||
; was:
|
||||
LD DE,DMA ; LD C,SDMA
|
||||
SetDMA: LD C,SDMA ; LD DE,DMA
|
||||
;
|
||||
ORG TPA+30B4H
|
||||
; was:
|
||||
ClUsrF: XOR A ; XOR A
|
||||
EX DE,HL ; LD (FCB+13),A
|
||||
JP Fill ; RET
|
||||
;
|
||||
; --- Usurp Config Flag for Auto-Insert use, sense on startup ---
|
||||
;
|
||||
ORG TPA+0057H
|
||||
; was: 0FFH
|
||||
AIDflt: DB 00H ; Set Desired default (0=Off, FF=On)
|
||||
;
|
||||
ORG TPA+262AH
|
||||
; was:
|
||||
LD (LfMarg),HL ; LD HL,0101H
|
||||
XOR A ; LD (LfMarg),HL
|
||||
LD (VTFlg),A ; XOR A
|
||||
LD (HCRFlg),A ; LD (VTFlg),A
|
||||
NOP ; LD (HCRFlg),A
|
||||
LD A,(AIDflt) ; DEC A
|
||||
;
|
||||
ORG TPA+2711H
|
||||
; was:
|
||||
NOP ; LD A,(0157H) {Unknown Use}
|
||||
NOP ; OR A
|
||||
NOP ; JP Z,Error2
|
||||
NOP
|
||||
NOP
|
||||
NOP
|
||||
NOP
|
||||
;
|
||||
;------------ End of Patch File ------------
|
||||
END
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -81,7 +81,7 @@ MINIT1:
|
||||
SUB '0' ; Got it, convert to binary
|
||||
LD (UNIT),A ; Save it
|
||||
LD A,' ' ; Space character to accum
|
||||
LD (HL),A ; Remove numeric from FCB
|
||||
LD (HL),A ; Remove numberic from FCB
|
||||
JR MINIT3 ; Proceed with initialization
|
||||
|
||||
MINIT2:
|
||||
@@ -181,13 +181,6 @@ MINIT_UB1:
|
||||
LD A,E ; Put in A
|
||||
LD (CPUSPD),A ; Save it
|
||||
;
|
||||
LD A,(UNIT) ; get current unit specified
|
||||
CP 0FFH ; check for undefined
|
||||
JR NZ,MINIT_UB2 ; if already specified, go ahead
|
||||
XOR A ; default is unit 0
|
||||
LD (UNIT),A ; and save it
|
||||
;
|
||||
MINIT_UB2:
|
||||
JP UB_INIT ; UNA BIOS init
|
||||
;
|
||||
MINIT_RET:
|
||||
@@ -220,6 +213,7 @@ MINIT_RET:
|
||||
;
|
||||
; Return with CPU speed in A
|
||||
LD A,(CPUSPD) ; A := CPU speed in MHz
|
||||
LD HL,(RCVSCL) ; HL := receive scalar
|
||||
RET ; and return
|
||||
;
|
||||
;-----------------------------------------------------------------------
|
||||
@@ -305,22 +299,6 @@ FAIL:
|
||||
CALL BDOS ; Do it
|
||||
JP 0 ; Bail out!
|
||||
;
|
||||
; Adjust CPUSPD to account for overhead of HBIOS or UBIOS. It appears
|
||||
; that dividing CPU speed in MHz by 8 results in timeouts that are
|
||||
; roughly correct.
|
||||
;
|
||||
SLOW:
|
||||
LD A,(CPUSPD) ; Get true CPU speed
|
||||
ADD A,4 ; Add for rounding
|
||||
SRL A ; Divide by 8
|
||||
SRL A
|
||||
SRL A
|
||||
JR NZ,SLOW1 ; If not zero, we are good
|
||||
LD A,1 ; else, make it 1
|
||||
SLOW1:
|
||||
LD (CPUSPD),A ; Save it
|
||||
RET
|
||||
;
|
||||
;-----------------------------------------------------------------------
|
||||
;
|
||||
; The following are all dummy routines that are unused because MINIT
|
||||
@@ -340,6 +318,7 @@ EXTRA3:
|
||||
;
|
||||
BIOID DB 0 ; BIOS ID, 1=HBIOS, 2=UBIOS
|
||||
CPUSPD DB 10 ; CPU speed in MHz
|
||||
RCVSCL DW 6600 ; RECV loop timeout scalar
|
||||
UNIT DB 0FFH ; BIOS serial device unit number
|
||||
BIOSBID DB 00H ; BIOS bank id
|
||||
;
|
||||
@@ -386,7 +365,8 @@ HB_JPTBL:
|
||||
; HBIOS initialization
|
||||
;
|
||||
HB_INIT:
|
||||
CALL SLOW ; Adjust CPUSPD for HBIOS overhead
|
||||
LD HL,2150 ; Smaller receive loop timeout scalar
|
||||
LD (RCVSCL),HL ; ... to compensate for BIOS overhead
|
||||
;
|
||||
; Patch SENDR w/ FastPath addresses
|
||||
LD BC,0F801H ; Get CIO func/data adr
|
||||
@@ -424,6 +404,10 @@ HB_INIT:
|
||||
RST 08
|
||||
JP NZ,APIERR ; handle API error
|
||||
LD (HB_SRFN),HL ; Plug in func adr
|
||||
;
|
||||
; Claim 1 MHz CPU to offset overhead of HBIOS
|
||||
LD A,1
|
||||
LD (CPUSPD),A ; Save it
|
||||
;
|
||||
LD HL,HB_JPTBL
|
||||
LD DE,HB_LBL
|
||||
@@ -572,8 +556,14 @@ UB_INIT:
|
||||
;
|
||||
; TODO:
|
||||
; - TEST!!!
|
||||
; - ADJUST RCVSCL?
|
||||
;
|
||||
CALL SLOW ; Adjust CPUSPD for UBIOS overhead
|
||||
LD HL,3000 ; Smaller receive loop timeout scalar
|
||||
LD (RCVSCL),HL ; ... to compensate for BIOS overhead
|
||||
;
|
||||
; Claim 1 MHz CPU to offset overhead of HBIOS
|
||||
LD A,1
|
||||
LD (CPUSPD),A ; Save it
|
||||
;
|
||||
LD HL,UB_JPTBL
|
||||
LD DE,UB_LBL
|
||||
@@ -588,10 +578,8 @@ UB_SENDR:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0012H ; unit 0, func 12h (write char)
|
||||
LD E,A ; character to E
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,12H ; func 12h (write char)
|
||||
RST 08
|
||||
POP HL
|
||||
POP DE
|
||||
@@ -623,9 +611,7 @@ UB_MDIN:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,11H ; func 11h (read char)
|
||||
LD BC,0011H ; unit 0, func 12h (write char)
|
||||
RST 08
|
||||
LD A,E ; byte received to A
|
||||
POP HL
|
||||
@@ -643,14 +629,12 @@ UB_RCVRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,13H ; func 13h (input stat)
|
||||
LD BC,0013H ; unit 0, func 13h (input stat)
|
||||
RST 08
|
||||
LD A,E ; move char count to accum
|
||||
SUB 1 ; CF set IFF zero
|
||||
RL A ; CF to bit 0 of A
|
||||
AND 01H ; set Z flag as needed
|
||||
XOR A ; zero accum ; 4
|
||||
CP E ; CF means not zero ; 4
|
||||
CCF ; CF means zero ; 4
|
||||
RLA ; ZF means not zero ; 4
|
||||
LD A,0 ; report no line errors
|
||||
POP HL
|
||||
POP DE
|
||||
@@ -665,14 +649,12 @@ UB_SNDRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,14H ; func 14h (output stat)
|
||||
LD BC,0014H ; unit 0, func 14h (output stat)
|
||||
RST 08
|
||||
LD A,E ; char avail to send to accum
|
||||
SUB 1 ; CF set IFF zero
|
||||
RL A ; CF to bit 0 of A
|
||||
AND 01H ; set Z flag as needed
|
||||
XOR A ; zero accum ; 4
|
||||
CP E ; CF means not zero ; 4
|
||||
CCF ; CF means zero ; 4
|
||||
RLA ; ZF means not zero ; 4
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
@@ -723,6 +705,9 @@ UA_JPTBL:
|
||||
; UART initialization
|
||||
;
|
||||
UA_INIT:
|
||||
LD DE,13000 ; receive loop timeout scalar
|
||||
LD (RCVSCL),DE ; ... for UART RCVRDY timing
|
||||
;
|
||||
LD A,L ; get base I/O port address
|
||||
LD (UA_SCP),A ; set port value in SENDR
|
||||
LD (UA_GCP),A ; set port value in GETCHR
|
||||
@@ -841,6 +826,9 @@ UF_JPTBL:
|
||||
; USB-FIFO initialization
|
||||
;
|
||||
UF_INIT:
|
||||
LD DE,12000 ; receive loop timeout scalar
|
||||
LD (RCVSCL),DE ; ... for UART RCVRDY timing
|
||||
;
|
||||
LD A,L ; get base I/O port address (data port)
|
||||
LD (UF_SCDP),A ; set data port in SENDR
|
||||
LD (UF_GCDP),A ; set data port in GETCHR/MDIN
|
||||
@@ -859,6 +847,7 @@ UF_INIT:
|
||||
; Send character on top of stack
|
||||
;
|
||||
UF_SENDR:
|
||||
|
||||
POP AF ; get character to send from stack
|
||||
OUT (0FFH),A ; write to fifo
|
||||
UF_SCDP EQU $-1 ; data port
|
||||
|
||||
@@ -7,13 +7,10 @@ set PATH=%TOOLS%\zxcc;%PATH%
|
||||
|
||||
set CPMDIR80=%TOOLS%/cpm/
|
||||
|
||||
:: zxcc Z80ASM -ZMO-RW01/LH || exit /b
|
||||
zxcc Z80ASM -ZMO-WBW/LH || exit /b
|
||||
zxcc MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-WBW || exit /b
|
||||
zxcc Z80ASM -ZMO-RW01/H || exit /b
|
||||
zxcc MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-RW01 || exit /b
|
||||
|
||||
copy /Y zmp.com ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y *.ovr ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y zmp.cfg ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y zmp.fon ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y *.hlp ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y zmp.doc ..\..\..\Binary\Apps\ || exit /b
|
||||
@@ -1,10 +1,10 @@
|
||||
OBJECTS = zmp.com *.ovr zmp.cfg zmp.fon *.hlp zmp.doc
|
||||
OBJECTS = zmp.com *.ovr *.hlp zmp.doc
|
||||
DEST = ../../../Binary/Apps
|
||||
TOOLS = ../../../Tools
|
||||
OTHERS = *.hex
|
||||
NODELETE = *.ovr zmp.doc zmp.cfg zmp.fon *.hlp
|
||||
NODELETE = *.ovr zmp.doc *.hlp
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
zmp.com: zmo-wbw.hex
|
||||
$(ZXCC) MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-WBW
|
||||
zmp.com: zmo-rw01.hex
|
||||
$(ZXCC) MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-RW01
|
||||
|
||||
@@ -27,15 +27,4 @@ as at Aug 23rd, 2021.
|
||||
Untested on Ron Murrays ZMP15
|
||||
- Space getting short so messages shortened.
|
||||
|
||||
--PMS 8/24/2021
|
||||
|
||||
- Refactored overlay to resolve some stack issues.
|
||||
- Removed support for setport because it didn't make much sense
|
||||
with ability to specify port on command line.
|
||||
- Added an equate (pcfg) which controls whether port configuration
|
||||
is implemented. It is set to false (no port configuration).
|
||||
because ZMP it is unable to handle many RomWBW serial port settings
|
||||
(notably the hard-wired 115200 baud of many RCBus systems). You
|
||||
must now used MODE to configure port before starting ZMP.
|
||||
|
||||
--WBW 1:55 PM 4/16/2025
|
||||
--PMS 8/24/2021
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,844 +0,0 @@
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
; Overlay for ZMP (Z-Modem Program)
|
||||
;
|
||||
; Name ZMO-WBW.Z80
|
||||
;
|
||||
; Dated April 14, 2025
|
||||
;
|
||||
; Written by -
|
||||
; Phil Summers, Wayne Warthen
|
||||
;
|
||||
; ROMWBW version using HBIOS and https://github.com/mecparts/zmp
|
||||
; version of zmodem
|
||||
;
|
||||
; - All modem/serial i/o is through RomWBW HBIOS.
|
||||
;
|
||||
; - Data bits, stop bits, and parity are determined by HBIOS.
|
||||
; The ZMP settings will have no effect. Use RomWBW MODE
|
||||
; command to set serial port config before starting ZMP.
|
||||
;
|
||||
; - Timing delay calculations based on HBIOS reported CPU speed.
|
||||
;
|
||||
; - The pcfg equate determines whether the overlay will
|
||||
; implement port initialization. Normally, pcfg will be
|
||||
; set to false because ZMP does not allow configuring
|
||||
; many HBIOS speeds (notably the 115200 baud hardwired
|
||||
; into many RCBus systems). In this case, you must
|
||||
; configure the modem port using the RomWBW
|
||||
; MODE command as desired before starting ZMP.
|
||||
;
|
||||
; - The modem port is assigned to an HBIOS character unit. By
|
||||
; default, the modem is assigned to HBIOS character unit 1.
|
||||
; An alternate HBIOS character unit may be specified as a
|
||||
; parameter on the command line as a single number. For
|
||||
; example, the following will assign HBIOS port 3 as the
|
||||
; ZMP modem port:
|
||||
;
|
||||
; ZMP 3
|
||||
;
|
||||
; - The original version of ZMP from Ron Murray allows you to
|
||||
; select from 2 logical modem ports. This overlay ignores
|
||||
; any attempt to select ports from within ZMP. The desired
|
||||
; modem port should be assigned using the command line
|
||||
; parameter as described above.
|
||||
;
|
||||
; - Teraterm users may need to change the ZmodemWinSize value
|
||||
; to 1024 in the teraterm.ini configuration file.
|
||||
;
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
;
|
||||
; System-dependent code overlay for ZMODEM
|
||||
;
|
||||
;
|
||||
;
|
||||
; Insert your own code as necessary in this file. Code contained herein
|
||||
; has been written in Z80 code for use with M80 or SLR. Assemble as follows:
|
||||
;
|
||||
; SLR ZMO-xx01/h
|
||||
; MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
|
||||
; or
|
||||
; M80 =ZMO-xx01.Z80
|
||||
; RELHEX ZMO-xx01
|
||||
; MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
|
||||
;
|
||||
;
|
||||
; (Don't use L80 without changing the source for assembly as a
|
||||
; cseg file.)
|
||||
;
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
;
|
||||
; Notes on modifying this file:
|
||||
;
|
||||
; C requires that functions do not change either index register (IX or IY).
|
||||
; If your overlay requires either of these to be changed, ensure they are
|
||||
; restored to the original values on return.
|
||||
; Since collecting parameters from C functions can be tricky, only change
|
||||
; the parts marked 'Insert your own code here'. Do NOT modify the jump
|
||||
; table at the start. Do NOT modify the entry/exit sections of each
|
||||
; function. Do NOT pass 'GO'. Do NOT collect $200.
|
||||
; Apart from defining modem functions, this file also defines terminal
|
||||
; characteristics. Examples provided are for ADM-3A (with a few of my own
|
||||
; additions). Modify to suit your own terminal. An inline print routine
|
||||
; is provided for printing strings in the usual way: usage is
|
||||
;
|
||||
; call print
|
||||
; db 'required string',0
|
||||
;
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
;
|
||||
; Don't forget to set your clock speed at the clkspd variable.
|
||||
;
|
||||
;
|
||||
; If you find your overlay exceeds the maximum size (currently 0400h),
|
||||
; you will have to contact me for another version. If too many people need
|
||||
; to do it, we haven't allowed enough room.
|
||||
;
|
||||
; Ron Murray 15/8/88
|
||||
;
|
||||
;
|
||||
;
|
||||
;---------------------------------------------------------------------------
|
||||
|
||||
false equ 0
|
||||
true equ not false
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
; User-set variables:
|
||||
|
||||
debug equ false ; to allow debugging of overlay with Z8E etc.
|
||||
clkspd equ 8 ; Processor clock speed in MHz
|
||||
pcfg equ false ; Allow ZMP to configure port
|
||||
|
||||
;
|
||||
;Set the following two equates to the drive and user area which will contain
|
||||
; ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
|
||||
; (null) to locate them on the drive from which ZMP was invoked.
|
||||
|
||||
overdrive equ 0 ; Drive to find overlay files on ('A'-'P')
|
||||
overuser equ 0 ; User area to find files
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
||||
; NOT user-set variables
|
||||
|
||||
userdef equ 0145h ; origin of this overlay
|
||||
; This address should not change with
|
||||
; subsequent revisions.
|
||||
mspeed equ 03ch ; location of current baud rate.
|
||||
ovsize equ 0400h ; max size of this overlay
|
||||
|
||||
fcb equ 05ch ; primary command line CP/M fcb
|
||||
|
||||
.z80 ; use z80 code
|
||||
aseg ; absolute
|
||||
|
||||
if debug
|
||||
org 100h ; so you can debug it with cebug, zsid, etc
|
||||
else
|
||||
org userdef
|
||||
endif
|
||||
|
||||
|
||||
esc equ 1bh
|
||||
ctrlq equ 11h
|
||||
cr equ 0dh
|
||||
lf equ 0ah
|
||||
bdos equ 5
|
||||
|
||||
|
||||
codebgn equ $
|
||||
|
||||
;Jump table for the overlay: do NOT change this
|
||||
jump_tab:
|
||||
jp scrnpr ; screen print
|
||||
jp mrd ; modem read with timeout
|
||||
jp mchin ; get a character from modem
|
||||
jp mchout ; send a character to the modem
|
||||
jp mordy ; test for tx buffer empty
|
||||
jp mirdy ; test for character received
|
||||
jp sndbrk ; send break
|
||||
jp cursadd ; cursor addressing
|
||||
jp cls ; clear screen
|
||||
jp invon ; inverse video on
|
||||
jp invoff ; inverse video off
|
||||
jp hide ; hide cursor
|
||||
jp show ; show cursor
|
||||
jp savecu ; save cursor position
|
||||
jp rescu ; restore cursor position
|
||||
jp mint ; service modem interrupt
|
||||
jp invec ; initialise interrupt vectors
|
||||
jp dinvec ; de-initialise interrupt vectors
|
||||
jp mdmerr ; test uart flags for error
|
||||
jp dtron ; turn DTR on
|
||||
jp dtroff ; turn DTR OFF
|
||||
jp init ; initialise uart
|
||||
jp wait ; wait seconds
|
||||
jp mswait ; wait milliseconds
|
||||
jp userin ; user-defined entry routine
|
||||
jp userout ; user-defined exit routine
|
||||
jp getvars ; get system variables
|
||||
jp setport ; set port (0 or 1)
|
||||
|
||||
; Spare jumps for compatibility with future versions
|
||||
jp spare ; spare for later use
|
||||
jp spare ; spare for later use
|
||||
jp spare ; spare for later use
|
||||
jp spare ; spare for later use
|
||||
jp spare ; spare for later use
|
||||
jp spare ; spare for later use
|
||||
|
||||
; Local storage
|
||||
|
||||
hbunit db 1 ; Active HBIOS unit for modem I/O
|
||||
cpumhz db clkspd ; CPU clock speed in MHz
|
||||
|
||||
;
|
||||
; Main code starts here
|
||||
;
|
||||
;Screen print function
|
||||
scrnpr:
|
||||
; <== Insert your own code here
|
||||
call print
|
||||
db 'Screen print not supported.',cr,lf,0
|
||||
; <== End of your own code
|
||||
spare:
|
||||
ret
|
||||
|
||||
|
||||
; User-defined entry routine: leave empty if not needed
|
||||
userin:
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
|
||||
call print
|
||||
db cr,lf,'ZMP Overlay for RomWBW HBIOS v1.0',cr,lf,0
|
||||
|
||||
; Scan and parse default FCB to initialize HBIOS unit if
|
||||
; specified.
|
||||
ld a,(fcb + 1) ; get parm from fcb
|
||||
cp ' ' ; anything there?
|
||||
jr z,userin1 ; if empty, done
|
||||
sub '0' ; ASCII to binary
|
||||
jr c,parmerr ; less than 0, parm error
|
||||
cp 10 ; >= 10?
|
||||
jr nc,parmerr ; greater than 9, parm error
|
||||
ld (hbunit),a ; save it
|
||||
|
||||
userin1:
|
||||
call showcom ; show com port info
|
||||
|
||||
; check that unit is actually available in HBIOS
|
||||
ld bc,0f800h ; get HBIOS char unit count
|
||||
rst 8 ; do it
|
||||
ld a,(hbunit) ; get active modem unit
|
||||
cp e ; compare to units available
|
||||
jr nc,porterr ; unit too high, port error
|
||||
|
||||
if pcfg
|
||||
|
||||
; Force port initialization by setting an invalid
|
||||
; baud rate (mspeed).
|
||||
; speed to an arbitrary value of 8 (9600 baud).
|
||||
ld a,-1
|
||||
ld (mspeed),a
|
||||
|
||||
else
|
||||
|
||||
; We don't support port configuration. Here we set the modem
|
||||
; speed to an arbitrary value of 8 (9600 baud).
|
||||
ld a,8
|
||||
ld (mspeed),a
|
||||
|
||||
endif
|
||||
|
||||
|
||||
ld bc,0f8f0h ; HBIOS func get CPU info
|
||||
rst 08 ; do it, l = CPU speed in MHz
|
||||
ld a,l ; to accum
|
||||
ld (cpumhz),a ; and save it for wait loop
|
||||
|
||||
ld hl,2
|
||||
call waithls
|
||||
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
|
||||
parmerr:
|
||||
; Handle a bad parameter
|
||||
call print ; print error message
|
||||
db cr,lf,'ZMP parameter error!',cr,lf,0
|
||||
rst 0 ; bail out to OS
|
||||
|
||||
porterr:
|
||||
; Handle a bad port
|
||||
call print ; print error message
|
||||
db cr,lf,'Invalid HBIOS unit for ZMP Modem port!',cr,lf,0
|
||||
rst 0 ; bail out to OS
|
||||
|
||||
showcom:
|
||||
; Display the HBIOS unit to be used for the ZMP Modem
|
||||
call print
|
||||
db cr,lf,'ZMP Modem on HBIOS Unit #',0
|
||||
ld a,(hbunit)
|
||||
add a,'0'
|
||||
call cout
|
||||
call print
|
||||
db cr,lf,0
|
||||
|
||||
; User-defined exit routine: leave empty if not needed
|
||||
userout:
|
||||
ret
|
||||
|
||||
;Get a character from the modem: return in HL
|
||||
mchin:
|
||||
push bc
|
||||
|
||||
; <== Insert your own code here
|
||||
ld a,(hbunit)
|
||||
ld c,a
|
||||
ld b,00h
|
||||
rst 08
|
||||
ld a,e
|
||||
; <== End of your own code
|
||||
|
||||
ld l,a ; put in HL
|
||||
ld h,0
|
||||
or a ; set/clear Z
|
||||
pop bc
|
||||
ret
|
||||
|
||||
;Send a character to the modem
|
||||
mchout:
|
||||
ld hl,2 ; get the character
|
||||
add hl,sp
|
||||
ld a,(hl)
|
||||
|
||||
; <== Insert your own code here
|
||||
push bc
|
||||
ld e,a
|
||||
ld a,(hbunit)
|
||||
ld c,a
|
||||
ld b,01h
|
||||
rst 08
|
||||
pop bc
|
||||
; <== End of your own code
|
||||
|
||||
ret ; done
|
||||
|
||||
;Test for output ready: return TRUE (1) in HL if ok
|
||||
mordy:
|
||||
; <== Insert your own code here
|
||||
push bc
|
||||
ld a,(hbunit)
|
||||
ld c,a
|
||||
ld b,03h
|
||||
rst 08
|
||||
ld h,0
|
||||
ld l,a
|
||||
pop bc
|
||||
; <== End of your own code
|
||||
|
||||
ld a,l ; set/clear Z
|
||||
or a
|
||||
ret
|
||||
|
||||
;Test for character at modem: return TRUE (1) in HL if so
|
||||
mirdy:
|
||||
; <== Insert your own code here
|
||||
push bc
|
||||
ld a,(hbunit)
|
||||
ld c,a
|
||||
ld b,02h
|
||||
rst 08
|
||||
ld h,0
|
||||
ld l,a
|
||||
pop bc
|
||||
; <== End of your own code
|
||||
|
||||
ld a,l ; set/clear Z
|
||||
or a
|
||||
ret
|
||||
|
||||
;Send a break to the modem: leave empty if your system can't do it
|
||||
sndbrk:
|
||||
; <== Insert your own code here
|
||||
ld hl,300 ; wait 300 mS
|
||||
call waithlms
|
||||
; <== End of your own code
|
||||
|
||||
ret
|
||||
;
|
||||
;Test UART flags for error: return TRUE (1) in HL if error.
|
||||
mdmerr:
|
||||
; <== Insert your own code here
|
||||
xor a ; not implemented
|
||||
; <== End of your own code
|
||||
|
||||
ld a,l ; set/clear Z
|
||||
or a
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;Turn DTR ON
|
||||
dtron:
|
||||
; <== Insert your own code here
|
||||
|
||||
; <== End of your own code
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;Turn DTR OFF
|
||||
dtroff:
|
||||
; <== Insert your own code here
|
||||
|
||||
|
||||
; <== End of your own code
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;Initialise the uart
|
||||
init:
|
||||
ld hl,2 ; get parameters
|
||||
add hl,sp
|
||||
ex de,hl
|
||||
call getparm ; in HL
|
||||
ld (brate),hl ; baud rate
|
||||
call getparm
|
||||
ld (parity),hl ; parity
|
||||
call getparm
|
||||
ld (data),hl ; data bits (BINARY 7 or 8)
|
||||
call getparm
|
||||
ld (stop),hl ; stop bits (BINARY 1 or 2)
|
||||
|
||||
; <== Insert your own code here
|
||||
; using values below
|
||||
; don't forget to load mspeed with the
|
||||
; current brate value if the new rate is
|
||||
; valid. See table of values below.
|
||||
|
||||
push bc
|
||||
|
||||
; If pcfg is true, attempt to initialize the active
|
||||
; HBIOS unit. If false, initialization if bypassed with
|
||||
; the assumption that the RomWBW MODE command was used
|
||||
; to initialize the port priot to running ZMP.
|
||||
|
||||
if pcfg
|
||||
|
||||
call print
|
||||
db 'Initializing device: ',0
|
||||
call diport
|
||||
|
||||
ld a,(hbunit) ; get device type
|
||||
ld c,a
|
||||
ld b,06h
|
||||
rst 08
|
||||
or a ; check if valid
|
||||
jr nz,initerr
|
||||
|
||||
ld a,(brate) ; get baud rate to set
|
||||
ld c,a
|
||||
ld b,0
|
||||
ld hl,baudtbl
|
||||
add hl,bc
|
||||
ld a,(hl) ; convert to encoded hbios
|
||||
cp a,-1
|
||||
jr z,initerr
|
||||
|
||||
push af
|
||||
ld a,(hbunit) ; get line characteristics
|
||||
ld c,a
|
||||
ld b,05h
|
||||
rst 08
|
||||
ld a,d ; mask out exisitng
|
||||
and 11100000b ; replace with rate
|
||||
ld d,a
|
||||
pop af
|
||||
or d
|
||||
ld d,a
|
||||
|
||||
ld b,04h ; set new
|
||||
ld a,(hbunit) ; speed
|
||||
ld c,a
|
||||
rst 08
|
||||
or a
|
||||
jr nz,initerr
|
||||
|
||||
ld a,(brate) ; load mspeed with the current brate value if
|
||||
ld (mspeed),a ; the new rate is valid. See table of values below.
|
||||
|
||||
call print
|
||||
db lf,lf,'Initization completed, device: ',0
|
||||
call diport
|
||||
|
||||
jr init_z
|
||||
|
||||
initerr:call print
|
||||
db lf,lf,'Initization failed, device: ',0
|
||||
call diport
|
||||
|
||||
jr init_z
|
||||
|
||||
diport: ld a,(hbunit) ; Display port
|
||||
diport1:add a,'0'
|
||||
call cout
|
||||
call print
|
||||
db cr,lf,0
|
||||
ld hl,2
|
||||
call waithls
|
||||
ret
|
||||
|
||||
else
|
||||
|
||||
;call print
|
||||
;db cr,lf,'Modem port initialization...',0
|
||||
;ld hl,2
|
||||
;call waithls
|
||||
|
||||
ld b,05h ; HBIOS port reset function
|
||||
ld a,(hbunit) ; get active modem port
|
||||
ld c,a ; and put in accum
|
||||
rst 8 ; reset port
|
||||
or a ; check result
|
||||
jr nz,init1 ; if error, handle it
|
||||
ld a,8 ; dummy value for speed
|
||||
ld (mspeed),a ; save it
|
||||
jr init_z ; done
|
||||
|
||||
init1:
|
||||
; Handle error return from initialization
|
||||
call print
|
||||
db cr,lf,'Modem port initialization failed!',cr,lf,0
|
||||
ld hl,2
|
||||
call waithls
|
||||
|
||||
jr init_z
|
||||
|
||||
endif
|
||||
|
||||
init_z:
|
||||
pop bc
|
||||
|
||||
; <== End of your own code
|
||||
|
||||
ret
|
||||
;--------------------------------------------------------------------------
|
||||
|
||||
stop: dw 1 ; stop bits
|
||||
parity: dw 'N' ; parity
|
||||
data: dw 8 ; data bits
|
||||
brate: dw 7 ; baud rate:
|
||||
|
||||
;--------------------------------------------------------------------------
|
||||
;
|
||||
;Values of brate for each baud rate
|
||||
;
|
||||
; hb encode baud rate brate
|
||||
;
|
||||
baudtbl:
|
||||
db -1 ; 110 0 not supported
|
||||
db 2 ; 300 1
|
||||
db 17 ; 450 2
|
||||
db 3 ; 600 3
|
||||
db -1 ; 710 4 not supported
|
||||
db 4 ; 1200 5
|
||||
db 5 ; 2400 6
|
||||
db 6 ; 4800 7
|
||||
db 7 ; 9600 8
|
||||
db 8 ; 19200 9
|
||||
db 9 ; 38400 10
|
||||
db 24 ; 57600 11
|
||||
db 10 ; 76800 12
|
||||
;
|
||||
; Set the port. ZMP supplies either 0 or 1 as a parameter. You're on your
|
||||
; own here -- your system is bound to be different from any other! You may
|
||||
; implement a software switch on all the modem-dependent routines, or perhaps
|
||||
; you can have one or two centralised routines for accessing the UARTs and
|
||||
; modify the code from this routine to select one or the other. (Who said
|
||||
; there was anything wrong with self-modifying code?). If you have only one
|
||||
; UART port, or if you don't want to go through all the hassles, just have
|
||||
; this routine returning with no changes made. Note that ZMP calls this
|
||||
; routine with both values for the port on initialisation.
|
||||
;
|
||||
; Only originl ZMP calls setport. MECPARTS variant does not.
|
||||
;
|
||||
; We ignore this call. Since we are using a command line parameter
|
||||
; to specify the desired modem port, it makes no sense.
|
||||
;
|
||||
setport:
|
||||
ld hl,2 ; get port number
|
||||
add hl,sp
|
||||
ex de,hl
|
||||
call getparm ; in HL (values are 0 and 1)
|
||||
|
||||
; <== Insert your own code here
|
||||
|
||||
; <== End of your own code
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;
|
||||
;****************************************************************************
|
||||
;Video terminal sequences: these are for VT-100: Modify as you wish
|
||||
;Cursor addressing:
|
||||
cursadd:
|
||||
ld hl,2 ; get parameters
|
||||
add hl,sp
|
||||
ex de,hl
|
||||
call getparm ; in HL
|
||||
inc hl
|
||||
ld (row),hl ; row
|
||||
call getparm
|
||||
inc hl
|
||||
ld (col),hl ; column
|
||||
;
|
||||
push bc
|
||||
|
||||
call print
|
||||
db esc,'[',0
|
||||
ld a,(row) ; row first
|
||||
call cursconv
|
||||
ld a,';'
|
||||
call cout
|
||||
ld a,(col) ; same for column
|
||||
call cursconv
|
||||
ld a,'H'
|
||||
call cout
|
||||
|
||||
pop bc
|
||||
|
||||
ret
|
||||
;
|
||||
cursconv:
|
||||
ld b,a
|
||||
xor a
|
||||
ca1: add a,1
|
||||
daa
|
||||
djnz ca1
|
||||
ld (num),a
|
||||
and 0f0h
|
||||
jr z,ca2
|
||||
srl a
|
||||
srl a
|
||||
srl a
|
||||
srl a
|
||||
or '0'
|
||||
call cout
|
||||
ca2: ld a,(num)
|
||||
and 0fh
|
||||
or '0'
|
||||
call cout
|
||||
ret
|
||||
;
|
||||
row: ds 2 ; row
|
||||
col: ds 2 ; column
|
||||
num: ds 1
|
||||
;
|
||||
;Clear screen:
|
||||
cls:
|
||||
call print
|
||||
db esc,"[H",esc,"[2J",0
|
||||
ret
|
||||
;
|
||||
;Inverse video on:
|
||||
invon:
|
||||
call print
|
||||
db esc,"[7m",0
|
||||
ret
|
||||
;
|
||||
;Inverse video off:
|
||||
invoff:
|
||||
call print
|
||||
db esc,"[m",0
|
||||
ret
|
||||
;
|
||||
;Turn off cursor:
|
||||
hide:
|
||||
call print
|
||||
db esc,'[?25l',0
|
||||
ret
|
||||
;
|
||||
;Turn on cursor:
|
||||
show:
|
||||
call print
|
||||
db esc,'[?25h',0
|
||||
ret
|
||||
;
|
||||
;Save cursor position:
|
||||
savecu:
|
||||
call print
|
||||
db esc,'[7',0
|
||||
ret
|
||||
;
|
||||
;Restore cursor position:
|
||||
rescu:
|
||||
call print
|
||||
db esc,'[8',0
|
||||
ret
|
||||
|
||||
;****************************************************************************
|
||||
|
||||
;Service modem interrupt:
|
||||
mint:
|
||||
ret ; handled in HBIOS
|
||||
|
||||
;Initialise interrupt vectors:
|
||||
invec:
|
||||
ret ; ditto
|
||||
|
||||
;De-initialise interrupt vectors:
|
||||
dinvec:
|
||||
ret ; ditto
|
||||
|
||||
;****************** End of user-defined code ********************************
|
||||
; Do not change anything below here.
|
||||
|
||||
;Modem character test for 100 ms
|
||||
mrd:
|
||||
push bc ; save bc
|
||||
ld bc,100 ; set limit
|
||||
mrd1:
|
||||
call mirdy ; char at modem?
|
||||
jr nz,mrd2 ; yes, exit
|
||||
ld hl,1 ; else wait 1ms
|
||||
call waithlms
|
||||
dec bc ; loop till done
|
||||
ld a,b
|
||||
or c
|
||||
jr nz,mrd1
|
||||
ld hl,0 ; none there, result=0
|
||||
xor a
|
||||
mrd2:
|
||||
pop bc
|
||||
ret
|
||||
|
||||
; Inline print routine: destroys A and HL
|
||||
|
||||
print:
|
||||
ex (sp),hl ; get address of string
|
||||
ploop:
|
||||
ld a,(hl) ; get next
|
||||
inc hl ; bump pointer
|
||||
or a ; done if zero
|
||||
jr z,pdone
|
||||
call cout ; else print
|
||||
jr ploop ; and loop
|
||||
pdone:
|
||||
ex (sp),hl ; restore return address
|
||||
ret ; and quit
|
||||
|
||||
;
|
||||
;Output a character in A to the console
|
||||
;
|
||||
cout:
|
||||
push bc ; save regs
|
||||
push de
|
||||
push hl
|
||||
ld e,a ; character to E
|
||||
ld c,2
|
||||
call bdos ; print it
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
|
||||
|
||||
;Wait seconds
|
||||
wait:
|
||||
ld hl,2
|
||||
add hl,sp
|
||||
ex de,hl ; get delay size
|
||||
call getparm
|
||||
; fall thru to..
|
||||
;Wait seconds in HL
|
||||
waithls:
|
||||
push hl ; save loop control
|
||||
ld hl,1000 ; 1000ms = 1 second
|
||||
call waithlms
|
||||
pop hl ; restore loop control
|
||||
dec hl
|
||||
ld a,h
|
||||
or l
|
||||
jr nz,waithls
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;Wait milliseconds
|
||||
mswait:
|
||||
ld hl,2
|
||||
add hl,sp
|
||||
ex de,hl ; get delay size
|
||||
call getparm
|
||||
; fall thru to..
|
||||
;Wait milliseconds in HL
|
||||
waithlms:
|
||||
; burn 1000us (1ms)
|
||||
ld a,(cpumhz)
|
||||
ld e,a
|
||||
hlms1:
|
||||
; burn 1000 t-states
|
||||
; 50 * 20 = 1000 t-states
|
||||
ld d,50
|
||||
hlms2:
|
||||
nop ; 4
|
||||
dec d ; 4
|
||||
jr nz,hlms2 ; 12 20
|
||||
|
||||
dec e
|
||||
jr nz,hlms1
|
||||
|
||||
dec hl
|
||||
ld a,h
|
||||
or l
|
||||
jr nz,waithlms
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;Get next parameter from (de) into hl
|
||||
getparm:
|
||||
ex de,hl ; get address into hl
|
||||
ld e,(hl) ; get lo
|
||||
inc hl
|
||||
ld d,(hl) ; then hi
|
||||
inc hl ; bump for next
|
||||
ex de,hl ; result in hl, address still in de
|
||||
ret
|
||||
|
||||
;Get address of user-defined variables
|
||||
|
||||
getvars:
|
||||
ld hl,uservars
|
||||
ret
|
||||
|
||||
uservars:
|
||||
dw overdrive ; .OVR etc. drive/user
|
||||
dw overuser
|
||||
|
||||
|
||||
if ($ - codebgn) gt ovsize
|
||||
toobig: jp errval ; Overlay too large!
|
||||
endif
|
||||
|
||||
end
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
; has been written in Z80 code for use with M80 or SLR. Assemble as follows:
|
||||
;
|
||||
; SLR ZMO-xx01/h
|
||||
; MLOAD ZMP.COM=ZMPX.COM,ZMO-xx01.HEX
|
||||
; MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
|
||||
; or
|
||||
; M80 =ZMO-xx01.Z80
|
||||
; RELHEX ZMO-xx01
|
||||
; MLOAD ZMP.COM=ZMPX.COM,ZMO-xx01.HEX
|
||||
; MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
|
||||
;
|
||||
;
|
||||
; (Don't use L80 without changing the source for assembly as a
|
||||
@@ -570,3 +570,4 @@ toobig: jp errval ; Overlay too large!
|
||||
endif
|
||||
|
||||
end
|
||||
|
||||
@@ -12,10 +12,6 @@ awhile (some, a few decades):
|
||||
* In keyboard macros, ! translates to a CR now, not CR/LF.
|
||||
* \ escapes ! and ~ so those literal characters can be used in
|
||||
keyboard macros.
|
||||
* Waits in keyboard macros now allow characters from the modem to
|
||||
be handled.
|
||||
* Keys in keyboard macros now have 25ms waits between them as to
|
||||
not overrun the remove system.
|
||||
* Long distance access code has been removed.
|
||||
* Quick dialing letters limited to A-T.
|
||||
|
||||
@@ -27,5 +23,5 @@ version in ZMP15.LBR. So, to quote the original author,
|
||||
new one with the config option. There have again been changes to
|
||||
the format of this file."
|
||||
|
||||
August 15, 2023
|
||||
|
||||
June 7, 2021
|
||||
|
||||
|
||||
Binary file not shown.
@@ -11,8 +11,6 @@
|
||||
; ex: ASSIGN (display all active drive assignments)
|
||||
; ASSIGN /? (display version and usage)
|
||||
; ASSIGN /L (display all possible devices)
|
||||
; ASSIGN /B=OPTS (perform assignment based on options)
|
||||
; ASSIGN C: (display assignment for C:)
|
||||
; ASSIGN C:=D: (swaps C: and D:)
|
||||
; ASSIGN C:=FD0: (assign C: to floppy unit 0)
|
||||
; ASSIGN C:=IDE0:1 (assign C: to IDE unit0, slice 1)
|
||||
@@ -35,9 +33,6 @@
|
||||
; 2023-06-19 [WBW] Update for revised DIODEVICE API
|
||||
; 2023-09-19 [WBW] Added CHUSB & CHSD device support
|
||||
; 2023-10-13 [WBW] Fixed DPH creation to select correct DPB
|
||||
; 2024-12-17 [MAP] Added new /B=opt feaure to assign drives
|
||||
; 2024-12-21 [MAP] Added CBIOS heap estimation to /B to prevent
|
||||
; overflow when the drives are finally added
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
@@ -57,7 +52,6 @@ bnksel .equ $FFF3 ; HBIOS bank select vector
|
||||
stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp
|
||||
;
|
||||
#include "../../ver.inc"
|
||||
#include "../../HBIOS/hbios.inc"
|
||||
;
|
||||
;===============================================================================
|
||||
; Code Section
|
||||
@@ -86,7 +80,7 @@ start:
|
||||
call init ; initialize
|
||||
jr nz,exit ; abort if init fails
|
||||
;
|
||||
; do the real work
|
||||
; do the real work
|
||||
call process ; parse and process command line
|
||||
jr nz,exit ; done if error or no action
|
||||
;
|
||||
@@ -166,14 +160,12 @@ init:
|
||||
ld e,(hl) ; dereference HL
|
||||
inc hl ; ... into DE to get
|
||||
ld d,(hl) ; ... DPB map pointer
|
||||
ld (dpbloc),de ; and save it
|
||||
ld (dpbloc),de ; and save it
|
||||
;
|
||||
; test for CP/M 3 and branch if so
|
||||
ld a,(cpmver) ; low byte of cpm version
|
||||
cp $30 ; CP/M 3.0?
|
||||
jp nc,initcpm3 ; handle CP/M 3.0 or greater
|
||||
;
|
||||
; CP/M 2.2 (CBIOS) initialization
|
||||
;
|
||||
; make a local working copy of the drive map
|
||||
ld hl,(maploc) ; copy from CBIOS drive map
|
||||
@@ -223,13 +215,6 @@ initx:
|
||||
add hl,de ; adjust
|
||||
ld (heaplim),hl ; save it
|
||||
;
|
||||
; establish remaining heap, used for estimation during /b
|
||||
ld de,(maploc) ; start of free heap space
|
||||
or a ; clear carry
|
||||
sbc hl,de ; upper heap - start of heap = size
|
||||
ld de,SIZ_DBUF ; 128 bytes for directory buffer
|
||||
sbc hl,de ; less directory buffer overhead
|
||||
ld (heaprem),hl ; save heap size that can be allocated
|
||||
#if 0
|
||||
ld a,' '
|
||||
call crlf
|
||||
@@ -244,9 +229,7 @@ initx:
|
||||
call prtchr
|
||||
ld bc,(heaplim)
|
||||
call prthexword
|
||||
call prtchr
|
||||
ld bc,(heaprem)
|
||||
call prthexword
|
||||
|
||||
#endif
|
||||
;
|
||||
; return success
|
||||
@@ -270,7 +253,7 @@ initcpm3:
|
||||
; switch to sysbnk
|
||||
ld a,($FFE0) ; get current bank
|
||||
push af ; save it
|
||||
ld bc,BC_SYSGET_BNKINFO ; HBIOS Get Bank Info
|
||||
ld bc,$F8F2 ; HBIOS Get Bank Info
|
||||
rst 08 ; call HBIOS, E=User Bank
|
||||
ld a,e ; HBIOS User Bank
|
||||
call bnksel ; HBIOS BNKSEL
|
||||
@@ -299,7 +282,7 @@ initc3:
|
||||
inc de ; bump to slice
|
||||
ld a,(hl) ; get slice from drvtbl
|
||||
ld (de),a ; save slice to drvmap
|
||||
initc4:
|
||||
initc4:
|
||||
inc de ; bump past slice
|
||||
inc de ; skip
|
||||
inc de ; ... dph
|
||||
@@ -416,8 +399,6 @@ option:
|
||||
ld a,(hl) ; get it
|
||||
cp '?' ; is it a '?' as expected?
|
||||
jp z,usage ; yes, display usage
|
||||
cp 'B' ; assign Boot Hard Drive Slices
|
||||
jp z,bootdr ; yes, assign boot drive slices
|
||||
cp 'L' ; is it a 'L', display device list?
|
||||
jp z,devlist ; yes, display device list
|
||||
jp errprm ; anything else is an error
|
||||
@@ -457,8 +438,9 @@ devlist:
|
||||
or a ; set flags
|
||||
jr nz,devlstu ; do UNA mode dev list
|
||||
;
|
||||
ld bc,BC_SYSGET_DIOCNT ; hbios func: sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
ld b,$F8 ; hbios func: sysget
|
||||
ld c,$10 ; sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
ld b,e ; use device count for loop count
|
||||
ld c,0 ; use C for device index
|
||||
devlist1:
|
||||
@@ -504,496 +486,6 @@ devlstu1:
|
||||
djnz devlstu1 ; loop as needed
|
||||
ret ; return
|
||||
;
|
||||
; -------------------------------------------------
|
||||
; /B=XXX - Bootup drive Assignment
|
||||
;
|
||||
; Variable used across the entire bootdr: function
|
||||
; - (mapwrk) working table of assignments
|
||||
; - (mapadr) pointer to next drive assignment in mapwrk
|
||||
; - (dstdrv) Drive letter of next assigment 0-15
|
||||
; - (tmpstr) List of Option letters being processed
|
||||
;
|
||||
bootdr:
|
||||
; command line processing mapping options into (tmpstr)
|
||||
inc hl ; next char after the /B expect a delimeter
|
||||
call nonblank ; skip ws
|
||||
cp '='
|
||||
inc hl
|
||||
call nonblank ; skip ws
|
||||
call getalpha ; options string into (tmpstr)
|
||||
;
|
||||
; defaulting loop for normal disk boot starting at A:
|
||||
ld hl,mapwrk ; DE := working drive map
|
||||
ld (mapadr),hl ; save pointer o next drive maping
|
||||
xor a ; next dest drive letter start at A:
|
||||
ld (dstdrv),a
|
||||
bootdr1:
|
||||
; process next letter in the cmd line options
|
||||
ld a,(tmpstr) ; next letter
|
||||
res 5,a ; FORCE UPPERCASE (IMPERFECTLY)
|
||||
; Case Statement
|
||||
ld hl,bootdr2 ; return address for below JP
|
||||
push hl ; when RET from below JP, return
|
||||
cp 'A'
|
||||
jp z,bootdra ; RAM
|
||||
cp 'B'
|
||||
jp z,bootdrb ; BOOT
|
||||
cp 'F'
|
||||
jp z,bootdrf ; FLOPPY
|
||||
cp 'H'
|
||||
jp z,bootdrh ; HARD DRIVES (improved)
|
||||
cp 'L'
|
||||
jp z,bootdrl ; HARD DRIVES (legacy)
|
||||
cp 'O'
|
||||
jp z,bootdro ; ROM
|
||||
cp 'P'
|
||||
jp z,bootdrp ; PRESERVE/KEEP (SKIP)
|
||||
cp 'S'
|
||||
jp z,bootdrs ; SLICES (OFF BOOT DRIVE)
|
||||
cp 'X'
|
||||
jp z,bootdrx ; UNASSIGN
|
||||
cp 'Z'
|
||||
jp z,bootdrz ; UNASSIGN ALL REMAINING
|
||||
; no valid option was found just ignore and continue
|
||||
; potentially signal an error
|
||||
pop hl ; remove the return address, since no match
|
||||
bootdr2:
|
||||
jr c,bootdr4 ; if overflowed, exhaused drives then error
|
||||
; bump to next letter in tmp str, by shifing string left in buffer
|
||||
ld hl,tmpstr+1 ; copy from +1 in buffer
|
||||
ld a,(hl) ; copy next char for Z check
|
||||
ld de,tmpstr ; copy down to +0 in buffer
|
||||
ld bc,16 ; buffer is 16 bytes
|
||||
ldir
|
||||
or a ; set flags based on next char
|
||||
jr nz,bootdr1 ; loop if character found
|
||||
bootdr3:
|
||||
xor a ; success
|
||||
ret ; finished
|
||||
bootdr4:
|
||||
or $ff ; failure
|
||||
ret ; finished
|
||||
;
|
||||
; -------------------------------------------------
|
||||
; /B=XXX AGORITHMS START HERE
|
||||
;
|
||||
; PRESERVE, SKIP 1, JUST LOOP
|
||||
bootdrp:
|
||||
; determine the drive being preserved, calc estimate
|
||||
ld hl,(mapadr) ; address of next map entry in table. Indirect
|
||||
ld a,(hl) ; the unit number of drive being skipped
|
||||
call bootdest ; for unit in A, calc the heap estimate -> DE
|
||||
; subtract bytes from estimate, not not checking for overflow
|
||||
ld hl,(heaprem) ; remaing heap estimate
|
||||
or a ; clear carry
|
||||
sbc hl,de ; subtract slice from heap estimate
|
||||
ld (heaprem),hl ; update estimate based on adding slice
|
||||
; and skip to next drive
|
||||
call bootinc ; Skip to next drive letter
|
||||
ret ; Finished
|
||||
;
|
||||
; EXCLUDE / UNASSIGNED / GAP
|
||||
bootdrx:
|
||||
ld a,$FF ; $FF (unit) signal a drive not assigned
|
||||
ld (unit),a ; set unit
|
||||
xor a ; slice 0
|
||||
ld (slice),a ; save as slice to assign.
|
||||
ld hl,SIZ_DMAP ; heap used is 4 bytes for drvmap entry only
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
call bootadd ; assign the slice
|
||||
ret ; Finished, returning error
|
||||
;
|
||||
; EXCLUDE / UNASSIGNED - ALL REMAINING
|
||||
bootdrz:
|
||||
ld a,$FF ; $FF (unit) signal a drive not assigned
|
||||
ld (unit),a ; set unit
|
||||
xor a ; slice 0
|
||||
ld (slice),a ; save as slice to assign.
|
||||
ld hl,0 ; all remainging drives consume 0 bytes
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
bootdrz1:
|
||||
call bootadd ; assign the slice
|
||||
jr nc,bootdrz1 ; NC still can continue to allocate
|
||||
xor a ; success
|
||||
ret ; Finished
|
||||
;
|
||||
; BOOT DRIVE
|
||||
bootdrb:
|
||||
ld bc,BC_SYSGET_BOOTINFO ; HBIOS SysGet; BootInfo
|
||||
rst 08 ; Get boot disk unit/slice in DE
|
||||
ld a,e ; boot slice returned in E
|
||||
ld (slice),a ; save as slice to assign.
|
||||
ld a,d ; boot unit id returned in D
|
||||
ld (unit),a ; save as unit number
|
||||
call bootdest ; calc estimat of unit A store in (sliceem)
|
||||
call bootadd ; add the boot drive slice
|
||||
ret ; Finished, returning error
|
||||
;
|
||||
; RAM DRIVE
|
||||
bootdra:
|
||||
ld a,$FF ; specific mask to include all BITS
|
||||
ld (atrmask),a ; mask for device attributes
|
||||
ld a,%00010101 ; specific mask for RAM DRIVE.
|
||||
ld (atrcomp),a ; compare to after mask
|
||||
ld hl,EST_MD ; estimate of heap used. for RAM ROM
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
call bootadds ; do single slice assignment
|
||||
ret ; Finished, returning error
|
||||
;
|
||||
; ROM DRIVE
|
||||
; Note: if MDFFENABLE is enabled, this wont select the ROM since the
|
||||
; driver returns MD_AFSH (%00010111), and we cannot generalise this mask
|
||||
bootdro:
|
||||
ld a,%11111101 ; ROM mask, excluding Bit 1, which varies
|
||||
ld (atrmask),a ; mask for device attributes
|
||||
ld a,%00010100 ; for values "MD_AROM", "MD_AFSH"; Att="000101x0"
|
||||
ld (atrcomp),a ; compare to after mask
|
||||
ld hl,EST_MD ; estimate of heap used. for RAM ROM
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
call bootadds ; do single slice assignment
|
||||
ret ; Finished, returning error
|
||||
;
|
||||
; FLOPPY DRIVE(S)
|
||||
bootdrf:
|
||||
ld a,%11000000 ; device parameters (Removable Floppy)
|
||||
ld (atrmask),a ; mask for device attributes
|
||||
ld (atrcomp),a ; compare to after mask
|
||||
ld hl,EST_FD ; estimate of heap used. for Floppy
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
call bootadds ; do single slice assignment
|
||||
ret ; Finished, returning error
|
||||
;
|
||||
; SLICES (From Boot Drive Only)
|
||||
bootdrs:
|
||||
; find the boot drive, save unit /slice number
|
||||
ld a,(mapwrk) ; boot drive unit number
|
||||
ld (unit),a ; save as unit number to assign
|
||||
ld hl,EST_HD ; estimate of heap used, for HDD
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
ld a,0 ; starting slice number
|
||||
bootdrs1:
|
||||
; A is next slice to assign when entering here
|
||||
ld (slice),a ; save as slice to assign.
|
||||
call bootadd ; add the slice, return Z - past the last drive
|
||||
jr c,bootdrs2 ; drives exhaused, finish up
|
||||
ld a,(slice) ; get the slice just consumed
|
||||
inc a ; next slice
|
||||
JR bootdrs1 ; loop round
|
||||
bootdrs2:
|
||||
xor a ; success
|
||||
ret
|
||||
;
|
||||
; HARD DRIVE(S) - Improved from CBIOS - More Drives
|
||||
bootdrh:
|
||||
ld a,%00100000 ; device parameters (High Capacity)
|
||||
ld (atrmask),a ; mask for device attributes
|
||||
ld (atrcomp),a ; compare to after mask
|
||||
ld hl,EST_HD ; estimate of heap used, for HDD
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
; count the number of drives matching criteria
|
||||
call bootcnt ; return Drive count in A
|
||||
; compute Slices per volume from drv count in A
|
||||
call bootdrh1 ; return SPV in A
|
||||
ld (slicec),a ; slice per volume count
|
||||
; do the drive assignment
|
||||
call bootaddn ; do the drive assignment
|
||||
ret ; Finished returning error
|
||||
;
|
||||
; Input A contains device count return SPV (slices per volume) in A
|
||||
bootdrh1:
|
||||
ld e,a ; divide by by e, the number of devices
|
||||
ld a,(dstdrv) ; next destination drive to map, 0-15
|
||||
ld d,a ; put it in d
|
||||
ld a,16 ; total number of drives
|
||||
sub d ; less assigned = remaining
|
||||
; above assumes we have space remaining on heap for all drives
|
||||
; ideally should take A=Min( A, (heaprem)/EST_HD ) before division
|
||||
ld d,a ; divides d - remaing drives
|
||||
; The following routine divides d by e and places the quotient in d and the remainder in a
|
||||
; https://wikiti.brandonw.net/index.php?title=Z80_Routines:Math:Division
|
||||
xor a
|
||||
ld b, 8
|
||||
bootdrh2:
|
||||
sla d
|
||||
rla
|
||||
cp e
|
||||
jr c, $+4
|
||||
sub e
|
||||
inc d
|
||||
djnz bootdrh2
|
||||
ld a,d ; end of the division the quotiant in A
|
||||
ret ; return it
|
||||
;
|
||||
; HARD DRIVE(S) - Legacy (from CBIOS)
|
||||
bootdrl:
|
||||
ld a,%00100000 ; device parameters (High Capacity)
|
||||
ld (atrmask),a ; mask for device attributes
|
||||
ld (atrcomp),a ; compare to after mask
|
||||
ld hl,EST_HD ; estimate of heap used, for HDD
|
||||
ld (slicmem),hl ; save estmate so heap space can be counted
|
||||
;
|
||||
; count the number of drives matching criteria
|
||||
call bootcnt ; return Drive count in A
|
||||
;
|
||||
; compute Slices per volume from drv count in A
|
||||
call bootdrl1 ; return SPV in A
|
||||
ld (slicec),a ; slice per volume count
|
||||
;
|
||||
; do the drive assignment
|
||||
call bootaddn ; do the drive assignment
|
||||
xor a ; Success
|
||||
ret ; Finished
|
||||
;
|
||||
; Input A contains device count return SPV (slices per volume) in A
|
||||
bootdrl1:
|
||||
ld e,8 ; ASSUME 8 SLICES PER VOLUME
|
||||
dec a ; DEC ACCUM TO CHECK FOR COUNT = 1
|
||||
jr z,bootdrl2 ; YES, SKIP AHEAD TO IMPLEMENT 8 HDSPV
|
||||
ld e,4 ; NOW ASSUME 4 SLICES PER VOLUME
|
||||
dec a ; DEC ACCUM TO CHECK FOR COUNT = 2
|
||||
jr z,bootdrl2 ; YES, SKIP AHEAD TO IMPLEMENT 4 HDSPV
|
||||
ld e,2 ; IN ALL OTHER CASES, WE USE 2 HDSPV
|
||||
bootdrl2:
|
||||
ld a,e
|
||||
ret
|
||||
;
|
||||
; -------------------------------------------------
|
||||
; Memory allocation estimates for each device type
|
||||
;
|
||||
SIZ_DBUF .EQU 128 ; actual size of directory buffer
|
||||
SIZ_DPH .EQU 20 ; actual size of a DPH structure
|
||||
SIZ_DMAP .EQU 4 ; actual bytes per drvmap entry
|
||||
;
|
||||
EST_FIXED .EQU SIZ_DPH+SIZ_DMAP ; overhead for all assignments
|
||||
;
|
||||
EST_MD .EQU EST_FIXED + 24 ; estimated size for ram/rom
|
||||
EST_FD .EQU EST_FIXED + 192 ; estimated size for floppy
|
||||
EST_HD .EQU EST_FIXED + 256 ; estimated size hdd (CKS/ALS)
|
||||
;
|
||||
; -------------------------------------------------
|
||||
; /B=XXX - General Purpose Functions
|
||||
;
|
||||
; Determine Slice Estimate for Unit in A reg
|
||||
; storing estimate in (slicmem), and DE
|
||||
;
|
||||
bootdest:
|
||||
; is it assigned
|
||||
ld c,a ; store unit (passed in A) for hbios call
|
||||
ld de,SIZ_DMAP ; assume unassigned, 4 bytes for drvmap
|
||||
cp $FF ; unassigned?
|
||||
jr z,bootdest2 ; finished at this point.
|
||||
; check for UNA mode, before calling HBIOS
|
||||
ld a,(unamod) ; get UNA mode flag, and set Flags
|
||||
or a ; if UNA Mode then dont do hbios lookup
|
||||
jr nz,bootdest1 ; use worst case scenario (future una call)
|
||||
; determine device type by hbios lookup
|
||||
ld b,BF_DIODEVICE ; get device info
|
||||
rst 08 ; Note C was set above
|
||||
; now work out the bytes to allocate
|
||||
ld a,d ; device type to A
|
||||
ld de,EST_MD ; assume md size
|
||||
cp DIODEV_MD ; ram/rom MD device
|
||||
jr z,bootdest2 ; finished at this point
|
||||
ld de,EST_FD ; assume floppy
|
||||
cp DIODEV_FD ; floppy device
|
||||
jr z,bootdest2 ; finished at this point
|
||||
bootdest1:
|
||||
ld de,EST_HD ; otherwise assume HD
|
||||
bootdest2:
|
||||
ld (slicmem),de
|
||||
ret
|
||||
;
|
||||
; Count Number of Devices
|
||||
; (atrmask) mask the device attribtes
|
||||
; (atrcomp) compare to set zero flag
|
||||
; return A number of drives mathing the attributes
|
||||
bootcnt:
|
||||
; loop thru hbios units looking for device type/unit match
|
||||
ld bc,BC_SYSGET_DIOCNT ; hbios func: sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
ld b,e ; use device count for loop count
|
||||
ld c,0 ; use C for device index C = 0
|
||||
ld l,0 ; will contain the drive count
|
||||
bootcnt1:
|
||||
call bootmat ; perform the match on device C, Z if match
|
||||
jr nz,bootcnt2 ; not matching, skip and continue loop
|
||||
inc l ; same so incrment the counter
|
||||
bootcnt2:
|
||||
inc c ; next drive letter
|
||||
djnz bootcnt1 ; loop
|
||||
ld a,l ; return the count in A register
|
||||
or a ; ensure registers are set correctly
|
||||
ret ; Finished
|
||||
;
|
||||
; Loop though all devices add a single slice based on device attributes
|
||||
; See method below for documentation. Noting (slice) is defaulted to 1
|
||||
bootadds
|
||||
ld a,1
|
||||
ld (slicec),a
|
||||
; fall through to bootaddn
|
||||
;
|
||||
; Loop though all devices add N slice(s) based on device attributes
|
||||
; (atrmask) mask the device attribtes
|
||||
; (atrcomp) compare to set zero flag
|
||||
; (slicec) number of slices
|
||||
; return C flag
|
||||
; C have expended all drives
|
||||
; NC still can continue to allocate
|
||||
; Z otherwise successfully completed
|
||||
bootaddn
|
||||
; loop thru hbios units looking for device type/unit match
|
||||
ld bc,BC_SYSGET_DIOCNT ; hbios func: sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
ld b,e ; use device count for loop count
|
||||
ld c,0 ; use C for device index C = 0
|
||||
bootaddn1:
|
||||
call bootmat ; perform the match on device C, Z if match
|
||||
jr nz,bootaddn4 ; not same skip volume, continue loop
|
||||
; save the disk unit
|
||||
ld a,c ; get the unit id back into A
|
||||
ld (unit),a ; unit to add, if we add it.
|
||||
; setup inner loop
|
||||
push bc ; save loop control for outer loop
|
||||
ld a,(slicec) ; count of slices to assign
|
||||
ld b,a ; use device count for loop count
|
||||
ld c,0 ; use C for slice index slice = 0
|
||||
bootaddn2:
|
||||
; entering here C contains updated slice
|
||||
ld a,c ; slice number
|
||||
ld (slice),a ; slice number
|
||||
; assign the slice and loop
|
||||
push bc ; save loop control
|
||||
call bootadd ; add the slice
|
||||
pop bc ; restore loop
|
||||
jr c,bootaddn3 ; if bootadd, ran out of drives to allocate
|
||||
inc c ; next slice
|
||||
djnz bootaddn2 ; inner loop
|
||||
bootaddn3:
|
||||
; finish inner loop for next disk unit
|
||||
pop bc ; restore loop control for outer
|
||||
ret c ; return if no drives left to allocate
|
||||
bootaddn4:
|
||||
; continue looping to next unit
|
||||
inc c ; next device
|
||||
djnz bootaddn1 ; outer loop
|
||||
xor a ; success
|
||||
ret ; Finished
|
||||
;
|
||||
; Add a Single Drive.
|
||||
; based on (unit) and (slice) variables
|
||||
; This routine will skip if drive already assigned
|
||||
; return C flag
|
||||
; C have expended all drives
|
||||
; NC still can continue to allocate
|
||||
bootadd:
|
||||
; check we are not already past last (P:) drive
|
||||
ld hl,dstdrv ; destination drive
|
||||
ld a,15
|
||||
cp (hl) ; C set if >= 16
|
||||
ret c ; Return with carry, cannot assign.
|
||||
; do we need to perform duplicate check
|
||||
ld a,(dstdrv) ; next destination drive to map, could be A: (=0)
|
||||
or a ; is it A:
|
||||
jr z,bootadd1 ; nothing to check we are assigning the A: drive
|
||||
; perform duplicate check before assignment
|
||||
ld b,a ; B number of entries to check
|
||||
ld hl,mapwrk ; HL point to working drive map table to compare to
|
||||
ld de,unit ; DE comparison, unit/slice are ordered (psudo mapwrk entry)
|
||||
call valid3 ; perform a duplicate check (REUSED)
|
||||
jr z,bootinc1 ; Z - found a duplicate, exit out
|
||||
;
|
||||
bootadd1:
|
||||
; check we have enough heap to allocate
|
||||
ld hl,(heaprem) ; remaing heap estimate
|
||||
ld de,(slicmem) ; memory alloc per drive
|
||||
or a ; clear carry
|
||||
sbc hl,de ; subtract slice from heap estimate
|
||||
ret c ; overflow (not enough heap) so abort
|
||||
ld (heaprem),hl ; update estimate based on sub of mem
|
||||
; actually assign it.
|
||||
ld hl,(mapadr) ; address of next map entry in table
|
||||
ld a,(unit) ; the unit number
|
||||
ld (hl), a ; write unit number to Table
|
||||
inc hl
|
||||
ld a,(slice) ; the slice
|
||||
ld (hl), a ; write slice to the table
|
||||
; show the new assignment
|
||||
push bc
|
||||
push de
|
||||
ld a,(dstdrv) ; destination drive
|
||||
call showone ; show it's new value
|
||||
pop de
|
||||
pop bc
|
||||
; signal the change has occured
|
||||
ld hl,modcnt ; point to mod count
|
||||
inc (hl) ; increment it
|
||||
; fall through to bootinc and inc target drive
|
||||
;
|
||||
; Increment to the next drive (A-P)
|
||||
; return C flag
|
||||
; C have expended all drives
|
||||
; NC still can continue to allocate
|
||||
bootinc:
|
||||
; check we are not already past last (P:) drive
|
||||
ld hl,dstdrv ; destination drive
|
||||
ld a,15
|
||||
cp (hl) ; C set if >= 16
|
||||
ret c ; Return with carry, cannot increment.
|
||||
; actually increment it
|
||||
inc (hl) ; increment destination drive (A-P)
|
||||
ld hl,(mapadr) ; address in working assignment table (mapwrk)
|
||||
ld bc,4
|
||||
add hl,bc
|
||||
ld (mapadr),hl ; move address to next location in map
|
||||
bootinc1:
|
||||
ld hl,dstdrv ; destination drive
|
||||
ld a,15
|
||||
cp (hl) ; C set if >= 16
|
||||
ret
|
||||
;
|
||||
; Does Disk Unit Meet matching Criteria
|
||||
; pass in C which is the unit, ret Z if matching:
|
||||
; * (atrmask) mask the device attribtes
|
||||
; * (atrcomp) compare to set zero flag
|
||||
; registers BC DE HL are preserved
|
||||
bootmat:
|
||||
push hl
|
||||
push de
|
||||
push bc ; preserve
|
||||
; get the disk unit attributes
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice C:= DISK UNIT
|
||||
rst 08 ; call hbios, C := device attributes
|
||||
; do the attribute comparison
|
||||
ld a,(atrmask) ; attribute bit mask
|
||||
and c ; mask with device attributes from hbios
|
||||
ld c,a ; move value back to c
|
||||
ld a,(atrcomp) ; value parameter to compare with
|
||||
cp c ; do the comparison : Z if matching
|
||||
jr nz,bootmat3 ; not matching, just return, NZ go no further
|
||||
; Attributes match - did caller request high capacity device
|
||||
bit 5,a ; high capacity flag passed in (atrcomp)
|
||||
jr NZ,bootmat1 ; IF hig capacity, test if hd is onlne
|
||||
; Attributes match - but NOT high capacity
|
||||
xor a ; Result = Z
|
||||
jr bootmat3 ; and return
|
||||
bootmat1:
|
||||
; Attributes match - and IS high capacity
|
||||
pop bc ; get C para back (unit)
|
||||
push bc
|
||||
; Sense Media
|
||||
ld b,BF_DIOMEDIA ; HBIOS FUNC: SENSE MEDIA
|
||||
ld e,1 ; PERFORM MEDIA DISCOVERY
|
||||
rst 08 ; DO IT
|
||||
; returns NZ if error (no media), and Z if no error (media detected)
|
||||
; can just return this flag
|
||||
bootmat3:
|
||||
pop bc
|
||||
pop de
|
||||
pop hl ; restore and return
|
||||
ret
|
||||
;
|
||||
; ----------------------------------------------------------------
|
||||
;
|
||||
; Install the new drive map into CBIOS
|
||||
;
|
||||
install:
|
||||
@@ -1054,7 +546,7 @@ install3:
|
||||
ld (heaptop),de ; DE has next byte available
|
||||
;
|
||||
; allocate directory buffer
|
||||
ld hl,SIZ_DBUF ; size of directory buffer
|
||||
ld hl,128 ; size of directory buffer
|
||||
call alloc ; allocate the space
|
||||
jp c,instovf ; handle overflow error
|
||||
ld (dirbuf),hl ; ... and save in dirbuf
|
||||
@@ -1082,7 +574,8 @@ dph_init2:
|
||||
ld a,(hl) ; unit to A
|
||||
push bc ; save loop control
|
||||
push hl ; save drive map pointer
|
||||
ld hl,SIZ_DPH ; size of a DPH structure
|
||||
;ld hl,16 ; size of a DPH structure
|
||||
ld hl,20 ; size of a DPH structure
|
||||
call alloc ; allocate space for dph
|
||||
jp c,instovf ; handle overflow error
|
||||
push hl ; save DPH location
|
||||
@@ -1114,15 +607,9 @@ dph_init3:
|
||||
call prtdecw ; print it
|
||||
ld de,msgmem ; add description
|
||||
call prtstr ; and print it
|
||||
;
|
||||
#if 0
|
||||
call crlf
|
||||
ld bc,(heaprem)
|
||||
call prthexword
|
||||
#endif
|
||||
;
|
||||
call drvrst ; perform BDOS drive reset
|
||||
;
|
||||
;
|
||||
xor a ; signal success
|
||||
ret ; done
|
||||
;
|
||||
@@ -1166,25 +653,25 @@ makdphuna1: ; handle ram/rom
|
||||
makdphwbw: ; determine appropriate dpb (WBW mode, unit number in A)
|
||||
;
|
||||
ld c,a ; unit number to C
|
||||
ld b,BF_DIODEVICE ; HBIOS: Report Device Info
|
||||
ld b,$17 ; HBIOS: Report Device Info
|
||||
rst 08 ; call HBIOS, return w/ device type in D, physical unit in E
|
||||
ld a,d ; device type to A
|
||||
cp DIODEV_MD ; ram/rom?
|
||||
cp $00 ; ram/rom?
|
||||
jr nz,makdph00 ; if not, skip ahead to other types
|
||||
ld a,e ; physical unit number to A
|
||||
ld e,MID_MDROM ; assume rom
|
||||
ld e,1 ; assume rom
|
||||
cp $01 ; rom?
|
||||
jr z,makdph0 ; yes, jump ahead
|
||||
ld e,MID_MDRAM ; otherwise ram
|
||||
ld e,2 ; otherwise ram
|
||||
jr makdph0 ; jump ahead
|
||||
makdph00:
|
||||
ld e,MID_FD144 ; assume floppy
|
||||
cp DIODEV_FD ; floppy?
|
||||
makdph00:
|
||||
ld e,6 ; assume floppy
|
||||
cp $01 ; floppy?
|
||||
jr z,makdph0 ; yes, jump ahead
|
||||
ld e,MID_RF ; assume ram floppy
|
||||
cp DIODEV_RF ; ram floppy?
|
||||
ld e,3 ; assume ram floppy
|
||||
cp $02 ; ram floppy?
|
||||
jr z,makdph0 ; yes, jump ahead
|
||||
ld e,MID_HD ; everything else is assumed to be hard disk
|
||||
ld e,4 ; everything else is assumed to be hard disk
|
||||
jr makdph0 ; yes, jump ahead
|
||||
;
|
||||
makdph0:
|
||||
@@ -1202,7 +689,7 @@ makdph1:
|
||||
pop hl ; hl := start of dph
|
||||
ld a,8 ; size of dph reserved area
|
||||
call addhl ; leave it alone (zero filled)
|
||||
;
|
||||
;
|
||||
ld bc,(dirbuf) ; address of dirbuf
|
||||
ld (hl),c ; plug dirbuf
|
||||
inc hl ; ... into dph
|
||||
@@ -1229,7 +716,7 @@ makdph2:
|
||||
;
|
||||
; HL := alloc size, DE bumped
|
||||
ex de,hl
|
||||
ld e,(hl) ; get size to allocate
|
||||
ld e,(hl) ; get size to allocate
|
||||
inc hl ; ...
|
||||
ld d,(hl) ; ... into HL
|
||||
inc hl ; and bump DE
|
||||
@@ -1243,7 +730,7 @@ makdph2:
|
||||
; allocate memory
|
||||
call alloc ; do the allocation
|
||||
jp c,instovf ; bail out on overflow
|
||||
|
||||
|
||||
makdph3:
|
||||
; swap hl and bc
|
||||
push bc ; bc -> (sp)
|
||||
@@ -1254,7 +741,7 @@ makdph3:
|
||||
ld (hl),c ; save cks/als buf
|
||||
inc hl ; ... address in
|
||||
ld (hl),b ; ... dph and bump
|
||||
inc hl ; ... to next dph entry
|
||||
inc hl ; ... to next dph entry
|
||||
xor a ; signal success
|
||||
ret
|
||||
;
|
||||
@@ -1264,7 +751,7 @@ instcpm3:
|
||||
; swicth to sysbnk
|
||||
ld a,($FFE0) ; get current bank
|
||||
push af ; save it
|
||||
ld bc,BC_SYSGET_BNKINFO ; HBIOS Get Bank Info
|
||||
ld bc,$F8F2 ; HBIOS Get Bank Info
|
||||
rst 08 ; call HBIOS, E=User Bank
|
||||
ld a,e ; HBIOS User Bank
|
||||
call $FFF3 ; HBIOS BNKSEL
|
||||
@@ -1276,7 +763,8 @@ instcpm3:
|
||||
ld h,(hl) ; ...
|
||||
ld l,a ; ...
|
||||
ld (dphadr),hl ; save starting dphadr
|
||||
|
||||
|
||||
|
||||
ld hl,(drvtbl) ; get drive table in HL
|
||||
ld de,mapwrk ; DE := working drive map
|
||||
ld b,16
|
||||
@@ -1295,7 +783,7 @@ instc1:
|
||||
inc de ; ...
|
||||
jr instc3 ; resume loop without copy
|
||||
;
|
||||
instc2:
|
||||
instc2:
|
||||
push hl ; save drvtbl entry adr
|
||||
push de ; save mapwrk entry adr
|
||||
ld de,(dphadr) ; get cur dph adr
|
||||
@@ -1377,15 +865,15 @@ alloc:
|
||||
ex de,hl ; de=new heaptop, hl=heaplim
|
||||
sbc hl,de ; heaplim - heaptop
|
||||
jr c,allocx ; c set on overflow error
|
||||
; allocation succeeded, commit new heaptop
|
||||
; allocation succeeded, commit new heaptop
|
||||
ld (heaptop),de ; save new heaptop
|
||||
allocx:
|
||||
allocx:
|
||||
pop hl ; return value to hl
|
||||
pop de ; recover de
|
||||
ret
|
||||
;
|
||||
; Scan drive map table for integrity
|
||||
; Currently just checks for multiple drive
|
||||
; Currently just checks for multiple drive
|
||||
; letters referencing a single file system
|
||||
;
|
||||
valid:
|
||||
@@ -1417,14 +905,6 @@ valid2: ; setup for inner loop
|
||||
call addhl ; point to entry following
|
||||
pop de ; de points to comparison entry
|
||||
;
|
||||
; Scan for a match in (mapwrk)
|
||||
; The following comparison code is called elsewhere, not just from above
|
||||
; (please respect the contract)
|
||||
; hl : pointer to start of items to scan check in map
|
||||
; de is the invarient (fixed) entry in the table to compare against
|
||||
; b : is the number of items to check
|
||||
; return Z - Found a duplicate comparison=0
|
||||
; return NZ - No Matches found (a=$ff)
|
||||
valid3: ; inner loop
|
||||
; bypass unassigned drives (only need to test 1)
|
||||
ld a,(hl) ; get first drive unit in A
|
||||
@@ -1501,7 +981,7 @@ drvswap:
|
||||
ld a,(srcdrv) ; get the source drive
|
||||
call chkdrv ; valid drive?
|
||||
ret nz ; abort if not
|
||||
ld hl,(drives) ; load source/dest in HL
|
||||
ld hl,(drives) ; load source/dest in DE
|
||||
ld a,h ; put source drive num in a
|
||||
cp l ; compare to the dest drive num
|
||||
jp z,errswp ; Invalid swap request, src == dest
|
||||
@@ -1521,7 +1001,7 @@ drvswap:
|
||||
rlca
|
||||
call addhl
|
||||
ld (dstptr),hl
|
||||
;
|
||||
;
|
||||
; 1) dest -> temp
|
||||
ld hl,(dstptr)
|
||||
ld de,tmpent
|
||||
@@ -1584,19 +1064,20 @@ drvmap1: ; loop through device table looking for a match
|
||||
djnz drvmap1 ; and loop
|
||||
jp errdev
|
||||
;
|
||||
drvmap2:
|
||||
drvmap2:
|
||||
; convert index to device type id
|
||||
ld a,c ; index to accum
|
||||
ld (device),a ; save as device id
|
||||
;
|
||||
; loop thru hbios units looking for device type/unit match
|
||||
ld bc,BC_SYSGET_DIOCNT ; hbios func: sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
ld b,$F8 ; hbios func: sysget
|
||||
ld c,$10 ; sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
ld b,e ; use device count for loop count
|
||||
ld c,0 ; use C for device index
|
||||
drvmap3:
|
||||
push bc ; preserve loop control
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice
|
||||
ld b,$17 ; hbios func: diodevice
|
||||
rst 08 ; call hbios, D := device, E := unit
|
||||
pop bc ; restore loop control
|
||||
ld a,(device)
|
||||
@@ -1618,7 +1099,7 @@ drvmap5:
|
||||
call chkdev ; check validity
|
||||
pop bc ; restore unit
|
||||
ret nz ; bail out on error
|
||||
|
||||
|
||||
; resolve the CBIOS DPH table entry
|
||||
ld a,(dstdrv) ; dest drv num to A
|
||||
call chkdrv ; valid drive?
|
||||
@@ -1725,12 +1206,12 @@ showall:
|
||||
ld b,16 ; 16 drives possible
|
||||
ld c,0 ; map index (drive letter)
|
||||
;
|
||||
; ld a,b ; load count
|
||||
; or $FF ; signal no action
|
||||
; ret z ; bail out if zero
|
||||
ld a,b ; load count
|
||||
or $FF ; signal no action
|
||||
ret z ; bail out if zero
|
||||
;
|
||||
showall1: ; loop
|
||||
; ld a,c ;
|
||||
ld a,c ;
|
||||
push bc ; save loop control
|
||||
call showass
|
||||
pop bc ; restore loop control
|
||||
@@ -1745,9 +1226,8 @@ showall1: ; loop
|
||||
showass:
|
||||
;
|
||||
; setup HL to point to desired entry in table
|
||||
; ld c,a ; save incoming drive in C
|
||||
ld c,a ; save incoming drive in C
|
||||
ld hl,mapwrk ; HL = address of drive map
|
||||
ld a,c
|
||||
rlca
|
||||
rlca
|
||||
call addhl ; HL = address of drive map table entry
|
||||
@@ -1821,7 +1301,7 @@ prtdev:
|
||||
or a ; set flags
|
||||
ld a,e ; put device num back
|
||||
jr nz,prtdevu ; print device in UNA mode
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice
|
||||
ld b,$17 ; hbios func: diodevice
|
||||
ld c,a ; unit to C
|
||||
rst 08 ; call hbios, D := device, E := unit
|
||||
push de ; save results
|
||||
@@ -1846,7 +1326,7 @@ prtdevu:
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
;
|
||||
;
|
||||
; UNA mode version of print device
|
||||
ld b,a ; B := unit num
|
||||
push bc ; save for later
|
||||
@@ -1909,14 +1389,15 @@ chkdrv:
|
||||
;
|
||||
chkdev: ; HBIOS variant
|
||||
push af ; save incoming unit
|
||||
ld bc,BC_SYSGET_DIOCNT ; hbios func: sysget subfunc: diocnt
|
||||
ld b,$F8 ; hbios func: sysget
|
||||
ld c,$10 ; sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
pop af ; restore incoming unit
|
||||
cp e ; compare to unit count
|
||||
jp nc,errdev ; if too high, error
|
||||
;
|
||||
; get device/unit info
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice
|
||||
ld b,$17 ; hbios func: diodevice
|
||||
ld c,a ; unit to C
|
||||
rst 08 ; call hbios, C := device attributes
|
||||
;
|
||||
@@ -1995,7 +1476,7 @@ prtstr1:
|
||||
;
|
||||
prtstr2:
|
||||
pop de ; restore registers
|
||||
ret
|
||||
ret
|
||||
;
|
||||
; Print the value in A in hex without destroying any registers
|
||||
;
|
||||
@@ -2018,7 +1499,7 @@ prthexword:
|
||||
ld a,b
|
||||
call prthex
|
||||
ld a,c
|
||||
call prthex
|
||||
call prthex
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
@@ -2042,9 +1523,9 @@ hexascii:
|
||||
hexconv:
|
||||
and $0F ; low nibble only
|
||||
add a,$90
|
||||
daa
|
||||
daa
|
||||
adc a,$40
|
||||
daa
|
||||
daa
|
||||
ret
|
||||
;
|
||||
; Print value of A or HL in decimal with leading zero suppression
|
||||
@@ -2390,27 +1871,19 @@ drives:
|
||||
dstdrv .db 0 ; destination drive
|
||||
srcdrv .db 0 ; source drive
|
||||
device .db 0 ; source device
|
||||
; note (unit and slice) need to be kept ordered since they are used
|
||||
; in code forming a temp table entry (comparison purposes). See bootadd:
|
||||
unit .db 0 ; source unit
|
||||
slice .db 0 ; source slice
|
||||
;
|
||||
atrmask .db 0 ; device attributes mask before compare
|
||||
atrcomp .db 0 ; device attributes compare to
|
||||
slicec .db 1 ; number of slices to assign for each volume
|
||||
slicmem .dw 280 ; memory to allocate to next slice assigment
|
||||
;
|
||||
unamod .db 0 ; $FF indicates UNA UBIOS active
|
||||
modcnt .db 0 ; count of drive map modifications
|
||||
;
|
||||
srcptr .dw 0 ; source pointer for copy
|
||||
dstptr .dw 0 ; destination pointer for copy
|
||||
tmpent .fill 4,0 ; space to save a table entry
|
||||
tmpstr .fill 17,0 ; temporary string of up to 16 chars, zero term
|
||||
tmpstr .fill 9,0 ; temporary string of up to 8 chars, zero term
|
||||
;
|
||||
heaptop .dw 0 ; current address of top of heap memory
|
||||
heaplim .dw 0 ; heap limit address
|
||||
heaprem .dw $7FFF ; estimate of heap remaining, (before allocate)
|
||||
;
|
||||
dirbuf .dw 0 ; directory buffer location
|
||||
;
|
||||
@@ -2420,7 +1893,6 @@ scbop .db $FF ; set a byte
|
||||
scbval .dw $FF ; value to set
|
||||
;
|
||||
mapwrk .fill (4 * 16),$FF ; working copy of drive map
|
||||
mapadr .dw mapwrk ; working pointer into mapwrk used by /B=
|
||||
;
|
||||
devtbl: ; device table
|
||||
.dw dev00, dev01, dev02, dev03
|
||||
@@ -2464,19 +1936,17 @@ stack .equ $ ; stack top
|
||||
; Messages
|
||||
;
|
||||
indent .db " ",0
|
||||
msgban1 .db "ASSIGN v2.0 for RomWBW CP/M ",0
|
||||
msgban1 .db "ASSIGN v1.8 for RomWBW CP/M ",0
|
||||
msg22 .db "2.2",0
|
||||
msg3 .db "3",0
|
||||
msbban2 .db ", 21-Dec-2024",0
|
||||
msbban2 .db ", 13-Oct-2023",0
|
||||
msghb .db " (HBIOS Mode)",0
|
||||
msgub .db " (UBIOS Mode)",0
|
||||
msgban3 .db "Copyright 2024, Wayne Warthen, GNU GPL v3",0
|
||||
msgban3 .db "Copyright 2023, Wayne Warthen, GNU GPL v3",0
|
||||
msguse .db "Usage: ASSIGN D:[=[{D:|<device>[<unitnum>]:[<slicenum>]}]][,...]",13,10
|
||||
.db " ex. ASSIGN (display all active assignments)",13,10
|
||||
.db " ASSIGN /? (display version and usage)",13,10
|
||||
.db " ASSIGN /L (display all possible devices)",13,10
|
||||
.db " ASSIGN /B=OPTS (perform assignment based on options)",13,10
|
||||
.db " ASSIGN C: (display assignment for C:)",13,10
|
||||
.db " ASSIGN C:=D: (swaps C: and D:)",13,10
|
||||
.db " ASSIGN C:=FD0: (assign C: to floppy unit 0)",13,10
|
||||
.db " ASSIGN C:=IDE0:1 (assign C: to IDE unit0, slice 1)",13,10
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
set TOOLS=../../../Tools
|
||||
set PATH=%TOOLS%\tasm32;%PATH%
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
tasm -t80 -g3 -fFF copysl.asm copysl.com copysl.lst || exit /b
|
||||
:: copysl.com is currently distributed as a binary application, so
|
||||
:: it is not built here.
|
||||
|
||||
copy /Y copysl.com ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y copysl.doc ..\..\..\Binary\Apps\ || exit /b
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if exist *.com del *.com
|
||||
if exist *.lst del *.lst
|
||||
if exist *.bin del *.bin
|
||||
:: copysl.com is currently distributed as a binary application, so
|
||||
:: we do not delete the .COM file.
|
||||
@@ -1,9 +1,7 @@
|
||||
OBJECTS = copysl.com
|
||||
NODELETE = $(OBJECTS)
|
||||
DOCS = copysl.doc
|
||||
DEST = ../../../Binary/Apps
|
||||
DOCDEST = ../../../Binary/Apps
|
||||
TOOLS =../../../Tools
|
||||
|
||||
USETASM=1
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
TOOLS=../../../Tools
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
;
|
||||
bdos .EQU 5
|
||||
;
|
||||
; Force BDOS to reset (logout) all drives
|
||||
;
|
||||
drvrst:
|
||||
ld c,$0D ; BDOS Reset Disk function
|
||||
call bdos ; do it
|
||||
;
|
||||
ld c,$25 ; BDOS Reset Multiple Drives
|
||||
ld de,$FFFF ; all drives
|
||||
call bdos ; do it
|
||||
;
|
||||
xor a ; signal success
|
||||
ret
|
||||
;
|
||||
@@ -1,328 +0,0 @@
|
||||
|
||||
BDOS .EQU 5
|
||||
|
||||
; bdos commands
|
||||
CONIN .EQU 1
|
||||
CONOUT .EQU 2
|
||||
DIRCONIO .EQU 6
|
||||
|
||||
; TODO for more routines see assign.asm
|
||||
|
||||
; ===============
|
||||
; INPUT
|
||||
|
||||
; Console Input
|
||||
getchr:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD C,CONIN
|
||||
CALL BDOS
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
RET
|
||||
|
||||
; direct console io
|
||||
; BDOS 6 - FF FE FD - commands
|
||||
conread:
|
||||
RET
|
||||
constatus:
|
||||
RET
|
||||
coninput:
|
||||
RET
|
||||
|
||||
; =======================================
|
||||
; STANDARD OUTPUT
|
||||
|
||||
;
|
||||
; Print character in A without destroying any registers
|
||||
;
|
||||
prtchr:
|
||||
; PUSH AF
|
||||
PUSH HL ; We must preserve HL, as the BDOS call sets it
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
LD C, CONOUT
|
||||
LD E, A
|
||||
CALL BDOS
|
||||
POP DE
|
||||
POP BC
|
||||
POP HL
|
||||
; POP AF
|
||||
RET
|
||||
;
|
||||
prtdot:
|
||||
push af
|
||||
ld a, '.'
|
||||
call prtchr
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
; Print a zero terminated string at (HL) without destroying any registers
|
||||
;
|
||||
prtstr:
|
||||
PUSH AF
|
||||
PUSH BC
|
||||
push de
|
||||
prtstr1:
|
||||
ld a,(hl)
|
||||
or 0
|
||||
jr z,prtstr2
|
||||
ld c, CONOUT
|
||||
ld e,a
|
||||
push hl
|
||||
call BDOS
|
||||
pop hl
|
||||
inc hl
|
||||
jr prtstr1
|
||||
prtstr2:
|
||||
pop de
|
||||
pop bc
|
||||
pop af
|
||||
ret
|
||||
|
||||
;
|
||||
; Print the value in A in hex without destroying any registers
|
||||
;
|
||||
prthex:
|
||||
push af ; save AF
|
||||
push de ; save DE
|
||||
call hexascii ; convert value in A to hex chars in DE
|
||||
ld a,d ; get the high order hex char
|
||||
call prtchr ; print it
|
||||
ld a,e ; get the low order hex char
|
||||
call prtchr ; print it
|
||||
pop de ; restore DE
|
||||
pop af ; restore AF
|
||||
ret ; done
|
||||
|
||||
;
|
||||
; print the hex word value in bc
|
||||
;
|
||||
prthexword:
|
||||
push af
|
||||
ld a,b
|
||||
call prthex
|
||||
ld a,c
|
||||
call prthex
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
; Convert binary value in A to ascii hex characters in DE
|
||||
;
|
||||
hexascii:
|
||||
ld d,a ; save A in D
|
||||
call hexconv ; convert low nibble of A to hex
|
||||
ld e,a ; save it in E
|
||||
ld a,d ; get original value back
|
||||
rlca ; rotate high order nibble to low bits
|
||||
rlca
|
||||
rlca
|
||||
rlca
|
||||
call hexconv ; convert nibble
|
||||
ld d,a ; save it in D
|
||||
ret ; done
|
||||
;
|
||||
; Convert low nibble of A to ascii hex
|
||||
;
|
||||
hexconv:
|
||||
and 0Fh ; low nibble only
|
||||
add a,90h
|
||||
daa
|
||||
adc a,40h
|
||||
daa
|
||||
ret
|
||||
;
|
||||
; Print the decimal value of A, with leading zero suppression
|
||||
;
|
||||
prtdec:
|
||||
push hl
|
||||
ld h,0
|
||||
ld l,a
|
||||
call prtdecword ; print it
|
||||
pop hl
|
||||
ret
|
||||
;
|
||||
; Print the Decimal value (word) in HL
|
||||
;
|
||||
prtdecword:
|
||||
push af
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
call prtdec0
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
prtdec0:
|
||||
ld e,'0'
|
||||
ld bc,-10000
|
||||
call prtdec1
|
||||
ld bc,-1000
|
||||
call prtdec1
|
||||
ld bc,-100
|
||||
call prtdec1
|
||||
ld c,-10
|
||||
call prtdec1
|
||||
ld e,0
|
||||
ld c,-1
|
||||
prtdec1:
|
||||
ld a,'0' - 1
|
||||
prtdec2:
|
||||
inc a
|
||||
add hl,bc
|
||||
jr c,prtdec2
|
||||
sbc hl,bc
|
||||
cp e
|
||||
ret z
|
||||
ld e,0
|
||||
call prtchr
|
||||
ret
|
||||
;
|
||||
; Print a byte buffer in hex pointed to by DE
|
||||
; Register A has size of buffer
|
||||
;
|
||||
prthexbuf:
|
||||
or a
|
||||
ret z ; empty buffer
|
||||
prthexbuf1:
|
||||
ld a,' '
|
||||
call prtchr
|
||||
ld a,(de)
|
||||
call prthex
|
||||
inc de
|
||||
djnz prthexbuf1
|
||||
ret
|
||||
;
|
||||
; Start a new Line
|
||||
;
|
||||
prtcrlf2:
|
||||
call prtcrlf
|
||||
prtcrlf:
|
||||
push hl
|
||||
ld hl, prtcrlf_msg
|
||||
call prtstr
|
||||
pop hl
|
||||
ret
|
||||
prtcrlf_msg:
|
||||
.DB 13,10,0
|
||||
|
||||
; =================================
|
||||
; following is from dmamon util.asm
|
||||
;
|
||||
; IMMEDIATE PRINT
|
||||
; =================================
|
||||
;
|
||||
; PRINT A CHARACTER REFERENCED BY POINTER AT TOP OF STACK
|
||||
; USAGE:
|
||||
; CALL IPRTCHR
|
||||
; .DB 'X'
|
||||
;
|
||||
iprtchr:
|
||||
EX (SP),HL
|
||||
PUSH AF
|
||||
LD A,(HL)
|
||||
CALL prtchr
|
||||
POP AF
|
||||
INC HL
|
||||
EX (SP),HL
|
||||
RET
|
||||
|
||||
; Print a string referenced by pointer at top of stack
|
||||
; Usage
|
||||
; call iprtstr
|
||||
; .DB "text", 0
|
||||
;
|
||||
iprtstr:
|
||||
EX (SP),HL
|
||||
CALL prtstr
|
||||
INC HL
|
||||
EX (SP),HL
|
||||
RET
|
||||
;
|
||||
; ===========================================================
|
||||
;
|
||||
; Following is for INPUT, used to process command line args
|
||||
;
|
||||
; ===========================================================
|
||||
;
|
||||
; Skip whitespace at buffer adr in DE, returns with first
|
||||
; non-whitespace character in A.
|
||||
;
|
||||
skipws:
|
||||
ld a,(hl) ; get next char
|
||||
or a ; check for eol
|
||||
ret z ; done if so
|
||||
cp ' ' ; blank?
|
||||
ret nz ; nope, done
|
||||
inc hl ; bump buffer pointer
|
||||
jr skipws ; and loop
|
||||
|
||||
;
|
||||
; Uppercase character in A
|
||||
;
|
||||
upcase:
|
||||
cp 'a' ; below 'a'?
|
||||
ret c ; if so, nothing to do
|
||||
cp 'z'+1 ; above 'z'?
|
||||
ret nc ; if so, nothing to do
|
||||
and ~020h ; convert character to lower
|
||||
ret ; done
|
||||
|
||||
;
|
||||
; Get numeric chars at HL and convert to number returned in A
|
||||
; Carry flag set on overflow
|
||||
; C is used as a working register
|
||||
;
|
||||
getnum:
|
||||
ld c,0 ; C is working register
|
||||
|
||||
getnum1:
|
||||
ld a,(hl) ; get the active char
|
||||
cp '0' ; compare to ascii '0'
|
||||
jr c,getnum2 ; abort if below
|
||||
cp '9' + 1 ; compare to ascii '9'
|
||||
jr nc,getnum2 ; abort if above
|
||||
;
|
||||
ld a,c ; get working value to A
|
||||
rlca ; multiply by 10
|
||||
ret c ; overflow, return with carry set
|
||||
rlca ; ...
|
||||
ret c ; overflow, return with carry set
|
||||
add a,c ; ...
|
||||
ret c ; overflow, return with carry set
|
||||
rlca ; ...
|
||||
ret c ; overflow, return with carry set
|
||||
ld c,a ; back to C
|
||||
ld a,(hl) ; get new digit
|
||||
sub '0' ; make binary
|
||||
add a,c ; add in working value
|
||||
ret c ; overflow, return with carry set
|
||||
ld c,a ; back to C
|
||||
;
|
||||
inc hl ; bump to next char
|
||||
jr getnum1 ; loop
|
||||
;
|
||||
getnum2:
|
||||
ld a,c ; return result in A
|
||||
or a ; with flags set, CF is cleared
|
||||
ret
|
||||
;
|
||||
; Is character in A numeric? NZ if not
|
||||
;
|
||||
isnum:
|
||||
cp '0' ; compare to ascii '0'
|
||||
jr c,isnum1 ; abort if below
|
||||
cp '9' + 1 ; compare to ascii '9'
|
||||
jr nc,isnum1 ; abort if above
|
||||
cp a ; set Z
|
||||
ret
|
||||
isnum1:
|
||||
or 0FFh ; set NZ
|
||||
ret ; and done
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
BIN
Source/Apps/copysl/copysl.com
Normal file
BIN
Source/Apps/copysl/copysl.com
Normal file
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
==========================================================================
|
||||
CopySlice Utility v0.3 for RomWbW computers
|
||||
written by Mark Pruden (March 2025)
|
||||
CopySlice Utility v0.2 for RomWbW computers
|
||||
written by Mark Pruden (Sept 2024)
|
||||
==========================================================================
|
||||
|
||||
Purpose:
|
||||
@@ -12,37 +12,37 @@ from one disk slice to another slice
|
||||
Background
|
||||
----------
|
||||
|
||||
This tool is only supported by RomWBW HBIOS, it uses HDIOS for all its
|
||||
disk IO. UNA UBIOS is not supported by this tool.
|
||||
This tool is only supported by RomWBW HBIOS, it uses HDIOS for all its
|
||||
disk IO. UNA UBIOS is not supported by this tool.
|
||||
|
||||
This tool is running on CP/M 2.2 or 3.0 and has access to full 64kb of
|
||||
RAM, with a minimum of 48kb TPA
|
||||
|
||||
This tool only works with hard disk devices, other media types like
|
||||
floppy, are not supported at this time. This tool works across different
|
||||
This tool only works with hard disk devices, other media types like
|
||||
floppy, are not supported at this time. This tool works across different
|
||||
hard disk device types, even of different physical type
|
||||
|
||||
Both hd1k and hd512 are fully supported, however copying from one layout
|
||||
Both hd1k and hd512 are fully supported, however copying from one layout
|
||||
type to the other is not supported.
|
||||
|
||||
During operation data is copied in a single read/write pass, data is not
|
||||
During operation data is copied in a single read/write pass, data is not
|
||||
verified by default. If there is a write error, it will be reported, and
|
||||
operation will stop.
|
||||
|
||||
General Usage
|
||||
-------------
|
||||
This tool operates at the disk level via RomWBW, thus all disk identifiers
|
||||
This tool operates at the disk level via RomWBW, thus all disk identifiers
|
||||
are in the RomWBW <disk>.<unit> format
|
||||
|
||||
The syntax (similar to copy) for the command is:
|
||||
|
||||
COPYSL <destunit>[.<slice>]=<srcunit>[.<slice>] [/options]
|
||||
|
||||
|
||||
E.g.
|
||||
|
||||
|
||||
COPYSL 3.3=2.10 /U
|
||||
|
||||
Means copy from slice 10 on disk 2, onto disk 3 slice 3. This is in
|
||||
Means copy from slice 10 on disk 2, onto disk 3 slice 3. This is in
|
||||
unattended mode, so you will not be asked to confirm the copy operation.
|
||||
|
||||
Options
|
||||
@@ -54,40 +54,39 @@ V - Verify. Does an additional read and verify after write.
|
||||
Description
|
||||
-----------
|
||||
|
||||
When run COPYSL will perform command line argument validation and display
|
||||
When run COPYSL will perform command line argument validation and display
|
||||
an error if they are illegal. Also any disk IO errors will cause COPYSL
|
||||
to exit.
|
||||
|
||||
When specifying slice number(s) a check is made that the slice number is
|
||||
valid, i.e. not too large that it would extend past the end of the
|
||||
When specifying slice number(s) a check is made that the slice number is
|
||||
valid, i.e. not too large that it would extend past the end of the
|
||||
partition (hd1k), or the end of the media (hd512). For hd512 a check is
|
||||
also performed to ensure that the slice would not extend into the first
|
||||
also performed to ensure that the slice would not extend into the first
|
||||
defined partition.
|
||||
|
||||
The copy operation will be faster if the source disk has been formatted
|
||||
with the CP/M file system, since during copy the CP/M directory is scanned,
|
||||
and unused blocks are not copied.
|
||||
with the CP/M file system, since during copy the CP/M directory is scanned,
|
||||
and unused blocks are not copied.
|
||||
|
||||
If a filesystem is not found, (or the /F option is chosen) all data is
|
||||
If a filesystem is not found, (or the /F option is chosen) all data is
|
||||
copied.
|
||||
|
||||
Verification (if option chosen) will do an aditional read (after write)
|
||||
and compare the data read matches what was written. This compare is only
|
||||
on every 32'nd byte. This is done for efficiency.
|
||||
on every 32'nd byte. This is done for efficiency.
|
||||
|
||||
During copy dots "." will be displayed to indicate progress of the copy.
|
||||
Each "." represents 16 kBytes of data. Each line of "." 's is 1 mBytes.
|
||||
|
||||
Testing
|
||||
-------
|
||||
This tool has been writen and tested on a SC126 computer. Testing been on both
|
||||
This tool has been writen and tested on a SC126 computer. Testing been on both
|
||||
SD and CF media types, and with both hd1k and hd512 formats
|
||||
|
||||
History
|
||||
-------
|
||||
* v 0.1 Initial Release
|
||||
* v 0.2 Added the /v command option to read and verify after write
|
||||
* v 0.3 Refresh CP/M disk buffers after completion
|
||||
|
||||
Future
|
||||
------
|
||||
@@ -96,3 +95,4 @@ Future
|
||||
This would be at the cost of performance
|
||||
* ability to abort once the copy has started <ctrl><c>
|
||||
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
|
||||
;
|
||||
; Simple Block Compare for Comparison purposes
|
||||
; Both HL and DL contain Block pointers to compare
|
||||
; HL MUST start on an even block e.g. 8000h
|
||||
; RET NZ - Failure, Z if no issue
|
||||
;
|
||||
_cmp20block
|
||||
; inc de ; uncommnet to test crc fail!
|
||||
ld bc, 20h ; 10t Size of Pointer Increment
|
||||
_cmp20block1:
|
||||
ld a, (de) ; 7t Do The comparison itself
|
||||
cp (hl) ; 7t
|
||||
JR NZ, _cmp20block2 ; 7t / 12t = 21t
|
||||
|
||||
add hl, bc ; 11t Add the Increment to both pointers
|
||||
ex de, hl ; 4t
|
||||
add hl, bc ; 11t
|
||||
ex de, hl ; 4t = 30t
|
||||
|
||||
ld a, h ; 4t High order byte on Even Boundary
|
||||
bit 4, a ; 8t has bit 4 been set then exceeded 1000h (4k boundary)
|
||||
JR Z, _cmp20block1 ; 12t / 7t = 24t
|
||||
xor a ; 4t
|
||||
RET ; 10t Return Success
|
||||
_cmp20block2:
|
||||
scf ; signal CARRY FLAG Also
|
||||
RET ; This is the error
|
||||
|
||||
; clock cycles for above
|
||||
; add 40h -> 64 (loop) * 73t =>> 4,672 - 1.56%
|
||||
; add 20h ->128 (loop) * 73t =>> 9,344 - 3.13% <= WENT WITH THIS
|
||||
; add 10h ->256 (loop) * 73t =>> 18,688 - 6.25%
|
||||
; accuracy = 88/4096 => 2.1%
|
||||
|
||||
; =====================================================================
|
||||
; From : https://tomdalby.com/other/crc.html
|
||||
; And : https://map.grauw.nl/sources/external/z80bits.html#6.1
|
||||
; =====================================================================
|
||||
;
|
||||
; =====================================================================
|
||||
; input - hl=start of memory to check, de=length of memory to check
|
||||
; returns - a=result crc
|
||||
; 20b
|
||||
; =====================================================================
|
||||
|
||||
; THE COMMNETED LINES NEED TO BE UNCOMMENTED
|
||||
|
||||
_crc8b:
|
||||
xor a ; 4t - initial value so first byte can be XORed in (CCITT)
|
||||
; ld c, 07h ; 7t - c=polyonimal used in loop (small speed up)
|
||||
_byteloop8b:
|
||||
xor (hl) ; 7t - xor in next byte, for first pass a=(hl)
|
||||
inc hl ; 6t - next mem
|
||||
; ld b, 8 ; 7t - loop over 8 bits
|
||||
_rotate8b:
|
||||
; add a,a ; 4t - shift crc left one
|
||||
; jr nc, _nextbit8b ; 12/7t - only xor polyonimal if msb set (carry=1)
|
||||
; xor c ; 4t - CRC8_CCITT = 0x07
|
||||
_nextbit8b:
|
||||
; djnz _rotate8b ; 13/8t
|
||||
ld b,a ; 4t - preserve a in b
|
||||
dec de ; 6t - counter-1
|
||||
ld a,d ; 4t - check if de=0
|
||||
or e ; 4t
|
||||
ld a,b ; 4t - restore a
|
||||
jr nz, _byteloop8b ; 12/7t
|
||||
ret ; 10t
|
||||
|
||||
; Clock Cycle For above with 4k bypes
|
||||
; Loop = 4096 * 47 cycles + 11 => 192,523 x 2 (src/dest) => 385,046
|
||||
; acuracy = 1 / 256 => 0.4 %
|
||||
|
||||
; =====================================================================
|
||||
; CRC-CCITT
|
||||
;
|
||||
; CCITT polynomial 1021h
|
||||
; Initial Value FFFFh
|
||||
;
|
||||
; input - de=start of memory to check, bc=length of memory to check
|
||||
; returns - hl=result crc
|
||||
; =====================================================================
|
||||
|
||||
_crc16:
|
||||
ld hl, 0ffffh ; 10t - initial crc = $ffff
|
||||
_byte16:
|
||||
; push bc ; 11t - preserve counter
|
||||
ld a,(de) ; 7t - get byte
|
||||
inc de ; 6t - next mem
|
||||
; xor h ; 4t - xor byte into crc high byte
|
||||
; ld h,a ; 4t - back into high byte
|
||||
; ld b,8 ; 7t - rotate 8 bits
|
||||
_rotate16:
|
||||
; add hl,hl ; 11t - rotate crc left one
|
||||
; jr nc,_nextbit16 ; 12/7t - only xor polyonimal if msb set
|
||||
; ld a,h ; 4t
|
||||
; xor 10h ; 7t - high byte with $10
|
||||
; ld h,a ; 4t
|
||||
; ld a,l ; 4t
|
||||
; xor 21h ; 7t - low byte with $21
|
||||
; ld l,a ; 4t - hl now xor $1021
|
||||
_nextbit16:
|
||||
; djnz _rotate16 ; 13/8t - loop over 8 bits
|
||||
; pop bc ; 10t - bring back main counter
|
||||
dec bc ; 6t
|
||||
ld a,b ; 4t
|
||||
or c ; 4t
|
||||
jr nz,_byte16 ; 12/7t
|
||||
ret ; 10t
|
||||
;
|
||||
@@ -1,178 +0,0 @@
|
||||
;
|
||||
; HBIOS FUNCTIONS
|
||||
;
|
||||
;
|
||||
BF_DIO .EQU 010H
|
||||
BF_DIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS
|
||||
BF_DIORESET .EQU BF_DIO + 1 ; DISK RESET
|
||||
BF_DIOSEEK .EQU BF_DIO + 2 ; DISK SEEK
|
||||
BF_DIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS
|
||||
BF_DIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS
|
||||
BF_DIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS
|
||||
BF_DIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK
|
||||
BF_DIODEVICE .EQU BF_DIO + 7 ; DISK DEVICE INFO REPORT
|
||||
BF_DIOMEDIA .EQU BF_DIO + 8 ; DISK MEDIA REPORT
|
||||
BF_DIODEFMED .EQU BF_DIO + 9 ; DEFINE DISK MEDIA
|
||||
BF_DIOCAP .EQU BF_DIO + 10 ; DISK CAPACITY REPORT
|
||||
BF_DIOGEOM .EQU BF_DIO + 11 ; DISK GEOMETRY REPORT
|
||||
;
|
||||
BF_SYS .EQU 0F0H
|
||||
BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS
|
||||
BF_SYSVER .EQU BF_SYS + 1 ; GET HBIOS VERSION
|
||||
BF_SYSSETBNK .EQU BF_SYS + 2 ; SET CURRENT BANK
|
||||
BF_SYSGETBNK .EQU BF_SYS + 3 ; GET CURRENT BANK
|
||||
BF_SYSSETCPY .EQU BF_SYS + 4 ; BANK MEMORY COPY SETUP
|
||||
BF_SYSBNKCPY .EQU BF_SYS + 5 ; BANK MEMORY COPY
|
||||
BF_SYSALLOC .EQU BF_SYS + 6 ; ALLOC HBIOS HEAP MEMORY
|
||||
BF_SYSFREE .EQU BF_SYS + 7 ; FREE HBIOS HEAP MEMORY
|
||||
BF_SYSGET .EQU BF_SYS + 8 ; GET HBIOS INFO
|
||||
BF_SYSSET .EQU BF_SYS + 9 ; SET HBIOS PARAMETERS
|
||||
BF_SYSPEEK .EQU BF_SYS + 10 ; GET A BYTE VALUE FROM ALT BANK
|
||||
BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK
|
||||
BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS
|
||||
;
|
||||
BF_SYSGET_CIOCNT .EQU 00h ; GET CHAR UNIT COUNT
|
||||
BF_SYSGET_CIOFN .EQU 01h ; GET CIO UNIT FN/DATA ADR
|
||||
BF_SYSGET_DIOCNT .EQU 10h ; GET DISK UNIT COUNT
|
||||
BF_SYSGET_DIOFN .EQU 11h ; GET DIO UNIT FN/DATA ADR
|
||||
BF_SYSGET_RTCCNT .EQU 20h ; GET RTC UNIT COUNT
|
||||
BF_SYSGET_DSKYCNT .EQU 30h ; GET DSKY UNIT COUNT
|
||||
BF_SYSGET_VDACNT .EQU 40h ; GET VDA UNIT COUNT
|
||||
BF_SYSGET_VDAFN .EQU 41h ; GET VDA UNIT FN/DATA ADR
|
||||
BF_SYSGET_SNDCNT .EQU 50h ; GET VDA UNIT COUNT
|
||||
BF_SYSGET_SNDFN .EQU 51h ; GET SND UNIT FN/DATA ADR
|
||||
BF_SYSGET_TIMER .EQU 0D0h ; GET CURRENT TIMER VALUE
|
||||
BF_SYSGET_SECS .EQU 0D1h ; GET CURRENT SECONDS VALUE
|
||||
BF_SYSGET_BOOTINFO .EQU 0E0h ; GET BOOT INFORMATION
|
||||
BF_SYSGET_CPUINFO .EQU 0F0h ; GET CPU INFORMATION
|
||||
BF_SYSGET_MEMINFO .EQU 0F1h ; GET MEMORY CAPACTITY INFO
|
||||
BF_SYSGET_BNKINFO .EQU 0F2h ; GET BANK ASSIGNMENT INFO
|
||||
BF_SYSGET_CPUSPD .EQU 0F3h ; GET CLOCK SPEED & WAIT STATES
|
||||
BF_SYSGET_PANEL .EQU 0F4h ; GET FRONT PANEL SWITCHES VAL
|
||||
BF_SYSGET_APPBNKS .EQU 0F5h ; GET APP BANK INFORMATION
|
||||
;
|
||||
; MEDIA ID VALUES
|
||||
;
|
||||
MID_NONE .EQU 0
|
||||
MID_MDROM .EQU 1
|
||||
MID_MDRAM .EQU 2
|
||||
MID_RF .EQU 3
|
||||
MID_HD .EQU 4
|
||||
MID_FD720 .EQU 5
|
||||
MID_FD144 .EQU 6
|
||||
MID_FD360 .EQU 7
|
||||
MID_FD120 .EQU 8
|
||||
MID_FD111 .EQU 9
|
||||
MID_HDNEW .EQU 10
|
||||
|
||||
; -----------------
|
||||
;
|
||||
; Read timer in sconds.
|
||||
;
|
||||
sysgetseconds:
|
||||
ld b,BF_SYSGET
|
||||
ld c,BF_SYSGET_SECS
|
||||
rst 08 ; do it
|
||||
ret
|
||||
|
||||
; -----------------
|
||||
;
|
||||
; Return non zero if A (media ID)
|
||||
; is a type of hard drive
|
||||
; If not A=0 and Z flag is set
|
||||
;
|
||||
isaharddrive:
|
||||
cp MID_HD
|
||||
jr z, ishdd1
|
||||
cp MID_HDNEW
|
||||
jr z, ishdd1
|
||||
xor a ; clear A and set Z flag
|
||||
ret
|
||||
ishdd1:
|
||||
or a ; set Z flag and return
|
||||
ret
|
||||
|
||||
; -------------------------------------
|
||||
;
|
||||
; used to pass the buffer address argument
|
||||
;
|
||||
bankid .DB 0 ; bank id used for read writes
|
||||
dma .DW 8000h ; address argument for read write
|
||||
;
|
||||
;
|
||||
; basic setup for disk io
|
||||
; call to get the current bank IO
|
||||
;
|
||||
initdiskio:
|
||||
; Get current RAM bank
|
||||
ld b,BF_SYSGETBNK ; HBIOS GetBank function
|
||||
RST 08 ; do it via RST vector, C=bank id
|
||||
JP NZ, err_hbios
|
||||
ld a,c ; put bank id in A
|
||||
ld (bankid),a ; put bank id in Argument
|
||||
RET
|
||||
;
|
||||
;
|
||||
; Read disk sector(s)
|
||||
; DE:HL is LBA, B is sector count, C is disk unit
|
||||
; (dma) is the buffer address
|
||||
; (bankid) is the memory bank
|
||||
; Returns E sectors read, and A status
|
||||
;
|
||||
diskread:
|
||||
; Seek to requested sector in DE:HL
|
||||
push bc ; save unit & count
|
||||
set 7,d ; set LBA access flag
|
||||
ld b,BF_DIOSEEK ; HBIOS func: seek
|
||||
rst 08 ; do it
|
||||
pop bc ; recover unit & count
|
||||
jp nz,err_diskio ; handle error
|
||||
|
||||
; Read sector(s) into buffer
|
||||
ld e,b ; transfer count
|
||||
ld b,BF_DIOREAD ; HBIOS func: disk read
|
||||
ld hl,(dma) ; read into info sec buffer
|
||||
ld a,(bankid) ; user bank
|
||||
ld d,a
|
||||
rst 08 ; do it
|
||||
jp nz,err_diskio ; handle error
|
||||
xor a ; signal success
|
||||
ret ; and done
|
||||
;
|
||||
; Write disk sector(s)
|
||||
; DE:HL is LBA, B is sector count, C is disk unit
|
||||
; (dma) is the buffer address
|
||||
; (bankid) is the memory bank
|
||||
; Returns E sectors written, and A status
|
||||
;
|
||||
diskwrite:
|
||||
; Seek to requested sector in DE:HL
|
||||
push bc ; save unit & count
|
||||
set 7,d ; set LBA access flag
|
||||
ld b,BF_DIOSEEK ; HBIOS func: seek
|
||||
rst 08 ; do it
|
||||
pop bc ; recover unit & count
|
||||
jp nz,err_diskio ; handle error
|
||||
|
||||
; Write sector(s) from buffer
|
||||
ld e,b ; transfer count
|
||||
ld b,BF_DIOWRITE ; HBIOS func: disk write
|
||||
ld hl,(dma) ; write from sec buffer
|
||||
ld a,(bankid) ; user bank
|
||||
ld d,a
|
||||
rst 08 ; do it
|
||||
jp nz,err_diskio ; handle error
|
||||
xor a ; signal success
|
||||
ret ; and done
|
||||
;
|
||||
err_diskio:
|
||||
; push hl
|
||||
; ld hl,str_err_prefix
|
||||
; call prtstr
|
||||
; pop hl
|
||||
; or 0ffh ; signal error
|
||||
ret ; done
|
||||
|
||||
;str_err_prefix db 13,10,13,10,"*** ",0
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
set TOOLS=../../../Tools
|
||||
set PATH=%TOOLS%\tasm32;%PATH%
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
tasm -t80 -g3 -fFF slabel.asm slabel.com slabel.lst || exit /b
|
||||
|
||||
copy /Y slabel.com ..\..\..\Binary\Apps\ || exit /b
|
||||
@@ -1,7 +0,0 @@
|
||||
OBJECTS = slabel.com
|
||||
DEST = ../../../Binary/Apps
|
||||
TOOLS =../../../Tools
|
||||
|
||||
USETASM=1
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
@@ -1,763 +0,0 @@
|
||||
;==============================================================================
|
||||
; SLICE LABEL - Update Disk Labels
|
||||
; Version December-2024
|
||||
;==============================================================================
|
||||
;
|
||||
; Author: Mark Pruden
|
||||
;______________________________________________________________________________
|
||||
;
|
||||
; Usage:
|
||||
; SLABEL [unit.slice,label] [/?]
|
||||
; ex: SLABEL Display current list of Labels
|
||||
; SLABEL unit.slice=label Assign a disk Label to the Slice on Unit
|
||||
; SLABEL /? Display version and usage
|
||||
;
|
||||
; Operation:
|
||||
; Print and Assign a Disk Label to a Hard Disk Slice.
|
||||
;
|
||||
; Technical:
|
||||
; On the third sector of "bootable" Disk Slice there is metadata used by RomWBW to know how
|
||||
; to boot the OS found on the slice. This includes a Label for the volume, which is printed
|
||||
; out by RomWBW during the boot process.
|
||||
; Note this label is not associated to any label the OS may assign to the volume.
|
||||
; See loader.asm in each of the O/S directories e.g. /src/CPM22 which describe these sectors
|
||||
;
|
||||
; This ony works on slices which have existing media information in the third sector.
|
||||
; There is no capabiity to write this information on demand.
|
||||
;
|
||||
; known Issues:
|
||||
; - Listing the slabel for all slices can be time consuming, because of the use of the EXT_MEDIA
|
||||
; function call. This function reads the partition table (on each call) to assert (if valid)
|
||||
; the LBA location of the requested slice. Ideally we would only need to read the partition
|
||||
; table once (per device), and work out all the LBA's from this single read.
|
||||
; Note this doesnt omit the fact that the 3 rd sector of each slice wold need to be read regarless.
|
||||
; To slightly reduce some IO only slices < 64 are considered.
|
||||
;
|
||||
; This code will only execute on a Z80 CPU (or derivitive)
|
||||
; This code requirs the use of HBIOS
|
||||
;
|
||||
;______________________________________________________________________________
|
||||
;
|
||||
; Change Log:
|
||||
; 2024-12-11 [MAP] Started - Reboot v1.0 used as the basis for this code
|
||||
; 2024-12-14 [MAP] Initial 0.9 alpha with basic working functionality
|
||||
; 2025-04-21 [MAP] Initial v1.0 release for distribution, fixing all issues
|
||||
;______________________________________________________________________________
|
||||
;
|
||||
; Include Files
|
||||
;
|
||||
#include "../../ver.inc" ; to ensure it is the correct ver
|
||||
#include "../../HBIOS/hbios.inc"
|
||||
;
|
||||
;===============================================================================
|
||||
;
|
||||
; General operational equates (should not requre adjustment)
|
||||
;
|
||||
stksiz .equ $40 ; Working stack size
|
||||
;
|
||||
restart .equ $0000 ; CP/M restart vector
|
||||
bdos .equ $0005 ; BDOS invocation vector
|
||||
cmdbuf .equ $0081 ; CPM command buffer
|
||||
;
|
||||
bf_sysreset .equ $F0 ; restart system
|
||||
bf_sysres_int .equ $00 ; reset hbios internal
|
||||
bf_sysres_warm .equ $01 ; warm start (restart boot loader)
|
||||
;
|
||||
ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr
|
||||
;
|
||||
sigbyte1 .equ $A5 ; 1st sig byte boot info sector (bb_sig)
|
||||
sigbyte2 .equ $5A ; 2nd sig byte boot info sector (bb_sig)
|
||||
;
|
||||
labelterm .equ '$' ; terminating charater for disk label
|
||||
;
|
||||
;===============================================================================
|
||||
;
|
||||
.org $0100 ; standard CP/M TPA executable
|
||||
;
|
||||
ld (stksav),sp ; save stack
|
||||
ld sp,stack ; set new stack
|
||||
;
|
||||
ld de,str_banner
|
||||
call prtstr ; print the banner
|
||||
;
|
||||
call init ; initialize
|
||||
jr nz,exit ; abort if init fails
|
||||
;
|
||||
call main ; do the real work
|
||||
;
|
||||
exit:
|
||||
call crlf ; print terminating crlf
|
||||
ld sp,(stksav) ; restore stack to prior state
|
||||
jp restart ; return to CP/M via restart
|
||||
;
|
||||
;===============================================================================
|
||||
; Initialization
|
||||
;
|
||||
init:
|
||||
; check for UNA (UBIOS)
|
||||
ld a,($FFFD) ; fixed location of UNA API vector
|
||||
cp $C3 ; jp instruction?
|
||||
jr nz,initwbw ; if not, not UNA
|
||||
ld hl,($FFFE) ; get jp address
|
||||
ld a,(hl) ; get byte at target address
|
||||
cp $FD ; first byte of UNA push ix instruction
|
||||
jr nz,initwbw ; if not, not UNA
|
||||
inc hl ; point to next byte
|
||||
ld a,(hl) ; get next byte
|
||||
cp $E5 ; second byte of UNA push ix instruction
|
||||
jr nz,initwbw ; if not, not UNA
|
||||
jp err_una ; UNA not supported
|
||||
;
|
||||
initwbw:
|
||||
; get location of config data and verify integrity
|
||||
ld hl,(ident) ; HL := adr or RomWBW HBIOS ident
|
||||
ld a,(hl) ; get first byte of RomWBW marker
|
||||
cp 'W' ; match?
|
||||
jp nz,err_inv ; abort with invalid config block
|
||||
inc hl ; next byte (marker byte 2)
|
||||
ld a,(hl) ; load it
|
||||
cp ~'W' ; match?
|
||||
jp nz,err_inv ; abort with invalid config block
|
||||
inc hl ; next byte (major/minor version)
|
||||
ld a,(hl) ; load it
|
||||
cp rmj << 4 | rmn ; match?
|
||||
jp nz,err_ver ; abort with invalid os version
|
||||
;
|
||||
initz:
|
||||
; initialization complete
|
||||
xor a ; signal success
|
||||
ret ; return
|
||||
;
|
||||
;===============================================================================
|
||||
; Main Execution
|
||||
;
|
||||
main:
|
||||
call initdiskio ; initi DiskIO routines (bank ID)
|
||||
;
|
||||
ld de,cmdbuf ; start of command input buffer
|
||||
call skipws ; skip whitespace on cmd line
|
||||
;
|
||||
ld a,(de) ; get first non-ws char
|
||||
or a ; test for terminator, no parms
|
||||
jr z,prtslc ; if so, print details, and return
|
||||
;
|
||||
call isnum ; do we have a number?
|
||||
jp z,setlabel ; if so, then we are setting Label.
|
||||
;
|
||||
jp usage ; otherwise print usage and return
|
||||
ret ; and exit
|
||||
;
|
||||
;===============================================================================
|
||||
; Print Usage /? Information
|
||||
;
|
||||
usage:
|
||||
ld de,str_usage ; display the cmd options for this utility
|
||||
call prtstr
|
||||
;
|
||||
ret ; exit back out to CP/M CCP
|
||||
;
|
||||
;===============================================================================
|
||||
; Print list of all slices
|
||||
;
|
||||
prtslc:
|
||||
ld de,PRTSLC_HDR ; Header for list of Slices
|
||||
call prtstr ; Print It
|
||||
;
|
||||
ld bc,BC_SYSGET_DIOCNT ; FUNC: SYSTEM INFO GET DISK DRIVES
|
||||
rst 08 ; E := UNIT COUNT
|
||||
;
|
||||
ld b,e ; MOVE Disk CNT TO B FOR LOOP COUNT
|
||||
ld c,0 ; C WILL BE UNIT INDEX
|
||||
prtslc1:
|
||||
ld a,b ; loop counter
|
||||
or a ; set flags
|
||||
ret z ; IF no more drives, finished
|
||||
;
|
||||
ld a,c ; unit index
|
||||
ld (currunit),a ; store the unit number
|
||||
;
|
||||
push bc ; save loop vars
|
||||
call prtslc2 ; for each disk Unit, print its details
|
||||
pop bc ; restore loop variables
|
||||
;
|
||||
inc c ; bump the unit number
|
||||
djnz prtslc1 ; main disk loop
|
||||
;
|
||||
ret ; loop has finished
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print list of All Slices for a given Unit
|
||||
;
|
||||
prtslc2:
|
||||
; get the media infor
|
||||
ld b,BF_DIOMEDIA ; get media information
|
||||
ld e,1 ; with media discovery
|
||||
rst 08 ; do media discovery
|
||||
ret nz ; an error
|
||||
;
|
||||
ld a,MID_HD ; hard disk
|
||||
cp e ; is it hard disk
|
||||
ret nz ; if not noting to do
|
||||
;
|
||||
; setup the loop
|
||||
ld b,64 ; arbitrary (?) number of slices to check.
|
||||
; NOTE: could be higher, but each slice check has disk IO
|
||||
ld c,0 ; starting at slice 0
|
||||
;
|
||||
prtslc2a:
|
||||
ld a,c ; slice number
|
||||
ld (currslice),a ; save slice number
|
||||
;
|
||||
push bc ; save loop
|
||||
call prtslc3 ; print detals of the slice
|
||||
pop bc ; restore loop
|
||||
ret nz ; if error dont continie
|
||||
;
|
||||
inc c ; next slice number
|
||||
djnz prtslc2a ; loop if more slices
|
||||
;
|
||||
ret ; return from Slice Loop
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print details of a Slice for a given Unit/Slice
|
||||
;
|
||||
prtslc3:
|
||||
; get the details of the device / slice
|
||||
ld a,(currunit)
|
||||
ld d,a ; unit
|
||||
ld a,(currslice)
|
||||
ld e,a ; slice
|
||||
ld b,BF_EXTSLICE ; EXT function to check compute slice offset
|
||||
rst 08 ; noting this call checks partition table.
|
||||
ret NZ ; an error, for lots of reasons, e.g. Slice not valid
|
||||
;
|
||||
call thirdsector ; point to the third sector of partition
|
||||
;
|
||||
call diskread ; do the sector read
|
||||
ret nz ; read error. exit the slice loop
|
||||
;
|
||||
; Check signature
|
||||
ld bc,(bb_sig) ; get signature read
|
||||
ld a,sigbyte1 ; expected value of first byte
|
||||
cp b ; compare
|
||||
jr nz,prtslc5 ; ignore missing signature and loop
|
||||
ld a,sigbyte2 ; expected value of second byte
|
||||
cp c ; compare
|
||||
jr nz,prtslc5 ; ignore missing signature and loop
|
||||
;
|
||||
; Print volume label string at HL, '$' terminated, 16 chars max
|
||||
ld a,(currunit)
|
||||
call prtdecb ; print unit number as decimal
|
||||
call pdot ; print a DOT
|
||||
ld a,(currslice)
|
||||
call prtdecb
|
||||
ld a,' '
|
||||
call cout ; print a space
|
||||
call cout ; print a space
|
||||
ld hl,bb_label ; point to label
|
||||
call pvol ; print it
|
||||
call crlf
|
||||
;
|
||||
prtslc5:
|
||||
xor a
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print volume label string at HL, '$' terminated, 16 chars max
|
||||
;
|
||||
pvol:
|
||||
ld b,16 ; init max char downcounter
|
||||
pvol1:
|
||||
ld a,(hl) ; get next character
|
||||
cp labelterm ; set flags based on terminator $
|
||||
inc hl ; bump pointer regardless
|
||||
ret z ; done if null
|
||||
call cout ; display character
|
||||
djnz pvol1 ; loop till done
|
||||
ret ; hit max of 16 chars
|
||||
;
|
||||
;===============================================================================
|
||||
; Set Label Information onto disk
|
||||
;
|
||||
setlabel:
|
||||
call getnum ; parse a number
|
||||
jp c,err_parm ; handle overflow error
|
||||
ld (currunit),a ; save boot unit
|
||||
xor a ; zero accum
|
||||
ld (currslice),a ; save default slice
|
||||
call skipws ; skip possible whitespace
|
||||
ld a,(de) ; get separator char
|
||||
or a ; test for terminator
|
||||
jp z,err_parm ; if so, incomplete
|
||||
cp '=' ; otherwise, is ','?
|
||||
jr z,setlabel4 ; if so, skip the Slice parm
|
||||
cp '.' ; otherwise, is '.'?
|
||||
jp NZ,err_parm ; if not, format error
|
||||
;
|
||||
inc de ; bump past separator
|
||||
call skipws ; skip possible whitespace
|
||||
call isnum ; do we have a number?
|
||||
jp nz,err_parm ; if not, format error
|
||||
call getnum ; get number
|
||||
jp c,err_parm ; handle overflow error
|
||||
ld (currslice),a ; save boot slice
|
||||
setlabel3:
|
||||
call skipws ; skip possible whitespace
|
||||
ld a,(de) ; get separator char
|
||||
or a ; test for terminator
|
||||
jp z,err_parm ; if so, then an error
|
||||
cp '=' ; otherwise, is ','?
|
||||
jp nz,err_parm ; if not, format error
|
||||
setlabel4:
|
||||
inc de ; bump past separator
|
||||
call skipws ; skip possible whitespace
|
||||
ld (newlabel),de ; address of disk label after '='
|
||||
;
|
||||
ld a,(currunit) ; passing boot unit
|
||||
ld d,a
|
||||
ld a,(currslice) ; and slice
|
||||
ld e,a
|
||||
ld b,BF_EXTSLICE ; HBIOS func: SLICE CALC - extended
|
||||
rst 08 ; info for the Device, and Slice
|
||||
;
|
||||
; Check errors from the Function
|
||||
cp ERR_NOUNIT ; compare to no unit error
|
||||
jp z,err_nodisk ; handle no disk err
|
||||
cp ERR_NOMEDIA ; no media in the device
|
||||
jp z,err_nomedia ; handle the error
|
||||
cp ERR_RANGE ; slice is invalid
|
||||
jp z,err_badslice ; bad slice, handle err
|
||||
or a ; any other error
|
||||
jp nz,err_diskio ; handle as general IO error
|
||||
;
|
||||
call thirdsector ; point to the third sector of partition
|
||||
;
|
||||
call diskread ; read the sector
|
||||
jp nz,err_diskio ; abort on error
|
||||
;
|
||||
; Check signature
|
||||
ld de,(bb_sig) ; get signature read
|
||||
ld a,sigbyte1 ; expected value of first byte
|
||||
cp d ; compare
|
||||
jp nz,err_sig ; handle error
|
||||
ld a,sigbyte2 ; expected value of second byte
|
||||
cp e ; compare
|
||||
jp nz,err_sig ; handle error
|
||||
;
|
||||
ld b,16 ; loop down counter (max size of label)
|
||||
ld de,(newlabel) ; reading from cmd line
|
||||
ld hl,bb_label ; writing to disk label in sector buffer
|
||||
updatelabel:
|
||||
ld a,(de) ; read input
|
||||
or a ; look for string terminator
|
||||
jr z,updatelabel2 ; if terminator then complete
|
||||
ld (hl),a ; store char in sector buff
|
||||
inc de ; update pointers
|
||||
inc hl
|
||||
djnz updatelabel ; loop for next character
|
||||
updatelabel2:
|
||||
ld a,labelterm
|
||||
ld (hl),a ; store the final terminator $ char
|
||||
writelabel:
|
||||
; write the sector
|
||||
ld hl,(lba) ; lba, low word, same as read sector
|
||||
ld de,(lba+2) ; lba, high word
|
||||
call diskwrite ; write the sector back to disk
|
||||
jp nz,err_diskio ; abort on error
|
||||
;
|
||||
; print the outcome.
|
||||
ld de,PRTSLC_HDR ; Header for list of Slices
|
||||
call prtstr ; Print header
|
||||
call prtslc3 ; print updated label for unit/slice
|
||||
;
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; advance the DE HL LBA sector by 2, ie third sector
|
||||
;
|
||||
thirdsector:
|
||||
ld bc,2 ; sector offset
|
||||
add hl,bc ; add to LBA value low word
|
||||
jr nc,sectornum ; check for carry
|
||||
inc de ; if so, bump high word
|
||||
sectornum:
|
||||
ld (lba),hl ; update lba, low word
|
||||
ld (lba+2),de ; update lba, high word
|
||||
ret
|
||||
;
|
||||
;===============================================================================
|
||||
; Error Handlers
|
||||
;
|
||||
err_una:
|
||||
ld de,str_err_una
|
||||
jr err_ret
|
||||
err_inv:
|
||||
ld de,str_err_inv
|
||||
jr err_ret
|
||||
err_ver:
|
||||
ld de,str_err_ver
|
||||
jr err_ret
|
||||
err_parm:
|
||||
ld de,str_err_parm
|
||||
jr err_ret
|
||||
err_nodisk:
|
||||
ld de,str_err_nodisk
|
||||
jr err_ret
|
||||
err_nomedia:
|
||||
ld de,str_err_nomedia
|
||||
jr err_ret
|
||||
err_badslice:
|
||||
ld de,str_err_badslc
|
||||
jr err_ret
|
||||
err_sig:
|
||||
ld de,str_err_sig
|
||||
jr err_ret
|
||||
err_diskio:
|
||||
ld de,str_err_diskio
|
||||
jr err_ret
|
||||
err_ret:
|
||||
call crlf2
|
||||
call prtstr
|
||||
or $FF ; signal error
|
||||
ret
|
||||
;
|
||||
;===============================================================================
|
||||
; Utility Routines
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print a dot on console
|
||||
;
|
||||
pdot:
|
||||
push af
|
||||
ld a,'.'
|
||||
call cout
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print character in A without destroying any registers
|
||||
;
|
||||
prtchr:
|
||||
cout:
|
||||
push af ; save registers
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
ld e,a ; character to print in E
|
||||
ld c,$02 ; BDOS function to output a character
|
||||
call bdos ; do it
|
||||
pop hl ; restore registers
|
||||
pop de
|
||||
pop bc
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Start a newline on console (cr/lf)
|
||||
;
|
||||
crlf2:
|
||||
call crlf ; two of them
|
||||
crlf:
|
||||
push af ; preserve AF
|
||||
ld a,13 ; <CR>
|
||||
call prtchr ; print it
|
||||
ld a,10 ; <LF>
|
||||
call prtchr ; print it
|
||||
pop af ; restore AF
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print a zero terminated string at (de) without destroying any registers
|
||||
;
|
||||
prtstr:
|
||||
push af
|
||||
push de
|
||||
;
|
||||
prtstr1:
|
||||
ld a,(de) ; get next char
|
||||
or a
|
||||
jr z,prtstr2
|
||||
call prtchr
|
||||
inc de
|
||||
jr prtstr1
|
||||
;
|
||||
prtstr2:
|
||||
pop de ; restore registers
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print value of a in decimal with leading zero suppression
|
||||
;
|
||||
prtdecb:
|
||||
push hl
|
||||
push af
|
||||
ld l,a
|
||||
ld h,0
|
||||
call prtdec
|
||||
pop af
|
||||
pop hl
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Print value of HL in decimal with leading zero suppression
|
||||
;
|
||||
prtdec:
|
||||
push bc
|
||||
push de
|
||||
push hl
|
||||
ld e,'0'
|
||||
ld bc,-10000
|
||||
call prtdec1
|
||||
ld bc,-1000
|
||||
call prtdec1
|
||||
ld bc,-100
|
||||
call prtdec1
|
||||
ld c,-10
|
||||
call prtdec1
|
||||
ld e,0
|
||||
ld c,-1
|
||||
call prtdec1
|
||||
pop hl
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
prtdec1:
|
||||
ld a,'0' - 1
|
||||
prtdec2:
|
||||
inc a
|
||||
add hl,bc
|
||||
jr c,prtdec2
|
||||
sbc hl,bc
|
||||
cp e
|
||||
jr z,prtdec3
|
||||
ld e,0
|
||||
call cout
|
||||
prtdec3:
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; INPUT ROUTINES
|
||||
;-------------------------------------------------------------------------------
|
||||
; Skip whitespace at buffer adr in DE, returns with first
|
||||
; non-whitespace character in A.
|
||||
;
|
||||
skipws:
|
||||
ld a,(de) ; get next char
|
||||
or a ; check for eol
|
||||
ret z ; done if so
|
||||
cp ' ' ; blank?
|
||||
ret nz ; nope, done
|
||||
inc de ; bump buffer pointer
|
||||
jr skipws ; and loop
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Convert character in A to uppercase
|
||||
;
|
||||
upcase:
|
||||
cp 'a' ; if below 'a'
|
||||
ret c ; ... do nothing and return
|
||||
cp 'z' + 1 ; if above 'z'
|
||||
ret nc ; ... do nothing and return
|
||||
res 5,a ; clear bit 5 to make lower case -> upper case
|
||||
ret ; and return
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Get numeric chars at DE and convert to number returned in A
|
||||
; Carry flag set on overflow
|
||||
;
|
||||
getnum:
|
||||
ld c,0 ; C is working register
|
||||
getnum1:
|
||||
ld a,(de) ; get the active char
|
||||
cp '0' ; compare to ascii '0'
|
||||
jr c,getnum2 ; abort if below
|
||||
cp '9' + 1 ; compare to ascii '9'
|
||||
jr nc,getnum2 ; abort if above
|
||||
;
|
||||
; valid digit, add new digit to C
|
||||
ld a,c ; get working value to A
|
||||
rlca ; multiply by 10
|
||||
ret c ; overflow, return with carry set
|
||||
rlca ; ...
|
||||
ret c ; overflow, return with carry set
|
||||
add a,c ; ...
|
||||
ret c ; overflow, return with carry set
|
||||
rlca ; ...
|
||||
ret c ; overflow, return with carry set
|
||||
ld c,a ; back to C
|
||||
ld a,(de) ; get new digit
|
||||
sub '0' ; make binary
|
||||
add a,c ; add in working value
|
||||
ret c ; overflow, return with carry set
|
||||
ld c,a ; back to C
|
||||
;
|
||||
inc de ; bump to next char
|
||||
jr getnum1 ; loop
|
||||
;
|
||||
getnum2: ; return result
|
||||
ld a,c ; return result in A
|
||||
or a ; with flags set, CF is cleared
|
||||
ret
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Is character in A numeric? NZ if not
|
||||
;
|
||||
isnum:
|
||||
cp '0' ; compare to ascii '0'
|
||||
jr c,isnum1 ; abort if below
|
||||
cp '9' + 1 ; compare to ascii '9'
|
||||
jr nc,isnum1 ; abort if above
|
||||
cp a ; set Z
|
||||
ret
|
||||
isnum1:
|
||||
or $FF ; set NZ
|
||||
ret ; and done
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; DISK IO ROUTINES
|
||||
;-------------------------------------------------------------------------------
|
||||
; Init Disk IO
|
||||
;
|
||||
initdiskio:
|
||||
; Get current RAM bank
|
||||
ld b,BF_SYSGETBNK ; HBIOS GetBank function
|
||||
RST 08 ; do it via RST vector, C=bank id
|
||||
RET NZ ; had to replace this line below.
|
||||
ld a,c ; put bank id in A
|
||||
ld (BID_USR),a ; put bank id in Argument
|
||||
RET
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; Read disk sector(s)
|
||||
; DE:HL is LBA, B is sector count, C is disk unit
|
||||
;
|
||||
diskread:
|
||||
;
|
||||
; Seek to requested sector in DE:HL
|
||||
ld a,(currunit)
|
||||
ld c,a ; from the specified unit
|
||||
set 7,d ; set LBA access flag
|
||||
ld b,BF_DIOSEEK ; HBIOS func: seek
|
||||
rst 08 ; do it
|
||||
ret nz ; handle error
|
||||
;
|
||||
; Read sector(s) into buffer
|
||||
ld a,(currunit)
|
||||
ld c,a ; from the specified unit
|
||||
ld e,1 ; read 1 sector
|
||||
ld hl,(dma) ; read into info sec buffer
|
||||
ld a,(BID_USR) ; get user bank to accum
|
||||
ld d,a ; and move to D
|
||||
ld b,BF_DIOREAD ; HBIOS func: disk read
|
||||
rst 08 ; do it
|
||||
ret ; and done
|
||||
;
|
||||
;-------------------------------------------------------------------------------
|
||||
; WRITE disk sector(s)
|
||||
; DE:HL is LBA, B is sector count, C is disk unit
|
||||
;
|
||||
diskwrite:
|
||||
;
|
||||
ld a,(currunit) ; disk unit to read
|
||||
ld c,a ; put in C
|
||||
ld b,1 ; one sector
|
||||
;
|
||||
; Seek to requested sector in DE:HL
|
||||
push bc ; save unit & count
|
||||
set 7,d ; set LBA access flag
|
||||
ld b,BF_DIOSEEK ; HBIOS func: seek
|
||||
rst 08 ; do it
|
||||
pop bc ; recover unit & count
|
||||
ret nz ; handle error
|
||||
;
|
||||
; Read sector(s) into buffer
|
||||
ld e,b ; transfer count
|
||||
ld b,BF_DIOWRITE ; HBIOS func: disk read
|
||||
ld hl,(dma) ; read into info sec buffer
|
||||
ld a,(BID_USR) ; get user bank to accum
|
||||
ld d,a ; and move to D
|
||||
rst 08 ; do it
|
||||
ret ; and done
|
||||
;
|
||||
;===============================================================================
|
||||
; Constants
|
||||
;===============================================================================
|
||||
;
|
||||
str_banner .db "\r\n"
|
||||
.db "Slice Label, v1.0, April 2025 - M.Pruden",0
|
||||
;
|
||||
str_err_una .db " ERROR: UNA not supported by application",0
|
||||
str_err_inv .db " ERROR: Invalid BIOS (signature missing)",0
|
||||
str_err_ver .db " ERROR: Unexpected HBIOS version",0
|
||||
str_err_parm .db " ERROR: Parameter error (SLABEL /? for usage)",0
|
||||
str_err_nodisk .db " ERROR: Disk unit not available",0
|
||||
str_err_nomedia .db " ERROR: Media not present",0
|
||||
str_err_badslc .db " ERROR: Slice specified is illegal",0
|
||||
str_err_sig .db " ERROR: No system image on disk",0
|
||||
str_err_diskio .db " ERROR: Disk I/O failure",0
|
||||
;
|
||||
str_usage .db "\r\n\r\n"
|
||||
.db " Usage: SLABEL - list current labels\r\n"
|
||||
.db " SLABEL unit[.slice]=label - Defines a label\r\n"
|
||||
.db " SLABEL /? - Display this help info.\r\n"
|
||||
.db " Options are case insensitive.\r\n",0
|
||||
;
|
||||
PRTSLC_HDR .TEXT "\r\n\r\n"
|
||||
.TEXT "Un.Sl Drive \r\n"
|
||||
.TEXT "----- ----------------\r\n"
|
||||
.DB 0
|
||||
;
|
||||
;===============================================================================
|
||||
; Working data
|
||||
;===============================================================================
|
||||
;
|
||||
currunit .db 0 ; parameters for disk unit, current unit
|
||||
currslice .db 0 ; parameters for disk slice, current slice
|
||||
lba .dw 0, 0 ; lba address (4 bytes), of slice
|
||||
newlabel .dw 0 ; address of parameter, new label to write
|
||||
;
|
||||
BID_USR .db 0 ; Bank ID for user bank
|
||||
dma .dw bl_infosec ; address for disk buffer
|
||||
;
|
||||
stksav .dw 0 ; stack pointer saved at start
|
||||
.fill stksiz,0 ; stack
|
||||
stack .equ $ ; stack top
|
||||
;
|
||||
;===============================================================================
|
||||
; Disk Buffer
|
||||
;===============================================================================
|
||||
;
|
||||
; define origin of disk buffer above 8000 for performance.
|
||||
.org $8000
|
||||
;
|
||||
; Below is copied from ROM LDR
|
||||
; Boot info sector is read into area below.
|
||||
; The third sector of a disk device is reserved for boot info.
|
||||
;
|
||||
bl_infosec .equ $
|
||||
.ds (512 - 128)
|
||||
bb_metabuf .equ $
|
||||
bb_sig .ds 2 ; signature (0xA55A if set)
|
||||
bb_platform .ds 1 ; formatting platform
|
||||
bb_device .ds 1 ; formatting device
|
||||
bb_formatter .ds 8 ; formatting program
|
||||
bb_drive .ds 1 ; physical disk drive #
|
||||
bb_lu .ds 1 ; logical unit (lu)
|
||||
.ds 1 ; msb of lu, now deprecated
|
||||
.ds (bb_metabuf + 128) - $ - 32
|
||||
bb_protect .ds 1 ; write protect boolean
|
||||
bb_updates .ds 2 ; update counter
|
||||
bb_rmj .ds 1 ; rmj major version number
|
||||
bb_rmn .ds 1 ; rmn minor version number
|
||||
bb_rup .ds 1 ; rup update number
|
||||
bb_rtp .ds 1 ; rtp patch level
|
||||
bb_label .ds 16 ; 16 character drive label
|
||||
bb_term .ds 1 ; label terminator ('$')
|
||||
bb_biloc .ds 2 ; loc to patch boot drive info
|
||||
bb_cpmloc .ds 2 ; final ram dest for cpm/cbios
|
||||
bb_cpmend .ds 2 ; end address for load
|
||||
bb_cpment .ds 2 ; CP/M entry point (cbios boot)
|
||||
;
|
||||
;===============================================================================
|
||||
;
|
||||
.end
|
||||
@@ -5,15 +5,14 @@ setlocal
|
||||
call BuildProp || exit /b
|
||||
call BuildShared || exit /b
|
||||
call BuildBP || exit /b
|
||||
call BuildImages || exit /b
|
||||
call BuildROM %* || exit /b
|
||||
call BuildImages || exit /b
|
||||
call BuildZRC || exit /b
|
||||
call BuildZ1RCC || exit /b
|
||||
call BuildZZRCC || exit /b
|
||||
call BuildZRC512 || exit /b
|
||||
call BuildFZ80 || exit /b
|
||||
call BuildEZ512 || exit /b
|
||||
|
||||
if "%1" == "dist" (
|
||||
call Clean || exit /b
|
||||
)
|
||||
)
|
||||
@@ -1,4 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
pushd EZ512 && call Build || exit /b & popd
|
||||
@@ -78,7 +78,7 @@ MEMTOP .EQU $10000
|
||||
#INCLUDE "../UBIOS/ubios.inc"
|
||||
#ENDIF
|
||||
;
|
||||
.ORG CBIOS_LOC ; DEFINED IN LAYOUT.INC
|
||||
.ORG CBIOS_LOC ; DEFINED IN STD.ASM
|
||||
;
|
||||
STACK .EQU CBIOS_END ; USE SLACK SPACE FOR STACK AS NEEDED
|
||||
;
|
||||
@@ -411,7 +411,8 @@ REBOOT:
|
||||
;
|
||||
#IFDEF PLTWBW
|
||||
; WARM START
|
||||
LD BC,BC_SYSRES_WARM ; SYSTEM WARM RESTART
|
||||
LD B,BF_SYSRESET ; SYSTEM RESTART
|
||||
LD C,BF_SYSRES_WARM ; WARM START
|
||||
CALL $FFF0 ; CALL HBIOS
|
||||
#ENDIF
|
||||
;
|
||||
@@ -2198,7 +2199,8 @@ INIT:
|
||||
|
||||
#ELSE
|
||||
; GET CRITICAL BANK ID'S
|
||||
LD BC,BC_SYSGET_BNKINFO ; HBIOS FUNC=GET SYS INFO;GET BANK ASSIGNMENTS
|
||||
LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO
|
||||
LD C,BF_SYSGET_BNKINFO ; HBIOS SUBFUNC=GET BANK ASSIGNMENTS
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,D ; GET HBIOS BANK RETURNED IN D
|
||||
LD (BNKBIOS),A ; ... AND SAVE IT
|
||||
@@ -2211,7 +2213,8 @@ INIT:
|
||||
#ENDIF
|
||||
;
|
||||
; SOFT RESET HBIOS
|
||||
LD BC,BC_SYSRES_INT ; HB FUNC: RESET; WARM START
|
||||
LD B,BF_SYSRESET ; HB FUNC: RESET
|
||||
LD C,BF_SYSRES_INT ; WARM START
|
||||
RST 08 ; DO IT
|
||||
;
|
||||
#IF DEBUG
|
||||
@@ -2340,8 +2343,10 @@ INIT2:
|
||||
LD C,(HL) ; PUT UNIT NUM IN C
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,C ; GET ATTRIBUTES
|
||||
AND %10001101 ; ISOLATE TYPE BITS, NOT FLOPPY
|
||||
CP %00000100 ; TYPE=ROM/FLASH ; Att="0xxx01x0"
|
||||
AND %10001111 ; ISOLATE TYPE BITS
|
||||
CP %00000100 ; NOT FLOPPY, TYPE = ROM?
|
||||
JR Z,INIT2A ; IF SO, ADJUST DEF DRIVE
|
||||
CP %00000111 ; NOT FLOPPY, TYPE = FLASH?
|
||||
JR NZ,INIT2X ; IF NOT THEN DONE
|
||||
;
|
||||
INIT2A:
|
||||
@@ -2491,7 +2496,8 @@ DEV_INIT000:
|
||||
DEV_INIT00:
|
||||
; LOOP THRU DEVICES ADDING DEVICES TO DEVMAP
|
||||
; CONSOLE DEVICE WAS ALREADY DONE, SO IT IS SKIPPED HERE
|
||||
LD BC,BC_SYSGET_CIOCNT ; HBIOS FUNC: GET SYS INFO; GET CIO UNIT COUNT
|
||||
LD B,BF_SYSGET ; HBIOS FUNC: GET SYS INFO
|
||||
LD C,BF_SYSGET_CIOCNT ; SUBFUNC: GET CIO UNIT COUNT
|
||||
RST 08 ; E := SERIAL UNIT COUNT
|
||||
LD B,E ; COUNT TO B
|
||||
LD C,0 ; UNIT INDEX
|
||||
@@ -2922,7 +2928,8 @@ DRV_INIT:
|
||||
; DEVICES. NON-HARD DISK UNITS ARE ALWAYS CONSIDERED
|
||||
; ACTIVE, BUT HARD DISK UNITS ARE ONLY CONSIDERED ACTIVE
|
||||
; IF THERE IS MEDIA IN THE DRIVE.
|
||||
LD BC,BC_SYSGET_DIOCNT ; GET DISK UNIT COUNT
|
||||
LD B,BF_SYSGET
|
||||
LD C,BF_SYSGET_DIOCNT
|
||||
RST 08 ; E := DISK UNIT COUNT
|
||||
LD B,E ; COUNT TO B
|
||||
LD A,B ; COUNT TO A
|
||||
@@ -3428,63 +3435,6 @@ DEV15 .EQU DEVUNK
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; INITIALIZATION Utilities
|
||||
;
|
||||
; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION
|
||||
;
|
||||
PRTDECB:
|
||||
PUSH HL
|
||||
PUSH AF
|
||||
LD L,A
|
||||
LD H,0
|
||||
CALL PRTDEC
|
||||
POP AF
|
||||
POP HL
|
||||
RET
|
||||
;
|
||||
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
|
||||
;
|
||||
PRTDEC:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD E,'0'
|
||||
LD BC,-10000
|
||||
CALL PRTDEC1
|
||||
LD BC,-1000
|
||||
CALL PRTDEC1
|
||||
LD BC,-100
|
||||
CALL PRTDEC1
|
||||
LD C,-10
|
||||
CALL PRTDEC1
|
||||
LD E,0
|
||||
LD C,-1
|
||||
CALL PRTDEC1
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
RET
|
||||
PRTDEC1:
|
||||
LD A,'0' - 1
|
||||
PRTDEC2:
|
||||
INC A
|
||||
ADD HL,BC
|
||||
JR C,PRTDEC2
|
||||
SBC HL,BC
|
||||
CP E
|
||||
JR Z,PRTDEC3
|
||||
LD E,0
|
||||
CALL COUT
|
||||
PRTDEC3:
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; INITIALIZATION Working Storage
|
||||
;
|
||||
DPHTOP .DW 0 ; CURRENT TOP OF DPH POOL
|
||||
DIRBUF .DW 0 ; DIR BUF POINTER
|
||||
HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP
|
||||
|
||||
@@ -28,10 +28,10 @@ PC_COLON:
|
||||
LD A,':'
|
||||
JR PC_PRTCHR
|
||||
|
||||
;PC_COMMA:
|
||||
; PUSH AF
|
||||
; LD A,','
|
||||
; JR PC_PRTCHR
|
||||
PC_COMMA:
|
||||
PUSH AF
|
||||
LD A,','
|
||||
JR PC_PRTCHR
|
||||
|
||||
PC_LBKT:
|
||||
PUSH AF
|
||||
@@ -43,30 +43,30 @@ PC_RBKT:
|
||||
LD A,']'
|
||||
JR PC_PRTCHR
|
||||
|
||||
;PC_LT:
|
||||
; PUSH AF
|
||||
; LD A,'<'
|
||||
; JR PC_PRTCHR
|
||||
PC_LT:
|
||||
PUSH AF
|
||||
LD A,'<'
|
||||
JR PC_PRTCHR
|
||||
|
||||
;PC_GT:
|
||||
; PUSH AF
|
||||
; LD A,'>'
|
||||
; JR PC_PRTCHR
|
||||
PC_GT:
|
||||
PUSH AF
|
||||
LD A,'>'
|
||||
JR PC_PRTCHR
|
||||
|
||||
;PC_LPAREN:
|
||||
; PUSH AF
|
||||
; LD A,'('
|
||||
; JR PC_PRTCHR
|
||||
PC_LPAREN:
|
||||
PUSH AF
|
||||
LD A,'('
|
||||
JR PC_PRTCHR
|
||||
|
||||
;PC_RPAREN:
|
||||
; PUSH AF
|
||||
; LD A,')'
|
||||
; JR PC_PRTCHR
|
||||
PC_RPAREN:
|
||||
PUSH AF
|
||||
LD A,')'
|
||||
JR PC_PRTCHR
|
||||
|
||||
;PC_ASTERISK:
|
||||
; PUSH AF
|
||||
; LD A,'*'
|
||||
; JR PC_PRTCHR
|
||||
PC_ASTERISK:
|
||||
PUSH AF
|
||||
LD A,'*'
|
||||
JR PC_PRTCHR
|
||||
|
||||
PC_CR:
|
||||
PUSH AF
|
||||
@@ -201,7 +201,7 @@ _REGDMP:
|
||||
LD A,'@'
|
||||
CALL COUT
|
||||
POP AF
|
||||
|
||||
|
||||
PUSH BC
|
||||
LD BC,(REGDMP_PC)
|
||||
CALL PRTHEXWORD ; PC
|
||||
@@ -235,7 +235,7 @@ _REGDMP:
|
||||
POP AF
|
||||
|
||||
;LD SP,(RD_STKSAV) ; BACK TO ORIGINAL STACK FRAME
|
||||
|
||||
|
||||
JP $FFFF ; RETURN, $FFFF IS DYNAMICALLY UPDATED
|
||||
REGDMP_RET .EQU $-2 ; RETURN ADDRESS GOES HERE
|
||||
;
|
||||
@@ -340,17 +340,17 @@ ADDHLA1:
|
||||
; IN: MULTIPLY H BY E
|
||||
; OUT: HL = RESULT, E = 0, B = 0
|
||||
;
|
||||
;MULT8:
|
||||
; LD D,0
|
||||
; LD L,D
|
||||
; LD B,8
|
||||
;MULT8_LOOP:
|
||||
; ADD HL,HL
|
||||
; JR NC,MULT8_NOADD
|
||||
; ADD HL,DE
|
||||
;MULT8_NOADD:
|
||||
; DJNZ MULT8_LOOP
|
||||
; RET
|
||||
MULT8:
|
||||
LD D,0
|
||||
LD L,D
|
||||
LD B,8
|
||||
MULT8_LOOP:
|
||||
ADD HL,HL
|
||||
JR NC,MULT8_NOADD
|
||||
ADD HL,DE
|
||||
MULT8_NOADD:
|
||||
DJNZ MULT8_LOOP
|
||||
RET
|
||||
;
|
||||
; FILL MEMORY AT HL WITH VALUE A, LENGTH IN BC, ALL REGS USED
|
||||
; LENGTH *MUST* BE GREATER THAN 1 FOR PROPER OPERATION!!!
|
||||
@@ -364,6 +364,54 @@ FILL:
|
||||
LDIR ; DO THE REST
|
||||
RET ; RETURN
|
||||
;
|
||||
; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION
|
||||
;
|
||||
PRTDECB:
|
||||
PUSH HL
|
||||
PUSH AF
|
||||
LD L,A
|
||||
LD H,0
|
||||
CALL PRTDEC
|
||||
POP AF
|
||||
POP HL
|
||||
RET
|
||||
;
|
||||
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
|
||||
;
|
||||
PRTDEC:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD E,'0'
|
||||
LD BC,-10000
|
||||
CALL PRTDEC1
|
||||
LD BC,-1000
|
||||
CALL PRTDEC1
|
||||
LD BC,-100
|
||||
CALL PRTDEC1
|
||||
LD C,-10
|
||||
CALL PRTDEC1
|
||||
LD E,0
|
||||
LD C,-1
|
||||
CALL PRTDEC1
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
RET
|
||||
PRTDEC1:
|
||||
LD A,'0' - 1
|
||||
PRTDEC2:
|
||||
INC A
|
||||
ADD HL,BC
|
||||
JR C,PRTDEC2
|
||||
SBC HL,BC
|
||||
CP E
|
||||
JR Z,PRTDEC3
|
||||
LD E,0
|
||||
CALL COUT
|
||||
PRTDEC3:
|
||||
RET
|
||||
;
|
||||
; PRINT THE HEX BYTE VALUE IN A
|
||||
;
|
||||
PRTHEXBYTE:
|
||||
@@ -409,9 +457,9 @@ HEXASCII:
|
||||
HEXCONV:
|
||||
AND 0FH ;LOW NIBBLE ONLY
|
||||
ADD A,90H
|
||||
DAA
|
||||
DAA
|
||||
ADC A,40H
|
||||
DAA
|
||||
DAA
|
||||
RET
|
||||
;
|
||||
;****************************
|
||||
@@ -440,40 +488,40 @@ BCD2BYTE:
|
||||
; [0..99] => [00H..99H]
|
||||
;*****************************
|
||||
;
|
||||
;BYTE2BCD:
|
||||
; PUSH BC
|
||||
; LD B,10
|
||||
; LD C,-1
|
||||
;BYTE2BCD1:
|
||||
; INC C
|
||||
; SUB B
|
||||
; JR NC,BYTE2BCD1
|
||||
; ADD A,B
|
||||
; LD B,A
|
||||
; LD A,C
|
||||
; ADD A,A
|
||||
; ADD A,A
|
||||
; ADD A,A
|
||||
; ADD A,A
|
||||
; OR B
|
||||
; POP BC
|
||||
; RET
|
||||
BYTE2BCD:
|
||||
PUSH BC
|
||||
LD B,10
|
||||
LD C,-1
|
||||
BYTE2BCD1:
|
||||
INC C
|
||||
SUB B
|
||||
JR NC,BYTE2BCD1
|
||||
ADD A,B
|
||||
LD B,A
|
||||
LD A,C
|
||||
ADD A,A
|
||||
ADD A,A
|
||||
ADD A,A
|
||||
ADD A,A
|
||||
OR B
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
; PRINT A BYTE BUFFER IN HEX POINTED TO BY DE
|
||||
; REGISTER A HAS SIZE OF BUFFER
|
||||
;
|
||||
;PRTHEXBUF:
|
||||
; OR A
|
||||
; RET Z ; EMPTY BUFFER
|
||||
PRTHEXBUF:
|
||||
OR A
|
||||
RET Z ; EMPTY BUFFER
|
||||
;
|
||||
; LD B,A
|
||||
;PRTHEXBUF1:
|
||||
; CALL PC_SPACE
|
||||
; LD A,(DE)
|
||||
; CALL PRTHEXBYTE
|
||||
; INC DE
|
||||
; DJNZ PRTHEXBUF1
|
||||
; RET
|
||||
LD B,A
|
||||
PRTHEXBUF1:
|
||||
CALL PC_SPACE
|
||||
LD A,(DE)
|
||||
CALL PRTHEXBYTE
|
||||
INC DE
|
||||
DJNZ PRTHEXBUF1
|
||||
RET
|
||||
;
|
||||
; LEFT SHIFT DE:HL BY B BITS (B > 0)
|
||||
;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE
|
||||
; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES):
|
||||
;
|
||||
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
|
||||
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
|
||||
; PARTITION TABLE, AND BOOT SIGNATURE
|
||||
; SECTOR 2: RESERVED
|
||||
; SECTOR 3: METADATA
|
||||
@@ -29,7 +29,6 @@
|
||||
;
|
||||
SYS_ENT .EQU $E600 ; SYSTEM (OS) ENTRY POINT ADDRESS
|
||||
SYS_LOC .EQU $D000 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
|
||||
SYS_SEC .EQU 22 ; NUMBER OF SECTORS TO READ
|
||||
SYS_END .EQU $FE00 ; ENDING ADDRESS OF SYSTEM IMAGE
|
||||
;
|
||||
SEC_SIZE .EQU 512 ; DISK SECTOR SIZE
|
||||
@@ -77,8 +76,8 @@ BOOT:
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
LD C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,SYS_LOC ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,SYS_SEC ; NUMBER OF SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
@@ -148,10 +147,10 @@ HEXASCII:
|
||||
HEXCONV:
|
||||
AND $0F ;LOW NIBBLE ONLY
|
||||
ADD A,$90
|
||||
DAA
|
||||
DAA
|
||||
ADC A,$40
|
||||
DAA
|
||||
RET
|
||||
DAA
|
||||
RET
|
||||
;
|
||||
ERROR:
|
||||
LD DE,STR_ERR ; POINT TO ERROR STRING
|
||||
@@ -253,7 +252,7 @@ PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE
|
||||
PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN
|
||||
PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?)
|
||||
PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION
|
||||
PR_LABEL .DB "CP/M 2.2$$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
.DW 0 ; (2) DEPRECATED
|
||||
PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM
|
||||
PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM
|
||||
|
||||
@@ -668,15 +668,15 @@ lba ds 4 ; current lba
|
||||
stack equ $
|
||||
stksav ds 2
|
||||
|
||||
; CPMLDR.SYS must be a multiple of 512 bytes (one sector)
|
||||
; for the RomWBW loader. Below padding as needed to force
|
||||
; this.
|
||||
ds 80h
|
||||
csvbufs equ 256
|
||||
alvbufs equ 512
|
||||
dirbufs equ 512
|
||||
dtabufs equ 512
|
||||
|
||||
csvbufs equ 256 ; length (CSV) = ((DRM+1)/4)
|
||||
alvbufs equ 512 ; length (ALV) = ((DSM+1)/4)
|
||||
dirbufs equ 512 ; sector buffer
|
||||
dtabufs equ 512 ; sector buffer
|
||||
;csvbuf ds 256 ; length (CSV) = ((DRM+1)/4)
|
||||
;alvbuf ds 512 ; length (ALV) = ((DSM+1)/4)
|
||||
;dirbuf ds 512 ; sector buffer
|
||||
;dtabuf ds 512 ; sector buffer
|
||||
|
||||
; Trying to save space. The loader must fit underneath
|
||||
; the start of BNKBDOS3 and we have a big BNKBDOS because
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE
|
||||
; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES):
|
||||
;
|
||||
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
|
||||
; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP,
|
||||
; PARTITION TABLE, AND BOOT SIGNATURE
|
||||
; SECTOR 2: RESERVED
|
||||
; SECTOR 3: METADATA
|
||||
@@ -31,7 +31,6 @@
|
||||
; THE SIZE OF CPMLDR.BIN CHANGES, SYS_SIZ MUST BE UPDATED!!!
|
||||
;
|
||||
SYS_SIZ .EQU $0F00 ; SIZE OF CPMLDR.BIN
|
||||
SYS_SEC .EQU 8 ; NUMBER OF SECTORS TO READ
|
||||
SYS_ENT .EQU $0100 ; SYSTEM (OS) ENTRY POINT ADDRESS
|
||||
SYS_LOC .EQU $0100 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE
|
||||
SYS_END .EQU SYS_SIZ + SYS_LOC ; ENDING ADDRESS OF SYSTEM IMAGE
|
||||
@@ -58,8 +57,6 @@ PT_SIZ .EQU $40
|
||||
; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING
|
||||
; ADDRESS OF $8000. THIS CODE IS *ONLY* FOR UNA. THE ROMWBW ROM BOOTLOADER
|
||||
; USES THE METADATA TO LOAD THE OS DIRECTLY.
|
||||
;
|
||||
; UNA DOES NOT SUPPORT CP/M 3 THIS CODE IS NOT USED, AND COULD BE REMOVED
|
||||
;
|
||||
.ORG $8000
|
||||
JR BOOT
|
||||
@@ -83,8 +80,8 @@ BOOT:
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
LD C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,SYS_LOC ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,SYS_SEC ; NUMBER OF SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
@@ -154,10 +151,10 @@ HEXASCII:
|
||||
HEXCONV:
|
||||
AND $0F ;LOW NIBBLE ONLY
|
||||
ADD A,$90
|
||||
DAA
|
||||
DAA
|
||||
ADC A,$40
|
||||
DAA
|
||||
RET
|
||||
DAA
|
||||
RET
|
||||
;
|
||||
ERROR:
|
||||
LD DE,STR_ERR ; POINT TO ERROR STRING
|
||||
@@ -259,7 +256,7 @@ PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE
|
||||
PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN
|
||||
PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?)
|
||||
PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION
|
||||
PR_LABEL .DB "CP/M 3.0$$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
.DW 0 ; (2) DEPRECATED
|
||||
PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM
|
||||
PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,12 +8,11 @@ $define{doc_date}{$date{%d %b %Y}$}$
|
||||
$ifndef{doc_authmail}$ $define{doc_authmail}{wwarthen@gmail.com}$ $endif$
|
||||
$define{doc_orgname}{RetroBrew Computers Group}$
|
||||
$define{doc_orgurl}{www.retrobrewcomputers.org}$
|
||||
$define{doc_intro}{[RomWBW Introduction]($doc_root$/RomWBW Introduction.pdf)}$
|
||||
$define{doc_user}{[RomWBW User Guide]($doc_root$/RomWBW User Guide.pdf)}$
|
||||
$define{doc_sys}{[RomWBW System Guide]($doc_root$/RomWBW System Guide.pdf)}$
|
||||
$define{doc_apps}{[RomWBW Applications]($doc_root$/RomWBW Applications.pdf)}$
|
||||
$define{doc_catalog}{[RomWBW Disk Catalog]($doc_root$/RomWBW Disk Catalog.pdf)}$
|
||||
$define{doc_hardware}{[RomWBW Hardware]($doc_root$/RomWBW Hardware.pdf)}$
|
||||
$define{doc_errata}{[RomWBW Errata]($doc_root$/RomWBW Errata.pdf)}$
|
||||
|
||||
---
|
||||
title: $doc_product$ $doc_title$
|
||||
|
||||
@@ -15,24 +15,20 @@ set PATH=%TOOLS%\gpp;%PATH%
|
||||
|
||||
if not "%1"=="" (call :GenDoc %1 & goto :eof)
|
||||
|
||||
:: call :GenDoc ReadMe || exit /b
|
||||
call :GenDoc Introduction || exit /b
|
||||
call :GenDoc ReadMe || exit /b
|
||||
call :GenDoc UserGuide || exit /b
|
||||
call :GenDoc SystemGuide || exit /b
|
||||
call :GenDoc Applications || exit /b
|
||||
call :GenDoc Catalog || exit /b
|
||||
call :GenDoc Hardware || exit /b
|
||||
call :GenDoc Errata || exit /b
|
||||
|
||||
:: if exist ReadMe.gfm copy Readme.gfm ..\..\ReadMe.md || exit /b
|
||||
:: if exist ReadMe.txt copy ReadMe.txt ..\..\ReadMe.txt || exit /b
|
||||
if exist Introduction.gfm copy Introduction.gfm ..\..\ReadMe.md || exit /b
|
||||
if exist Introduction.txt copy Introduction.txt ..\..\ReadMe.txt || exit /b
|
||||
if exist Introduction.pdf copy Introduction.pdf "..\..\Doc\RomWBW Introduction.pdf" || exit /b
|
||||
if exist ReadMe.gfm copy Readme.gfm ..\..\ReadMe.md || exit /b
|
||||
if exist ReadMe.txt copy ReadMe.txt ..\..\ReadMe.txt || exit /b
|
||||
if exist UserGuide.pdf copy UserGuide.pdf "..\..\Doc\RomWBW User Guide.pdf" || exit /b
|
||||
if exist SystemGuide.pdf copy SystemGuide.pdf "..\..\Doc\RomWBW System Guide.pdf" || exit /b
|
||||
if exist Applications.pdf copy Applications.pdf "..\..\Doc\RomWBW Applications.pdf" || exit /b
|
||||
if exist Catalog.pdf copy Catalog.pdf "..\..\Doc\RomWBW Disk Catalog.pdf" || exit /b
|
||||
if exist Hardware.pdf copy Hardware.pdf "..\..\Doc\RomWBW Hardware.pdf" || exit /b
|
||||
if exist Errata.pdf copy Errata.pdf "..\..\Doc\RomWBW Errata.pdf" || exit /b
|
||||
|
||||
echo.
|
||||
goto :eof
|
||||
@@ -57,4 +53,4 @@ pandoc %1.tmp -f markdown -t gfm-yaml_metadata_block -s -o %1.gfm --default-imag
|
||||
::pandoc %1.tmp -f markdown -t gfm-yaml_metadata_block -s -o %1.txt --markdown-headings=setext --default-image-extension=png || exit /b
|
||||
pandoc %1.tmp -f markdown -t plain+gutenberg -s -o %1.txt || exit /b
|
||||
|
||||
goto :eof
|
||||
goto :eof
|
||||
@@ -381,10 +381,11 @@ The following files appear in User Area 0
|
||||
| `GET.COM` | DRI CPM+ Temporarily get console input form a disk file |
|
||||
| `HELP.COM` | DRI CPM+ Display information on how to use commands |
|
||||
| `HELP.HLP` | DRI CPM+ Databse of help information for HELP.COM |
|
||||
| `HEXCOM.COM` | DRI CPM+ Create a COM file from a hex file (replaces LOAD.COM) |
|
||||
| `HEXCOM.COM` | DRI CPM+ Create a COM file from a hex file output by MAC |
|
||||
| `INITDIR.COM` | DRI CPM+ Initializes a disk to allow time and date stamping |
|
||||
| `LIB.COM` | DRI object file library manager |
|
||||
| `LINK.COM` | DRI object file linker |
|
||||
| `LOAD.COM` | DRI loader for Intel hex files |
|
||||
| `MAC.COM` | DRI 8080 macro assembler |
|
||||
| `PATCH.COM` | DRI CPM+ Display or install patch to the CPM+ system or command files |
|
||||
| `PIP.COM` | DRI CPM+ Periperal Interchange Program |
|
||||
@@ -537,6 +538,8 @@ This is a generic ZPM3 adaptation for RomWBW.
|
||||
| `GENCPM.COM` | 15 | DRI CPM3 Utility to Create a memory image of CPM3.SYS |
|
||||
| `GOTO.COM` | 15 | |
|
||||
| `HELPC15.CFG` | 14 | |
|
||||
| `HP-RPN.HLP` | 10 | Help File for HP RPN Calculators ? |
|
||||
| `HP-ZP.HLP` | 10 | Help File for HP ZP Calculators ? |
|
||||
| `IF.COM` | 15 | Extended flow control tester for FCP (v1.6 Type 3) |
|
||||
| `IF.HLP` | 10 | |
|
||||
| `LOADSEG.COM` | 15 | ZCCP Utility to Load RSXes, TCAPs and Named Directory files. |
|
||||
@@ -556,6 +559,9 @@ This is a generic ZPM3 adaptation for RomWBW.
|
||||
| `ZF11.CFG` | 14 | |
|
||||
| `ZFMACRO.HLP` | 10 | |
|
||||
| `ZHELP.COM` | 15 | |
|
||||
| `ZP.COM` | 15 | Patch utility edits files, disk sectors, or memory |
|
||||
| `ZP.HLP` | 10 | Help File for ZP.COM |
|
||||
| `ZP17.CFG` | 14 | |
|
||||
| `ZSHOW.COM` | 15 | displays amount of information about your Z-System |
|
||||
|
||||
### Additional Files
|
||||
@@ -670,8 +676,6 @@ The following are found in
|
||||
| CPN3MT.LBR | CP/NET 3 | CP/M 3 | RCBus w/ MT011 |
|
||||
| CPN12DUO.LBR | CP/NET 1.2 | CP/M 2.2 | Duodyne w/ Disk I/O |
|
||||
| CPN3DUO.LBR | CP/NET 3 | CP/M 3 | Duodyne w/ Disk I/O |
|
||||
| CPN12SER.LBR | CP/NET 1.2 | CP/M 2.2 | RomWBW Serial Port |
|
||||
| CPN3SER.LBR | CP/NET 3 | CP/M 3 | RomWBW Serial Port |
|
||||
|
||||
## General Purpose Applications
|
||||
|
||||
@@ -688,34 +692,34 @@ RomWBW enhancements. These applications are typically documented in the
|
||||
"RomWBW Applications.pdf" document in the Doc directory of the
|
||||
RomWBW Distribution.
|
||||
|
||||
| **File** | **Source** | **Description** |
|
||||
|----------------|-------------------|---------------------------------------------------------------|
|
||||
| `ASSIGN.COM` | RomWBW | Assign,remove,swap drive letters of RomWBW disk slices |
|
||||
| `CLRDIR.COM` | Max Scane | Initializes the directory area of a disk |
|
||||
| `COPYSL.COM` | M.Pruden | Copy CPM Hard Disk Slices |
|
||||
| `COPYSL.DOC` | M.Pruden | Documentation for COPYSL.COM |
|
||||
| `CPUSPD.COM` | RomWBW | CPU Speed |
|
||||
| `FAT.COM` | RomWBW | MS-DOS FAT filesystem tool (list, copy, delete, format, etc.) |
|
||||
| `FDISK80.COM` | John Coffman | Hard disk partitioning tool |
|
||||
| `FDU.COM` | RomWBW | Floppy Disk Utility, Test and format floppy disks |
|
||||
| `FDU.DOC` | RomWBW | Documentation for FDU |
|
||||
| `FLASH.COM` | Will Sowerbutts | Program FLASH chips in-situ |
|
||||
| `FLASH.DOC` | Will Sowerbutts | Documentation for FLASH |
|
||||
| `FORMAT.COM` | RomWBW | Placeholder application with formatting instructions |
|
||||
| `HTALK.COM` | Tom Plano | Terminal utility talking directly to HBIOS Character Units |
|
||||
| `MODE.COM` | RomWBW | Change serial line characteristics (baud rate, etc.) |
|
||||
| `REBOOT.COM` | MartinR | Cold or Warm Boot the RomWBW System |
|
||||
| `RTC.COM` | Andrew Lynch | Test real time clock hardware on your system |
|
||||
| `SURVEY.COM` | RomWBW | Display system resources summary |
|
||||
| `SYSCOPY.COM` | RomWBW | Copy system tracks to disks (make bootable) |
|
||||
| `TALK.COM` | RomWBW | Route console I/O to & from specified serial port |
|
||||
| `TIMER.COM` | RomWBW | Test and display system timer ticks |
|
||||
| `TUNE.COM` | RomWBW | Play .PT2, .PT3, and .MYM audio files on supported hardware |
|
||||
| `VGMPLAY.COM` | | Simple player for VGM (Video Game Music) files. |
|
||||
| `WDATE.COM` | Kevin Boone | Utility to configure RTC Date. |
|
||||
| `XM.COM` | RomWBW | XModem file transfer application |
|
||||
| **File** | **Source** | **Description** |
|
||||
|----------------|-----------------|---------------------------------------------------------------|
|
||||
| `ASSIGN.COM` | RomWBW | Assign,remove,swap drive letters of RomWBW disk slices |
|
||||
| `CLRDIR.COM` | Max Scane | Initializes the directory area of a disk |
|
||||
| `COPYSL.COM` | M.Pruden | Copy CPM Hard Disk Slices |
|
||||
| `COPYSL.DOC` | M.Pruden | Documentation for COPYSL.COM |
|
||||
| `CPUSPD.COM` | RomWBW | CPU Speed |
|
||||
| `FAT.COM` | RomWBW | MS-DOS FAT filesystem tool (list, copy, delete, format, etc.) |
|
||||
| `FDISK80.COM` | John Coffman | Hard disk partitioning tool |
|
||||
| `FDU.COM` | RomWBW | Floppy Disk Utility, Test and format floppy disks |
|
||||
| `FDU.DOC` | RomWBW | Documentation for FDU |
|
||||
| `FLASH.COM` | Will Sowerbutts | Program FLASH chips in-situ |
|
||||
| `FLASH.DOC` | Will Sowerbutts | Documentation for FLASH |
|
||||
| `FORMAT.COM` | RomWBW | Placeholder application with formatting instructions |
|
||||
| `HTALK.COM` | Tom Plano | Terminal utility talking directly to HBIOS Character Units |
|
||||
| `MODE.COM` | RomWBW | Change serial line characteristics (baud rate, etc.) |
|
||||
| `REBOOT.COM` | MartinR | Cold or Warm Boot the RomWBW System |
|
||||
| `RTC.COM` | Andrew Lynch | Test real time clock hardware on your system |
|
||||
| `SURVEY.COM` | RomWBW | Display system resources summary |
|
||||
| `SYSCOPY.COM` | RomWBW | Copy system tracks to disks (make bootable) |
|
||||
| `TALK.COM` | RomWBW | Route console I/O to & from specified serial port |
|
||||
| `TIMER.COM` | RomWBW | Test and display system timer ticks |
|
||||
| `TUNE.COM` | RomWBW | Play .PT2, .PT3, and .MYM audio files on supported hardware |
|
||||
| `VGMPLAY.COM` | | Simple player for VGM (Video Game Music) files. |
|
||||
| `WDATE.COM` | Kevin Boone | Utility to configure RTC Date. |
|
||||
| `XM.COM` | RomWBW | XModem file transfer application |
|
||||
|
||||
Then we have some more general purpose applications.
|
||||
Then we have some more general purpose applcations.
|
||||
In general, there is no documentation for these applications included with the RomWBW
|
||||
distribution. Some provide command line help themselves. Some are fairly obvious.
|
||||
|
||||
@@ -742,9 +746,7 @@ distribution. Some provide command line help themselves. Some are fairly obvio
|
||||
| `SUPERSUB.DOC` | | Documentation for SUPERSUB |
|
||||
| `SYSGEN.COM` | DRI | Copy system tracks to disks |
|
||||
| `TBASIC.COM` | Dimitri Theulings | Tasty Basic. This also exists as a Rom appication |
|
||||
| `TDLBASIC.COM` | | TDL Zapple 12K BASIC language interpreter |
|
||||
| `TE.COM` | Ladislau Szilagyi | RomWBW enhanced version of TE editor |
|
||||
| `TE.DOC` | Ladislau Szilagyi | TE Editor Documentation |
|
||||
| `TDLBASIC.COM` | | TDL Zapple 12K BASIC language interpreter |
|
||||
| `UNARC.COM` | | Extract file(s) from .ARC or .ARK archive |
|
||||
| `UNARC.DOC` | | Documentation for UNARC |
|
||||
| `UNCR.COM` | | Decompress Crunched file(s). See CRUNCH.COM |
|
||||
@@ -787,8 +789,6 @@ The following files are found in
|
||||
| `COPY.COM` | Z | File copier with ZSDOS date stamping awareness |
|
||||
| `COPY.CFG` | Z | ZCNFG configuration file for COPY application |
|
||||
| `EDITNDR.COM` | Z3 | Edit named directory register in memory. |
|
||||
| `HP-RPN.HLP` | Z3 | Help File for ZP.COM - HP RPN Calculators |
|
||||
| `HP-ZP.HLP` | Z3 | Help File for ZP.COM - HP ZP Calculators |
|
||||
| `KERCPM22.COM` | CPM22 | Kermit communication application |
|
||||
| `KERCPM3.COM` | CPM3 | Kermit communication application |
|
||||
| `LBREXT.COM` | Z | Extract file from .LBR libraries |
|
||||
@@ -814,9 +814,6 @@ The following files are found in
|
||||
| `ZCNFG24.CFG` | Z | Configuration file for ZCNFG.COM |
|
||||
| `ZEX.COM` | Z3 | A memory-based command file processor, like SUBMIT |
|
||||
| `ZEX.CFG` | Z3 | ZCNFG configuration file for ZEX program |
|
||||
| `ZP.COM` | Z3 | Screen-oriented file/disk/memory record patcher (ZAP) |
|
||||
| `ZP.HLP` | Z3 | Help File for ZP.COM |
|
||||
| `ZP17.CFG` | Z3 | Configuration file for ZP.COM |
|
||||
| `ZXD.CFG` | Z | Configuration file for ZXD.COM |
|
||||
| `ZXD.COM` | Z | Extended directory utility w/ date/time stamp support |
|
||||
| `Z3LOC.COM` | Z3 | Display info of the ZCPR3 CCP, BDOS, and BIOS |
|
||||
@@ -1309,9 +1306,7 @@ Also contained on this image in User Area 1 are.
|
||||
| Floppy Disk Image: **fd_z80asm.img**
|
||||
| Hard Disk Image: **hd_z80asm.img**
|
||||
|
||||
This disk contains 6 major components
|
||||
|
||||
* Z80ASM is a relocating macro assembler for CP/M. It takes assembly language
|
||||
Z80ASM is a relocating macro assembler for CP/M. It takes assembly language
|
||||
source statements from a disk file, converts them into their binary equivalent,
|
||||
and stores the output in either a core-image, Intel hex format, or relocatable
|
||||
object file. The mnemonics recognized are those of Zilog/Mostek. The optional
|
||||
@@ -1319,103 +1314,19 @@ listing output may be sent to a disk file, the console and/or the printer, in
|
||||
any combination. Output files may also be generated containing cross-reference
|
||||
information on each symbol used.
|
||||
|
||||
* Z80ASMP (Z80ASM Plus). Referred to as the "Virtual Memory" version which
|
||||
uses disk for working storage, thus not constrained by RAM.
|
||||
|
||||
* SLR180 is a powerful relocating macro assembler for Z80
|
||||
compatible CP/M systems. It takes assembly language source
|
||||
statements from a disk file, converts them into their binary
|
||||
equivalent, and stores the output in either a core-image, Intel
|
||||
hex format, or relocatable object file. The mnemonics recognized
|
||||
are those of Zilog (Z180)/Hitachi. The optional listing output may be
|
||||
sent to a disk file, the console and/or the printer, in any
|
||||
combination. Output files may also be generated containing
|
||||
cross-reference information on each symbol used.
|
||||
|
||||
* SLRMAC relocating macro assembler for Intel 8080 mnemonics
|
||||
|
||||
* SLRNK is a powerful linking loader for Z80-based CP/M systems.
|
||||
It takes relocatable binary information in either Microsoft or
|
||||
SLR Systems format from a disk file, resolves external and entry
|
||||
point references, and stores the output in memory for execution
|
||||
or outputs it to a disk file.
|
||||
|
||||
* SLRNKP (SLRNK Plus). Referred to as the "Virtual Memory" version which
|
||||
uses disk for working storage, thus not constrained by RAM.
|
||||
|
||||
* Z80DIS is an entirely new disassembler for Z80 based CP/M sys-
|
||||
tems. Z80DIS is written in TURBO PASCAL. Z80DIS generates Z80
|
||||
mnemonics and prepares an assembly language file with many
|
||||
special features for ease of understanding the intent of the
|
||||
code. The program and documantation are Copyright 1985, by
|
||||
Kenneth Gielow, Palo Alto, CA. All rights are reserved.
|
||||
|
||||
The manual(s) are available in the Doc/Language directory,
|
||||
|
||||
* z80asm (SLR Systems).pdf
|
||||
* SL180 (SLR Systems 1985).pdf
|
||||
* SLRNK (SLR Systems 1984).pdf
|
||||
* Z80DIS User Manual (1985).pdf
|
||||
The manual is available in the Doc/Language directory,
|
||||
z80asm (SLR Systems).pdf
|
||||
|
||||
A run through of using the assembler is available at
|
||||
[https://8bitlabs.ca/Posts/2023/05/20/learning-z80-asm]
|
||||
|
||||
And another shorter, but shows linker usage guide
|
||||
[https://pollmyfinger.wordpress.com/2022/01/10/modular-retro-z80-assembly-language-programming-using-slr-systems-z80asm-and-srlnk/]
|
||||
|
||||
The following files are found in
|
||||
|
||||
* /Source/Images/d_z80asm
|
||||
|
||||
User Area 0 - Assembler
|
||||
|
||||
| **File** | **Description** |
|
||||
|-------------|---------------------------------------------|
|
||||
| 180FIG.COM | Configuration utility for SLR180.COM |
|
||||
| 8080.MAC | ? |
|
||||
| CONFIG.COM | Configuration utility for Z80ASM.COM |
|
||||
| CONFIGP.COM | Configuration utility for Z80ASMP.COM |
|
||||
| DUMP.* | Sample Program |
|
||||
| MAKESYM.COM | Symbol File .SYM file generation |
|
||||
| MAKESYM.DOC | Documentation for MAKESYM.COM |
|
||||
| SLR180.COM | HD64180 (Z180) Relocating Macro Assembler |
|
||||
| SLR180.DOC | Release Notes for SLR180.COM |
|
||||
| SLRMAC.COM | 8080 Relocating Macro Assembler |
|
||||
| SYNTAX.HLP | Documentation basic usage for all SLR Tools |
|
||||
| SYNTAX.TXT | Documentation basic usage for all SLR Tools |
|
||||
| TEST.* | Sample Program |
|
||||
| Z80ASM.COM | Z80 Relocating Macro Assembler |
|
||||
| Z80ASMP.COM | Z80 Relocating Macro Assembler (PLUS) |
|
||||
| Z80ASM.DOC | Release Notes for Z80ASM.COM |
|
||||
|
||||
User Area 1 - Linker and Library Management
|
||||
|
||||
| **File** | **Description** |
|
||||
|--------------|-----------------------------------------------|
|
||||
| LNKFIG.COM | Configuration utility for SLRNK.COM |
|
||||
| NZLNKFIX.ZEX | ? |
|
||||
| SLRIB.COM | SuperLibrarian, library manager |
|
||||
| SLRNK.COM | SuperLinker, the main linker tool |
|
||||
| SLRNKP.COM | SuperLinker (PLUS) |
|
||||
| SLRNK.DOC | Release Notes for SLRNK.COM |
|
||||
| SLRNKFIX.ZEX | ? |
|
||||
| SYNTAX.HLP | Documentation basic usage for all SLR Tools |
|
||||
| SYNTAX.TXT | Documentation basic usage for all SLR Tools |
|
||||
| SYSSLR.REL | SYSLIB (older) Library compatible with SLR |
|
||||
| VSLR.REL | VLIB (older) Library compatible with SLR |
|
||||
| Z3SLR.REL | Z3LIB (older) Library compatible with SLR |
|
||||
|
||||
User Area 2 - Disassembler
|
||||
|
||||
| **File** | **Description** |
|
||||
|--------------|----------------------------------|
|
||||
| README.22 | Documentation for Z80DIS |
|
||||
| Z80DIS.000 | Overlay File for Z80DIS.COM |
|
||||
| Z80DIS.001 | Overlay File for Z80DIS.COM |
|
||||
| Z80DIS.002 | Overlay File for Z80DIS.COM |
|
||||
| Z80DIS.COM | Z80DIS Disassembler main program |
|
||||
| Z80DIS22.DOC | Main Documentation for Z80DIS |
|
||||
| ZDINSTAL.COM | Instal and Config for Z80DIS.COM |
|
||||
| ZDINSTAL.DTA | Overlay file for ZDINSTAL.COM |
|
||||
| ZDINSTAL.MSG | Overlay file for ZDINSTAL.COM |
|
||||
|
||||
| **File** | **Description** |
|
||||
|------------|-------------------------------------|
|
||||
| DUMP.* | Sample Program |
|
||||
| TEST.* | Sample Program |
|
||||
| Z80ASM.COM | Relocating macro assembler for CP/M |
|
||||
| Z80ASM.DOC | Documentation for Z80.COM |
|
||||
|
||||
19
Source/Doc/Errata.md
Normal file
19
Source/Doc/Errata.md
Normal file
@@ -0,0 +1,19 @@
|
||||
$define{doc_title}{Errata}$
|
||||
$include{"Book.h"}$
|
||||
|
||||
# Errata
|
||||
|
||||
The following errata apply to $doc_product$ $doc_ver$:
|
||||
|
||||
* The use of high density floppy disks requires a CPU speed of 8 MHz or
|
||||
greater.
|
||||
|
||||
* The PropIO support is based on RomWBW specific firmware. Be sure to
|
||||
program/update your PropIO firmware with the corresponding firmware
|
||||
image provided in the Binary directory of the RomWBW distribution.
|
||||
|
||||
* Reading bytes from the video memory of the VDU board (not Color
|
||||
VDU) appears to be problematic. This is only an issue when the driver
|
||||
needs to scroll a portion of the screen which is done by applications
|
||||
such as WordStar or ZDE. You are likely to see screen corruption in
|
||||
this case.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,409 +0,0 @@
|
||||
$define{doc_title}{Introduction}$
|
||||
$include{"Book.h"}$
|
||||
|
||||
# Overview
|
||||
|
||||
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.
|
||||
|
||||
A wide variety of platforms are supported including those
|
||||
produced by these developer communities:
|
||||
|
||||
* [RetroBrew Computers](https://www.retrobrewcomputers.org)
|
||||
(<https://www.retrobrewcomputers.org>)
|
||||
* [RC2014](https://rc2014.co.uk) (<https://rc2014.co.uk>), \
|
||||
[RC2014-Z80](https://groups.google.com/g/rc2014-z80)
|
||||
(<https://groups.google.com/g/rc2014-z80>)
|
||||
* [Retro Computing](https://groups.google.com/g/retro-comp)
|
||||
(<https://groups.google.com/g/retro-comp>)
|
||||
* [Small Computer Central](https://smallcomputercentral.com/)
|
||||
(<https://smallcomputercentral.com/>)
|
||||
|
||||
A complete list of the currently supported platforms is found in
|
||||
$doc_hardware$ .
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
# Description
|
||||
|
||||
## Primary Features
|
||||
|
||||
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.
|
||||
|
||||
Supported hardware features of RomWBW include:
|
||||
|
||||
* Z80 Family CPUs including Z80, Z180, and Z280
|
||||
* Banked memory services for several banking designs
|
||||
* Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, Iomega
|
||||
* Serial drivers including UART (16550-like), ASCI, ACIA, SIO
|
||||
* Video drivers including TMS9918, SY6545, MOS8563, HD6445
|
||||
* Keyboard (PS/2) drivers via VT8242 or PPI interfaces
|
||||
* Real time clock drivers including DS1302, BQ4845
|
||||
* Support for CP/NET networking using Wiznet, MT011 or Serial
|
||||
* Built-in VT-100 terminal emulation support
|
||||
|
||||
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.
|
||||
|
||||
## Included Software
|
||||
|
||||
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.
|
||||
|
||||
Some of the included software:
|
||||
|
||||
* Operating Systems (CP/M 2.2, ZSDOS, NZ-COM, CP/M 3, ZPM3, Z3PLUS, QPM )
|
||||
* Support for other operating systems, p-System, FreeRTOS, and FUZIX.
|
||||
* Programming Tools (Z80ASM, Turbo Pascal, Forth, Cowgol)
|
||||
* C Compiler's including Aztec-C, and HI-TECH C
|
||||
* Microsoft Basic Compiler, and Microsoft Fortran
|
||||
* Some games such as Colossal Cave, Zork, etc
|
||||
* Wordstar Word processing software
|
||||
|
||||
Some of the provided software can be launched directly from the
|
||||
ROM firmware itself:
|
||||
|
||||
* System Monitor
|
||||
* Operating Systems (CP/M 2.2, ZSDOS)
|
||||
* ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
* ROM Forth
|
||||
|
||||
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.
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
## ROM Distribution
|
||||
|
||||
The [RomWBW Repository](https://github.com/wwarthen/RomWBW)
|
||||
(<https://github.com/wwarthen/RomWBW>) on GitHub is the official
|
||||
distribution location for all project source and documentation.
|
||||
|
||||
RomWBW is distributed as both source code and pre-built ROM and disk
|
||||
images.
|
||||
|
||||
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.
|
||||
|
||||
The fully-built distribution releases are available on the
|
||||
[RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases)
|
||||
(<https://github.com/wwarthen/RomWBW/releases>) 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.
|
||||
|
||||
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.
|
||||
|
||||
#### Distribution Directory Layout
|
||||
|
||||
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:
|
||||
|
||||
| **Directory** | **Description** |
|
||||
|--------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| **Binary** | 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. |
|
||||
| **Doc** | Contains various detailed documentation, both RomWBW specifically as well as the operating systems and applications. |
|
||||
| **Source** | Contains the source code files used to build the software and ROM images. |
|
||||
| **Tools** | Contains the programs that are used by the build process or that may be useful in setting up your system. |
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
#### Building from Source
|
||||
|
||||
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.
|
||||
|
||||
## Installation & Operation
|
||||
|
||||
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.
|
||||
|
||||
Complete instructions for installation and operation of RomWBW are found
|
||||
in the $doc_user$. It is also a good idea to review the [Release
|
||||
Notes](https://github.com/wwarthen/RomWBW/blob/master/RELEASE_NOTES.md)
|
||||
for helpful release-specific information.
|
||||
|
||||
## Documentation
|
||||
|
||||
There are several documents that form the core of the RomWBW documentation:
|
||||
|
||||
* $doc_user$ 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
|
||||
|
||||
* $doc_hardware$ contains a description of all the hardware platforms,
|
||||
and devices supported by RomWBW.
|
||||
|
||||
* $doc_apps$ is a reference for the ROM-hosted and OS-hosted applications
|
||||
created or customized to enhance the operation of RomWBW.
|
||||
|
||||
* $doc_catalog$ is a reference for the contents of the disk images
|
||||
provided with RomWBW, with a description of many of the files on each image
|
||||
|
||||
* $doc_sys$ discusses much of the internal design and construction
|
||||
of RomWBW. It includes a reference for the RomWBW HBIOS API
|
||||
functions.
|
||||
|
||||
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.
|
||||
|
||||
Since RomWBW is purely a software product for many different platforms,
|
||||
the documentation does **not** cover hardware construction,
|
||||
configuration, or troubleshooting -- please see your hardware provider
|
||||
for this information.
|
||||
|
||||
# Support
|
||||
|
||||
## Getting Assistance
|
||||
|
||||
The best way to get assistance with RomWBW or any aspect of the
|
||||
RetroBrew Computers projects is via one of the community forums:
|
||||
|
||||
* [RetroBrew Computers Forum](https://www.retrobrewcomputers.org/forum/)
|
||||
* [RC2014 Google Group](https://groups.google.com/forum/#!forum/rc2014-z80)
|
||||
* [retro-comp Google Group](https://groups.google.com/forum/#!forum/retro-comp)
|
||||
|
||||
Submission of issues and bugs are welcome at the
|
||||
[RomWBW GitHub Repository](https://github.com/wwarthen/RomWBW).
|
||||
|
||||
Also feel free to email $doc_author$ at [$doc_authmail$](mailto:$doc_authmail$).
|
||||
I am happy to provide support adapting RomWBW to new or modified systems
|
||||
|
||||
# Contributions
|
||||
|
||||
All source code and distributions are maintained on GitHub.
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
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!
|
||||
|
||||
* 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.
|
||||
|
||||
* 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.
|
||||
|
||||
* 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.
|
||||
|
||||
* Sergey Kiselev created several hardware platforms for RomWBW
|
||||
including the very popular Zeta.
|
||||
|
||||
* David Giles created support for the Z180 CSIO which is now included
|
||||
SD Card driver.
|
||||
|
||||
* 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.
|
||||
|
||||
* Ed Brindley contributed some of the code that supports the RCBus
|
||||
platform.
|
||||
|
||||
* Spencer Owen created the RC2014 series of hobbyist kit computers
|
||||
which has exponentially increased RomWBW usage. Some of his kits
|
||||
include RomWBW.
|
||||
|
||||
* Stephen Cousins has likewise created a series of hobbyist kit
|
||||
computers at Small Computer Central and is distributing RomWBW
|
||||
with many of them.
|
||||
|
||||
* Alan Cox has contributed some driver code and has provided a great
|
||||
deal of advice.
|
||||
|
||||
* The CP/NET client files were developed by Douglas Miller.
|
||||
|
||||
* Phillip Stevens contributed support for FreeRTOS.
|
||||
|
||||
* Curt Mayer contributed the original Linux / MacOS build process.
|
||||
|
||||
* UNA BIOS and FDISK80 are the products of John Coffman.
|
||||
|
||||
* FLASH4 is a product of Will Sowerbutts.
|
||||
|
||||
* CLRDIR is a product of Max Scane.
|
||||
|
||||
* Tasty Basic is a product of Dimitri Theulings.
|
||||
|
||||
* Dean Netherton contributed eZ80 CPU support, the sound driver
|
||||
interface, and the SN76489 sound driver.
|
||||
|
||||
* The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
|
||||
* 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.
|
||||
|
||||
* Martin R has provided substantial help reviewing and improving the
|
||||
User Guide and Applications documents.
|
||||
|
||||
* Mark Pruden has made a wide variety of contributions including:
|
||||
- significant content in the Disk Catalog and User Guide
|
||||
- creation of the Introduction and Hardware documents
|
||||
- Z3PLUS operating system disk image
|
||||
- COPYSL utility
|
||||
- a feature for RomWBW configuration by NVRAM
|
||||
- the /B bulk mode of disk assignment to the ASSIGN utility
|
||||
|
||||
* Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
* Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
* Matt Carroll has contributed a fix to XM.COM that corrects the
|
||||
port specification when doing a send.
|
||||
|
||||
* Dean Jenkins enhanced the build process to accommodate the
|
||||
Raspberry Pi 4.
|
||||
|
||||
* Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
* Lars Nelson has contributed several generic utilities such as
|
||||
a universal (OS agnostic) UNARC application.
|
||||
|
||||
* Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
* Bill Shen has contributed boot loaders for several of his
|
||||
systems.
|
||||
|
||||
* Laszlo Szolnoki has contributed an EF9345 video display
|
||||
controller driver.
|
||||
|
||||
* Ladislau Szilagyi has contributed an enhanced version of
|
||||
CP/M Cowgol that leverages RomWBW memory banking.
|
||||
|
||||
* Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
## Related Projects
|
||||
|
||||
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.
|
||||
|
||||
#### Z88DK
|
||||
|
||||
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 <https://github.com/z88dk/z88dk>.
|
||||
|
||||
#### Paleo Editor
|
||||
|
||||
Steve Garcia has created a Windows-hosted IDE that is tailored to
|
||||
development of RomWBW. The project can be found at
|
||||
<https://github.com/alloidian/PaleoEditor>.
|
||||
|
||||
#### Z80 fig-FORTH
|
||||
|
||||
Dimitri Theulings' implementation of fig-FORTH for the Z80 has a
|
||||
RomWBW-specific variant. The project is hosted at
|
||||
<https://github.com/dimitrit/figforth>.
|
||||
|
||||
#### Assembly Language Programming for the RC2014 Zed
|
||||
|
||||
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
|
||||
[http://w8bh.net/Assembly for RC2014Z.pdf](http://w8bh.net/Assembly%20for%20RC2014Z.pdf).
|
||||
|
||||
# Licensing
|
||||
|
||||
## License Terms
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with RomWBW. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
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.
|
||||
|
||||
If anyone feels their work is being used outside of its intended
|
||||
licensing, please notify:
|
||||
|
||||
> $doc_author$ \
|
||||
> [$doc_authmail$](mailto:$doc_authmail$)
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
All contributions to RomWBW are subject to this license.
|
||||
@@ -9,7 +9,7 @@
|
||||
# On Ubuntu Linux:
|
||||
# apt install gpp pandoc texlive texlive-luatex texlive-fonts-extra
|
||||
#
|
||||
OBJECTS = Introduction.gfm Introduction.txt Introduction.pdf UserGuide.pdf SystemGuide.pdf Applications.pdf Catalog.pdf Hardware.pdf
|
||||
OBJECTS = ReadMe.gfm ReadMe.txt UserGuide.pdf SystemGuide.pdf Applications.pdf Catalog.pdf Errata.pdf
|
||||
# DEST = ../../Doc
|
||||
TOOLS = ../../Tools
|
||||
OTHERS = *.tmp
|
||||
@@ -31,17 +31,16 @@ all :: deploy
|
||||
pandoc $< -f markdown -t dokuwiki -s -o $@ --default-image-extension=pdf
|
||||
|
||||
%.gfm : %.tmp
|
||||
pandoc $< -f markdown -t gfm-yaml_metadata_block -s -o $@ --default-image-extension=pdf
|
||||
pandoc $< -f markdown -t gfm -s -o $@ --default-image-extension=pdf
|
||||
|
||||
%.txt : %.tmp
|
||||
pandoc $< -f markdown -t plain -s -o $@ --default-image-extension=pdf
|
||||
|
||||
deploy :
|
||||
cp Introduction.gfm "../../ReadMe.md"
|
||||
cp Introduction.txt "../../ReadMe.txt"
|
||||
cp Introduction.pdf "../../Doc/RomWBW Introduction.pdf"
|
||||
cp ReadMe.gfm "../../ReadMe.md"
|
||||
cp ReadMe.txt "../../ReadMe.txt"
|
||||
cp UserGuide.pdf "../../Doc/RomWBW User Guide.pdf"
|
||||
cp SystemGuide.pdf "../../Doc/RomWBW System Guide.pdf"
|
||||
cp Applications.pdf "../../Doc/RomWBW Applications.pdf"
|
||||
cp Catalog.pdf "../../Doc/RomWBW Disk Catalog.pdf"
|
||||
cp Hardware.pdf "../../Doc/RomWBW Hardware.pdf"
|
||||
cp Errata.pdf "../../Doc/RomWBW Errata.pdf"
|
||||
|
||||
@@ -3,10 +3,9 @@ $include{"Basic.h"}$
|
||||
|
||||
# Overview
|
||||
|
||||
RomWBW software provides a complete, commercial quality
|
||||
implementation of CP/M (and workalike) operating systems and
|
||||
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.
|
||||
|
||||
A wide variety of platforms are supported including those
|
||||
produced by these developer communities:
|
||||
|
||||
@@ -23,7 +22,7 @@ produced by these developer communities:
|
||||
A complete list of the currently supported platforms is found in the
|
||||
[Installation] section.
|
||||
|
||||
Supported hardware features of RomWBW include:
|
||||
General features include:
|
||||
|
||||
* Z80 Family CPUs including Z80, Z180, and Z280
|
||||
* Banked memory services for several banking designs
|
||||
@@ -32,7 +31,7 @@ Supported hardware features of RomWBW include:
|
||||
* Video drivers including TMS9918, SY6545, MOS8563, HD6445
|
||||
* Keyboard (PS/2) drivers via VT8242 or PPI interfaces
|
||||
* Real time clock drivers including DS1302, BQ4845
|
||||
* Support for CP/NET networking using Wiznet, MT011 or Serial
|
||||
* OSes: CP/M 2.2, ZSDOS, CP/M 3, NZ-COM, ZPM3, QPM, p-System, and FreeRTOS
|
||||
* Built-in VT-100 terminal emulation support
|
||||
|
||||
RomWBW is distributed as both source code and pre-built ROM and disk
|
||||
@@ -44,14 +43,13 @@ ROM firmware itself:
|
||||
* ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
* ROM Forth
|
||||
|
||||
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
|
||||
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.
|
||||
OSes and allows up to 2GB of accessible storage on a single device.
|
||||
|
||||
The pre-built ROM firmware images are generally suitable for most
|
||||
users. However, it is also very easy to modify and build custom ROM
|
||||
@@ -74,25 +72,25 @@ 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.
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
# Acquiring RomWBW
|
||||
|
||||
The [RomWBW Repository](https://github.com/wwarthen/RomWBW)
|
||||
(<https://github.com/wwarthen/RomWBW>) on GitHub is the official
|
||||
distribution location for all project source and documentation.
|
||||
The fully-built distribution releases are available on the
|
||||
(<https://github.com/wwarthen/RomWBW>) on GitHub is the official
|
||||
distribution location for all project source and documentation. The
|
||||
fully-built distribution releases are available on the
|
||||
[RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases)
|
||||
(<https://github.com/wwarthen/RomWBW/releases>) of the repository.
|
||||
On this page, you will normally see a Development Snapshot as well as
|
||||
(<https://github.com/wwarthen/RomWBW/releases>) 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.
|
||||
|
||||
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
|
||||
stick to the most recent stable release. Expand the "Assets" drop-down
|
||||
for the release you want to download, then select the asset named
|
||||
RomWBW-vX.X.X-Package.zip. The Package asset 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.
|
||||
|
||||
All source code and distributions are maintained on GitHub. Code
|
||||
@@ -107,20 +105,16 @@ drives (IDE disk, CF Card, SD Card, etc.) which then provides even more
|
||||
functionality.
|
||||
|
||||
Complete instructions for installation and operation of RomWBW are
|
||||
found in the $doc_user$. It is also a good idea to review the
|
||||
[Release Notes](https://github.com/wwarthen/RomWBW/blob/master/RELEASE_NOTES.md)
|
||||
for helpful release-specific information.
|
||||
found in the $doc_user$.
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation for $doc_product$ includes:
|
||||
|
||||
* $doc_intro$
|
||||
* $doc_user$
|
||||
* $doc_sys$
|
||||
* $doc_apps$
|
||||
* $doc_catalog$
|
||||
* $doc_hardware$
|
||||
* $doc_errata$
|
||||
|
||||
# Acknowledgments
|
||||
|
||||
@@ -194,14 +188,10 @@ please let me know if I missed you!
|
||||
|
||||
* Martin R has provided substantial help reviewing and improving the
|
||||
User Guide and Applications documents.
|
||||
|
||||
* Mark Pruden has made a wide variety of contributions including:
|
||||
- significant content in the Disk Catalog and User Guide
|
||||
- creation of the Introduction and Hardware documents
|
||||
- Z3PLUS operating system disk image
|
||||
- COPYSL and SLABEL utility
|
||||
- a feature for RomWBW configuration by NVRAM
|
||||
- the /B bulk mode of disk assignment to the ASSIGN utility
|
||||
|
||||
* Mark Pruden has also contributed a great deal of content to the
|
||||
Disk Catalog, User Guide as well as contributing the disk image
|
||||
for the Z3PLUS operating system, and the COPYSL utility.
|
||||
|
||||
* Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ constraints, new hardware platforms can be supported by simply
|
||||
adjusting values in a build configuration file.
|
||||
|
||||
RomWBW is geared toward hardware being developed in modern
|
||||
retro-computing hobbyist communities, not as replacement software for
|
||||
retro-computing hobbyist communities, not as a replacement for
|
||||
legacy hardware. As a result, RomWBW requires at least 128KB
|
||||
of bank switched RAM.
|
||||
|
||||
@@ -42,11 +42,11 @@ RomWBW firmware (ROM) includes:
|
||||
|
||||
It is appropriate to note that much of the code and components that make
|
||||
up a complete RomWBW package are derived from pre-existing work. Most
|
||||
notably, the embedded operating systems are simply ROM-based copies of
|
||||
notably, the embedded operating system is simply a ROM-based copy of
|
||||
generic CP/M or ZSDOS. Much of the hardware support code was originally
|
||||
produced by other members of the RetroBrew Computers Community.
|
||||
|
||||
The remainder of this document focuses on RomWBW HBIOS which is the
|
||||
The remainder of this document focuses on HBIOS which is the
|
||||
fundamental basis of RomWBW.
|
||||
|
||||
# Background
|
||||
@@ -61,13 +61,13 @@ space that is much larger than the CPU address space (typically 512K or
|
||||
the CPU using a technique called bank switching. To achieve this, the
|
||||
physical memory is divided up into chunks (banks) of 32K each. A
|
||||
designated area of the CPU's 64K address space is then reserved to "map"
|
||||
any of the physical memory chunks. You can think of this as a window
|
||||
any of the physical memory chunks. You can think of this as a window
|
||||
that can be adjusted to view portions of the physical memory in 32K
|
||||
blocks. In the case of RomWBW, the lower 32K of the CPU address space is
|
||||
used for this purpose (the window). The upper 32K of CPU address space
|
||||
used for this purpose (the window). The upper 32K of CPU address space
|
||||
is assigned a fixed 32K area of physical memory that never changes. The
|
||||
lower 32K can be "mapped" on the fly to any of the 32K banks of physical
|
||||
memory at a time. The primary constraint is that the CPU cannot be
|
||||
memory at a time. The only constraint is that the CPU cannot be
|
||||
executing code in the lower 32K of CPU address space at the time that a
|
||||
bank switch is performed.
|
||||
|
||||
@@ -91,17 +91,6 @@ operating system is unaware this has occurred. As control is returned to
|
||||
the operating system, the lower 32KB of memory is switched back to the
|
||||
original memory bank.
|
||||
|
||||
The HBIOS functions are invoked simply by placing function parameters
|
||||
in Z80 registers and calling an address within the HBIOS proxy.
|
||||
Additionally, HBIOS implements a complete hardware interrupt management
|
||||
framework. When a hardware interrupt occurs, control vectors through
|
||||
the HBIOS proxy which saves the machine state, selects the HBIOS
|
||||
driver bank into memory, and transfers control to the registered
|
||||
driver's interrupt handler. Upon completion of interrupt processing,
|
||||
control returns via the HBIOS proxy, machine state is restored, and
|
||||
normal processing resumes. The interrupt management framework supports
|
||||
Z80 interrupt modes 1, 2, and 3 (Z280).
|
||||
|
||||
HBIOS is completely agnostic with respect to the operating system (it
|
||||
does not know or care what operating system is using it). The operating
|
||||
system makes simple calls to HBIOS to access any desired hardware
|
||||
@@ -135,24 +124,9 @@ execution.
|
||||
|
||||
# Runtime Memory Layout
|
||||
|
||||
RomWBW divides the standard 64KB Z80 address space into 2 sections.
|
||||
The lower 32KB is the "banked" area. This is the area that will
|
||||
contain any of the 32KB chunks of physical RAM based on which bank is
|
||||
currently selected. The upper 32KB is "fixed". This area of memory
|
||||
is never swapped out and is used to contain software and operating
|
||||
systems that must remain in the Z80 address space.
|
||||
|
||||
Figure 4.1 depicts the memory layout for a system running the CP/M
|
||||
operating system. Applications residing in TPA invoke BDOS services
|
||||
of CP/M, BDOS invokes the custom CBIOS APIs, and finally CBIOS
|
||||
invokes HBIOS functions as needed by calling into the HBIOS proxy.
|
||||
The HBIOS proxy swaps in the HBIOS bank as needed to perform the
|
||||
requested function.
|
||||
|
||||
Additional banks of RAM are used to create a virtual disk drive.
|
||||
|
||||
{ width=100% }
|
||||
|
||||
|
||||
## Bank Id
|
||||
|
||||
RomWBW utilizes a specific assignment of memory banks for dedicated
|
||||
@@ -165,17 +139,16 @@ a ROM bank is being referred to. If it is 1, it indicates a RAM bank
|
||||
is being referred to.
|
||||
|
||||
For example, let's say we have a typical system with 512KB of ROM and
|
||||
512KB of RAM. The following table demonstrates how Bank Ids represent
|
||||
areas of physical memory.
|
||||
512KB of RAM. The Bank Ids would look like this:
|
||||
|
||||
| **Physical Memory** | **Type** | **Physical Bank** | **Bank Id** |
|
||||
|-----------------------|----------|-------------------|---------------|
|
||||
| 0x000000-0x007FFF | ROM | 0 | 0x00 |
|
||||
| 0x008000-0x00FFFF | ROM | 1 | 0x01 |
|
||||
| 0x010000-0x07FFFF | ROM | 2-15 | 0x02-0x0F |
|
||||
| 0x080000-0x087FFF | RAM | 16 | 0x80 |
|
||||
| 0x088000-0x08FFFF | RAM | 17 | 0x81 |
|
||||
| 0x090000-0x0FFFFF | RAM | 18-31 | 0x82-0x8F |
|
||||
| Physical Memory | Type | Physical Bank | Bank Id |
|
||||
|-------------------|------|---------------|-----------|
|
||||
| 0x000000-0x007FFF | ROM | 0 | 0x00 |
|
||||
| 0x008000-0x00FFFF | ROM | 1 | 0x01 |
|
||||
| 0x010000-0x07FFFF | ROM | 2-15 | 0x02-0x0F |
|
||||
| 0x080000-0x087FFF | RAM | 16 | 0x80 |
|
||||
| 0x088000-0x08FFFF | RAM | 17 | 0x81 |
|
||||
| 0x090000-0x0FFFFF | RAM | 18-31 | 0x82-0x8F |
|
||||
|
||||
Note that Bank Id 0x00 is **always** the first bank of ROM and 0x80 is
|
||||
**always** the first bank of RAM. If there were more banks of physical ROM,
|
||||
@@ -197,23 +170,23 @@ table describes the way the banks are assigned. The Typical column
|
||||
shows the specific values that would be assigned for a common system
|
||||
with 512KB of ROM and 512KB of RAM (nROM=16, nRAM=16).
|
||||
|
||||
| **Bank Id** | **Identity** | **Typical** | **Purpose** |
|
||||
|---------------------|--------------|-------------|--------------------------------------------|
|
||||
| 0x00 | BID_BOOT | 0x00 | Boot Bank (HBIOS image) |
|
||||
| 0x01 | BID_IMG0 | 0x01 | Boot Loader, Monitor, ROM OSes, ROM Apps |
|
||||
| 0x02 | BID_IMG1 | 0x02 | ROM Apps |
|
||||
| 0x03 | BID_IMG2 | 0x03 | \<Reserved\> |
|
||||
| 0x04 | BID_ROMD0 | 0x04 | First ROM Disk Bank |
|
||||
| nROM - 1 | | 0x0F | Last ROM Disk Bank |
|
||||
| 0x80 | BID_BIOS | 0x80 | HBIOS (working copy) |
|
||||
| 0x81 | BID_RAMD0 | 0x81 | First RAM Disk Bank |
|
||||
| 0x80 + nRAM - 8 | | 0x88 | Last RAM Disk Bank |
|
||||
| 0x80 + nRAM - 7 | BID_APP0 | 0x89 | First Application Bank |
|
||||
| 0x80 + nRAM - 5 | | 0x8B | Last Application Bank |
|
||||
| 0x80 + nRAM - 4 | BID_BUF | 0x8C | OS Disk Buffers |
|
||||
| 0x80 + nRAM - 3 | BID_AUX | 0x8D | OS Code Bank |
|
||||
| 0x80 + nRAM - 2 | BID_USR | 0x8E | User Bank (CP/M TPA) |
|
||||
| 0x80 + nRAM - 1 | BID_COM | 0x8F | Common Bank |
|
||||
| Bank Id | Identity | Typical | Purpose |
|
||||
|-------------------|-----------|---------|------------------------------------------|
|
||||
| 0x00 |BID_BOOT | 0x00 | Boot Bank (HBIOS image) |
|
||||
| 0x01 |BID_IMG0 | 0x01 | Boot Loader, Monitor, ROM OSes, ROM Apps |
|
||||
| 0x02 |BID_IMG1 | 0x02 | ROM Apps |
|
||||
| 0x03 |BID_IMG2 | 0x03 | \<Reserved\> |
|
||||
| 0x04 |BID_ROMD0 | 0x04 | First ROM Disk Bank |
|
||||
| nROM - 1 | | 0x0F | Last ROM Disk Bank |
|
||||
| 0x80 |BID_BIOS | 0x80 | HBIOS (working copy) |
|
||||
| 0x81 |BID_RAMD0 | 0x81 | First RAM Disk Bank |
|
||||
| 0x80 + nRAM - 8 | | 0x88 | Last RAM Disk Bank |
|
||||
| 0x80 + nRAM - 7 |BID_APP0 | 0x89 | First Application Bank |
|
||||
| 0x80 + nRAM - 5 | | 0x8B | Last Application Bank |
|
||||
| 0x80 + nRAM - 4 |BID_BUF | 0x8C | OS Disk Buffers |
|
||||
| 0x80 + nRAM - 3 |BID_AUX | 0x8D | OS Code Bank |
|
||||
| 0x80 + nRAM - 2 |BID_USR | 0x8E | User Bank (CP/M TPA) |
|
||||
| 0x80 + nRAM - 1 |BID_COM | 0x8F | Common Bank |
|
||||
|
||||
In this table, nROM and nRAM refer to the number of corresponding
|
||||
ROM and RAM banks in the the system.
|
||||
@@ -292,72 +265,28 @@ hence the name "Common".
|
||||
|
||||
# Disk Layout
|
||||
|
||||
## Floppy Disk Layout
|
||||
|
||||
RomWBVW generally handles floppy disks in the same physical formats
|
||||
as MS-DOS. However, the filesystem will normally be CP/M. The following
|
||||
table lists the floppy disk formats used by RomWBW. In all cases,
|
||||
the sector size is 512 bytes.
|
||||
|
||||
| **HBIOS Media ID** | **Capacity** | **Tracks** | **Heads** | **Sectors** |
|
||||
|--------------------|-------------:|-----------:|----------:|------------:|
|
||||
| MID_FD720 | 720KB | 80 | 2 | 9 |
|
||||
| MID_FD144 | 1440KB | 80 | 2 | 18 |
|
||||
| MID_FD360 | 360KB | 40 | 2 | 9 |
|
||||
| MID_FD120 | 1200KB | 80 | 2 | 15 |
|
||||
| MID_FD111 | 1155KB | 77 | 2 | 15 |
|
||||
|
||||
## Hard Disk Layout
|
||||
|
||||
RomWBW supports the use of PC MBR hard disk partitioning (see
|
||||
<https://en.wikipedia.org/wiki/Disk_partitioning>). When accessing
|
||||
a hard disk device, HBIOS will look for a partition with type id 0x2E
|
||||
and will use that partition exclusively for all storage. If a hard
|
||||
disk does not have a valid partition table with a partition of type
|
||||
0x2E, the HBIOS will treat the hard disk as dedicated storage and
|
||||
will store data starting at the first sector of the disk.
|
||||
|
||||
The use of a partition of type 0x2E is preferred for RomWBW and is
|
||||
referred to as a "Modern" disk layout. If there is no RomWBW
|
||||
partition on the disk, then the disk is designated as having a
|
||||
"Classic" disk layout.
|
||||
|
||||
When a disk uses a RomWBW partition (type 0x2E) for storage (Modern
|
||||
layout), the CP/M filesystems on that disk will utilize a format with
|
||||
1,024 directory entries per filesystem. If there is no RomWBW
|
||||
partition, the CP/M filesystems will have 512 directory entries per
|
||||
filesystem. As a result, the Modern disk layout with a RomWBW partition
|
||||
is also referred to as the "hd1k" layout indicating 1024 directory
|
||||
entries. Similarly, the Classic disk layout (no partition of type 0x2E)
|
||||
is also referred to as the "hd512" layout indicating 512 directory
|
||||
entries.
|
||||
|
||||
The layout type of any hard disk is simply dictated by the existence of
|
||||
a RomWBW partition. This also means that if you add or remove a
|
||||
partition table entry of type 0x2E on existing hard disk media, you will
|
||||
lose access to any pre-existing CP/M data on the disk. If used,
|
||||
partitioning should be done before putting any data on the disk.
|
||||
RomWBW supports two hard disk layouts: the Classic layout used by
|
||||
RomWBW with 512 directory entries per slice and a Modern layout with
|
||||
1024 directory entries per slice. These layouts are referred to as
|
||||
hd512 and hd1k respectively.
|
||||
|
||||
WARNING: You **can not** mix the two hard disk layouts on one hard
|
||||
disk device. You can use different layouts on different hard disk
|
||||
devices in a single system though.
|
||||
|
||||
Regardless of whether a disk is Modern or Classic, RomWBW supports
|
||||
the concept of CP/M filesystem slices. In general, CP/M filesystems are
|
||||
limited to 8MB. Since current disk media is dramatically larger than
|
||||
this, RomWBW implements a mechanism to put many (up to 256) CP/M
|
||||
filesystems on a single disk. Each such filesystem is called a slice
|
||||
referring to the idea that the disk has been sliced into many
|
||||
independent CP/M filesystems. RomWBW allows the disk slices to be
|
||||
mapped to the limited (16) drive letters of CP/M. The mapping can be
|
||||
modified on-the-fly on a running system as desired.
|
||||
RomWBW determines which of the hard disk layouts to use for a given
|
||||
hard disk device based on whether there is a RomWBW hard disk
|
||||
partition on the disk containing the slices. If there is no RomWBW
|
||||
partition, then RomWBW will assume the 512 directory entry format for
|
||||
all slices and will assume the slices start at the first sector of
|
||||
the hard disk. If there is a RomWBW partition on the hard disk
|
||||
device, then RomWBW will assume the 1024 directory entry format for
|
||||
all slices and will assume the slices are located in the defined
|
||||
partition.
|
||||
|
||||
If the case of a Modern disk layout (with a RomWBW partition), the
|
||||
slices are contained within the defined partition area and the number
|
||||
of slices is dictated by the size of the partition. In the case of a
|
||||
Classic disk layout (no RomWBW partition), the slices are located at the
|
||||
start of the disk (first sector). In either case, the slices are just
|
||||
sequential areas of space on the hard disk.
|
||||
RomWBW supports up to 256 CP/M slices (0-255). Under hd512, the slices
|
||||
begin at the start of the hard disk. Under hd1k, the slices reside
|
||||
within partition type 0x2E.
|
||||
|
||||
RomWBW accesses all hard disks using Logical Block Addressing (pure
|
||||
sector offset). When necessary, RomWBW simulates the following disk
|
||||
@@ -386,16 +315,17 @@ and CP/M knows nothing about the FAT partition. However, the FAT
|
||||
application can be run under CP/M to access the FAT partition
|
||||
programmatically.
|
||||
|
||||
Before being used, A CP/M slice must be (re)initialized using the CP/M
|
||||
command CLRDIR. A CP/M slice can be made bootable by copying a system
|
||||
image to the System Area using SYSCOPY.
|
||||
A CP/M slice is (re)initialized using the CP/M command CLRDIR. A CP/M
|
||||
slice can be made bootable by copying system image to the System Area
|
||||
using SYSCOPY.
|
||||
|
||||
The FAT partition can be created from CP/M using the FDISK80 application.
|
||||
|
||||
The FAT partition can be initialized using the FAT application from CP/M
|
||||
using the command `FAT FORMAT n:` where n is the RomWBW disk unit
|
||||
number containing the FAT partition to be formatted.
|
||||
|
||||
### Modern Hard Disk Layout (hd1k)
|
||||
## Modern Disk Layout (hd1k)
|
||||
|
||||

|
||||
|
||||
@@ -406,7 +336,7 @@ The CP/M slices reside entirely within a hard disk partition of type
|
||||
0x2E. The number of slices is determined by the number of slices that
|
||||
fit within the partition spaces allocated up to the maximum of 256.
|
||||
|
||||
### Classic Hard Disk Layout (hd512)
|
||||
## Classic Disk Layout (hd512)
|
||||
|
||||

|
||||
|
||||
@@ -433,25 +363,27 @@ application. The user is responsible for ensuring that the start of the
|
||||
FAT partition does not overlap with the area they intend to use for
|
||||
CP/M slices. FDISK80 has a Reserve option to assist with this.
|
||||
|
||||
### Mapping to Media ID
|
||||
## Mapping to Media ID
|
||||
|
||||
HBIOS has a definition of "Media ID", which defines the type and physical
|
||||
properties of disk media provided by an underlying storage device. For a
|
||||
complete list of Media ID's please see [Disk Input/Output (DIO)].
|
||||
complete list of Media ID's please see the following section
|
||||
|
||||
[Disk Input/Output (DIO)]
|
||||
|
||||
There are two important Media ID's relating to Hard Disk Layouts:
|
||||
|
||||
| **Media** | **ID** | **Format / Meaning** |
|
||||
|----------------|-------:|-------------------------------------------------------------|
|
||||
| MID_HD | 4 | Classic Disk Layout (hd512) *--and--* HBIOS Hard Disk Drive |
|
||||
| MID_HDNEW | 10 | Modern Disk Layout (hd1k) |
|
||||
| **Media** | **ID** | **Format / Meaning** |
|
||||
|------------|-------:|-------------------------------------------------------------|
|
||||
| MID_HD | 4 | Classic Disk Layout (hd512) *--and--* HBIOS Hard Disk Drive |
|
||||
| MID_HDNEW | 10 | Modern Disk Layout (hd1k) |
|
||||
|
||||
HBIOS typically does not understand the format of data on a device,
|
||||
instead just treating all hard disks as raw sectors. `MID_HD` is the typical
|
||||
Media ID used by HBIOS to describe high capacity hard disk media
|
||||
Media ID used by HBIOS to describe high capaity hard disk media
|
||||
|
||||
When the Modern Disk Layout was added, the `MID_HDNEW`, was added to
|
||||
differentiate (at the operating system level) between the Classic and Modern layouts.
|
||||
differentiate (at the oerating system level) between the Classic and Modern layouts.
|
||||
|
||||
However HBIOS itself typically does NOT make this distinction, since the use
|
||||
of these two formats is determined by the operating system based on the
|
||||
@@ -532,10 +464,8 @@ of a system image before programming it to the ROM; or 2) easily switch
|
||||
between system images on the fly.
|
||||
|
||||
During the RomWBW build process, one of the output files produced is an
|
||||
actual CP/M application (an executable .COM program file). Like the
|
||||
normal .ROM files, this file is placed in the Binary directory with the
|
||||
same name as the ROM file, but with the file extension of .ROM. Once
|
||||
you have a running CP/M (or compatible) system, you can upload/copy this
|
||||
actual CP/M application (an executable .COM program file). Once you have
|
||||
a running CP/M (or compatible) system, you can upload/copy this
|
||||
application file to the filesystem. By executing this file, you will
|
||||
initiate an Application Boot using the system image contained in the
|
||||
application file itself.
|
||||
@@ -569,97 +499,6 @@ The startup then proceeds very much like the Application Boot
|
||||
process described above. HBIOS is installed in its operating bank
|
||||
and control is passed to the Boot Loader.
|
||||
|
||||
## Boot Recovery
|
||||
|
||||
To assist users when driver faults or mis-configuration causes a boot
|
||||
failure, RomWBW supports a limited recovery capability. This is
|
||||
achieved by allowing the user to reboot their machine, loading
|
||||
a minimal driver set. Implementation of this feature requires a
|
||||
hardware input "BOOT RECOVERY" button to be available and
|
||||
appropriate software configuration to be completed in the HBIOS.
|
||||
|
||||
When implemented, holding the "BOOT RECOVERY" button in after a
|
||||
reset or power cycle will cause the normal driver load process to
|
||||
be skipped in preference to a minimal set of drivers being loaded.
|
||||
|
||||
Typically this would be: Serial communication, RAM disk and parallel
|
||||
port IDE interface drivers.
|
||||
|
||||
Platforms supporting this option currently are the MBC, Duodyne and
|
||||
latter version of the SBC.
|
||||
|
||||
# Configuration
|
||||
|
||||
## RomWBW NVRAM Configuration
|
||||
|
||||
On systems with RTC devices (that have Non-Volatile RAM), RomWBW supports storing
|
||||
some limited configuration option options inside this RAM.
|
||||
|
||||
Several configuration options are currently supported; these are known as Switches.
|
||||
The following switch ID's are defined, and described in sections below.
|
||||
|
||||
| Switch Number | Name | Description |
|
||||
|---------------|--------------|-----------------------------------------------|
|
||||
| 0x00 | -reserved- | Reserved |
|
||||
| 0x01 | Boot Options | ROM or Disk Boot Settings |
|
||||
| 0x02 | -n/a- | -n/a- high order byte of previous switch |
|
||||
| 0x03 | Auto Boot | Automatically boot enabled without user input |
|
||||
| 0x04 - 0xFE | -future- | Future general usage |
|
||||
| 0xFF | Status Reset | Get Status or Reset Switches to Default |
|
||||
|
||||
RomWBW uses bytes located at the start of RTC NVRAM, and includes a Parity check of
|
||||
the bytes in NVRAM to check for authenticity before using the configuration.
|
||||
|
||||
| NVRAM Byte | Name | Description |
|
||||
|-------------|--------------|-----------------------------------|
|
||||
| 0x00 | Header Byte | Header Signature Byte 'W' |
|
||||
| 0x01 - 0x03 | Switch Data | Actual Switch Data |
|
||||
| 0x04 | Parity Check | Checksum byte to check integrity |
|
||||
|
||||
The above data is copied into the HBIOS Configuration Block (HCB) at startup at
|
||||
the location starting at CB_SWITCHES.
|
||||
|
||||
### Boot Options (NVSW_BOOTOPTS)
|
||||
|
||||
16 bit Switch defining the ROM application or Disk device to boot if
|
||||
automatic booting is enabled.
|
||||
|
||||
| Bit 15 | Bits 14-8 | Bits 7-0 |
|
||||
|-------------|-------------------|--------------------|
|
||||
| 1 = ROM App | -undefined- | App to Boot (Char) |
|
||||
| 0 = Disk | Disk Unit (0-127) | Disk Slice (0-255) |
|
||||
|
||||
### Auto Boot (NVSW_AUTOBOOT)
|
||||
|
||||
8 bit Switch defining if the system should auto boot at startup.
|
||||
|
||||
| Bits 7-6 | Bit 5 | Bit 4 | Bits 3-0 |
|
||||
|----------|------------------------|----------|--------------------------------------|
|
||||
| -unused- | 1 = Auto Boot Enabled | -unused- | 0 = Immediate Boot with no delay |
|
||||
| -unused- | 1 = Auto Boot Enabled | -unused- | (1-15) Timeout (seconds) before boot |
|
||||
| -unused- | 0 = Auto Boot Disabled | -unused- | -undefined- |
|
||||
|
||||
### Status Reset (0xFF)
|
||||
|
||||
The Status Reset switch is not a general purpose switch, it is a control mechanism
|
||||
to allow the global status of all switches to be determined. The meaning of the switch
|
||||
is different for Read (Get Status) and Write (Reset NVRAM)
|
||||
|
||||
#### GET (Get Status)
|
||||
|
||||
The read Get Status of switches. This returns very specific values from the function call.
|
||||
|
||||
| Status | A Register | Z / NZ Flag |
|
||||
|----------------------------------------------|------------|--------------|
|
||||
| NVRAM does not exist | A=0 | NZ flag set |
|
||||
| NVRAM exists, but has not been initialised | A=1 | NZ flag set |
|
||||
| NVRAM exists, and has been fully initialised | A='W' | Z flag set |
|
||||
|
||||
#### SET (Reset NVRAM)
|
||||
|
||||
Reset NVRAM to default values. This will wipe any existing data and set default
|
||||
values into NVRAM.
|
||||
|
||||
# Driver Model
|
||||
|
||||
The framework code for bank switching also allows hardware drivers to be
|
||||
@@ -708,7 +547,7 @@ CRT character device, the data is actually passed to a built-in terminal
|
||||
emulator which, in turn, utilizes a set of VDA (Video Display Adapter)
|
||||
functions (such as cursor positioning, scrolling, etc.).
|
||||
|
||||
Figure 9.1 depicts the relationship between these components
|
||||
Figure 7.1 depicts the relationship between these components
|
||||
of HBIOS video processing:
|
||||
|
||||
{ width=100% }
|
||||
@@ -759,7 +598,7 @@ must be careful not to modify the operating environment in any way that
|
||||
the operating system does not expect.
|
||||
|
||||
In general, the desired function is placed in the B register. Register C
|
||||
is frequently used to specify a sub-function or a target device unit
|
||||
is frequently used to specify a subfunction or a target device unit
|
||||
number. Additional registers are used as defined by the specific
|
||||
function. Register A should be used to return function result
|
||||
information. See below for result code definitions.
|
||||
@@ -782,7 +621,7 @@ lower 32K of CPU address space. For optimal performance, such buffers
|
||||
should be placed in the upper 32K of CPU address space.
|
||||
|
||||
HBIOS also implements a small number of core functions in the HBIOS
|
||||
proxy area at the top of RAM. These exist primarily to facilitate the
|
||||
proxy area at the top of RAM. These exist primarily to faciliate the
|
||||
operation of normal HBIOS function calls. However, they are available
|
||||
to be used by OSes and applications. These functions can only be
|
||||
invoked by calling into a jump table in upper RAM.
|
||||
@@ -836,28 +675,27 @@ below enumerates these values.
|
||||
| CIODEV_DUART | 0x09 | SCC2681 Family Dual UART | duart.asm |
|
||||
| CIODEV_Z2U | 0x0A | Zilog Z280 Built-in Serial Ports | z2u.asm |
|
||||
| CIODEV_LPT | 0x0B | Parallel I/O Controller | lpt.asm |
|
||||
| CIODEV_ESPCON | 0x0C | ESP32 VGA Console | esp.asm |
|
||||
| CIODEV_ESPSER | 0x0D | ESP32 Serial Port | esp.asm |
|
||||
| CIODEV_SCON | 0x0E | S100 Console | scon.asm |
|
||||
| CIODEV_SSER | 0x0F | Simple Serial Console | sser.asm |
|
||||
| CIODEV_EZ80UART | 0x10 | eZ80 Built-in UART0 Interface | ez80uart.asm |
|
||||
| CIODEV_ESPCON | 0x0B | ESP32 VGA Console | esp.asm |
|
||||
| CIODEV_ESPSER | 0x0B | ESP32 Serial Port | esp.asm |
|
||||
| CIODEV_SCON | 0x0B | S100 Console | scon.asm |
|
||||
| CIODEV_EZ80UART | 0x11 | eZ80 Built-in UART0 Interface | ez80uart.asm |
|
||||
|
||||
Character devices can usually be configured with line characteristics
|
||||
such as speed, framing, etc. A word value (16 bit) is used to describe
|
||||
the line characteristics as indicated below:
|
||||
|
||||
| **Bits** | **Characteristic** |
|
||||
|---------:|------------------------------------------------------------|
|
||||
| 15-14 | Reserved (set to 0) |
|
||||
| 13 | RTS |
|
||||
| 12-8 | Baud Rate (see below) |
|
||||
| 7 | DTR |
|
||||
| 6 | XON/XOFF Flow Control |
|
||||
| 5 | 1 = Stick Parity(Mark/Space), 0 = Normal Parity (odd/even) |
|
||||
| 4 | 1 = Even/Space, 0 = Odd/Mark |
|
||||
| 3 | Parity Enable (set for true) |
|
||||
| 2 | Stop Bits (set for true) |
|
||||
| 1-0 | Data Bits (5-8 encoded as 0-3) |
|
||||
| **Bits** | **Characteristic** |
|
||||
|---------:|----------------------------------------|
|
||||
| 15-14 | Reserved (set to 0) |
|
||||
| 13 | RTS |
|
||||
| 12-8 | Baud Rate (see below) |
|
||||
| 7 | DTR |
|
||||
| 6 | XON/XOFF Flow Control |
|
||||
| 5 | Stick Parity (set for true) |
|
||||
| 4 | Even Parity (set for true) |
|
||||
| 3 | Parity Enable (set for true) |
|
||||
| 2 | Stop Bits (set for true) |
|
||||
| 1-0 | Data Bits (5-8 encoded as 0-3) |
|
||||
|
||||
The 5-bit Baud Rate value (V) is encoded as V = 75 * 2^X * 3^Y. The
|
||||
bits are defined as YXXXX.
|
||||
@@ -977,9 +815,7 @@ Returns the current Line Characteristics (DE) of the specified Character
|
||||
Returns device information for the specified Character Unit (C). The
|
||||
status (A) is a standard HBIOS result code.
|
||||
|
||||
The two high bits of Device Attribute (C) are: 00 = RS/232, 01 = Terminal,
|
||||
10 = Parallel. The remaining bits should be ignored and are used
|
||||
internally.
|
||||
Device Attribute (C) values are: 0 = RS/232, 1 = Terminal, 2 = Parallel.
|
||||
|
||||
Device Type (D) indicates the specific hardware driver that handles the
|
||||
specified Character Unit. Values are listed at the start of this
|
||||
@@ -1005,7 +841,7 @@ during the boot process that identifies all disk devices uniquely.
|
||||
|
||||
All character units are assigned a Device Type ID which indicates
|
||||
the specific hardware device driver that handles the unit. The table
|
||||
below enumerates their values.
|
||||
below enumerates there values.
|
||||
|
||||
| **Device Type** | **ID** | **Description** | **Driver** |
|
||||
|-----------------|-------:|------------------------------------------|------------|
|
||||
@@ -1147,13 +983,6 @@ contain all sectors requested. Disk data transfers will be faster if
|
||||
the buffer resides in the top 32K of memory because it avoids a
|
||||
double buffer copy.
|
||||
|
||||
Also for buffers in the top 32K of memory the Bank ID is not
|
||||
strictly required as this memory is alway mapped to the common bank.
|
||||
For buffers in the bottom 32KB ram, the Bank ID is used to identify
|
||||
the bank to use for the buffer. If you do not wih to use banked memory
|
||||
you will need to provide the current Bank ID, which can be obtained
|
||||
using [Function 0xF3 -- System Get Bank (SYSGETBNK)]
|
||||
|
||||
### Function 0x14 -- Disk Write (DIOWRITE)
|
||||
|
||||
| **Entry Parameters** | **Returned Values** |
|
||||
@@ -1242,7 +1071,7 @@ The non-Floppy specific bits are:
|
||||
|---------:|--------------------------------------------------|
|
||||
| 4 | LBA Capable |
|
||||
| 3-0 | Media Type: 0=Hard Disk, 1=CF, 2=SD, 3=USB, |
|
||||
| | 4=ROM, 5=RAM, 6=FLASH, 7=RAMF, 8=CD-ROM, |
|
||||
| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH, 8=CD-ROM, |
|
||||
| | 9=Cartridge |
|
||||
|
||||
Device Type (D) indicates the specific hardware driver that handles the
|
||||
@@ -1698,7 +1527,7 @@ keyboard functions should return a failure status.
|
||||
|
||||
All video units are assigned a Device Type ID which indicates
|
||||
the specific hardware device driver that handles the unit. The table
|
||||
below enumerates their values.
|
||||
below enumerates there values.
|
||||
|
||||
| **Device Type** | **ID** | **Description** | **Driver** |
|
||||
|-----------------|-------:|------------------------------------------|------------|
|
||||
@@ -2061,19 +1890,15 @@ standard HBIOS result code.
|
||||
| | E: Keycode |
|
||||
|
||||
Read the next key data from keyboard of the specified Video Unit (C). If
|
||||
a keyboard buffer is used, return the next Keycode in the buffer. If
|
||||
a keyboard buffer is used, return the next key code in the buffer. If
|
||||
no key data is available, this function will wait indefinitely for a
|
||||
keypress. The Status (A) is a standard HBIOS result code.
|
||||
|
||||
The Scancode (C) value is the raw scancode from the keyboard for the
|
||||
keypress. Scancodes are optional and may not be implemented by the
|
||||
driver. The Scancode values are driver dependent. In the case of a
|
||||
PS/2 keyboard driver, they should be the PS/2 scancode. Other keyboard
|
||||
drivers may return values appropriate for their specific keyboard. If
|
||||
the driver does not implement this, it should return 0 in C.
|
||||
keypress. Scancodes are from the PS/2 scancode set 2 standard.
|
||||
|
||||
The Keystate (D) is a bitmap representing the value of all modifier keys
|
||||
and shift states as they existed at the time of the keystroke. The
|
||||
and shift states as they existed at the time of the keystroke. The
|
||||
bitmap is defined as:
|
||||
|
||||
| **Bit** | **Keystate Indication** |
|
||||
@@ -2087,9 +1912,6 @@ bitmap is defined as:
|
||||
| 1 | Control key was held down |
|
||||
| 0 | Shift key was held down |
|
||||
|
||||
Not all of these bits may be relevant for all keyboards. Any bit that
|
||||
is not relevant should be returned as 0.
|
||||
|
||||
The Keycode (E) is generally returned as appropriate ASCII values, if
|
||||
possible. Special keys, like function keys and arrows, are returned as
|
||||
reserved codes as described at the start of this section.
|
||||
@@ -2418,7 +2240,7 @@ start of the Slice (E). The Status (A) is a standard HBIOS result code.
|
||||
This function extends upon [Function 0x18 -- Disk Media (DIOMEDIA)] for hard
|
||||
disk media by scanning for a partition to determine if the disk uses HD512
|
||||
or HD1K, correctly reporting MID_HD or MID_HDNEW respectively.
|
||||
See the following for some background [Mapping to Media ID]
|
||||
See the folowing for some background [Mapping to Media ID]
|
||||
|
||||
It will also return the sector number of the first sector in the
|
||||
slice if the slice number is valid. If the slice number is invalid
|
||||
@@ -2470,11 +2292,6 @@ Cold Start (0x02):
|
||||
: Perform a system cold start (like a power on). All devices are
|
||||
reinitialized.
|
||||
|
||||
User Restart (0x03):
|
||||
|
||||
: Perform a video terminal reset. Terminal emulation and visual display
|
||||
systems are reset.
|
||||
|
||||
The Status (A) is a standard HBIOS result code.
|
||||
|
||||
### Function 0xF1 -- System Version (SYSVER)
|
||||
@@ -2497,34 +2314,26 @@ version 3.1.0, build 2.
|
||||
|
||||
The hardware Platform (L) is identified as follows:
|
||||
|
||||
| **Name** | **Id** | **Platform ** |
|
||||
| **Name** | **Id** | **Platform ** |
|
||||
|---------------|-------:|-----------------------------------------|
|
||||
| PLT_SBC | 1 | ECB Z80 SBC |
|
||||
| PLT_ZETA | 2 | ZETA Z80 SBC |
|
||||
| PLT_ZETA2 | 3 | ZETA Z80 V2 SBC |
|
||||
| PLT_N8 | 4 | N8 (HOME COMPUTER) Z180 SBC |
|
||||
| PLT_MK4 | 5 | MARK IV |
|
||||
| PLT_UNA | 6 | UNA BIOS |
|
||||
| PLT_RCZ80 | 7 | RCBUS W/ Z80 |
|
||||
| PLT_RCZ180 | 8 | RCBUS W/ Z180 |
|
||||
| PLT_EZZ80 | 9 | EASY/TINY Z80 |
|
||||
| PLT_SCZ180 | 10 | SMALL COMPUTER CENTRAL Z180 |
|
||||
| PLT_DYNO | 11 | DYNO MICRO-ATX MOTHERBOARD |
|
||||
| PLT_RCZ280 | 12 | RCBUS W/ Z280 |
|
||||
| PLT_MBC | 13 | NHYODYNE MULTI-BOARD COMPUTER |
|
||||
| PLT_RPH | 14 | RHYOPHYRE GRAPHICS SBC |
|
||||
| PLT_Z80RETRO | 15 | Z80 RETRO COMPUTER |
|
||||
| PLT_S100 | 16 | S100 COMPUTERS Z180 |
|
||||
| PLT_DUO | 17 | DUODYNE Z80 SYSTEM |
|
||||
| PLT_HEATH | 18 | HEATHKIT H8 Z80 SYSTEM |
|
||||
| PLT_EPITX | 19 | Z180 MINI-ITX |
|
||||
| PLT_MON | 20 | MONSPUTER (DEPRECATED) |
|
||||
| PLT_GMZ180 | 21 | GENESIS Z180 SYSTEM |
|
||||
| PLT_NABU | 22 | NABU PC W/ ROMWBW OPTION BOARD |
|
||||
| PLT_FZ80 | 23 | S100 FPGA Z80 |
|
||||
| PLT_RCEZ80 | 24 | RCBUS W/ eZ80 |
|
||||
|
||||
For more information on these platforms see $doc_hardware$
|
||||
| PLT_SBC |1 | ECB Z80 SBC |
|
||||
| PLT_ZETA |2 | ZETA Z80 SBC |
|
||||
| PLT_ZETA2 |3 | ZETA Z80 V2 SBC |
|
||||
| PLT_N8 |4 | N8 (HOME COMPUTER) Z180 SBC |
|
||||
| PLT_MK4 |5 | MARK IV |
|
||||
| PLT_UNA |6 | UNA BIOS |
|
||||
| PLT_RCZ80 |7 | RCBUS W/ Z80 |
|
||||
| PLT_RCZ180 |8 | RCBUS W/ Z180 |
|
||||
| PLT_EZZ80 |9 | EASY/TINY Z80 |
|
||||
| PLT_SCZ180 |10 | RCBUS SC126, SC130, SC131, SC140 |
|
||||
| PLT_DYNO |11 | DYNO MICRO-ATX MOTHERBOARD |
|
||||
| PLT_RCZ280 |12 | RCBUS W/ Z280 |
|
||||
| PLT_MBC |13 | NHYODYNE MULTI-BOARD COMPUTER |
|
||||
| PLT_RPH |14 | RHYOPHYRE GRAPHICS SBC |
|
||||
| PLT_Z80RETRO |15 | Z80 RETRO COMPUTER |
|
||||
| PLT_S100 |16 | S100 COMPUTERS Z180 |
|
||||
| PLT_DUO |17 | DUODYNE Z80 SYSTEM |
|
||||
| PLT_RCEZ80 |24 | RCBUS W/ eZ80 |
|
||||
|
||||
### Function 0xF2 -- System Set Bank (SYSSETBNK)
|
||||
|
||||
@@ -2802,27 +2611,6 @@ the caller can use interbank calls directly to the function in the
|
||||
driver which bypasses the overhead of the normal function invocation
|
||||
lookup.
|
||||
|
||||
#### SYSGET Subfunction 0xC0 -- Get Switches (SWITCH)
|
||||
|
||||
| **Entry Parameters** | **Returned Values** |
|
||||
|----------------------|---------------------|
|
||||
| B: 0xF8 | A: Status |
|
||||
| C: 0xC0 | HL: Switch Value |
|
||||
| D: Switch Key | |
|
||||
|
||||
This function will return the current value (HL) of the switch (D) from NVRAM.
|
||||
|
||||
Switches may be returned as a 16 bit (HL) or 8 bit (L) value. It is up to the caller
|
||||
to process the returned value correctly. Note for Switch 0xFF (status) the returned value
|
||||
is primarily in the Status (A) register.
|
||||
|
||||
Errors are signaled in the return by setting the NZ flag. When set the
|
||||
(A) register may contain an error code, but this code does not conform to RomWBW standard
|
||||
|
||||
Success is indicated by setting the Z flag
|
||||
|
||||
For a description of switches please see [RomWBW NVRAM Configuration]
|
||||
|
||||
#### SYSGET Subfunction 0xD0 -- Get Timer Tick Count (TIMER)
|
||||
|
||||
| **Entry Parameters** | **Returned Values** |
|
||||
@@ -2995,27 +2783,6 @@ sub-function value. The following lists the subfunctions available along
|
||||
with the registers/information utilized. The Status (A) is a standard
|
||||
HBIOS result code.
|
||||
|
||||
#### SYSSET Subfunction 0xC0 -- Set Switches (SWITCH)
|
||||
|
||||
| **Entry Parameters** | **Returned Values** |
|
||||
|----------------------|---------------------|
|
||||
| B: 0xF9 | A: Status |
|
||||
| C: 0xC0 | |
|
||||
| D: Switch Key | |
|
||||
| HL: Switch Value | |
|
||||
|
||||
This function will set the value (HL) into the switch (D) and store it into NVRAM.
|
||||
|
||||
Switches may be passed as a 16 bit (HL) or 8 bit (L) value. It is up to the caller
|
||||
to send the value correctly. Note for Switch 0xFF (reset) the value (HL) is ignored
|
||||
|
||||
Errors are signalled in the return by setting the NZ flag. When set the
|
||||
(A) register may contain an error code, but this code does not conform to RomWBW standard
|
||||
|
||||
Success is indicated by setting the Z flag
|
||||
|
||||
For a description of switches please see [RomWBW NVRAM Configuration]
|
||||
|
||||
#### SYSSET Subfunction 0xD0 -- Set Timer Tick Count (TIMER)
|
||||
|
||||
| **Entry Parameters** | **Returned Values** |
|
||||
@@ -3134,7 +2901,7 @@ Status (A) is a standard HBIOS result code.
|
||||
This function allows the caller to query information about the interrupt
|
||||
configuration of the running system and allows adding or hooking
|
||||
interrupt handlers dynamically. Register C is used to specify a
|
||||
sub-function. Additional input and output registers may be used as
|
||||
subfunction. Additional input and output registers may be used as
|
||||
defined by the sub-function. The Status (A) is a standard
|
||||
HBIOS result code.
|
||||
|
||||
@@ -3194,11 +2961,13 @@ with the handler prior to uninstalling it.
|
||||
| C: 0x00 | D: Interrupt Mode |
|
||||
| | E: IVT Size |
|
||||
|
||||
Return current Interrupt Mode (D) of the system. Also return the number
|
||||
of Interrupt Vector Table (IVT) entries in IVT (E). For IM1, the size
|
||||
of the table is the number of vectors chained together. For IM2, the
|
||||
size of the table is the number of slots in the vector table. The
|
||||
Status (A) is a standard HBIOS result code.
|
||||
Return current Interrupt Mode (D) of the system. Also return the
|
||||
number of Interrupt Vector Table (IVT) entries in IVT Size (E).
|
||||
interrupt mode in D and size of interrupt vector table in E. For
|
||||
IM1, the size of the table is the number of vectors chained together.
|
||||
For IM2, the size of the table is the number of slots in the vector
|
||||
table. The Status (A) is a standard
|
||||
HBIOS result code.
|
||||
|
||||
#### SYSINT Subfunction 0x10 -- Get Interrupt (INTGET)
|
||||
|
||||
@@ -3433,62 +3202,28 @@ placeholder
|
||||
|
||||
### Diagnostic LEDs
|
||||
|
||||
Progress through the boot and initialization process can be difficult to
|
||||
monitor due to the lack of console or video output. Access to these output
|
||||
devices does not become available until late the in the boot process. If
|
||||
these output devices are also involved with the issue trying to be resolved
|
||||
then trouble shooting is even more difficult.
|
||||
Progress through the boot and initialization process can be difficult to monitor
|
||||
due to the lack of console or video output. Access to these output devices does
|
||||
not become available until late the in the boot process. If these output devices
|
||||
are also involved with the issue trying to be resolved then trouble shooting is
|
||||
even more difficult.
|
||||
|
||||
ROMWBW can be configured to display boot progress with the assistance of
|
||||
additional hardware. This can take the form of a front panel LED display or
|
||||
LED breakout debugging board connected to an 8-bit output port. Or it can
|
||||
utilize existing platform status LEDS.
|
||||
ROMWBW can be configured to display boot progress with the assistance of additional
|
||||
hardware. This take the form of an LED breakout debugging board connected to an
|
||||
8-bit output port. As the boot code executes, the LED output display is updated.
|
||||
|
||||
As the boot code executes, the LED output display is updated to indicate the execution progress.
|
||||
To use a LED breakout board, it must be connected the computers data, reset and port
|
||||
select lines.
|
||||
|
||||
Platforms that have these capabilities built in have them enabled by default.
|
||||
To enable the DIAG option the following settings must be made in the systems .ini
|
||||
configuration file, where 0xnn is the port address.
|
||||
|
||||
#### Front Panel display
|
||||
DIAGENABLE .SET TRUE
|
||||
DIAGPORT .SET 0xnn
|
||||
|
||||
A LED front panel or breakout board needs to be connected the computers data,
|
||||
reset and port select lines.
|
||||
The following table shows the ROMWBW process steps in relation to the LED display.
|
||||
|
||||
To enable this option the following settings can be made in the platforms custom
|
||||
configuration file.
|
||||
|
||||
```
|
||||
FPLED_ENABLE .SET TRUE ; ENABLE FRONT PANEL
|
||||
```
|
||||
|
||||
Custom hardware can be configured with :
|
||||
|
||||
```
|
||||
FPLED_IO .SET $nn ; USE PORT ADDRESS nn
|
||||
FPLED_INV .SET FALSE ; INVERTED LED BITS
|
||||
```
|
||||
|
||||
#### Platform Status LEDS
|
||||
|
||||
These status LEDs use preexisting status LEDs on each platform.
|
||||
|
||||
Enable using:
|
||||
|
||||
```
|
||||
LEDENABLE .SET TRUE ; ENABLES STATUS LED
|
||||
```
|
||||
|
||||
Customize using:
|
||||
|
||||
```
|
||||
LEDMODE .SET LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU]
|
||||
LEDPORT .SET $nn ; STATUS LED PORT ADDRESS
|
||||
```
|
||||
|
||||
The following table shows the ROMWBW process steps in relation to the panel
|
||||
display.
|
||||
|
||||
|
||||
| **PANEL** | **RomWBW Processes** |
|
||||
| **LED** | **RomWBW Processes** |
|
||||
|------------|------------------------------------------------|
|
||||
| `........` | Initial boot |
|
||||
| | Jump to start address |
|
||||
@@ -3561,3 +3296,5 @@ The following section outlines the read only data referenced by the
|
||||
| DCNTL* | 14 | 1 | Z180 DMA/WAIT CONTROL |
|
||||
|
||||
* ONLY PRESENT FOR Z180 BUILDS
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user