mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Compare commits
291 Commits
v3.5.0-dev
...
v3.6.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
edfbfe8eee | ||
|
|
8510158aa0 | ||
|
|
760ed38297 | ||
|
|
95e7c5ce3b | ||
|
|
e92091c922 | ||
|
|
edf3cf93bb | ||
|
|
a110b24d76 | ||
|
|
1813100142 | ||
|
|
e29fb43754 | ||
|
|
d32fe11a19 | ||
|
|
db577eddd9 | ||
|
|
603d29f4ba | ||
|
|
ba5af175ba | ||
|
|
a9c7be6744 | ||
|
|
4ff7888bdc | ||
|
|
80e514e5d4 | ||
|
|
54b48da071 | ||
|
|
1b2f452373 | ||
|
|
4f25b011e1 | ||
|
|
6c95a4285a | ||
|
|
f2e42dd9d8 | ||
|
|
936a3958a5 | ||
|
|
eb8b76819d | ||
|
|
11bc9703c0 | ||
|
|
9a77d7f93e | ||
|
|
2f5cf8fce4 | ||
|
|
0d0360b277 | ||
|
|
7515359c3f | ||
|
|
30a89dedbd | ||
|
|
f5e1987367 | ||
|
|
45222d6b2a | ||
|
|
3513b220c0 | ||
|
|
81278afefe | ||
|
|
eaca39b557 | ||
|
|
27864e8128 | ||
|
|
ec77861fae | ||
|
|
52ea94161c | ||
|
|
ed77b3ef84 | ||
|
|
2f61c3fc81 | ||
|
|
2ffd248eb5 | ||
|
|
ed4ced1ab6 | ||
|
|
77d201f9d3 | ||
|
|
3e1e640bb3 | ||
|
|
5c6ccbf0d3 | ||
|
|
4559608aa5 | ||
|
|
e0b6a23e4a | ||
|
|
f42c53f9e5 | ||
|
|
9563ae4c15 | ||
|
|
331a55ec89 | ||
|
|
6fec2aaf90 | ||
|
|
27ec33e007 | ||
|
|
275291e61f | ||
|
|
ee6621cc63 | ||
|
|
57007a60fc | ||
|
|
e048febffb | ||
|
|
12e76b3434 | ||
|
|
aa6375c093 | ||
|
|
9599a2c37b | ||
|
|
f5f3927e69 | ||
|
|
696b737612 | ||
|
|
09e868eec0 | ||
|
|
6cbe5ad9b7 | ||
|
|
5976afce2e | ||
|
|
8581f477d2 | ||
|
|
7d3bc01899 | ||
|
|
bd558d6a30 | ||
|
|
5d4b234fdb | ||
|
|
149601d17c | ||
|
|
b79709f61c | ||
|
|
7922ac4da5 | ||
|
|
d55f3bdcae | ||
|
|
aee00b0ff8 | ||
|
|
a0d1825701 | ||
|
|
cc2fda0cc2 | ||
|
|
e67b0f7e24 | ||
|
|
96d0900cf7 | ||
|
|
98441355c9 | ||
|
|
2e0f7922ec | ||
|
|
df3a9e7756 | ||
|
|
5e7f359b82 | ||
|
|
4ef452bcd8 | ||
|
|
d1af2ea8c0 | ||
|
|
cda51f7277 | ||
|
|
094545dcbb | ||
|
|
d79dce64fe | ||
|
|
c1152cfe17 | ||
|
|
ea418f9dc4 | ||
|
|
5118ab8d0a | ||
|
|
e42c04d40f | ||
|
|
3618e0a976 | ||
|
|
d0aad220df | ||
|
|
98e633461f | ||
|
|
cb33018341 | ||
|
|
07c08e2817 | ||
|
|
37f01810f5 | ||
|
|
9b4dd7b1bb | ||
|
|
98414da4d5 | ||
|
|
3450ce71a6 | ||
|
|
f162081ec1 | ||
|
|
6222f7410a | ||
|
|
665067eb25 | ||
|
|
dd25180f7c | ||
|
|
ea38e8e93b | ||
|
|
ddb2da2b8f | ||
|
|
3268d99b43 | ||
|
|
a5314c992d | ||
|
|
683f31438f | ||
|
|
69e9eb0805 | ||
|
|
d18208ef6b | ||
|
|
9ec4b0aa4d | ||
|
|
10dcc4300e | ||
|
|
ce65f8dce0 | ||
|
|
ad4c4ac81b | ||
|
|
31dc8a72d4 | ||
|
|
e4daa2d727 | ||
|
|
a8d2017abc | ||
|
|
f81e089d63 | ||
|
|
acc32dc819 | ||
|
|
ca29e429e7 | ||
|
|
39afeda279 | ||
|
|
23c5f7b8c0 | ||
|
|
91c7349026 | ||
|
|
80995f5264 | ||
|
|
56c9edb547 | ||
|
|
af21691d4e | ||
|
|
3a228e3c1f | ||
|
|
d299a9009f | ||
|
|
667aeeb24d | ||
|
|
067560ae74 | ||
|
|
ef0656f162 | ||
|
|
a8a5a85c5c | ||
|
|
4dcd00089e | ||
|
|
f4caf244af | ||
|
|
a91deeb347 | ||
|
|
3804c69428 | ||
|
|
1b45d32af2 | ||
|
|
83e3b8f24f | ||
|
|
29f6fea4aa | ||
|
|
bf61350280 | ||
|
|
ecf2cdfba2 | ||
|
|
9fc2c6129b | ||
|
|
8f80f2f9cd | ||
|
|
81d81952d3 | ||
|
|
ed532cb51b | ||
|
|
a46e05258c | ||
|
|
a35dbefeda | ||
|
|
74f4149034 | ||
|
|
34cc40f459 | ||
|
|
6f5aa06fb3 | ||
|
|
b28e308bfd | ||
|
|
3d23cea071 | ||
|
|
f7b8efd964 | ||
|
|
3c7e3d7586 | ||
|
|
f359f5fb61 | ||
|
|
50deb280b5 | ||
|
|
7654a6b2ed | ||
|
|
dd9e7d6532 | ||
|
|
37ebfefea3 | ||
|
|
6d8ecbb49a | ||
|
|
dfb005ae9e | ||
|
|
5806522402 | ||
|
|
930bcce7da | ||
|
|
ad7d7638d3 | ||
|
|
da05245b4a | ||
|
|
9469aaf333 | ||
|
|
363218b0eb | ||
|
|
1de5458ad7 | ||
|
|
3c0e4a195e | ||
|
|
30866ccbae | ||
|
|
858d680371 | ||
|
|
252e9077e6 | ||
|
|
6c06413dfe | ||
|
|
a8ee0ca19b | ||
|
|
5a48cc5b42 | ||
|
|
ae9b9f9c14 | ||
|
|
874f1b999e | ||
|
|
64611e1df4 | ||
|
|
ebe1504d75 | ||
|
|
6dc4be24e1 | ||
|
|
257fa5407b | ||
|
|
b8fbe0094c | ||
|
|
9c815a6b4c | ||
|
|
2d854510e3 | ||
|
|
374c0675f1 | ||
|
|
766a65bed0 | ||
|
|
7ecd0aa574 | ||
|
|
c5280b3ebd | ||
|
|
8756937946 | ||
|
|
de94085558 | ||
|
|
7d1cbe0f70 | ||
|
|
8e189b4a4a | ||
|
|
c1866d7091 | ||
|
|
eca0370c65 | ||
|
|
ee7c28c119 | ||
|
|
1ae6274e45 | ||
|
|
0adef71f6a | ||
|
|
d4195b2908 | ||
|
|
33603ed826 | ||
|
|
1279daa2fc | ||
|
|
ab4f43c6bb | ||
|
|
e4bbeece09 | ||
|
|
997c3fbcde | ||
|
|
14c8eddcbd | ||
|
|
81d99a76fc | ||
|
|
4555bdec11 | ||
|
|
9103304399 | ||
|
|
1ab10410a8 | ||
|
|
8a16b851ad | ||
|
|
a27f2479af | ||
|
|
f50ae14f9e | ||
|
|
b02aecb45d | ||
|
|
4e716c6b74 | ||
|
|
63460a982b | ||
|
|
c6d5d41933 | ||
|
|
5544275e0d | ||
|
|
f976ede2d1 | ||
|
|
751cc62a81 | ||
|
|
77b98260e9 | ||
|
|
986acd481b | ||
|
|
f8f46c630a | ||
|
|
4df6f00ed9 | ||
|
|
6647b09cf7 | ||
|
|
f36a90afae | ||
|
|
3c3ae4c6ab | ||
|
|
4110c67db4 | ||
|
|
4ac6a7d706 | ||
|
|
1b7ef20ad1 | ||
|
|
913a9caa87 | ||
|
|
58444fb213 | ||
|
|
7917f0a5ad | ||
|
|
8d8868e5d5 | ||
|
|
a6b3b980f2 | ||
|
|
d5c331076c | ||
|
|
bb4a64c35d | ||
|
|
757f0b08ff | ||
|
|
5bb168eb6e | ||
|
|
cee3f8af78 | ||
|
|
70cc884014 | ||
|
|
e4475b5e99 | ||
|
|
2e216d6bf5 | ||
|
|
e428e7ff8e | ||
|
|
083715e097 | ||
|
|
b0bb87ba0a | ||
|
|
83cd133c66 | ||
|
|
327a21ee10 | ||
|
|
0d645cec30 | ||
|
|
82d28e143b | ||
|
|
c0b48a007c | ||
|
|
60b143fe01 | ||
|
|
be618e07a6 | ||
|
|
893da14d50 | ||
|
|
83ef709a71 | ||
|
|
5f54db2d60 | ||
|
|
33e6fdadd7 | ||
|
|
fe947248bd | ||
|
|
b7c9a3b821 | ||
|
|
fa8df65b50 | ||
|
|
26a87a16a8 | ||
|
|
66bc219b32 | ||
|
|
0ad7431528 | ||
|
|
e433eb4962 | ||
|
|
b5b9098429 | ||
|
|
49ff4e4bc0 | ||
|
|
59a7b6c42d | ||
|
|
f9ed5651e6 | ||
|
|
efb9ac21f0 | ||
|
|
a8f2aa71cc | ||
|
|
043600595f | ||
|
|
c106b75261 | ||
|
|
55336ac010 | ||
|
|
778231dc80 | ||
|
|
61d9555dc0 | ||
|
|
4b963c3ab4 | ||
|
|
2788fa4fdf | ||
|
|
1468cecfad | ||
|
|
8f75441317 | ||
|
|
007e8a372a | ||
|
|
7606abb8f3 | ||
|
|
e3192bfbe6 | ||
|
|
9d7adbec63 | ||
|
|
2d1811dcb4 | ||
|
|
cfa86a9f2a | ||
|
|
7a663e2a3c | ||
|
|
1a73a9614b | ||
|
|
660bb20bba | ||
|
|
f03dcf7193 | ||
|
|
64dbf4ff35 | ||
|
|
ce98947d07 | ||
|
|
5d92341189 | ||
|
|
2a501566d7 | ||
|
|
736e4e276c |
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -7,5 +7,7 @@ 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
|
||||
-->
|
||||
|
||||
17
.github/workflows/release.yml
vendored
17
.github/workflows/release.yml
vendored
@@ -31,6 +31,8 @@ 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
|
||||
@@ -50,6 +52,21 @@ jobs:
|
||||
title: "${{env.TITLE}} ${{github.ref_name}}"
|
||||
files: |
|
||||
RomWBW-${{github.ref_name}}-Package.zip
|
||||
|
||||
- name: Build Docs
|
||||
run: |
|
||||
export TZ='America/Los_Angeles'
|
||||
sudo apt-get install gpp pandoc
|
||||
pip install mkdocs
|
||||
make -C Source/Doc deploy_mkdocs
|
||||
mkdocs build -f Source/Doc/mkdocs.yml
|
||||
|
||||
- name: Deploy Docs
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
# if: github.ref == 'refs/heads/master'
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: Source/Doc/site
|
||||
|
||||
# - name: Upload Package Archive
|
||||
# uses: AButler/upload-release-assets@v2.0.2
|
||||
|
||||
79
.gitignore
vendored
79
.gitignore
vendored
@@ -20,7 +20,7 @@
|
||||
|
||||
Binary/**/*.mym
|
||||
Binary/**/*.pt3
|
||||
!Binary/CPNET/NetBoot/cpnos-wbw.sys
|
||||
!Binary/CPNET/NetBoot/*/cpnos.sys
|
||||
|
||||
Source/**/eeprom
|
||||
Source/Apps/Assign.com
|
||||
@@ -77,7 +77,6 @@ Tools/unix/zx/zx
|
||||
|
||||
!Source/ver.lib
|
||||
!Source/Apps/FAT/FAT.COM
|
||||
!Source/Apps/copysl/copysl.com
|
||||
!Source/Apps/ZMP/zmpx.com
|
||||
!Source/Apps/ZMD/zmdsubs.rel
|
||||
!Source/Apps/Test/vdctest/font.asm
|
||||
@@ -98,6 +97,7 @@ 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
|
||||
@@ -120,11 +120,14 @@ Binary/Apps/Tunes/inchina.vgm
|
||||
Binary/Apps/Tunes/shirakaw.vgm
|
||||
Binary/Apps/Tunes/startdem.vgm
|
||||
Binary/Apps/Tunes/wonder01.vgm
|
||||
Binary/Apps/copysl.doc
|
||||
Binary/Apps/fdu.doc
|
||||
Binary/Apps/zmconfig.ovr
|
||||
Binary/Apps/zminit.ovr
|
||||
Binary/Apps/zmp.doc
|
||||
Binary/Apps/zmp.hlp
|
||||
Binary/Apps/zmp.cfg
|
||||
Binary/Apps/zmp.fon
|
||||
Binary/Apps/zmterm.ovr
|
||||
Binary/Apps/zmxfer.ovr
|
||||
Binary/CPM3/bdos3.spr
|
||||
@@ -143,8 +146,7 @@ Binary/CPNET/cpn12ser.lbr
|
||||
Binary/CPNET/cpn3duo.lbr
|
||||
Binary/CPNET/cpn3mt.lbr
|
||||
Binary/CPNET/cpn3ser.lbr
|
||||
Binary/RCEZ80_std.upd
|
||||
Binary/RCZ80_std.upd
|
||||
Binary/*.upd
|
||||
Binary/ZPM3/bnkbdos3.spr
|
||||
Binary/ZPM3/bnkbios3.spr
|
||||
Binary/ZPM3/gencpm.dat
|
||||
@@ -173,74 +175,17 @@ Source/Fonts/fontcgau.asm
|
||||
Source/Fonts/fontvgarcc.asm
|
||||
Source/Fonts/fontvgarcc.bin
|
||||
Source/Fonts/fontvgarcu.asm
|
||||
Source/HBIOS/RCEZ80_std.upd
|
||||
Source/HBIOS/RCZ80_std.upd
|
||||
Source/HBIOS/*.upd
|
||||
Source/HBIOS/build_env.cmd
|
||||
Source/HBIOS/hbios_env.sh
|
||||
Source/HBIOS/netboot.mod
|
||||
Source/Images/*.cat
|
||||
Source/Images/*.img
|
||||
Source/Images/blank144
|
||||
Source/Images/blankhd1k
|
||||
Source/Images/blankhd512
|
||||
Source/Images/fd144_aztecc.img
|
||||
Source/Images/fd144_bascomp.img
|
||||
Source/Images/fd144_cowgol.img
|
||||
Source/Images/fd144_cpm22.img
|
||||
Source/Images/fd144_cpm3.img
|
||||
Source/Images/fd144_fortran.img
|
||||
Source/Images/fd144_games.img
|
||||
Source/Images/fd144_hitechc.img
|
||||
Source/Images/fd144_nzcom.img
|
||||
Source/Images/fd144_qpm.img
|
||||
Source/Images/fd144_tpascal.img
|
||||
Source/Images/fd144_ws4.img
|
||||
Source/Images/fd144_z80asm.img
|
||||
Source/Images/fd144_zpm3.img
|
||||
Source/Images/fd144_zsdos.img
|
||||
Source/Images/hd1k_aztecc.img
|
||||
Source/Images/hd1k_bascomp.img
|
||||
Source/Images/hd1k_blank.img
|
||||
Source/Images/hd1k_bp.img
|
||||
Source/Images/hd1k_combo.img
|
||||
Source/Images/hd1k_cowgol.img
|
||||
Source/Images/hd1k_cpm22.img
|
||||
Source/Images/hd1k_cpm3.img
|
||||
Source/Images/hd1k_fortran.img
|
||||
Source/Images/hd1k_games.img
|
||||
Source/Images/hd1k_hitechc.img
|
||||
Source/Images/hd1k_nzcom.img
|
||||
Source/Images/hd1k_qpm.img
|
||||
Source/Images/hd1k_tpascal.img
|
||||
Source/Images/hd1k_ws4.img
|
||||
Source/Images/hd1k_z80asm.img
|
||||
Source/Images/hd1k_zpm3.img
|
||||
Source/Images/hd1k_zsdos.img
|
||||
Source/Images/hd512_aztecc.img
|
||||
Source/Images/hd512_bascomp.img
|
||||
Source/Images/hd512_blank.img
|
||||
Source/Images/hd512_combo.img
|
||||
Source/Images/hd512_cowgol.img
|
||||
Source/Images/hd512_cpm22.img
|
||||
Source/Images/hd512_cpm3.img
|
||||
Source/Images/hd512_dos65.img
|
||||
Source/Images/hd512_fortran.img
|
||||
Source/Images/hd512_games.img
|
||||
Source/Images/hd512_hitechc.img
|
||||
Source/Images/hd512_nzcom.img
|
||||
Source/Images/hd512_qpm.img
|
||||
Source/Images/hd512_tpascal.img
|
||||
Source/Images/hd512_ws4.img
|
||||
Source/Images/hd512_z80asm.img
|
||||
Source/Images/hd512_zpm3.img
|
||||
Source/Images/hd512_zsdos.img
|
||||
Source/RomDsk/rom0_una.dat
|
||||
Source/RomDsk/rom0_wbw.dat
|
||||
Source/RomDsk/rom128_una.dat
|
||||
Source/RomDsk/rom128_wbw.dat
|
||||
Source/RomDsk/rom256_una.dat
|
||||
Source/RomDsk/rom256_wbw.dat
|
||||
Source/RomDsk/rom384_una.dat
|
||||
Source/RomDsk/rom384_wbw.dat
|
||||
Source/RomDsk/rom896_una.dat
|
||||
Source/RomDsk/rom896_wbw.dat
|
||||
Source/RomDsk/*.cat
|
||||
Source/RomDsk/*.dat
|
||||
Source/ZCPR-DJ/zcprdemo.com
|
||||
Source/ZPM3/autotog.com
|
||||
Source/ZPM3/clrhist.com
|
||||
|
||||
@@ -9,5 +9,8 @@ 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
|
||||
SUBDIRS = Test ZDE
|
||||
|
||||
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
|
||||
@rm -f *.bin *.com *.img *.rom *.pdf *.log *.eeprom *.ovr *.hlp *.doc *.COM *.BIN Tunes/*.mym Tunes/*.pt? Tunes/*.vgm bbcbasic.txt *.cfg *.fon
|
||||
|
||||
4
Binary/Apps/ZDE/Clean.cmd
Normal file
4
Binary/Apps/ZDE/Clean.cmd
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if exist *.com del *.com
|
||||
6
Binary/Apps/ZDE/Makefile
Normal file
6
Binary/Apps/ZDE/Makefile
Normal file
@@ -0,0 +1,6 @@
|
||||
TOOLS = ../../../Tools
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
clean::
|
||||
@rm -f *.com
|
||||
10
Binary/Apps/ZDE/ReadMe.txt
Normal file
10
Binary/Apps/ZDE/ReadMe.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
***********************************************************************
|
||||
*** ***
|
||||
*** R o m W B W ***
|
||||
*** ***
|
||||
*** Z80/Z180 System Software ***
|
||||
*** ***
|
||||
***********************************************************************
|
||||
|
||||
This directory contains the ZDE executable binaries. They are
|
||||
in their original, unconfigured state.
|
||||
BIN
Binary/CPNET/NetBoot/DUO/cpnos.sys
Normal file
BIN
Binary/CPNET/NetBoot/DUO/cpnos.sys
Normal file
Binary file not shown.
BIN
Binary/CPNET/NetBoot/DUO/snios.spr
Normal file
BIN
Binary/CPNET/NetBoot/DUO/snios.spr
Normal file
Binary file not shown.
BIN
Binary/CPNET/NetBoot/MT/ccp.spr
Normal file
BIN
Binary/CPNET/NetBoot/MT/ccp.spr
Normal file
Binary file not shown.
BIN
Binary/CPNET/NetBoot/MT/ndos.spr
Normal file
BIN
Binary/CPNET/NetBoot/MT/ndos.spr
Normal file
Binary file not shown.
@@ -68,3 +68,11 @@ ZSDOS is the DOS portion of Z-System. This is the manual for ZSDOS
|
||||
1.x as included in RomWBW. The installation instructions can be
|
||||
ignored since that work has already been completed as part of the
|
||||
RomWBW distribution.
|
||||
|
||||
ZPM3 ("ZPM3.txt")
|
||||
-----------------
|
||||
|
||||
A Z80 coded CP/M 3.0 compatible BDOS replacement with ZCPR support.
|
||||
This minimal documentation is all that is provided with ZPM3.
|
||||
|
||||
-- WBW 8:38 AM 6/6/2025
|
||||
|
||||
483
Doc/CPM/ZPM3.txt
Normal file
483
Doc/CPM/ZPM3.txt
Normal file
@@ -0,0 +1,483 @@
|
||||
|
||||
Z P M 3 by Simeon Cran
|
||||
========================
|
||||
|
||||
A Z80 coded CP/M 3.0 compatible BDOS replacement.
|
||||
|
||||
The first public release: 27/3/92
|
||||
This document dated: 16/6/92
|
||||
|
||||
Distributed at: Z-Node 62 (Perth, Western Australia)
|
||||
V21,V22,V22bis 09 450 0200
|
||||
|
||||
|
||||
WELCOME TO ZPM3
|
||||
~~~~~~~~~~~~~~~
|
||||
Welcome to the best CP/M compatible operating system for Z80
|
||||
based computers with banked memory. The best? Yes, we believe so.
|
||||
CP/M 3.0 has had bad press, but the fact is that it is faster
|
||||
than CP/M 2.2 ever was, and it offered more integrated
|
||||
facilities. Perhaps it was all the Z80 replacement BDOSes for
|
||||
CP/M 2.2 which stole the limelight from CP/M 3.0, or was it just
|
||||
that few computers had the required banked memory?
|
||||
|
||||
Whatever the reason for CP/M 3.0's lack of success in the
|
||||
marketplace, there are still plenty of users who will stand by
|
||||
its wonderful facilities and speed. For those users ZPM3 provides
|
||||
the long awaited Z80 coded update.
|
||||
|
||||
ZPM3 offers all the good things that CP/M 3.0 does, and then it
|
||||
offers more. Because ZPM3 is written in Z80 code rather than the
|
||||
8080 code of CP/M 3.0, it can do everything that CP/M 3.0 does,
|
||||
but in much less space. With the extra space recovered, ZPM3
|
||||
packs in a number of new facilities. Yet the whole package fits
|
||||
in exactly the same space as CP/M 3.0 so you can directly replace
|
||||
your old CP/M 3.0 BDOS with ZPM3 without a worry.
|
||||
|
||||
ZPM3 is also fast. Faster, in fact, than CP/M 3.0. This is
|
||||
possible because the rich Z80 instruction set allows many
|
||||
algorithms to be implemented more efficiently. In addition, the
|
||||
extra space available in ZPM3 has been put to use to further
|
||||
optimise the code. Lots of small optimisations smooth the
|
||||
execution flow, so ZPM3 becomes the fastest operating system on
|
||||
most banked CP/M computers.
|
||||
|
||||
|
||||
THE FEATURES
|
||||
~~~~~~~~~~~~
|
||||
ZPM3, in addition to complete CP/M 3.0 compatibility, offers the
|
||||
following features:
|
||||
|
||||
|
||||
Random Read Bug fixed.
|
||||
++++++++++++++++++++++
|
||||
Maybe you didn't know, but CP/M 3.0 has a bug. It affects random
|
||||
reads under very specific circumstances, and can result in a
|
||||
program thinking that you don't have some pieces of data in a
|
||||
file when in fact you do. The bug would occur very, very rarely,
|
||||
but it is real. ZPM3 finally squashes it.
|
||||
|
||||
|
||||
Protected SCB User code
|
||||
+++++++++++++++++++++++
|
||||
The System Control Block of CP/M 3.0 was a revolution at the
|
||||
time. ZCPR has a system environment and most other operating
|
||||
systems have other similar structures, but the SCB of CP/M 3.0
|
||||
was one of the very first.
|
||||
|
||||
Unfortunately, Digital Research never properly documented it, and
|
||||
some programmers found things out about it that weren't quite
|
||||
true and started programming accordingly. As well, because it is
|
||||
available in the TPA bank, runaway programs can overwrite it
|
||||
causing problems.
|
||||
|
||||
Mostly though, the SCB will survive, or at least any problems
|
||||
will be so obvious that the user will realise that a crash has
|
||||
occurred and will reboot. A real problem exists with the CP/M 3.0
|
||||
code however when the user value is written over with a value
|
||||
above 15. Many programs now directly write to this byte, and if
|
||||
they put a value in that is above 15, all sorts of havoc can
|
||||
happen with the disk system. Actually, CP/M 3.0 will handle user
|
||||
areas above 15 with this method, and all seems ok until the
|
||||
operating system mistakes one of these directory entries as an
|
||||
XFCB. Simply put, user areas above 15 must not be used with CP/M
|
||||
3.0.
|
||||
|
||||
ZPM3 has code which prevents these problems, making the system
|
||||
even more stable.
|
||||
|
||||
|
||||
Obsoleted Trap system.
|
||||
++++++++++++++++++++++
|
||||
One of the problems of the banked operating system was that it
|
||||
was possible to redirect the BIOS to code below common memory, in
|
||||
which case the banked BDOS could not access it. One solution is
|
||||
to call all BIOS code from common memory, but this involves a
|
||||
bank switch for every BIOS call, and this slows things down
|
||||
considerably.
|
||||
|
||||
CP/M 3.0 got around the problem by providing special code just
|
||||
below the SCB. If you redirected the BIOS, you also had to change
|
||||
this code which caused a bank switch when your new BIOS routine
|
||||
was called. When you removed the redirection, you also had to
|
||||
restore the special code.
|
||||
|
||||
This system has major drawbacks. For a start, if you redirect the
|
||||
BIOS, then another program redirects your redirection, then you
|
||||
remove your first redirection (along with the special code), the
|
||||
bank switch won't happen for the second redirection and the
|
||||
system will crash.
|
||||
|
||||
If a CP/M 2.2 program tried to do the redirection, it would know
|
||||
nothing about CP/M 3.0 and would not adjust the special code, so
|
||||
a crash would result in that case too.
|
||||
|
||||
The special code was called the "Trap System" as it was meant to
|
||||
trap redirection (as long as you set the trap). ZPM3 has
|
||||
eliminated the need for the traps. They are still there, and
|
||||
programs can still fiddle with them, but it doesn't matter how
|
||||
they are set, they are ignored. There is simply no need for them
|
||||
anymore. And this has been achieved without a performance
|
||||
penalty. In fact, in the case of a program which sets the traps
|
||||
but forgets to restore them, performance is now much better.
|
||||
|
||||
|
||||
Semi-Permanent Read Only status for drives.
|
||||
+++++++++++++++++++++++++++++++++++++++++++
|
||||
In recent years, a trend in CP/M 2.2 is to make drives which have
|
||||
been set read only to remain that way until explicitly changed by
|
||||
function 37. ZPM3 now adopts this logic. Previously a control-C
|
||||
would return a read only drive to read write. The advantage is
|
||||
that a program can now make a drive read only for a session and
|
||||
know that it will stay that way.
|
||||
|
||||
|
||||
ZCPR compatible function 152
|
||||
++++++++++++++++++++++++++++
|
||||
Function 152 is the CP/M 3.0 parser. It was a great innovation at
|
||||
the time as parsing is one of the more tedious aspects of
|
||||
programming for CP/M. Unfortunately, almost as soon as it
|
||||
appeared, it was made obsolete by the fact that it didn't handle
|
||||
references to user number (DU references). A line such as
|
||||
A:FILE.TYP would be correctly parsed, but A3:FILE.TYP would not.
|
||||
CP/M 3.0 programs would often parse the drive and user
|
||||
separately, then give function 152 the line without the DU:
|
||||
reference. All this extra work should not have been necessary if
|
||||
CP/M 3.0 had included user number parsing.
|
||||
|
||||
ZPM3 parses the user number, and goes even further by handling
|
||||
named directories for ZCPR. This is possible as long as you set a
|
||||
special word in the SCB which tells ZPM3 where to find the ZCPR
|
||||
system environment descriptor. ZCCP, a companion CCP for ZPM3,
|
||||
handles this automatically, but for Z3PLUS users, a special
|
||||
utility is available which automatically sets this word.
|
||||
|
||||
The result is that CP/M 3.0 programs will not balk at DU:
|
||||
references and ZPM3 aware programs can use the full DU: and DIR:
|
||||
facilities of function 152. It has also made the brilliant ZCCP
|
||||
code possible.
|
||||
|
||||
|
||||
New Functions 54 and 55
|
||||
+++++++++++++++++++++++
|
||||
Datestamps in CP/M 3.0 are wonderful, but difficult to
|
||||
manipulate. Two new functions make them easier to handle and at
|
||||
the same time give compatibility to Z80DOS aware programs.
|
||||
|
||||
Function 54 (Get Stamp) returns a Z80DOS compatible datestamp.
|
||||
Any program (such as many directory programs) which recognise the
|
||||
Z80DOS standard can make use of function 54. There is only one
|
||||
slight difference between Z80DOS datestamps and ZPM3's which you
|
||||
should be aware of. Z80DOS will return a correct datestamp after
|
||||
any successful open or search of any extent. ZPM3 can only return
|
||||
a correct datestamp after a successful open or search of the
|
||||
first extent of the file. This is because CP/M 3.0 datestamps are
|
||||
only saved for the first extents of each file, in order to
|
||||
provide the highest performance.
|
||||
|
||||
Even more interesting is Function 55 (Use Stamp) which provides a
|
||||
mechanism for changing datestamps on files. Trying to do this
|
||||
with CP/M 3.0 was virtually impossible because it involved direct
|
||||
sector writes. With Function 55 you can simply set the stamp and
|
||||
then write.
|
||||
|
||||
|
||||
Wheel protected files
|
||||
+++++++++++++++++++++
|
||||
If you are using a ZCPR system (ZCCP or Z3PLUS), ZPM3 has access
|
||||
to the wheel byte and supports wheel protected files. Such files
|
||||
act normally if the wheel is set (signifying a priveleged user),
|
||||
but if the wheel is not set, the files can not be changed. This
|
||||
is of most benefit to BBS systems. The implementation is
|
||||
virtually the same as most current Z80 CP/M 2.2 compatible
|
||||
BDOSes.
|
||||
|
||||
|
||||
Better error messages
|
||||
+++++++++++++++++++++
|
||||
CP/M 3.0 introduced the best error messages that CP/M had ever
|
||||
had. ZPM3 goes further. The main difference you will notice is
|
||||
that the user number as well as the drive is shown in the error
|
||||
message. This is invaluable in helping you identify which file
|
||||
might have caused a problem.
|
||||
|
||||
|
||||
Function 10 history buffer and improved editing.
|
||||
++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Function 10 is used by the CCP to input command lines. Many other
|
||||
programs use function 10 for input.
|
||||
|
||||
CP/M 3.0 introduced a history buffer for function 10. You press
|
||||
control-W and you were returned the last command. It is a great
|
||||
facility, but because it only remembers one command it is rather
|
||||
limited. There have been RSXes written which give a much larger
|
||||
history buffer, but RSXes take up extra program memory so are
|
||||
undesirable.
|
||||
|
||||
ZPM3 gives a large (approximately 250 bytes) history buffer which
|
||||
can store multiple commands. It also makes very intelligent use
|
||||
of the buffer so that identical commands are not stored twice,
|
||||
and commands of less than three characters are not stored. The
|
||||
history buffer takes up no additional memory, and is always
|
||||
available.
|
||||
|
||||
For security, it is possible to clear the history buffer so that
|
||||
other users can not see what commands you have used.
|
||||
|
||||
The ZPM3 history buffer feature is so good, that for many users,
|
||||
the ZPM3 upgrade is completely justified by it.
|
||||
|
||||
As part of the history buffer system, ZPM3 also offers a facility
|
||||
called Automatic Command Prompting. This can be disabled, or can
|
||||
be made switchable from the keyboard. When it is on, ZPM3 tries
|
||||
to fill in the rest of your command based on what commands you
|
||||
used most recently. It is like magic, and can save you typing out
|
||||
complicated commands many times. In effect, it looks through the
|
||||
history buffer for you and finds the command it thinks you want.
|
||||
As you keep typing, if it turns out that the command doesn't
|
||||
match anymore, it will try to match another command, and if it
|
||||
can't, it lets you make the command by yourself. This facility is
|
||||
quite amazing to watch.
|
||||
|
||||
And to integrate the history buffer and the automatic command
|
||||
prompting, function 10 has the best command line editing you'll
|
||||
find anywhere. Most of the control keys do something when you are
|
||||
editing a function 10 line, and for the most part they mimic the
|
||||
standard WordStar/NewWord/ZDE functions. You can jump to
|
||||
different words in the command, delete individual words, delete
|
||||
individual letters, insert letters, and a whole lot more.
|
||||
|
||||
|
||||
Here is a list of what the various control keys do for function
|
||||
10:
|
||||
|
||||
A Move left one word
|
||||
B Go to the beginning or end of the line
|
||||
C Warm boot if at start of line, otherwise nothing
|
||||
D Go right one character
|
||||
E Go backwards one command in the history buffer
|
||||
F Go right one word
|
||||
G Delete current character
|
||||
H Destructive backspace
|
||||
I
|
||||
J Enter line
|
||||
K Delete all to the right
|
||||
L
|
||||
M Enter line
|
||||
N
|
||||
O
|
||||
P Toggle printing
|
||||
Q Toggle automatic command prompting (if enabled)
|
||||
R
|
||||
S Go left one character
|
||||
T Delete current word
|
||||
U Add current line to history buffer
|
||||
V Clear line and delete from history buffer
|
||||
W Go forwards one command in the history buffer
|
||||
X Delete all to the left
|
||||
Y Clear the whole line
|
||||
Z
|
||||
|
||||
|
||||
CPMLDR.REL bug fixed.
|
||||
+++++++++++++++++++++
|
||||
If you have ever tried to use the CPMLDR.REL code supplied with
|
||||
CP/M 3.0 to load a CPM3.SYS file larger than 16k, you have
|
||||
probably come across the CPMLDR.REL bug. The computer probably
|
||||
crashed, and you were left wondering what you did wrong in your
|
||||
bios.
|
||||
|
||||
Well CPMLDR.REL has a bug. To solve this for you ZPM3 comes with
|
||||
ZPM3LDR.REL which directly replaces CPMLDR.REL. It is also
|
||||
somewhat better in that all the messages, and the fcb for loading
|
||||
CPM3.SYS, are at the start of the file along with plenty of spare
|
||||
room. As a result you can easily patch the signon and error
|
||||
messages to say whatever you like and even change the FCB to load
|
||||
a file called something other than CPM3.SYS.
|
||||
|
||||
|
||||
|
||||
|
||||
All About the Random Read Bug.
|
||||
==============================
|
||||
Never heard of it? Well it's there in CP/M 3.0. I spent a lot of
|
||||
time trying to work out what it was and just why it was
|
||||
happening, and if you are interested, here are the details.
|
||||
|
||||
CP/M 3.0 uses the Record Count byte of an active FCB a little
|
||||
differently from the way CP/M 2.2 does. It is mentioned in the
|
||||
CP/M 3.0 manuals that the record count may contain numbers
|
||||
greater than 128, but in such a case it implies that the record
|
||||
count is really 128. CP/M 2.2 would not return record counts
|
||||
greater than 128.
|
||||
|
||||
The reason for the use of the record count in this way is to help
|
||||
speed up some of the logic used to find records in a file. It
|
||||
works very well for sequential access. When it comes to random
|
||||
access, the system has some failings.
|
||||
|
||||
The idea behind CP/M 3.0's unusual use of the record count is to
|
||||
keep the record count of the last logical extent of the current
|
||||
physical extent always in the Record Count byte. When accessing
|
||||
extents before the last one, bit 7 of the byte is set. That way
|
||||
it will always be at least 128 for logical extents before the
|
||||
last (which CP/M 3.0 translates to mean equal to 128), and the
|
||||
lower 7 bits are used as convenient storage for the record count
|
||||
of the last logical extent. This is particularly convenient
|
||||
because it means there is no need to go and read the directory
|
||||
entry again when it comes time to read the last logical extent.
|
||||
|
||||
I hope you have followed that! In sequential access, this scheme
|
||||
is great. The problem occurs with random access. In this case it
|
||||
is possible to access a logical extent which has no records in
|
||||
it. This could be any logical extent past the last one. In such a
|
||||
case the record count must be returned as 0 (which is correct).
|
||||
If we then go back to a previous logical extent in the same
|
||||
physical extent, CP/M 3.0 gets confused and assumes that there
|
||||
must be 128 records in that extent because the one we just came
|
||||
from had no records and we are now accessing an earlier extent.
|
||||
You're probably well and truly lost by now!
|
||||
|
||||
Anyhow, the assumption that CP/M 3.0 makes is quite wrong. The
|
||||
record count ends up being set to 128, a read is allowed to go
|
||||
ahead as if nothing was wrong, no error is returned, and the
|
||||
record count remains incorrectly set until a different physical
|
||||
extent is opened. The result could be chaos, but mostly it just
|
||||
means that a program returns the wrong information.
|
||||
|
||||
Remember, a logical extent is always 16k. A physical extent can
|
||||
be a multiple of 16k and is all the data described by one
|
||||
directory entry. If your system has physical extents which are
|
||||
16k, you would never have the problem because a new physical
|
||||
extent would be properly opened for every new logical extent that
|
||||
was accessed.
|
||||
|
||||
Typically though, a physical extent is 32k, so it holds 2 logical
|
||||
extents. The problem won't arise until the file grows past the
|
||||
32k mark in such a case. And when the file gets over 48k the
|
||||
problem can't occur again until it gets over 64k... and so on.
|
||||
Even then, it can only happen if reads are attempted to
|
||||
particular extents in a particular order. So you shouldn't be too
|
||||
surprised if the bug hasn't been too noticeable to you.
|
||||
|
||||
ZPM3 squashes the bug once and for all by using the correct
|
||||
logic. In the situation where the bug would normally occur, ZPM3
|
||||
makes sure it gets the correct record count information, and the
|
||||
reads return the correct record count every time.
|
||||
|
||||
If you are interested in seeing a demonstration of the bug in
|
||||
action (on CP/M 3.0) and comparing it with ZPM3, there is a file
|
||||
floating around various bulletin boards which contains
|
||||
demonstrations for the bug and an RSX to fix it. The RSX is a
|
||||
less than perfect way of overcoming the bug, although it seems to
|
||||
work. However, now that you have ZPM3, you don't need to worry.
|
||||
|
||||
|
||||
|
||||
|
||||
Other things you should know about ZPM3
|
||||
=======================================
|
||||
ZPM3 has worked on EVERY CP/M 3.0 system tried so far except one.
|
||||
This is a Bondwell computer, and as yet it isn't clear why it
|
||||
won't work. I will study the source code of its BIOS and come up
|
||||
with a fix shortly.
|
||||
|
||||
The MAKEDOS.COM utility is not perfect (as mentioned previously)
|
||||
and it seems that nobody has managed to get it to work with the
|
||||
Commodore C128 system. You must use the conventional method for
|
||||
installing ZPM3 on such systems.
|
||||
|
||||
If you have a computer that ZPM3 will not install on with MAKEDOS
|
||||
and you do not have access to the files required to do a
|
||||
conventional install, please contact me. I am interested in
|
||||
making ZPM3 as universal as possible and will help you to install
|
||||
it on your system.
|
||||
|
||||
The ESCAPE key is ignored by function 10. There has been some
|
||||
lively discussion about this but the decision is final: it stays
|
||||
ignored. Remember what function 10 is for and you will understand
|
||||
why I made it ignore the ESCAPE key. The argument against this
|
||||
has been from people who control their terminals from the command
|
||||
line. Apparently some people type in an escape sequence at the
|
||||
command line (which CP/M 3.0 will not output correctly anyhow
|
||||
(converting the escape character to ^[)) then press return to
|
||||
have the CCP echo back the line including the escape character.
|
||||
|
||||
Sorry folks, that is a KLUDGE in my books! Anybody using Z-System
|
||||
would of course use an ALIAS and ECHO to do this properly, but
|
||||
for those who will continue to complain that I have sacrificed
|
||||
CP/M 3.0 compatibility I am now including ECHOTERM.COM to solve
|
||||
your problems. Run it and whatever you type will be sent to the
|
||||
terminal correctly after you press RETURN. Press RETURN twice to
|
||||
exit the program.
|
||||
|
||||
And a reminder that the ability to put control characters into
|
||||
function 10 lines was always limited by the fact that some
|
||||
control keys were used to edit the command line. CP/M 3.0 added
|
||||
even more, and ZPM3 uses virtually all the control keys. The few
|
||||
that aren't used are ignored, and this is in fact a FEATURE which
|
||||
guarantees that unusable characters can't get into function 10
|
||||
lines by accident.
|
||||
|
||||
|
||||
|
||||
|
||||
LEGALS and SUCH
|
||||
===============
|
||||
The ZPM3 package is supplied free of charge, on the condition
|
||||
that you don't use it to make money. If you want to use it
|
||||
commercially you must contact me to get the OK (and negotiate our
|
||||
fee).
|
||||
|
||||
If you find anyone (except myself) charging money for ZPM3,
|
||||
please inform me!
|
||||
|
||||
Nobody is making any guarantees about this software. None at all.
|
||||
If it causes your house to burn down, or a divorce, or just a bad
|
||||
day, this is unfortunate, regrettable, but there is nothing that
|
||||
I can or will do about it. You have been warned.
|
||||
|
||||
The ZPM3 package must only be distributed in the form that you
|
||||
found it. Do not change or add anything. Don't even change it
|
||||
into a different type of archive. Just leave it alone. However
|
||||
you are free to distribute it to as many places and people that
|
||||
you can. Just don't charge for it.
|
||||
|
||||
|
||||
|
||||
If in using ZPM3 you find that it doesn't act as described,
|
||||
please forward the details to me so that either the ZPM3 code or
|
||||
the documentation can be changed. If you would like further
|
||||
details, please forward your specific questions to me. SJC.
|
||||
|
||||
|
||||
|
||||
|
||||
As a service to all our ZPM3 fans, the latest version of the ZPM3
|
||||
package can now be ordered. At this stage we can only supply IBM
|
||||
formatted 3.5 inch 720k disks, however if you are keen enough
|
||||
that shouldn't matter. ZPM3 remains free, however this service
|
||||
will cost you $15 Australian (for the disk, copying, postage and
|
||||
packing) to most places in the Western World (others by
|
||||
arrangement).
|
||||
|
||||
This is a good way to guarantee you have the latest version, and
|
||||
to guarantee that your package has not been corrupted by some
|
||||
unscrupulous person.
|
||||
|
||||
When we fill your order, we will make sure to include the latest
|
||||
demonstration copy of MYZ80 - the fastest and best Z80 emulator
|
||||
for IBM AT (and better) compatibles. MYZ80 can run ZPM3 with
|
||||
ease. It also handles ZCPR and CP/M 2.2. And yes, we do mean
|
||||
FASTEST.
|
||||
|
||||
Send your international money order to:
|
||||
|
||||
Software by Simeon
|
||||
ZPM3 Package
|
||||
2 Maytone Ave
|
||||
Killara NSW
|
||||
Australia 2071
|
||||
|
||||
Your order will be promptly filled.
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
Version 3.6
|
||||
-----------
|
||||
- RDG: Added VDA driver for Xosera FPGA-based VDC
|
||||
- MGG: Added COBOL language disk image
|
||||
- WDC: Added config options to PCF driver
|
||||
- WBW: Enabled dynamic CPU speed update on LCD screen
|
||||
- WBW: Improve LPT driver boot messaging when not detected (per Robb Bates)
|
||||
- WBW: Correct DS1307 boot date/time display (per Tadeusz Pycio)
|
||||
- WBW: Add -DELAY option to TUNE app (per Robb Bates)
|
||||
- RDG: Add online documentation site
|
||||
- WBW: Added enhanced Hi-Tech C Compiler files from Ladislau Szilagyi
|
||||
- WBW: Added boundary check to ram/rom disk driver
|
||||
- WBW: Per Peter Onion, switch KERMIT default file xfer mode to binary
|
||||
|
||||
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.
|
||||
- MAP: Hardware documentation, Significant new content added with project links.
|
||||
|
||||
Version 3.5
|
||||
-----------
|
||||
- M?F: Fix for hours display in HBRTC application
|
||||
@@ -38,8 +62,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
|
||||
- MAP: Added new HBIOS function EXT_SLICE (orginally SYSGET_DIOMED)
|
||||
- MAP: Contributed COPYSL utility that allows disk slices to be copied
|
||||
- MAP: Added new HBIOS function EXT_SLICE, extended disk slice info
|
||||
- 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
|
||||
@@ -47,7 +71,17 @@ 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: Initial NVRAM configuration infrastructure, and boot device selection.
|
||||
- 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)
|
||||
|
||||
Version 3.4
|
||||
-----------
|
||||
|
||||
Binary file not shown.
28084
Doc/Language/Microsoft_COBOL-80_Manuals_1878.pdf
Normal file
28084
Doc/Language/Microsoft_COBOL-80_Manuals_1878.pdf
Normal file
File diff suppressed because one or more lines are too long
9860
Doc/Language/SLR180 (SLR Systems 1985).pdf
Executable file
9860
Doc/Language/SLR180 (SLR Systems 1985).pdf
Executable file
File diff suppressed because one or more lines are too long
BIN
Doc/Language/SLRNK (SLR Systems 1984).pdf
Normal file
BIN
Doc/Language/SLRNK (SLR Systems 1984).pdf
Normal file
Binary file not shown.
BIN
Doc/Language/The Cowgol Language.pdf
Normal file
BIN
Doc/Language/The Cowgol Language.pdf
Normal file
Binary file not shown.
BIN
Doc/Language/Z80DIS User Manual (1985).pdf
Normal file
BIN
Doc/Language/Z80DIS User Manual (1985).pdf
Normal file
Binary file not shown.
@@ -28,12 +28,13 @@ ChangeLog.txt
|
||||
Log of changes in RomWBW by version.
|
||||
|
||||
|
||||
RomWBW Introduction ("RomWBW Introduction.pdf")
|
||||
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 Errata ("RomWBW Errata.pdf")
|
||||
RomWBW Hardware ("RomWBW Hardware.pdf")
|
||||
|
||||
-------------------------------------------------------
|
||||
|
||||
Documentation set for RomWBW. The primary document is the
|
||||
@@ -84,4 +85,4 @@ UCSD p-System Users Manual ("UCSD p-System Users Manual.pdf")
|
||||
Official user manual for p-System operating system included with
|
||||
RomWBW.
|
||||
|
||||
--WBW 5:18 PM 6/14/2023
|
||||
--WBW 8:37 AM 6/6/2025
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Doc/RomWBW Hardware.pdf
Normal file
BIN
Doc/RomWBW Hardware.pdf
Normal file
Binary file not shown.
BIN
Doc/RomWBW Introduction.pdf
Normal file
BIN
Doc/RomWBW Introduction.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
116
RELEASE_NOTES.md
Normal file
116
RELEASE_NOTES.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# 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.1
|
||||
|
||||
This is a patch release of v3.5.
|
||||
|
||||
### Fixes
|
||||
|
||||
- Corrects an issue with the `CPMLDR.SYS` and `ZPMLDR.SYS` files that
|
||||
caused `SYSCOPY` to fail when used with them.
|
||||
|
||||
- Added missing `BCLOAD` file to the MS BASIC Compiler disk image.
|
||||
|
||||
### New Features
|
||||
|
||||
- Added `SLABEL` application (Mark Pruden).
|
||||
|
||||
- Variety of documentation improvements, especially an overhaul of
|
||||
the Hardware Document (Mark Pruden).
|
||||
|
||||
## 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.
|
||||
280
ReadMe.md
280
ReadMe.md
@@ -1,17 +1,22 @@
|
||||
|
||||
|
||||
**RomWBW ReadMe** \
|
||||
Version 3.5 \
|
||||
|
||||
|
||||
|
||||
|
||||
**RomWBW Introduction** \
|
||||
Version 3.6 \
|
||||
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
|
||||
01 Dec 2024
|
||||
07 Jun 2025
|
||||
|
||||
# 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>)
|
||||
@@ -23,47 +28,43 @@ communities:
|
||||
- [Small Computer Central](https://smallcomputercentral.com/)
|
||||
(<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](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Hardware.pdf)
|
||||
.
|
||||
|
||||
General features include:
|
||||
# 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
|
||||
- Video drivers including TMS9918, SY6545, MOS8563, HD6445, Xosera
|
||||
- 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
|
||||
- Support for CP/NET networking using Wiznet, MT011 or Serial
|
||||
- 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 accessible storage on a single device.
|
||||
OSes and allows up to 2GB of addressable storage on a single device,
|
||||
with up to 128MB accessible at any one time.
|
||||
|
||||
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.
|
||||
## Included Software
|
||||
|
||||
Multiple disk images are provided in the distribution. Most disk images
|
||||
contain a complete, bootable, ready-to-run implementation of a specific
|
||||
@@ -72,37 +73,79 @@ 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.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
# Acquiring RomWBW
|
||||
## 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. 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.
|
||||
|
||||
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. 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.
|
||||
stick to the most recent stable release.
|
||||
|
||||
All source code and distributions are maintained on GitHub. Code
|
||||
contributions are very welcome.
|
||||
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.
|
||||
|
||||
# Installation & Operation
|
||||
#### 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
|
||||
|
||||
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
|
||||
@@ -113,21 +156,79 @@ 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
|
||||
|
||||
Documentation for RomWBW includes:
|
||||
There are several documents that form the core of the RomWBW
|
||||
documentation:
|
||||
|
||||
- [RomWBW User
|
||||
Guide](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20User%20Guide.pdf)
|
||||
- [RomWBW System
|
||||
Guide](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20System%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)
|
||||
- [RomWBW
|
||||
Errata](https://github.com/wwarthen/RomWBW/raw/master/Doc/RomWBW%20Errata.pdf)
|
||||
is a reference for the ROM-hosted and OS-hosted applications created
|
||||
or customized to enhance the operation of RomWBW.
|
||||
|
||||
# Acknowledgments
|
||||
- [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.
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
@@ -198,10 +299,15 @@ 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 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, the COPYSL utility, and also implemented
|
||||
feature for RomWBW configuration by NVRAM.
|
||||
- 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
|
||||
- SLABEL 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.
|
||||
|
||||
@@ -234,10 +340,50 @@ let me know if I missed you!
|
||||
|
||||
- Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
- Rob Gowin created an online documentation site via MkDocs, and
|
||||
contributed a driver for the Xosera FPGA-based video controller.
|
||||
|
||||
## 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
|
||||
@@ -277,19 +423,3 @@ 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>.
|
||||
|
||||
442
ReadMe.txt
442
ReadMe.txt
@@ -1,6 +1,9 @@
|
||||
RomWBW ReadMe
|
||||
RomWBW Introduction
|
||||
Wayne Warthen (wwarthen@gmail.com)
|
||||
01 Dec 2024
|
||||
07 Jun 2025
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,41 +12,45 @@ 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.
|
||||
|
||||
- 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 wide variety of platforms are supported including those produced by
|
||||
these developer communities:
|
||||
|
||||
A complete list of the currently supported platforms is found in the
|
||||
[Installation] section.
|
||||
- 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/)
|
||||
|
||||
General features include:
|
||||
A complete list of the currently supported platforms is found in RomWBW
|
||||
Hardware .
|
||||
|
||||
- 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:
|
||||
|
||||
- System Monitor
|
||||
- Operating Systems (CP/M 2.2, ZSDOS)
|
||||
- ROM BASIC (Nascom BASIC and Tasty BASIC)
|
||||
- ROM Forth
|
||||
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, Xosera
|
||||
- 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.
|
||||
@@ -51,15 +58,11 @@ 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.
|
||||
OSes and allows up to 2GB of addressable storage on a single device,
|
||||
with up to 128MB accessible at any one time.
|
||||
|
||||
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.
|
||||
|
||||
Included Software
|
||||
|
||||
Multiple disk images are provided in the distribution. Most disk images
|
||||
contain a complete, bootable, ready-to-run implementation of a specific
|
||||
@@ -68,11 +71,24 @@ 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.
|
||||
|
||||
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.
|
||||
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
|
||||
@@ -80,30 +96,67 @@ slices or on stand-alone media. This makes exchanging files with modern
|
||||
OSes such as Windows, MacOS, and Linux very easy.
|
||||
|
||||
|
||||
|
||||
ACQUIRING ROMWBW
|
||||
|
||||
ROM Distribution
|
||||
|
||||
The RomWBW Repository (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)
|
||||
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.
|
||||
documentation.
|
||||
|
||||
All source code and distributions are maintained on GitHub. Code
|
||||
contributions are very welcome.
|
||||
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.
|
||||
|
||||
|
||||
|
||||
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
|
||||
@@ -112,137 +165,235 @@ 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.
|
||||
in the RomWBW User Guide. It is also a good idea to review the Release
|
||||
Notes for helpful release-specific information.
|
||||
|
||||
|
||||
Documentation
|
||||
|
||||
Documentation for RomWBW includes:
|
||||
There are several documents that form the core of the RomWBW
|
||||
documentation:
|
||||
|
||||
- RomWBW User Guide
|
||||
- RomWBW System Guide
|
||||
- RomWBW Applications
|
||||
- RomWBW Errata
|
||||
- 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.
|
||||
|
||||
|
||||
|
||||
ACKNOWLEDGMENTS
|
||||
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
|
||||
- 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 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, the COPYSL utility, and also implemented
|
||||
feature for RomWBW configuration by NVRAM.
|
||||
- Mark Pruden has made a wide variety of contributions including:
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
- significant content in the Disk Catalog and User Guide
|
||||
- creation of the Introduction and Hardware documents
|
||||
- Z3PLUS operating system disk image
|
||||
- COPYSL utility
|
||||
- SLABEL utility
|
||||
- a feature for RomWBW configuration by NVRAM
|
||||
- the /B bulk mode of disk assignment to the ASSIGN utility
|
||||
|
||||
- Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility
|
||||
(WDATE).
|
||||
- Jose Collado has contributed enhancements to the TMS driver including
|
||||
compatibility with standard TMS register configuration.
|
||||
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
|
||||
- Bill Shen has contributed boot loaders for several of his systems.
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
- Laszlo Szolnoki has contributed an EF9345 video display controller
|
||||
driver.
|
||||
- Bill Shen has contributed boot loaders for several of his systems.
|
||||
|
||||
- Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol
|
||||
that leverages RomWBW memory banking.
|
||||
- Laszlo Szolnoki has contributed an EF9345 video display controller
|
||||
driver.
|
||||
|
||||
- Les Bird has contributed support for the NABU w/ Option Board
|
||||
- Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol
|
||||
that leverages RomWBW memory banking.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
- Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
- Rob Gowin created an online documentation site via MkDocs, and
|
||||
contributed a driver for the Xosera FPGA-based video controller.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
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
|
||||
@@ -282,20 +433,3 @@ 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,16 +1,21 @@
|
||||
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
|
||||
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
|
||||
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.
|
||||
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.
|
||||
|
||||
-- WBW 1:15 PM 5/30/2024
|
||||
-- WBW 4:21 PM 2/17/2025
|
||||
|
||||
|
||||
|
||||
@@ -23,55 +28,55 @@ later on provides information on the changes in v5.00.
|
||||
|
||||
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%
|
||||
@@ -92,7 +97,7 @@ later on provides information on the changes in v5.00.
|
||||
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)
|
||||
@@ -103,29 +108,29 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -138,15 +143,15 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -159,8 +164,8 @@ later on provides information on the changes in v5.00.
|
||||
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).
|
||||
@@ -171,28 +176,28 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -208,15 +213,15 @@ later on provides information on the changes in v5.00.
|
||||
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%
|
||||
@@ -225,7 +230,7 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -240,34 +245,34 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -278,7 +283,7 @@ later on provides information on the changes in v5.00.
|
||||
|
||||
*. [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:
|
||||
@@ -288,53 +293,53 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -352,7 +357,7 @@ later on provides information on the changes in v5.00.
|
||||
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
|
||||
@@ -383,9 +388,9 @@ later on provides information on the changes in v5.00.
|
||||
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, May 2024:
|
||||
|
||||
New features in BBC BASIC (Z80) version 5.00, January 2025:
|
||||
|
||||
1. BASIC V statements
|
||||
|
||||
@@ -394,7 +399,7 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
|
||||
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
|
||||
@@ -408,10 +413,10 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
|
||||
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
|
||||
|
||||
@@ -423,9 +428,12 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
|
||||
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) +
|
||||
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.
|
||||
|
||||
* 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$() = ""
|
||||
@@ -434,22 +442,27 @@ New features in BBC BASIC (Z80) version 5.00, May 2024:
|
||||
|
||||
4.1 Bit-shifts <<, >>, >>>
|
||||
4.2 Floating-point indirection (|)
|
||||
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
|
||||
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
|
||||
|
||||
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 variables and arrays (& suffix)
|
||||
5.2 Address-of operator (^)
|
||||
5.3 Byte (unsigned 8-bit) 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,64 +1,68 @@
|
||||
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
|
||||
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
|
||||
|
||||
19
Source/Apps/BBCBASIC/licence.txt
Normal file
19
Source/Apps/BBCBASIC/licence.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
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,6 +29,8 @@ 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,6 +24,8 @@ 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 \
|
||||
sysgen syscopy assign format talk mode rtc timer
|
||||
slabel sysgen syscopy assign format talk mode rtc timer ZDE
|
||||
TOOLS =../../Tools
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
@@ -23,6 +23,39 @@ CLI_HAVE_HBIOS_SWITCH1 ; NOT MATCHED --HBIOS
|
||||
LD (HBIOSMD), A
|
||||
RET
|
||||
|
||||
CLI_HAVE_DELAY_SWITCH:
|
||||
LD HL, CLIARGS ; TEST FOR --DELAY ON COMMAND LINE
|
||||
LD DE, DELAYOPT
|
||||
CALL STRINDEX
|
||||
JR NZ, CLI_HAVE_DELAY_SWITCH1
|
||||
OR $FF ; MATCHED --DELAY
|
||||
LD (DELAYMD), A
|
||||
RET
|
||||
CLI_HAVE_DELAY_SWITCH1 ; NOT MATCHED --HBIOS
|
||||
XOR A
|
||||
LD (DELAYMD), 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
|
||||
@@ -79,7 +112,10 @@ CLI_OCTAVE_ADJST5:
|
||||
LD (OCTAVEADJ), A
|
||||
RET
|
||||
|
||||
HBIOSOPT: .DB "--HBIOS", 0
|
||||
OPT_MSX .DB "-MSX", 0 ; USE MSX PORTS
|
||||
OPT_RC .DB "-RC", 0 ; USE RC PORTS
|
||||
HBIOSOPT: .DB "--HBIOS", 0 ; USE HBIOS API FOR PLAYBACK
|
||||
DELAYOPT: .DB "-DELAY",0 ; FORCE DELAY MODE
|
||||
DOWN1 .DB "-t1", 0 ; DOWN AN OCTAVE
|
||||
DOWN2 .DB "-t2", 0 ; DOWN TWO OCTAVE
|
||||
UP1 .DB "+t1", 0 ; UP AN OCTAVE
|
||||
|
||||
@@ -41,8 +41,14 @@ DLY1 DEC BC ; [6]
|
||||
; Test for timer running to determine if it can be used for delay
|
||||
; Return string message in DE
|
||||
; Assigned (WMOD) with 0 if no hardware time, 1 if hardware timer found
|
||||
; If -DELAY on command line, force delay mode
|
||||
;
|
||||
PROBETIMER:
|
||||
LD A,(DELAYMD) ; GET COMMAND LINE DELAY FLAG
|
||||
OR A ; TEST IT
|
||||
LD A,0 ; ASSUME NO TIMER
|
||||
LD DE,MSGDLY ; DELAY MODE MESSAGE
|
||||
JR NZ,SETDLY ; IF TRUE, DONE
|
||||
LD B,BF_SYSGET ; HBIOS: GET function
|
||||
LD C,$D0 ; TIMER subfunction
|
||||
RST 08 ; DE:HL := current tick count
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
; 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
|
||||
; 2025-05-28 [WBW] Add option to force delay mode
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
@@ -73,6 +75,10 @@ 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
|
||||
@@ -106,7 +112,9 @@ 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_HAVE_DELAY_SWITCH
|
||||
CALL CLI_OCTAVE_ADJST
|
||||
JP CONTINUE
|
||||
|
||||
@@ -125,6 +133,22 @@ 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
|
||||
@@ -646,6 +670,17 @@ 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:
|
||||
@@ -670,13 +705,16 @@ FILTYP .DB 0 ; Sound file type (TYPPT2, TYPPT3, TYPMYM)
|
||||
TMP .DB 0 ; work around use of undocumented Z80
|
||||
|
||||
HBIOSMD .DB 0 ; NON-ZERO IF USING HBIOS SOUND DRIVER, ZERO OTHERWISE
|
||||
DELAYMD .DB 0 ; FORCE DELAY MODE IF TRUE (NON-ZERO)
|
||||
OCTAVEADJ .DB 0 ; AMOUNT TO ADJUST OCTAVE UP OR DOWN
|
||||
|
||||
MSGBAN .DB "Tune Player for RomWBW v3.11, 17-Sep-2024",0
|
||||
MSGUSE .DB "Copyright (C) 2024, Wayne Warthen, GNU GPL v3",13,10
|
||||
USEPORTS .DB 0 ; AUDIO CHIP PORT SELECTION MODE
|
||||
|
||||
MSGBAN .DB "Tune Player for RomWBW v3.13, 28-May-2025",0
|
||||
MSGUSE .DB "Copyright (C) 2025, 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] [--hbios] [+tn|-tn]",0
|
||||
.DB "Usage: TUNE <filename>.[PT2|PT3|MYM] [-msx|-rc] [-delay] [--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
|
||||
@@ -700,6 +738,8 @@ 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,6 +146,13 @@ 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:
|
||||
@@ -284,7 +291,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 0 ; BIOS serial device unit number
|
||||
UNIT DB 0FFH ; BIOS serial device unit number
|
||||
BIOSBID DB 00H ; BIOS bank id
|
||||
;
|
||||
TAG DB "RomWBW, 30-May-2020$"
|
||||
@@ -323,7 +330,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
|
||||
;
|
||||
;-----------------------------------------------------------------------
|
||||
;
|
||||
@@ -535,8 +542,10 @@ 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
|
||||
@@ -568,7 +577,9 @@ UB_MDIN:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0011H ; unit 0, func 12h (write char)
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,11H ; func 11h (read char)
|
||||
RST 08
|
||||
LD A,E ; byte received to A
|
||||
POP HL
|
||||
@@ -586,12 +597,14 @@ UB_RCVRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0013H ; unit 0, func 13h (input stat)
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,13H ; func 13h (input stat)
|
||||
RST 08
|
||||
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,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
|
||||
LD A,0 ; report no line errors
|
||||
POP HL
|
||||
POP DE
|
||||
@@ -606,12 +619,14 @@ UB_SNDRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0014H ; unit 0, func 14h (output stat)
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,14H ; func 14h (output stat)
|
||||
RST 08
|
||||
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,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
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
@@ -804,7 +819,6 @@ 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
|
||||
|
||||
35
Source/Apps/ZDE/Build.cmd
Normal file
35
Source/Apps/ZDE/Build.cmd
Normal file
@@ -0,0 +1,35 @@
|
||||
@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
|
||||
9
Source/Apps/ZDE/Clean.cmd
Normal file
9
Source/Apps/ZDE/Clean.cmd
Normal file
@@ -0,0 +1,9 @@
|
||||
@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
|
||||
15
Source/Apps/ZDE/Makefile
Normal file
15
Source/Apps/ZDE/Makefile
Normal file
@@ -0,0 +1,15 @@
|
||||
# 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
|
||||
38
Source/Apps/ZDE/ReadMe.md
Normal file
38
Source/Apps/ZDE/ReadMe.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# 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.
|
||||
8111
Source/Apps/ZDE/zde16.z80
Normal file
8111
Source/Apps/ZDE/zde16.z80
Normal file
File diff suppressed because it is too large
Load Diff
102
Source/Apps/ZDE/zde16a.pat
Normal file
102
Source/Apps/ZDE/zde16a.pat
Normal file
@@ -0,0 +1,102 @@
|
||||
; 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
|
||||
|
||||
8111
Source/Apps/ZDE/zde17.z80
Normal file
8111
Source/Apps/ZDE/zde17.z80
Normal file
File diff suppressed because it is too large
Load Diff
8567
Source/Apps/ZDE/zde18.z80
Normal file
8567
Source/Apps/ZDE/zde18.z80
Normal file
File diff suppressed because it is too large
Load Diff
8598
Source/Apps/ZDE/zde19.z80
Normal file
8598
Source/Apps/ZDE/zde19.z80
Normal file
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 numberic from FCB
|
||||
LD (HL),A ; Remove numeric from FCB
|
||||
JR MINIT3 ; Proceed with initialization
|
||||
|
||||
MINIT2:
|
||||
@@ -181,6 +181,13 @@ 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:
|
||||
@@ -213,7 +220,6 @@ 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
|
||||
;
|
||||
;-----------------------------------------------------------------------
|
||||
@@ -299,6 +305,22 @@ 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
|
||||
@@ -318,7 +340,6 @@ 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
|
||||
;
|
||||
@@ -365,8 +386,7 @@ HB_JPTBL:
|
||||
; HBIOS initialization
|
||||
;
|
||||
HB_INIT:
|
||||
LD HL,2150 ; Smaller receive loop timeout scalar
|
||||
LD (RCVSCL),HL ; ... to compensate for BIOS overhead
|
||||
CALL SLOW ; Adjust CPUSPD for HBIOS overhead
|
||||
;
|
||||
; Patch SENDR w/ FastPath addresses
|
||||
LD BC,0F801H ; Get CIO func/data adr
|
||||
@@ -404,10 +424,6 @@ 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
|
||||
@@ -556,14 +572,8 @@ UB_INIT:
|
||||
;
|
||||
; TODO:
|
||||
; - TEST!!!
|
||||
; - ADJUST RCVSCL?
|
||||
;
|
||||
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
|
||||
CALL SLOW ; Adjust CPUSPD for UBIOS overhead
|
||||
;
|
||||
LD HL,UB_JPTBL
|
||||
LD DE,UB_LBL
|
||||
@@ -578,8 +588,10 @@ 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
|
||||
@@ -611,7 +623,9 @@ UB_MDIN:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0011H ; unit 0, func 12h (write char)
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,11H ; func 11h (read char)
|
||||
RST 08
|
||||
LD A,E ; byte received to A
|
||||
POP HL
|
||||
@@ -629,12 +643,14 @@ UB_RCVRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0013H ; unit 0, func 13h (input stat)
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,13H ; func 13h (input stat)
|
||||
RST 08
|
||||
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,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
|
||||
LD A,0 ; report no line errors
|
||||
POP HL
|
||||
POP DE
|
||||
@@ -649,12 +665,14 @@ UB_SNDRDY:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD BC,0014H ; unit 0, func 14h (output stat)
|
||||
LD A,(UNIT) ; unit
|
||||
LD B,A ; to B
|
||||
LD C,14H ; func 14h (output stat)
|
||||
RST 08
|
||||
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,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
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
@@ -705,9 +723,6 @@ 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
|
||||
@@ -826,9 +841,6 @@ 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
|
||||
@@ -847,7 +859,6 @@ 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,10 +7,13 @@ set PATH=%TOOLS%\zxcc;%PATH%
|
||||
|
||||
set CPMDIR80=%TOOLS%/cpm/
|
||||
|
||||
zxcc Z80ASM -ZMO-RW01/H || exit /b
|
||||
zxcc MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-RW01 || exit /b
|
||||
:: zxcc Z80ASM -ZMO-RW01/LH || exit /b
|
||||
zxcc Z80ASM -ZMO-WBW/LH || exit /b
|
||||
zxcc MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-WBW || 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 *.hlp zmp.doc
|
||||
OBJECTS = zmp.com *.ovr zmp.cfg zmp.fon *.hlp zmp.doc
|
||||
DEST = ../../../Binary/Apps
|
||||
TOOLS = ../../../Tools
|
||||
OTHERS = *.hex
|
||||
NODELETE = *.ovr zmp.doc *.hlp
|
||||
NODELETE = *.ovr zmp.doc zmp.cfg zmp.fon *.hlp
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
zmp.com: zmo-rw01.hex
|
||||
$(ZXCC) MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-RW01
|
||||
zmp.com: zmo-wbw.hex
|
||||
$(ZXCC) MLOAD25 -ZMP.COM=ZMPX.COM,ZMO-WBW
|
||||
|
||||
@@ -27,4 +27,15 @@ as at Aug 23rd, 2021.
|
||||
Untested on Ron Murrays ZMP15
|
||||
- Space getting short so messages shortened.
|
||||
|
||||
--PMS 8/24/2021
|
||||
--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
|
||||
Binary file not shown.
Binary file not shown.
844
Source/Apps/ZMP/zmo-wbw.z80
Normal file
844
Source/Apps/ZMP/zmo-wbw.z80
Normal file
@@ -0,0 +1,844 @@
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
; 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=ZMODEM.COM,ZMO-xx01.HEX
|
||||
; MLOAD ZMP.COM=ZMPX.COM,ZMO-xx01.HEX
|
||||
; or
|
||||
; M80 =ZMO-xx01.Z80
|
||||
; RELHEX ZMO-xx01
|
||||
; MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
|
||||
; MLOAD ZMP.COM=ZMPX.COM,ZMO-xx01.HEX
|
||||
;
|
||||
;
|
||||
; (Don't use L80 without changing the source for assembly as a
|
||||
@@ -570,4 +570,3 @@ toobig: jp errval ; Overlay too large!
|
||||
endif
|
||||
|
||||
end
|
||||
|
||||
@@ -12,6 +12,10 @@ 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.
|
||||
|
||||
@@ -23,5 +27,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."
|
||||
|
||||
June 7, 2021
|
||||
|
||||
August 15, 2023
|
||||
|
||||
|
||||
Binary file not shown.
@@ -11,6 +11,8 @@
|
||||
; 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)
|
||||
@@ -33,6 +35,9 @@
|
||||
; 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:
|
||||
@@ -52,6 +57,7 @@ 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
|
||||
@@ -80,7 +86,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
|
||||
;
|
||||
@@ -160,12 +166,14 @@ 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
|
||||
@@ -215,6 +223,13 @@ 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
|
||||
@@ -229,7 +244,9 @@ initx:
|
||||
call prtchr
|
||||
ld bc,(heaplim)
|
||||
call prthexword
|
||||
|
||||
call prtchr
|
||||
ld bc,(heaprem)
|
||||
call prthexword
|
||||
#endif
|
||||
;
|
||||
; return success
|
||||
@@ -253,7 +270,7 @@ initcpm3:
|
||||
; switch to sysbnk
|
||||
ld a,($FFE0) ; get current bank
|
||||
push af ; save it
|
||||
ld bc,$F8F2 ; HBIOS Get Bank Info
|
||||
ld bc,BC_SYSGET_BNKINFO ; HBIOS Get Bank Info
|
||||
rst 08 ; call HBIOS, E=User Bank
|
||||
ld a,e ; HBIOS User Bank
|
||||
call bnksel ; HBIOS BNKSEL
|
||||
@@ -282,7 +299,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
|
||||
@@ -399,6 +416,8 @@ 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
|
||||
@@ -438,9 +457,8 @@ devlist:
|
||||
or a ; set flags
|
||||
jr nz,devlstu ; do UNA mode dev list
|
||||
;
|
||||
ld b,$F8 ; hbios func: sysget
|
||||
ld c,$10 ; sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
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
|
||||
devlist1:
|
||||
@@ -486,6 +504,496 @@ 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:
|
||||
@@ -546,7 +1054,7 @@ install3:
|
||||
ld (heaptop),de ; DE has next byte available
|
||||
;
|
||||
; allocate directory buffer
|
||||
ld hl,128 ; size of directory buffer
|
||||
ld hl,SIZ_DBUF ; size of directory buffer
|
||||
call alloc ; allocate the space
|
||||
jp c,instovf ; handle overflow error
|
||||
ld (dirbuf),hl ; ... and save in dirbuf
|
||||
@@ -574,8 +1082,7 @@ dph_init2:
|
||||
ld a,(hl) ; unit to A
|
||||
push bc ; save loop control
|
||||
push hl ; save drive map pointer
|
||||
;ld hl,16 ; size of a DPH structure
|
||||
ld hl,20 ; size of a DPH structure
|
||||
ld hl,SIZ_DPH ; size of a DPH structure
|
||||
call alloc ; allocate space for dph
|
||||
jp c,instovf ; handle overflow error
|
||||
push hl ; save DPH location
|
||||
@@ -607,9 +1114,15 @@ 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
|
||||
;
|
||||
@@ -653,25 +1166,25 @@ makdphuna1: ; handle ram/rom
|
||||
makdphwbw: ; determine appropriate dpb (WBW mode, unit number in A)
|
||||
;
|
||||
ld c,a ; unit number to C
|
||||
ld b,$17 ; HBIOS: Report Device Info
|
||||
ld b,BF_DIODEVICE ; 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 $00 ; ram/rom?
|
||||
cp DIODEV_MD ; ram/rom?
|
||||
jr nz,makdph00 ; if not, skip ahead to other types
|
||||
ld a,e ; physical unit number to A
|
||||
ld e,1 ; assume rom
|
||||
ld e,MID_MDROM ; assume rom
|
||||
cp $01 ; rom?
|
||||
jr z,makdph0 ; yes, jump ahead
|
||||
ld e,2 ; otherwise ram
|
||||
ld e,MID_MDRAM ; otherwise ram
|
||||
jr makdph0 ; jump ahead
|
||||
makdph00:
|
||||
ld e,6 ; assume floppy
|
||||
cp $01 ; floppy?
|
||||
makdph00:
|
||||
ld e,MID_FD144 ; assume floppy
|
||||
cp DIODEV_FD ; floppy?
|
||||
jr z,makdph0 ; yes, jump ahead
|
||||
ld e,3 ; assume ram floppy
|
||||
cp $02 ; ram floppy?
|
||||
ld e,MID_RF ; assume ram floppy
|
||||
cp DIODEV_RF ; ram floppy?
|
||||
jr z,makdph0 ; yes, jump ahead
|
||||
ld e,4 ; everything else is assumed to be hard disk
|
||||
ld e,MID_HD ; everything else is assumed to be hard disk
|
||||
jr makdph0 ; yes, jump ahead
|
||||
;
|
||||
makdph0:
|
||||
@@ -689,7 +1202,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
|
||||
@@ -716,7 +1229,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
|
||||
@@ -730,7 +1243,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)
|
||||
@@ -741,7 +1254,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
|
||||
;
|
||||
@@ -751,7 +1264,7 @@ instcpm3:
|
||||
; swicth to sysbnk
|
||||
ld a,($FFE0) ; get current bank
|
||||
push af ; save it
|
||||
ld bc,$F8F2 ; HBIOS Get Bank Info
|
||||
ld bc,BC_SYSGET_BNKINFO ; HBIOS Get Bank Info
|
||||
rst 08 ; call HBIOS, E=User Bank
|
||||
ld a,e ; HBIOS User Bank
|
||||
call $FFF3 ; HBIOS BNKSEL
|
||||
@@ -763,8 +1276,7 @@ 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
|
||||
@@ -783,7 +1295,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
|
||||
@@ -865,15 +1377,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:
|
||||
@@ -905,6 +1417,14 @@ 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
|
||||
@@ -981,7 +1501,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 DE
|
||||
ld hl,(drives) ; load source/dest in HL
|
||||
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
|
||||
@@ -1001,7 +1521,7 @@ drvswap:
|
||||
rlca
|
||||
call addhl
|
||||
ld (dstptr),hl
|
||||
;
|
||||
;
|
||||
; 1) dest -> temp
|
||||
ld hl,(dstptr)
|
||||
ld de,tmpent
|
||||
@@ -1064,20 +1584,19 @@ 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 b,$F8 ; hbios func: sysget
|
||||
ld c,$10 ; sysget subfunc: diocnt
|
||||
rst 08 ; call hbios, E := device count
|
||||
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
|
||||
drvmap3:
|
||||
push bc ; preserve loop control
|
||||
ld b,$17 ; hbios func: diodevice
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice
|
||||
rst 08 ; call hbios, D := device, E := unit
|
||||
pop bc ; restore loop control
|
||||
ld a,(device)
|
||||
@@ -1099,7 +1618,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?
|
||||
@@ -1206,12 +1725,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
|
||||
@@ -1226,8 +1745,9 @@ 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
|
||||
@@ -1301,7 +1821,7 @@ prtdev:
|
||||
or a ; set flags
|
||||
ld a,e ; put device num back
|
||||
jr nz,prtdevu ; print device in UNA mode
|
||||
ld b,$17 ; hbios func: diodevice
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice
|
||||
ld c,a ; unit to C
|
||||
rst 08 ; call hbios, D := device, E := unit
|
||||
push de ; save results
|
||||
@@ -1326,7 +1846,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
|
||||
@@ -1389,15 +1909,14 @@ chkdrv:
|
||||
;
|
||||
chkdev: ; HBIOS variant
|
||||
push af ; save incoming unit
|
||||
ld b,$F8 ; hbios func: sysget
|
||||
ld c,$10 ; sysget subfunc: diocnt
|
||||
ld bc,BC_SYSGET_DIOCNT ; hbios func: 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,$17 ; hbios func: diodevice
|
||||
ld b,BF_DIODEVICE ; hbios func: diodevice
|
||||
ld c,a ; unit to C
|
||||
rst 08 ; call hbios, C := device attributes
|
||||
;
|
||||
@@ -1476,7 +1995,7 @@ prtstr1:
|
||||
;
|
||||
prtstr2:
|
||||
pop de ; restore registers
|
||||
ret
|
||||
ret
|
||||
;
|
||||
; Print the value in A in hex without destroying any registers
|
||||
;
|
||||
@@ -1499,7 +2018,7 @@ prthexword:
|
||||
ld a,b
|
||||
call prthex
|
||||
ld a,c
|
||||
call prthex
|
||||
call prthex
|
||||
pop af
|
||||
ret
|
||||
;
|
||||
@@ -1523,9 +2042,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
|
||||
@@ -1871,19 +2390,27 @@ 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 9,0 ; temporary string of up to 8 chars, zero term
|
||||
tmpstr .fill 17,0 ; temporary string of up to 16 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
|
||||
;
|
||||
@@ -1893,6 +2420,7 @@ 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
|
||||
@@ -1936,17 +2464,19 @@ stack .equ $ ; stack top
|
||||
; Messages
|
||||
;
|
||||
indent .db " ",0
|
||||
msgban1 .db "ASSIGN v1.8 for RomWBW CP/M ",0
|
||||
msgban1 .db "ASSIGN v2.0 for RomWBW CP/M ",0
|
||||
msg22 .db "2.2",0
|
||||
msg3 .db "3",0
|
||||
msbban2 .db ", 13-Oct-2023",0
|
||||
msbban2 .db ", 21-Dec-2024",0
|
||||
msghb .db " (HBIOS Mode)",0
|
||||
msgub .db " (UBIOS Mode)",0
|
||||
msgban3 .db "Copyright 2023, Wayne Warthen, GNU GPL v3",0
|
||||
msgban3 .db "Copyright 2024, 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,8 +1,11 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
:: copysl.com is currently distributed as a binary application, so
|
||||
:: it is not built here.
|
||||
set TOOLS=../../../Tools
|
||||
set PATH=%TOOLS%\tasm32;%PATH%
|
||||
set TASMTABS=%TOOLS%\tasm32
|
||||
|
||||
tasm -t80 -g3 -fFF copysl.asm copysl.com copysl.lst || exit /b
|
||||
|
||||
copy /Y copysl.com ..\..\..\Binary\Apps\ || exit /b
|
||||
copy /Y copysl.doc ..\..\..\Binary\Apps\ || exit /b
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
:: copysl.com is currently distributed as a binary application, so
|
||||
:: we do not delete the .COM file.
|
||||
if exist *.com del *.com
|
||||
if exist *.lst del *.lst
|
||||
if exist *.bin del *.bin
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
OBJECTS = copysl.com
|
||||
NODELETE = $(OBJECTS)
|
||||
DOCS = copysl.doc
|
||||
DEST = ../../../Binary/Apps
|
||||
DOCDEST = ../../../Binary/Apps
|
||||
TOOLS=../../../Tools
|
||||
include $(TOOLS)/Makefile.inc
|
||||
TOOLS =../../../Tools
|
||||
|
||||
USETASM=1
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
16
Source/Apps/copysl/bdos.asm
Normal file
16
Source/Apps/copysl/bdos.asm
Normal file
@@ -0,0 +1,16 @@
|
||||
;
|
||||
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
|
||||
;
|
||||
328
Source/Apps/copysl/cio.asm
Normal file
328
Source/Apps/copysl/cio.asm
Normal file
@@ -0,0 +1,328 @@
|
||||
|
||||
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
|
||||
|
||||
|
||||
1324
Source/Apps/copysl/copysl.asm
Normal file
1324
Source/Apps/copysl/copysl.asm
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
==========================================================================
|
||||
CopySlice Utility v0.2 for RomWbW computers
|
||||
written by Mark Pruden (Sept 2024)
|
||||
CopySlice Utility v0.3 for RomWbW computers
|
||||
written by Mark Pruden (March 2025)
|
||||
==========================================================================
|
||||
|
||||
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,39 +54,40 @@ 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
|
||||
------
|
||||
@@ -95,4 +96,3 @@ Future
|
||||
This would be at the cost of performance
|
||||
* ability to abort once the copy has started <ctrl><c>
|
||||
|
||||
|
||||
110
Source/Apps/copysl/crc.asm
Normal file
110
Source/Apps/copysl/crc.asm
Normal file
@@ -0,0 +1,110 @@
|
||||
|
||||
;
|
||||
; 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
|
||||
;
|
||||
178
Source/Apps/copysl/hbios.asm
Normal file
178
Source/Apps/copysl/hbios.asm
Normal file
@@ -0,0 +1,178 @@
|
||||
;
|
||||
; 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
|
||||
|
||||
|
||||
10
Source/Apps/slabel/Build.cmd
Normal file
10
Source/Apps/slabel/Build.cmd
Normal file
@@ -0,0 +1,10 @@
|
||||
@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
|
||||
6
Source/Apps/slabel/Clean.cmd
Normal file
6
Source/Apps/slabel/Clean.cmd
Normal file
@@ -0,0 +1,6 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if exist *.com del *.com
|
||||
if exist *.lst del *.lst
|
||||
if exist *.bin del *.bin
|
||||
7
Source/Apps/slabel/Makefile
Normal file
7
Source/Apps/slabel/Makefile
Normal file
@@ -0,0 +1,7 @@
|
||||
OBJECTS = slabel.com
|
||||
DEST = ../../../Binary/Apps
|
||||
TOOLS =../../../Tools
|
||||
|
||||
USETASM=1
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
763
Source/Apps/slabel/slabel.asm
Normal file
763
Source/Apps/slabel/slabel.asm
Normal file
@@ -0,0 +1,763 @@
|
||||
;==============================================================================
|
||||
; 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
|
||||
@@ -12,6 +12,7 @@ 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
|
||||
|
||||
4
Source/BuildEZ512.cmd
Normal file
4
Source/BuildEZ512.cmd
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
pushd EZ512 && call Build || exit /b & popd
|
||||
@@ -411,8 +411,7 @@ REBOOT:
|
||||
;
|
||||
#IFDEF PLTWBW
|
||||
; WARM START
|
||||
LD B,BF_SYSRESET ; SYSTEM RESTART
|
||||
LD C,BF_SYSRES_WARM ; WARM START
|
||||
LD BC,BC_SYSRES_WARM ; SYSTEM WARM RESTART
|
||||
CALL $FFF0 ; CALL HBIOS
|
||||
#ENDIF
|
||||
;
|
||||
@@ -2199,8 +2198,7 @@ INIT:
|
||||
|
||||
#ELSE
|
||||
; GET CRITICAL BANK ID'S
|
||||
LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO
|
||||
LD C,BF_SYSGET_BNKINFO ; HBIOS SUBFUNC=GET BANK ASSIGNMENTS
|
||||
LD BC,BC_SYSGET_BNKINFO ; HBIOS FUNC=GET SYS INFO;GET BANK ASSIGNMENTS
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,D ; GET HBIOS BANK RETURNED IN D
|
||||
LD (BNKBIOS),A ; ... AND SAVE IT
|
||||
@@ -2213,8 +2211,7 @@ INIT:
|
||||
#ENDIF
|
||||
;
|
||||
; SOFT RESET HBIOS
|
||||
LD B,BF_SYSRESET ; HB FUNC: RESET
|
||||
LD C,BF_SYSRES_INT ; WARM START
|
||||
LD BC,BC_SYSRES_INT ; HB FUNC: RESET; WARM START
|
||||
RST 08 ; DO IT
|
||||
;
|
||||
#IF DEBUG
|
||||
@@ -2343,10 +2340,8 @@ INIT2:
|
||||
LD C,(HL) ; PUT UNIT NUM IN C
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,C ; GET ATTRIBUTES
|
||||
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?
|
||||
AND %10001101 ; ISOLATE TYPE BITS, NOT FLOPPY
|
||||
CP %00000100 ; TYPE=ROM/FLASH ; Att="0xxx01x0"
|
||||
JR NZ,INIT2X ; IF NOT THEN DONE
|
||||
;
|
||||
INIT2A:
|
||||
@@ -2496,8 +2491,7 @@ DEV_INIT000:
|
||||
DEV_INIT00:
|
||||
; LOOP THRU DEVICES ADDING DEVICES TO DEVMAP
|
||||
; CONSOLE DEVICE WAS ALREADY DONE, SO IT IS SKIPPED HERE
|
||||
LD B,BF_SYSGET ; HBIOS FUNC: GET SYS INFO
|
||||
LD C,BF_SYSGET_CIOCNT ; SUBFUNC: GET CIO UNIT COUNT
|
||||
LD BC,BC_SYSGET_CIOCNT ; HBIOS FUNC: GET SYS INFO; GET CIO UNIT COUNT
|
||||
RST 08 ; E := SERIAL UNIT COUNT
|
||||
LD B,E ; COUNT TO B
|
||||
LD C,0 ; UNIT INDEX
|
||||
@@ -2928,8 +2922,7 @@ 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 B,BF_SYSGET
|
||||
LD C,BF_SYSGET_DIOCNT
|
||||
LD BC,BC_SYSGET_DIOCNT ; GET DISK UNIT COUNT
|
||||
RST 08 ; E := DISK UNIT COUNT
|
||||
LD B,E ; COUNT TO B
|
||||
LD A,B ; COUNT TO A
|
||||
@@ -3435,6 +3428,63 @@ 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,54 +364,6 @@ 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:
|
||||
@@ -457,9 +409,9 @@ HEXASCII:
|
||||
HEXCONV:
|
||||
AND 0FH ;LOW NIBBLE ONLY
|
||||
ADD A,90H
|
||||
DAA
|
||||
DAA
|
||||
ADC A,40H
|
||||
DAA
|
||||
DAA
|
||||
RET
|
||||
;
|
||||
;****************************
|
||||
@@ -488,40 +440,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)
|
||||
;
|
||||
|
||||
@@ -38,7 +38,7 @@ It is an independent disassembly and reconstruction of CCP/BDOS.
|
||||
DRI CPM22PAT01 was already applied. Unclear why, but the BDOS
|
||||
source was checking for a blank instead of a ctrl-s in the
|
||||
KBSTAT routine. Ctrl-s seems to be correct based on all other
|
||||
BDOS images I have encountered. Also, these files imbed the
|
||||
BDOS images I have encountered. Also, these files embed the
|
||||
CP/M version number into the serial number fields. Other than
|
||||
this, they are byte identical to the OS2CCP/OS3BDOS images above.
|
||||
|
||||
@@ -51,17 +51,24 @@ BDOS22.ASM - Modified ORG & fix for ctrl-S
|
||||
CCPB03 & BDOSB01
|
||||
----------------
|
||||
|
||||
Sourced from N8VEM effort to create an enhanced
|
||||
variant of CP/M 2.2.
|
||||
These files were derived from a disassembly of the Jade DD CP/M-80
|
||||
image by William Beech in 1982.
|
||||
|
||||
It appears to be a disassembly and reconstruction of CCP/BDOS,
|
||||
but there are no comments attributing the work. DRI CPM22PAT01
|
||||
was already applied. The message string literals are all
|
||||
- Modified by Bill Beech for global CP/M size configuration
|
||||
and separate CCP and BDOSE 2013.
|
||||
|
||||
- Modified by Bill Beech for addition of MON
|
||||
command and display/change of user on command line
|
||||
1984. Also removed all SN checks.
|
||||
|
||||
Eventually modified as part of the N8VEM project and converted to
|
||||
the Z80 instruction set.
|
||||
|
||||
DRI CPM22PAT01 has been applied. The message string literals are all
|
||||
in CAPS in BDOS. Additionally, there is explicit filler of 0x55
|
||||
value bytes at the end of the CCP/BDOS files padding their
|
||||
length out to full page. Other than this, the BDOS
|
||||
is byte identical to the others above. CCP contains multiple
|
||||
enhancements and is, therefore, not identical to others.
|
||||
is byte identical to the others above.
|
||||
|
||||
CCPB03.ASM - Enhanced reassembly of CCP
|
||||
|
||||
|
||||
@@ -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,6 +29,7 @@
|
||||
;
|
||||
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
|
||||
@@ -76,8 +77,8 @@ BOOT:
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
LD C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
LD DE,SYS_LOC ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,SYS_SEC ; NUMBER OF SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
@@ -147,10 +148,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
|
||||
@@ -252,7 +253,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 "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
PR_LABEL .DB "CP/M 2.2$$$$$$$$","$" ; (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
|
||||
|
||||
csvbufs equ 256
|
||||
alvbufs equ 512
|
||||
dirbufs equ 512
|
||||
dtabufs equ 512
|
||||
; CPMLDR.SYS must be a multiple of 512 bytes (one sector)
|
||||
; for the RomWBW loader. Below padding as needed to force
|
||||
; this.
|
||||
ds 80h
|
||||
|
||||
;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
|
||||
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
|
||||
|
||||
; 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,6 +31,7 @@
|
||||
; 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
|
||||
@@ -57,6 +58,8 @@ 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
|
||||
@@ -80,8 +83,8 @@ BOOT:
|
||||
CALL PRTDOT ; PROGRESS
|
||||
;
|
||||
LD C,$42 ; UNA FUNC: READ SECTORS
|
||||
LD DE,$D000 ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,22 ; READ 22 SECTORS
|
||||
LD DE,SYS_LOC ; STARTING ADDRESS FOR IMAGE
|
||||
LD L,SYS_SEC ; NUMBER OF SECTORS
|
||||
CALL $FFFD ; DO READ
|
||||
JR NZ,ERROR ; HANDLE ERROR
|
||||
CALL PRTDOT ; PROGRESS
|
||||
@@ -151,10 +154,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
|
||||
@@ -256,7 +259,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 "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!)
|
||||
PR_LABEL .DB "CP/M 3.0$$$$$$$$","$" ; (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
@@ -1,4 +1,4 @@
|
||||
$define{doc_ver}{Version 3.5}$
|
||||
$define{doc_ver}{Version 3.6}$
|
||||
$define{doc_product}{RomWBW}$
|
||||
$define{file_root}{https://github.com/wwarthen/RomWBW/raw/master}$
|
||||
$define{doc_root}{$file_root$/Doc}$
|
||||
@@ -8,12 +8,20 @@ $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_errata}{[RomWBW Errata]($doc_root$/RomWBW Errata.pdf)}$
|
||||
|
||||
$define{doc_hardware}{[RomWBW Hardware]($doc_root$/RomWBW Hardware.pdf)}$
|
||||
$ifdef{GFM}$
|
||||
$define{doc_intro}{[RomWBW Introduction](Introduction.md)}$
|
||||
$define{doc_user}{[RomWBW User Guide](UserGuide.md)}$
|
||||
$define{doc_sys}{[RomWBW System Guide](SystemGuide.md)}$
|
||||
$define{doc_apps}{[RomWBW Applications](Applications.md)}$
|
||||
$define{doc_catalog}{[RomWBW Disk Catalog](Catalog.md)}$
|
||||
$define{doc_hardware}{[RomWBW Hardware](Hardware.md)}$
|
||||
$endif$
|
||||
---
|
||||
title: $doc_product$ $doc_title$
|
||||
subtitle: $doc_ver$
|
||||
|
||||
@@ -15,20 +15,24 @@ set PATH=%TOOLS%\gpp;%PATH%
|
||||
|
||||
if not "%1"=="" (call :GenDoc %1 & goto :eof)
|
||||
|
||||
call :GenDoc ReadMe || exit /b
|
||||
:: call :GenDoc ReadMe || exit /b
|
||||
call :GenDoc Introduction || exit /b
|
||||
call :GenDoc UserGuide || exit /b
|
||||
call :GenDoc SystemGuide || exit /b
|
||||
call :GenDoc Applications || exit /b
|
||||
call :GenDoc Catalog || exit /b
|
||||
call :GenDoc Errata || exit /b
|
||||
call :GenDoc Hardware || 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 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 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 Errata.pdf copy Errata.pdf "..\..\Doc\RomWBW Errata.pdf" || exit /b
|
||||
if exist Hardware.pdf copy Hardware.pdf "..\..\Doc\RomWBW Hardware.pdf" || exit /b
|
||||
|
||||
echo.
|
||||
goto :eof
|
||||
@@ -53,4 +57,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
|
||||
|
||||
@@ -70,11 +70,12 @@ disks should now be fully described.
|
||||
CP/M 3. Applications have been patched according to the DRI
|
||||
patch list.
|
||||
|
||||
- **ZPM3**: Digital Research CP/M-80 2.2 Distribution Files
|
||||
- **ZPM3**: ZPM3 Distribution Files
|
||||
|
||||
Documentation: *CPM Manual.pdf*
|
||||
Documentation: *ZPM3.txt*
|
||||
|
||||
These files are from Simeon Cran's ZPM3 operating system distribution.
|
||||
These files are from Simeon Cran's official distribution of ZPM3.
|
||||
All known patches have been applied.
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
@@ -381,11 +382,10 @@ 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 output by MAC |
|
||||
| `HEXCOM.COM` | DRI CPM+ Create a COM file from a hex file (replaces LOAD.COM) |
|
||||
| `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 |
|
||||
@@ -538,8 +538,6 @@ 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. |
|
||||
@@ -559,9 +557,6 @@ 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
|
||||
@@ -579,7 +574,7 @@ This is a generic ZPM3 adaptation for RomWBW.
|
||||
|
||||
The following files came from from Microcode Consulting. The official
|
||||
distribution files can be found on the Microcode Consulting website at
|
||||
[https://www.microcodeconsulting.com/z80/qpm.htm].
|
||||
<https://www.microcodeconsulting.com/z80/qpm.htm>.
|
||||
Also included in this image are debugz, and linkz frm the same company.
|
||||
|
||||
This disk includes the standard DRI CP/M 2.2 files in addition to the
|
||||
@@ -657,7 +652,7 @@ look a little strange depending on the terminal emulation you are using.
|
||||
|
||||
User area 4 contains a full implementation of the CP/NET 1.2 client
|
||||
provided by Doug Miller. Please refer to
|
||||
[https://github.com/durgadas311/cpnet-z80] for more information,
|
||||
<https://github.com/durgadas311/cpnet-z80> for more information,
|
||||
complete documentation and the latest source code.
|
||||
|
||||
Please refer to the RomWBW User Guide for instructions on installing
|
||||
@@ -672,10 +667,12 @@ The following are found in
|
||||
|
||||
| **File** | **CP/NET Version** | **OS** | **Hardware** |
|
||||
|-----------------|---------------------|-----------------|-------------------------|
|
||||
| CPN12MT.LBR | CP/NET 1.2 | CP/M 2.2 | RCBus w/ MT011 |
|
||||
| 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 |
|
||||
| `CPN12MT.LBR` | CP/NET 1.2 | CP/M 2.2 | RCBus w/ MT011 |
|
||||
| `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
|
||||
|
||||
@@ -692,34 +689,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 applcations.
|
||||
Then we have some more general purpose applications.
|
||||
In general, there is no documentation for these applications included with the RomWBW
|
||||
distribution. Some provide command line help themselves. Some are fairly obvious.
|
||||
|
||||
@@ -746,7 +743,9 @@ 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 |
|
||||
| `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 |
|
||||
| `UNARC.COM` | | Extract file(s) from .ARC or .ARK archive |
|
||||
| `UNARC.DOC` | | Documentation for UNARC |
|
||||
| `UNCR.COM` | | Decompress Crunched file(s). See CRUNCH.COM |
|
||||
@@ -789,6 +788,8 @@ 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,6 +815,9 @@ 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 |
|
||||
@@ -924,12 +928,12 @@ The following files are found in
|
||||
|
||||
| **File** | **Description** |
|
||||
|----------------|-----------------------------------------------------------|
|
||||
| HDIR.COM | |
|
||||
| R.COM | transfer files between the simulator and host file system |
|
||||
| RSETSIMH.COM | -- |
|
||||
| TIMER.COM | -- |
|
||||
| URL.COM | -- |
|
||||
| W.COM | transfer files between the simulator and host file system |
|
||||
| `HDIR.COM` | |
|
||||
| `R.COM` | transfer files between the simulator and host file system |
|
||||
| `RSETSIMH.COM` | -- |
|
||||
| `TIMER.COM` | -- |
|
||||
| `URL.COM` | -- |
|
||||
| `W.COM` | transfer files between the simulator and host file system |
|
||||
|
||||
## Testing Applications
|
||||
|
||||
@@ -976,7 +980,7 @@ The following files are found in
|
||||
| `ZEXDOC.COM` | Z80 Instruction Set Exerciser |
|
||||
|
||||
And The following CPU Tests - Which are probably originally from this source.
|
||||
[https://github.com/raxoft/z80test]
|
||||
<https://github.com/raxoft/z80test>
|
||||
|
||||
| **File** | **Description** |
|
||||
|----------------|---------------------------------------------------------------|
|
||||
@@ -999,7 +1003,7 @@ including MS-DOS, Apple II DOS 3.3 and PRoDOS, Commodore 64, Macintosh and
|
||||
Amiga. This disk contains the CP/M version of that compiler. A cross-compiler
|
||||
for MS-DOS or Windows XP is also available.
|
||||
|
||||
For full documentation, see [https://www.aztecmuseum.ca]
|
||||
For full documentation, see <https://www.aztecmuseum.ca>
|
||||
The user manual is available in the Doc/Language directory
|
||||
Aztec_C_1.06_User_Manual_Mar84.pdf
|
||||
|
||||
@@ -1045,10 +1049,10 @@ NOTE : The above is incomplete
|
||||
|
||||
The Cowgol 2.0 compiler and related tools.
|
||||
These files were provided by Ladislau Szilagyi and were sourced
|
||||
from his GitHub repository at [https://github.com/Laci1953/Cowgol_on_CP_M].
|
||||
from his GitHub repository at <https://github.com/Laci1953/Cowgol_on_CP_M>.
|
||||
|
||||
The primary distribution site for Cowgol 2.0 is at
|
||||
[https://github.com/davidgiven/cowgol].
|
||||
<https://github.com/davidgiven/cowgol>.
|
||||
The user manual is available in the Doc/Language directory
|
||||
Cowgol Language.pdf
|
||||
|
||||
@@ -1056,25 +1060,66 @@ The following files are found in
|
||||
|
||||
* /Source/Images/d_cowgol
|
||||
|
||||
| **File** | **Description** |
|
||||
|--------------|--------------------------------------------|
|
||||
| ADVENT.COW | Adventure game program source |
|
||||
| ADVENT.SUB | Submit file to build ADVENT |
|
||||
| ADVENT?.TXT | Adventure game program resource |
|
||||
| ADVMAIN.COW | Adventure game program source |
|
||||
| RAND.AS | Assembler Library File |
|
||||
| COWBE.COM | |
|
||||
| COWFE.COM | RomWBW specific (Memory Manage) version |
|
||||
| COWLINK.COM | |
|
||||
| DYNMSORT.COW | demonstrates a sort algorithm |
|
||||
| DYNMSORT.SUB | Submit file to build DYNMSORT |
|
||||
| HEXDUMP.COW | a simple hex dump utility, purely a Cowgol |
|
||||
| HEXDUMP.SUB | Submit file to build HEXDUMP |
|
||||
| HMERGES.C | C Library File |
|
||||
| XRND.AS | Assembler Library File |
|
||||
| - | - |
|
||||
|
||||
NOTE : The above is incomplete
|
||||
| **File** | **Description** |
|
||||
|----------------|--------------------------------------------|
|
||||
| `$EXEC.COM` | HiTech C batch processor which launches the Cowgol toolchain executables |
|
||||
| `ADVENT.COW` | Adventure game program source |
|
||||
| `ADVENT.SUB` | SUBMIT file to build Adventure game |
|
||||
| `ADVENT?.TXT` | Adventure game program resources |
|
||||
| `ADVMAIN.COW` | Adventure game program source |
|
||||
| `ADVTRAV.COW` | Adventure game component source |
|
||||
| `ARGV.COH` | Cowgol include file providing command line argument processing |
|
||||
| `C.LIB` | HI-TECH C runtime library |
|
||||
| `CGEN.COM` | HiTech C compiler pass 2 |
|
||||
| `COMMFILE.COH` | Include file providing file I/O |
|
||||
| `COMMON.COH` | Include file providing common functions |
|
||||
| `COWBE.COM` | Cowgol back end which builds the cowgol object files (optimized) |
|
||||
| `COWFE.COM` | Cowgol front end which parses the source file (optimized) |
|
||||
| `COWFIX.COM` | Interface to Z80AS -- performs code optimizations |
|
||||
| `COWGOL.COH` | Include file providing standard Cowgol functions |
|
||||
| `COWGOL.COM` | Interprets the command line and generates $EXEC run requests (a variant of HiTech C.COM) |
|
||||
| `COWGOL.COO` | Cowgol object file with ??? |
|
||||
| `COWGOL.LIB` | ??? |
|
||||
| `COWGOLC.COH` | Cowgol include file providing ??? |
|
||||
| `COWLINK.COM` | Cowgol linker which binds all the cowgol object files and outputs a Z80 assembler file (optimized) |
|
||||
| `CPP.COM` | HiTech C pre-processor, modified to accept // style comments |
|
||||
| `DYNMSORT.COW` | Sort algorithm sample program source |
|
||||
| `DYNMSORT.SUB` | SUBMIT file to build DYNMSORT sample application |
|
||||
| `FACT.COW` | Factorial computation sample program source |
|
||||
| `FILE.COH` | Include file providing CP/M file processing support |
|
||||
| `FILEIO.COH` | Include file providing CP/M file processing support |
|
||||
| `HEXDUMP.COW` | Hex file dump sample source |
|
||||
| `HEXDUMP.SUB` | SUBMIT file to build HEXDUMP sample program |
|
||||
| `LIBBASIC.COH` | Include file providing ??? |
|
||||
| `LIBBIOS.COH` | Include file providing ??? |
|
||||
| `LIBCONIO.COH` | Include file providing console I/O |
|
||||
| `LIBFP.COH` | Include file providing floating point support |
|
||||
| `LIBR.COM` | HiTech object file librarian |
|
||||
| `LIBSTR.COH` | Include file providing string functions |
|
||||
| `LINK.COM` | HiTech linker which builds the final executable from object and library files |
|
||||
| `MALLOC.COH` | Include file providing dynamic memory management functions |
|
||||
| `MERGES.C` | Merge sort sample function C language source |
|
||||
| `MISC.COH` | Include file providing miscellaneous functions |
|
||||
| `MISC.COO` | Miscellaneous functions object file |
|
||||
| `MISC.COW` | Miscellaneous functions source file |
|
||||
| `OPTIM.COM` | HiTech C compiler optimizer |
|
||||
| `P1.COM` | HiTech C compiler first pass |
|
||||
| `RAND.AS` | Pseudo-random number generator source in assembly language |
|
||||
| `RANFILE.COH` | Include file providing random file access functions |
|
||||
| `RANFILE.COO` | Random file access functions object file |
|
||||
| `RANFILE.COW` | Random file access functions source file |
|
||||
| `README.TXT` | Cowgol disk image release notes |
|
||||
| `SEQFILE.COH` | Include file providing sequential file access functions |
|
||||
| `SEQFILE.COO` | Sequential file access functions object file |
|
||||
| `SEQFILE.COW` | Sequential file access functions source file |
|
||||
| `STDCOW.COH` | Include file providing standard library functions |
|
||||
| `STRING.COH` | Include file providing string functions |
|
||||
| `STRING.COO` | String functions object file |
|
||||
| `STRING.COW` | String functions source file |
|
||||
| `STRINGS.COH` | Include file implementing string functions |
|
||||
| `TESTAS.COW` | Assembly language interface sample program source |
|
||||
| `TESTAS.SUB` | SUBMIT file to build TESTAS sample program |
|
||||
| `Z80AS.COM` | Z80 assembler which assembles the output of COWFIX and other Z80 source files (see <https://github.com/Laci1953/Z80AS>) |
|
||||
|
||||
## Microsoft Fortran 80 (Fortran)
|
||||
|
||||
@@ -1111,12 +1156,12 @@ Zork 1 through 3, Planetfall and Hitchhiker's Guide to the Galaxy.
|
||||
Nemesis and Dungeon Master is a Rogue-like game released in 1981. It is playable
|
||||
on a text terminal using ASCII graphics to represent the dungeon. Only a few
|
||||
thousand copies of the game were ever made, making it very rare. See
|
||||
[http://crpgaddict.blogspot.com/2019/03/game-322-nemesis-1981.html]
|
||||
<http://crpgaddict.blogspot.com/2019/03/game-322-nemesis-1981.html>
|
||||
|
||||
Colossal Cave Adventure is a CP/M port of the 1976 classic game originally
|
||||
written by Will Crowther for the PDP-10 mainframe. See
|
||||
[https://en.wikipedia.org/wiki/Colossal_Cave_Adventure] and
|
||||
[https://if50.substack.com/p/1976-adventure]
|
||||
<https://en.wikipedia.org/wiki/Colossal_Cave_Adventure> and
|
||||
<https://if50.substack.com/p/1976-adventure>
|
||||
|
||||
The following files are found in
|
||||
|
||||
@@ -1133,31 +1178,92 @@ NOTE : The above is incomplete
|
||||
| Floppy Disk Image: **fd_hitechc.img**
|
||||
| Hard Disk Image: **hd_hitechc.img**
|
||||
|
||||
The HI-TECH C Compiler is a set of software which
|
||||
The HI-TECH C Compiler is a set of software which
|
||||
translates programs written in the C language to executable
|
||||
machine code programs. Versions are available which compile
|
||||
programs for operation under the host operating system, or
|
||||
which produce programs for execution in embedded systems
|
||||
without an operating system.
|
||||
|
||||
This is the Mar 21, 2023 update 17 released by Tony Nicholson who currently
|
||||
maintains HI-TECH C at [https://github.com/agn453/HI-TECH-Z80-C]
|
||||
This is the Jun 2, 2025 update 19 released by Tony Nicholson who
|
||||
currently maintains HI-TECH C at
|
||||
<https://github.com/agn453/HI-TECH-Z80-C>.
|
||||
|
||||
The manual is available in the Doc/Language directory,
|
||||
HI-TECH Z80 C Compiler Manual.txt
|
||||
|
||||
A good blog post about the HI-TECH C Compiler is available at
|
||||
[https://techtinkering.com/2008/10/22/installing-the-hi-tech-z80-c-compiler-for-cpm]
|
||||
<https://techtinkering.com/2008/10/22/installing-the-hi-tech-z80-c-compiler-for-cpm>.
|
||||
|
||||
User area 1 contains another complete copy of the HI-TECH C Compiler.
|
||||
It is identical to the copy in user area 0 except for the following files
|
||||
which were enhanced by Ladislau Szilagyi from his GitHub Repository at
|
||||
<https://github.com/Laci1953/HiTech-C-compiler-enhanced>. The files
|
||||
take advantage of additional banked memory using the RomWBW HBIOS API.
|
||||
As such, they require RomWBW to operate. They should be compatible with
|
||||
all CP/M and compatible operations systems provided in RomWBW.
|
||||
|
||||
The enhanced files are:
|
||||
|
||||
- `CGEN.COM`
|
||||
- `CPP.COM`
|
||||
- `OPTIM.COM`
|
||||
- `P1.COM`
|
||||
- `ZAS.COM` (replaced with Z80AS)
|
||||
|
||||
A thread discussing this enhanced version of HI-TECH C is found at
|
||||
<https://groups.google.com/g/rc2014-z80/c/sBCCIpOnnGg>.
|
||||
|
||||
The following files are found in
|
||||
|
||||
* /Source/Images/d_hitechc
|
||||
|
||||
| **File** | **Description** |
|
||||
|----------|-----------------|
|
||||
| -- | -- |
|
||||
|
||||
NOTE : The above is incomplete
|
||||
| **File** | **Description** |
|
||||
|----------------|--------------------------------------------|
|
||||
| `$EXEC.COM` | Compiler execution manager |
|
||||
| `ASSERT.H` | Language include file |
|
||||
| `C.COM` | Compiler invocation application (updated) |
|
||||
| `C309.COM` | Compiler invocation application (original) |
|
||||
| `CGEN.COM` | The code generator - produces assembler code |
|
||||
| `CONIO.H` | Language include file (see manual) |
|
||||
| `CPM.H` | Language include file (see manual) |
|
||||
| `CPP.COM` | Pre-processor - handles macros and conditional compilation |
|
||||
| `CREF.COM` | Produces cross-reference listings of C or assembler programs |
|
||||
| `CRTCPM.OBJ` | Startup Object File (standard) |
|
||||
| `CTYPE.H` | Language include file (see manual) |
|
||||
| `DEBUG.COM` | C Debugger (Z80) |
|
||||
| `DRTCPM.OBJ` | Startup Object File (???) |
|
||||
| `EXEC.H` | Language include file (see manual) |
|
||||
| `FLOAT.H` | Language include file (see manual) |
|
||||
| `HITECH.H` | Language include file (see manual) |
|
||||
| `LIBC.LIB` | Standard C Runtime Library |
|
||||
| `LIBF.LIB` | Floating Point Library |
|
||||
| `LIBOVR.LIB` | Overlay Library |
|
||||
| `LIBR.COM` | Creates and maintains libraries of object modules |
|
||||
| `LIMITS.H` | Language include file (see manual) |
|
||||
| `LINQ.COM` | Link editor - links object files with libraries |
|
||||
| `MATH.H` | Language include file (see manual) |
|
||||
| `NRTCPM.OBJ` | Startup Object File (minimal getargs) |
|
||||
| `OBJTOHEX.COM` | Converts the output of LINK into the appropriate executable file format (e.g., .EXE or .PRG or .HEX) |
|
||||
| `OPTIM.COM` | Code improver - may optionally be omitted, reducing compilation time at a cost of larger, slower code produced |
|
||||
| `OPTIONS` | Compiler usage help file |
|
||||
| `OVERLAY.H` | Language include file |
|
||||
| `P1.COM` | The syntax and semantic analysis pass - writes intermediate code for the code generator to read |
|
||||
| `RRTCPM.OBJ` | Startup Object File (self relocating) |
|
||||
| `SETJMP.H` | Language include file (see manual) |
|
||||
| `SIGNAL.H` | Language include file (see manual) |
|
||||
| `STAT.H` | Language include file (see manual) |
|
||||
| `STDARG.H` | Language include file (see manual) |
|
||||
| `STDDEF.H` | Language include file (see manual) |
|
||||
| `STDINT.H` | Language include file (see manual) |
|
||||
| `STDIO.H` | Language include file (see manual) |
|
||||
| `STDLIB.H` | Language include file (see manual) |
|
||||
| `STRING.H` | Language include file (see manual) |
|
||||
| `SYMTOAS.COM` | Convert symbol file to assembler |
|
||||
| `SYS.H` | Language include file (see manual) |
|
||||
| `TIME.H` | Language include file (see manual) |
|
||||
| `UNIXIO.H` | Language include file (see manual) |
|
||||
| `ZAS.COM` | The assembler - in fact a general purpose macro assembler |
|
||||
|
||||
## MSX ROMS
|
||||
|
||||
@@ -1167,7 +1273,7 @@ NOTE : The above is incomplete
|
||||
The collection of MSX ROMs (2 disks) as provided by Les Bird.
|
||||
These ROMs are "run" by using the
|
||||
appropriate variant of Les' MSX8 ROM loader. You can download the
|
||||
loader binaries from [https://github.com/lesbird/MSX8]. You will need
|
||||
loader binaries from <https://github.com/lesbird/MSX8>. You will need
|
||||
appropriate hardware to run the loader.
|
||||
|
||||
Please review the file ROMLIST.TXT for information on the current
|
||||
@@ -1203,23 +1309,23 @@ The manual can be found in the Docs/Language directory,
|
||||
Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf
|
||||
|
||||
A good overview of using Turbo Pascal in CP/M is available at
|
||||
[https://techtinkering.com/2013/03/05/turbo-pascal-a-great-choice-for-programming-under-cpm]
|
||||
<https://techtinkering.com/2013/03/05/turbo-pascal-a-great-choice-for-programming-under-cpm>
|
||||
|
||||
The following files are found in
|
||||
|
||||
* /Source/Images/d_tpascal
|
||||
|
||||
| **File** | **Description** |
|
||||
|--------------|--------------------------------|
|
||||
| ART.TXT | Part of the Example program |
|
||||
| SA.PAS | Example Program |
|
||||
| TINST.COM | Installation and Configuration |
|
||||
| TINST.DTA | Part of TINST |
|
||||
| TINST.MSG | Part of TINST |
|
||||
| TURBO.COM | The main Turbo Pascal program |
|
||||
| TURBO.MSG | Part of TURBO tascal |
|
||||
| TURBO.OVR | Part of TURBO tascal |
|
||||
| TURBOMSG.OVR | Part of TURBO tascal |
|
||||
| **File** | **Description** |
|
||||
|----------------|--------------------------------|
|
||||
| `ART.TXT` | Part of the Example program |
|
||||
| `SA.PAS` | Example Program |
|
||||
| `TINST.COM` | Installation and Configuration |
|
||||
| `TINST.DTA` | Part of TINST |
|
||||
| `TINST.MSG` | Part of TINST |
|
||||
| `TURBO.COM` | The main Turbo Pascal program |
|
||||
| `TURBO.MSG` | Part of TURBO Pascal |
|
||||
| `TURBO.OVR` | Part of TURBO Pascal |
|
||||
| `TURBOMSG.OVR` | Part of TURBO Pascal |
|
||||
|
||||
## WordStar 4
|
||||
|
||||
@@ -1306,7 +1412,9 @@ Also contained on this image in User Area 1 are.
|
||||
| Floppy Disk Image: **fd_z80asm.img**
|
||||
| Hard Disk Image: **hd_z80asm.img**
|
||||
|
||||
Z80ASM is a relocating macro assembler for CP/M. It takes assembly language
|
||||
This disk contains 6 major components
|
||||
|
||||
* 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
|
||||
@@ -1314,19 +1422,103 @@ 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.
|
||||
|
||||
The manual is available in the Doc/Language directory,
|
||||
z80asm (SLR Systems).pdf
|
||||
* 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
|
||||
|
||||
A run through of using the assembler is available at
|
||||
[https://8bitlabs.ca/Posts/2023/05/20/learning-z80-asm]
|
||||
<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
|
||||
|
||||
| **File** | **Description** |
|
||||
|------------|-------------------------------------|
|
||||
| DUMP.* | Sample Program |
|
||||
| TEST.* | Sample Program |
|
||||
| Z80ASM.COM | Relocating macro assembler for CP/M |
|
||||
| Z80ASM.DOC | Documentation for Z80.COM |
|
||||
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 |
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
$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.
|
||||
2407
Source/Doc/Hardware.md
Normal file
2407
Source/Doc/Hardware.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,12 @@
|
||||
$define{doc_title}{ReadMe}$
|
||||
$include{"Basic.h"}$
|
||||
$define{doc_title}{Introduction}$
|
||||
$include{"Book.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:
|
||||
|
||||
@@ -19,45 +20,43 @@ produced by these developer communities:
|
||||
* [Small Computer Central](https://smallcomputercentral.com/)
|
||||
(<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
|
||||
$doc_hardware$ .
|
||||
|
||||
General features include:
|
||||
`\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
|
||||
* Video drivers including TMS9918, SY6545, MOS8563, HD6445, Xosera
|
||||
* 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
|
||||
* Support for CP/NET networking using Wiznet, MT011 or Serial
|
||||
* 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
|
||||
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.
|
||||
OSes and allows up to 2GB of addressable storage on a single device,
|
||||
with up to 128MB accessible at any one time.
|
||||
|
||||
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.
|
||||
## Included Software
|
||||
|
||||
Multiple disk images are provided in the distribution. Most disk
|
||||
images contain a complete, bootable, ready-to-run implementation of a
|
||||
@@ -66,57 +65,152 @@ 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.
|
||||
|
||||
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.
|
||||
Some of the included software:
|
||||
|
||||
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
|
||||
* 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.
|
||||
|
||||
# Acquiring RomWBW
|
||||
`\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. 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.
|
||||
|
||||
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
|
||||
(<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
|
||||
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.
|
||||
|
||||
All source code and distributions are maintained on GitHub. Code
|
||||
contributions are very welcome.
|
||||
#### Distribution Directory Layout
|
||||
|
||||
# Installation & Operation
|
||||
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
|
||||
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$.
|
||||
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
|
||||
|
||||
Documentation for $doc_product$ includes:
|
||||
There are several documents that form the core of the RomWBW documentation:
|
||||
|
||||
* $doc_user$
|
||||
* $doc_sys$
|
||||
* $doc_apps$
|
||||
* $doc_errata$
|
||||
* $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
|
||||
|
||||
# Acknowledgments
|
||||
* $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
|
||||
@@ -188,11 +282,15 @@ 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 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, the COPYSL utility, and also
|
||||
implemented feature for RomWBW configuration by NVRAM.
|
||||
|
||||
* 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
|
||||
- SLABEL 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.
|
||||
|
||||
@@ -226,10 +324,53 @@ please let me know if I missed you!
|
||||
|
||||
* Les Bird has contributed support for the NABU w/ Option Board
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
* Rob Gowin created an online documentation site via MkDocs, and
|
||||
contributed a driver for the Xosera FPGA-based video
|
||||
controller.
|
||||
|
||||
`\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
|
||||
@@ -271,17 +412,3 @@ 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 $doc_author$ at [$doc_authmail$](mailto:$doc_authmail$).
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user