Browse Source

Merge pull request #378 from wwarthen/dev

RomWBW v3.4
patch
Wayne Warthen 2 years ago
committed by GitHub
parent
commit
23e0b82112
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/pull_request_template.md
  2. 4
      .github/workflows/commit.yml
  3. 2
      .github/workflows/release.yml
  4. 5
      .gitignore
  5. 4
      Binary/ReadMe.txt
  6. BIN
      Doc/Aztec_C_1.06_User_Manual_Mar84.pdf
  7. 64
      Doc/ChangeLog.txt
  8. 11351
      Doc/HI-TECH Z80 C Compiler Manual.txt
  9. 4090
      Doc/Microsoft_FORTRAN-80_Users_Manual_1977.pdf
  10. 36
      Doc/ReadMe.txt
  11. BIN
      Doc/RomWBW Applications.pdf
  12. BIN
      Doc/RomWBW Disk Catalog.pdf
  13. BIN
      Doc/RomWBW Errata.pdf
  14. BIN
      Doc/RomWBW ROM Applications.pdf
  15. BIN
      Doc/RomWBW System Guide.pdf
  16. BIN
      Doc/RomWBW User Guide.pdf
  17. 49495
      Doc/Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf
  18. BIN
      Doc/Z180 ASCI Baud Rate Options.pdf
  19. BIN
      Doc/z80asm (SLR Systems).pdf
  20. 18
      Makefile
  21. 86
      ReadMe.md
  22. 83
      ReadMe.txt
  23. 6
      Source/Apps/Build.cmd
  24. 1
      Source/Apps/Clean.cmd
  25. 3
      Source/Apps/FAT/ReadMe.txt
  26. BIN
      Source/Apps/FAT/fat.com
  27. 45
      Source/Apps/FDU/fdu.asm
  28. 32
      Source/Apps/FDU/fdu.doc
  29. 14
      Source/Apps/HTalk/Build.cmd
  30. 5
      Source/Apps/HTalk/Clean.cmd
  31. 10
      Source/Apps/HTalk/Makefile
  32. 725
      Source/Apps/HTalk/htalk.asm
  33. 2
      Source/Apps/Makefile
  34. 131
      Source/Apps/Test/DMAmon/dmamon.asm
  35. 2
      Source/Apps/Test/I2C/Build.cmd
  36. 2
      Source/Apps/Test/I2C/Makefile
  37. 32
      Source/Apps/Test/I2C/i2cscan.asm
  38. 1679
      Source/Apps/Test/I2C/srom.asm
  39. 136
      Source/Apps/Test/ps2info/ps2info.asm
  40. 4
      Source/Apps/Tune/tune.asm
  41. 15
      Source/Apps/XM/xmdm125.asm
  42. 41
      Source/Apps/assign.asm
  43. 38
      Source/Apps/cpuspd/cpuspd.asm
  44. 37
      Source/Apps/rtc.asm
  45. 7
      Source/BPBIOS/Build.cmd
  46. 35
      Source/BPBIOS/Makefile
  47. 4
      Source/BPBIOS/ZCPR33/Build.cmd
  48. 17
      Source/BPBIOS/ZCPR33/Makefile
  49. 3
      Source/BPBIOS/cboot-ww.z80
  50. 13
      Source/BPBIOS/deblock.z80
  51. 4
      Source/BPBIOS/def-ww-z33.lib
  52. 4
      Source/BPBIOS/def-ww-z33bnk.lib
  53. 4
      Source/BPBIOS/def-ww-z34.lib
  54. 4
      Source/BPBIOS/def-ww-z34bnk.lib
  55. 4
      Source/BPBIOS/def-ww-z41bnk.lib
  56. 26
      Source/BPBIOS/diskdefs
  57. 148
      Source/BPBIOS/dpbhd-ww.lib
  58. 1
      Source/BPBIOS/hard-ww.z80
  59. 55
      Source/BPBIOS/hbios.z80
  60. 18
      Source/BPBIOS/ibmv-ww.z80
  61. 33
      Source/BPBIOS/romwbw.lib
  62. 6
      Source/Build.cmd
  63. 1
      Source/BuildShared.cmd
  64. 4
      Source/BuildZ1RCC.cmd
  65. 4
      Source/BuildZRC512.cmd
  66. 4
      Source/BuildZZRC.cmd
  67. 4
      Source/BuildZZRCC.cmd
  68. 190
      Source/CBIOS/cbios.asm
  69. 3
      Source/CPM3/biosldr.z80
  70. 81
      Source/CPM3/boot.z80
  71. 124
      Source/CPM3/diskio.z80
  72. 38
      Source/CPM3/genbnk.dat
  73. 2
      Source/CPM3/genres.dat
  74. 23
      Source/CPM3/move.z80
  75. 4
      Source/Clean.cmd
  76. 147
      Source/Doc/Applications.md
  77. 2
      Source/Doc/Basic.h
  78. 4
      Source/Doc/Book.h
  79. BIN
      Source/Doc/Graphics/Panel.pdf
  80. BIN
      Source/Doc/Graphics/Panel.png
  81. BIN
      Source/Doc/Graphics/Panel.vsdx
  82. 6
      Source/Doc/Makefile
  83. 82
      Source/Doc/ReadMe.md
  84. 344
      Source/Doc/SystemGuide.md
  85. 2956
      Source/Doc/UserGuide.md
  86. BIN
      Source/Doc/Z180 ASCI Baud Rate Options.xlsx
  87. 5
      Source/Fonts/Build.cmd
  88. 9
      Source/Fonts/Makefile
  89. BIN
      Source/Fonts/fontvgarcu.bin
  90. 99
      Source/HBIOS/API.txt
  91. 85
      Source/HBIOS/Bank Layout.txt
  92. 47
      Source/HBIOS/Build.cmd
  93. 4
      Source/HBIOS/Build.ps1
  94. 15
      Source/HBIOS/Build.sh
  95. 1
      Source/HBIOS/Clean.cmd
  96. 47
      Source/HBIOS/Config/DUO_std.asm
  97. 2
      Source/HBIOS/Config/DYNO_std.asm
  98. 64
      Source/HBIOS/Config/EPITX_std.asm
  99. 69
      Source/HBIOS/Config/HEATH_std.asm
  100. 10
      Source/HBIOS/Config/MBC_std.asm

2
.github/pull_request_template.md

@ -1,7 +1,7 @@
<!-- <!--
BEFORE YOU CREATE A PULL REQUEST: BEFORE YOU CREATE A PULL REQUEST:
- Please base all pull requests against the dev branch
- Please base all pull requests against the master branch
- Include a clear description of your change - Include a clear description of your change
- Reference related Issue(s) (e.g., "Resolves Issue #123") - Reference related Issue(s) (e.g., "Resolves Issue #123")

4
.github/workflows/commit.yml

@ -26,7 +26,7 @@ jobs:
run: | run: |
export TZ='America/Los_Angeles' export TZ='America/Los_Angeles'
sudo apt-get install srecord sudo apt-get install srecord
make dist
make distlog
rm -rf .git* rm -rf .git*
- name: List Output - name: List Output
@ -58,7 +58,7 @@ jobs:
run: | run: |
export TZ='America/Los_Angeles' export TZ='America/Los_Angeles'
brew install srecord brew install srecord
make dist
make distlog
rm -rf .git* rm -rf .git*
- name: List Output - name: List Output

2
.github/workflows/release.yml

@ -19,7 +19,7 @@ jobs:
export TZ='America/Los_Angeles' export TZ='America/Los_Angeles'
sudo apt-get install libncurses-dev sudo apt-get install libncurses-dev
sudo apt-get install srecord sudo apt-get install srecord
make dist
make distlog
rm -rf .git* rm -rf .git*
- name: Create Package Archive - name: Create Package Archive

5
.gitignore

@ -95,8 +95,9 @@ Tools/unix/zx/zx
!Source/ZPM3/*.[Cc][Oo][Mm] !Source/ZPM3/*.[Cc][Oo][Mm]
!Source/ZSDOS/*.[Cc][Oo][Mm] !Source/ZSDOS/*.[Cc][Oo][Mm]
!Source/ZRC/*.bin !Source/ZRC/*.bin
!Source/ZZRC/*.bin
!Source/ZZRC/*.hex
!Source/ZRC512/*.bin
!Source/Z1RCC/*.bin
!Source/ZZRCC/*.bin
!Tools/cpm/** !Tools/cpm/**
!Tools/unix/zx/* !Tools/unix/zx/*
!Tools/zx/* !Tools/zx/*

4
Binary/ReadMe.txt

@ -39,8 +39,8 @@ image for the Mark IV with the standard configuration. If a custom
configuration called "custom" is created and built, a new file called configuration called "custom" is created and built, a new file called
MK4_custom.rom will be added to this directory. MK4_custom.rom will be added to this directory.
Documentation of the pre-built ROM Images is contained in the
RomList.txt file in this directory.
Documentation of the pre-built ROM Images is contained in
"RomWBW User Guide.pdf" in the Doc directory.
ROM Firmware Update Images (<plt>_<cfg>.upd) ROM Firmware Update Images (<plt>_<cfg>.upd)
------------------------------------- -------------------------------------

BIN
Doc/Aztec_C_1.06_User_Manual_Mar84.pdf

Binary file not shown.

64
Doc/ChangeLog.txt

@ -1,3 +1,67 @@
Version 3.4
-----------
NOTE: Changes require HBIOS/CBIOS/Apps sync, version bump to 3.4 to ensure integrity
- WBW: Device type number moved from upper nibble to full byte
- A?C: Support for EP ITX-Mini Z180 Platform
- M?R: Significant improvement in User Guide document
- J?P: Preliminary support for Monsputer (MON)
- JLC: Standardize TMS driver memory map for compatibility
- WBW: Improved IDE device detection
- WBW: Fixed decompression when run on Z280
- K?B: WDATE generic HBIOS date/time utility
- WBW: Create new DSKY framework with simple driver style interface
- JBL: Added ColecoVision config in TMS driver
- WBW: Added support for interrupt mode 1 on Z180
- WBW: Added S100 platform
- WBW: Added Duodyne platform
- WBW: Incorporated John Monahan's S100 Monitor in S100 platform build
- WBW: Support ESP32 on Duodyne
- M?C: Fixed port specification when using XM.COM send transfers
- PMS: Support for Duodyne DMA
- WBW: Added Serial ROM (SROM.COM) utility
- WBW: Support S100 Propeller Console
- SCC: Added support for SC700
- WBW: Added Heath H8 platform
- D?J: Enhanced build to run on Raspberry Pi 4
- WBW: Complete overhaul of ROMless boot operation
- WBW: Prevent access to slices outside of partition
- T?P: Contributed the HTALK utility
- WBW: CTS stall detection
- W?S: Updated FLASH utility to v1.3.7
- L?N: Updated UNARC to new OS universal version
- B?C: Added support for Z1RCC
- M?R: User Guide enhancements and corrections
- D?H: Added support for specification of secondary console
- WBW: Added platform for Monsputer
- WBW: Added FAT.COM to standard ROM Disk (removed RMAC.COM & LINK.COM)
Version 3.3
-----------
NOTE: v3.3 was never released
- WBW: Support Front Panel switches
- A?C: Preliminary support for Z80-Retro
- A?C: Support for SD PIO
- A?C: Support for Z80-Retro SD interface
- WBW: Support per-drive floppy configuration
- WBW: Support for Bill Shen's VGARC
- WBW: Support for MG014 Parallel Port module + printer
- WBW: Support for IMM Zip Drive on PPI interface (much inspiration from Alan Cox)
- WBW: Support for PPA Zip Drive on PPI interface (much inspiration from Alan Cox)
- WBW: Support for SyQuest SparQ Drive on PPI interface (much inspiration from Alan Cox)
- WBW: Support for ATAPI Disk Drives (not CD-ROMs) on IDE and PPIDE interfaces
- R?P: Added new disk images: Aztec C, MS BASIC Compiler, MS Fortran, Games, HiTech-C, Turbo Pascal, SLR Z80ASM
- JBL: Added RCZ80 configuration for ColecoVision
- WBW: Support for Z180 running interrupt mode 1
- WBW: Preliminary support for S100 Computers Z180
- WBW: Preliminary support for Dan Werner's ESP32 MBC Module
- WBW: Early support for Duodyne base system (CPU/UART/ROM/RAM/RTC/SPK)
- M?C: Fixed XM to allow specifying HBIOS port for send operations
- WBW: Fix S100 Z180 LED operation (credit to Jay Cotton for finding this issue)
- WBW: QPM system image is now combined with current CBIOS during build
- WBW: Added framework for Heath platform
- WBW: Support for USB Disks via CH375/CH376
- D?J: Support for Raspberry Pi build process
Version 3.2.1 Version 3.2.1
------------- -------------
- M?P: Fixed Zeta 2 FDD and CPUSPD config settings - M?P: Fixed Zeta 2 FDD and CPUSPD config settings

11351
Doc/HI-TECH Z80 C Compiler Manual.txt

File diff suppressed because it is too large

4090
Doc/Microsoft_FORTRAN-80_Users_Manual_1977.pdf

File diff suppressed because one or more lines are too long

36
Doc/ReadMe.txt

@ -110,7 +110,6 @@ QP/M 2.7 Features and Facilities ("qcp27.pdf")
Official documentation set for QP/M 2.7 from original QP/M distribution. Official documentation set for QP/M 2.7 from original QP/M distribution.
SIO+CTC Baud Rate Options (SIO+CTC Baud Rate Options.pdf) SIO+CTC Baud Rate Options (SIO+CTC Baud Rate Options.pdf)
--------------------------------------------------------- ---------------------------------------------------------
@ -133,4 +132,37 @@ UCSD p-System Users Manual ("UCSD p-System Users Manual.pdf")
Official user manual for p-System operating system included with Official user manual for p-System operating system included with
RomWBW. RomWBW.
--WBW 5:18 PM 3/16/2023
Z80 Assembler User Manual (z80asm (SLR Systems).pdf)
----------------------------------------------------
Official user manual for the Z80 Macro Assembler by SLR Systems
included in the z80asm disk image.
HI-TECH C Compiler User Manual (HI-TECH Z80 C Compiler Manual.txt)
------------------------------------------------------------------
Official user manual for the HI-TECH C Compiler included in the
hitechc disk image.
Borland TurboPascal User Manual (Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf)
------------------------------------------------------------------------------------
Official user manual Borland TurboPascal included in the pascal disk image.
Aztec C Compiler User Manual (Aztec_C_1.06_User_Manual_Mar84.pdf)
-----------------------------------------------------------------
Official user manual for the Aztec C Compiler included in the aztecc disk image.
FORTRAN-80 User Manual (Microsoft_FORTRAN-80_Users_Manual_1977.pdf)
---------------------------------------------------------------
Official user manual for Microsoft's FORTRAN-80 compiler included in the fortran
disk image.
--WBW 5:18 PM 6/14/2023

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Errata.pdf

Binary file not shown.

BIN
Doc/RomWBW ROM Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

49495
Doc/Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf

File diff suppressed because one or more lines are too long

BIN
Doc/Z180 ASCI Baud Rate Options.pdf

Binary file not shown.

BIN
Doc/z80asm (SLR Systems).pdf

Binary file not shown.

18
Makefile

@ -1,5 +1,14 @@
all:
.PHONY: tools source clean clobber diff dist
.ONESHELL:
.SHELLFLAGS = -cex
all: tools source
tools:
$(MAKE) --directory Tools $(MAKE) --directory Tools
source:
$(MAKE) --directory Source $(MAKE) --directory Source
clean: clean:
@ -14,6 +23,9 @@ diff:
$(MAKE) --directory Source diff $(MAKE) --directory Source diff
dist: dist:
$(MAKE) ROM_PLATFORM=dist 2>&1 | tee make.log
$(MAKE) --directory Source clean
$(MAKE) ROM_PLATFORM=dist
$(MAKE) --directory Tools clean $(MAKE) --directory Tools clean
$(MAKE) --directory Source clean
distlog:
$(MAKE) dist 2>&1 | tee make.log

86
ReadMe.md

@ -1,9 +1,9 @@
**RomWBW ReadMe** \ **RomWBW ReadMe** \
Version 3.2.1 \
Version 3.4 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
07 Apr 2023
30 Dec 2023
# Overview # Overview
@ -14,15 +14,24 @@ platforms are supported including those produced by these developer
communities: communities:
- [RetroBrew Computers](https://www.retrobrewcomputers.org) - [RetroBrew Computers](https://www.retrobrewcomputers.org)
- [RC2014](https://rc2014.co.uk),
(<https://www.retrobrewcomputers.org>)
- [RC2014](https://rc2014.co.uk) (<https://rc2014.co.uk>),
[RC2014-Z80](https://groups.google.com/g/rc2014-z80) [RC2014-Z80](https://groups.google.com/g/rc2014-z80)
- [retro-comp](https://groups.google.com/forum/#!forum/retro-comp)
(<https://groups.google.com/g/rc2014-z80>)
- [Retro Computing](https://groups.google.com/g/retro-comp)
(<https://groups.google.com/g/retro-comp>)
- [Small Computer Central](https://smallcomputercentral.com/) - [Small Computer Central](https://smallcomputercentral.com/)
(<https://smallcomputercentral.com/>)
A complete list of the currently supported platforms is found in the
\[Installation\] section.
General features include: General features include:
- Z80 Family CPUs including Z80, Z180, and Z280
- Banked memory services for several banking designs - Banked memory services for several banking designs
- Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD
- Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip,
Iomega
- Serial drivers including UART (16550-like), ASCI, ACIA, SIO - Serial drivers including UART (16550-like), ASCI, ACIA, SIO
- Video drivers including TMS9918, SY6545, MOS8563, HD6445 - Video drivers including TMS9918, SY6545, MOS8563, HD6445
- Keyboard (PS/2) drivers via VT8242 or PPI interfaces - Keyboard (PS/2) drivers via VT8242 or PPI interfaces
@ -42,11 +51,11 @@ ROM firmware itself:
A dynamic disk drive letter assignment mechanism allows mapping A dynamic disk drive letter assignment mechanism allows mapping
operating system drive letters to any available disk media. operating system drive letters to any available disk media.
Additionally, mass storage devices (IDE Disk, CF Card, SD Card) 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.
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.
The pre-built ROM firmware images are generally suitable for most users. 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 However, it is also very easy to modify and build custom ROM images that
@ -66,7 +75,7 @@ changing media.
By design, RomWBW isolates all of the hardware specific functions in the By design, RomWBW isolates all of the hardware specific functions in the
ROM chip itself. The ROM provides a hardware abstraction layer such that 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 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
RomWBW-based system. To put it simply, you can take a disk (or CF/SD/USB
Card) and move it between systems transparently. Card) and move it between systems transparently.
A tool is provided that allows you to access a FAT-12/16/32 filesystem. A tool is provided that allows you to access a FAT-12/16/32 filesystem.
@ -76,18 +85,19 @@ OSes such as Windows, MacOS, and Linux very easy.
# Acquiring RomWBW # Acquiring RomWBW
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.
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
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.
All source code and distributions are maintained on GitHub. Code All source code and distributions are maintained on GitHub. Code
contributions are very welcome. contributions are very welcome.
@ -183,6 +193,36 @@ let me know if I missed you!
- 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.
- Martin R has provided substantial help reviewing and improving the
User Guide.
- Jacques Pelletier has contributed the DS1501 RTC driver code.
- Jose Collado has contributed enhancements to the TMS driver including
compatibility with standard TMS register configuration.
- Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
- Matt Carroll has contributed a fix to XM.COM that corrects the port
specification when doing a send.
- Dean Jenkins enhanced the build process to accommodate the Raspberry
Pi 4.
- Tom Plano has contributed a new utility (HTALK) to allow talking
directly to HBIOS COM ports.
- Lars Nelson has contributed several generic utilities such as a
universal (OS agnostic) UNARC application.
- Dylan Hall added support for specifying a secondary console.
- Bill Shen has contributed boot loaders for several of his systems.
Contributions of all kinds to RomWBW are very welcome. Contributions of all kinds to RomWBW are very welcome.
# Licensing # Licensing

83
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com) Wayne Warthen (wwarthen@gmail.com)
07 Apr 2023
30 Dec 2023
@ -13,15 +13,21 @@ Z80/180/280 retro-computing hardware systems. A wide variety of
platforms are supported including those produced by these developer platforms are supported including those produced by these developer
communities: communities:
- RetroBrew Computers
- RC2014, RC2014-Z80
- retro-comp
- Small Computer Central
- RetroBrew Computers (https://www.retrobrewcomputers.org)
- RC2014 (https://rc2014.co.uk),
RC2014-Z80 (https://groups.google.com/g/rc2014-z80)
- Retro Computing (https://groups.google.com/g/retro-comp)
- Small Computer Central (https://smallcomputercentral.com/)
A complete list of the currently supported platforms is found in the
[Installation] section.
General features include: General features include:
- Z80 Family CPUs including Z80, Z180, and Z280
- Banked memory services for several banking designs - Banked memory services for several banking designs
- Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD
- Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip,
Iomega
- Serial drivers including UART (16550-like), ASCI, ACIA, SIO - Serial drivers including UART (16550-like), ASCI, ACIA, SIO
- Video drivers including TMS9918, SY6545, MOS8563, HD6445 - Video drivers including TMS9918, SY6545, MOS8563, HD6445
- Keyboard (PS/2) drivers via VT8242 or PPI interfaces - Keyboard (PS/2) drivers via VT8242 or PPI interfaces
@ -41,11 +47,11 @@ ROM firmware itself:
A dynamic disk drive letter assignment mechanism allows mapping A dynamic disk drive letter assignment mechanism allows mapping
operating system drive letters to any available disk media. operating system drive letters to any available disk media.
Additionally, mass storage devices (IDE Disk, CF Card, SD Card) 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.
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.
The pre-built ROM firmware images are generally suitable for most users. 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 However, it is also very easy to modify and build custom ROM images that
@ -65,7 +71,7 @@ changing media.
By design, RomWBW isolates all of the hardware specific functions in the By design, RomWBW isolates all of the hardware specific functions in the
ROM chip itself. The ROM provides a hardware abstraction layer such that 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 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
RomWBW-based system. To put it simply, you can take a disk (or CF/SD/USB
Card) and move it between systems transparently. Card) and move it between systems transparently.
A tool is provided that allows you to access a FAT-12/16/32 filesystem. A tool is provided that allows you to access a FAT-12/16/32 filesystem.
@ -78,16 +84,18 @@ OSes such as Windows, MacOS, and Linux very easy.
ACQUIRING ROMWBW ACQUIRING ROMWBW
The RomWBW Repository 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 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.
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.
All source code and distributions are maintained on GitHub. Code All source code and distributions are maintained on GitHub. Code
contributions are very welcome. contributions are very welcome.
@ -185,6 +193,37 @@ let me know if I missed you!
- 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.
- Martin R has provided substantial help reviewing and improving the
User Guide.
- Jacques Pelletier has contributed the DS1501 RTC driver code.
- Jose Collado has contributed enhancements to the TMS driver
including compatibility with standard TMS register configuration.
- Kevin Boone has contributed a generic HBIOS date/time utility
(WDATE).
- Matt Carroll has contributed a fix to XM.COM that corrects the port
specification when doing a send.
- Dean Jenkins enhanced the build process to accommodate the Raspberry
Pi 4.
- Tom Plano has contributed a new utility (HTALK) to allow talking
directly to HBIOS COM ports.
- Lars Nelson has contributed several generic utilities such as a
universal (OS agnostic) UNARC application.
- Dylan Hall added support for specifying a secondary console.
- Bill Shen has contributed boot loaders for several of his systems.
Contributions of all kinds to RomWBW are very welcome. Contributions of all kinds to RomWBW are very welcome.

6
Source/Apps/Build.cmd

@ -1,13 +1,10 @@
@echo off @echo off
setlocal setlocal
set TOOLS=../../Tools
set TOOLS=..\..\Tools
set APPBIN=..\..\Binary\Apps set APPBIN=..\..\Binary\Apps
set PATH=%TOOLS%\tasm32;%TOOLS%\zxcc;%PATH% set PATH=%TOOLS%\tasm32;%TOOLS%\zxcc;%PATH%
set TASMTABS=%TOOLS%\tasm32 set TASMTABS=%TOOLS%\tasm32
set CPMDIR80=%TOOLS%/cpm/ set CPMDIR80=%TOOLS%/cpm/
call :asm syscopy || exit /b call :asm syscopy || exit /b
@ -32,6 +29,7 @@ pushd Dev && call Build || exit /b & popd
pushd VGM && call Build || exit /b & popd pushd VGM && call Build || exit /b & popd
pushd cpuspd && call Build || exit /b & popd pushd cpuspd && call Build || exit /b & popd
pushd Survey && call Build || exit /b & popd pushd Survey && call Build || exit /b & popd
pushd HTalk && call Build || exit /b & popd
copy *.com %APPBIN%\ || exit /b copy *.com %APPBIN%\ || exit /b

1
Source/Apps/Clean.cmd

@ -18,3 +18,4 @@ pushd Dev && call Clean || exit /b 1 & popd
pushd VGM && call Clean || exit /b 1 & popd pushd VGM && call Clean || exit /b 1 & popd
pushd cpuspd && call Clean || exit /b 1 & popd pushd cpuspd && call Clean || exit /b 1 & popd
pushd Survey && call Clean || exit /b 1 & popd pushd Survey && call Clean || exit /b 1 & popd
pushd HTalk && call Clean || exit /b 1 & popd

3
Source/Apps/FAT/ReadMe.txt

@ -1,7 +1,7 @@
RomWBW HBIOS CP/M FAT Utility ("FAT.COM") RomWBW HBIOS CP/M FAT Utility ("FAT.COM")
Author: Wayne Warthen Author: Wayne Warthen
Updated: 12-Apr-2021
Updated: 12-Oct-2023
Application to manipulate and exchange files with a FAT (DOS) Application to manipulate and exchange files with a FAT (DOS)
filesystem. Runs on any HBIOS hosted CP/M implementation. filesystem. Runs on any HBIOS hosted CP/M implementation.
@ -101,4 +101,5 @@ HISTORY:
11-Oct-2019: v0.9.7 (beta) fix FORMAT to use existing partition table entries 11-Oct-2019: v0.9.7 (beta) fix FORMAT to use existing partition table entries
add attributes to directory listing add attributes to directory listing
12-Apr-2021: v0.9.8 (beta) support CP/NET drives 12-Apr-2021: v0.9.8 (beta) support CP/NET drives
12-Oct-2023: v0.9.9 (beta) handle updated HBIOS Disk Device call

BIN
Source/Apps/FAT/fat.com

Binary file not shown.

45
Source/Apps/FDU/fdu.asm

@ -48,7 +48,8 @@
; 2020-04-29: v5.5 ADDED SUPPORT FOR ETCHED PIXELS FDC ; 2020-04-29: v5.5 ADDED SUPPORT FOR ETCHED PIXELS FDC
; 2020-12-12: v5.6 UPDATED SMALLZ80 TO NEW I/O ADDRESSES ; 2020-12-12: v5.6 UPDATED SMALLZ80 TO NEW I/O ADDRESSES
; 2021-03-24: v5.7 ADDED SOME SINGLE-SIDED FORMATS ; 2021-03-24: v5.7 ADDED SOME SINGLE-SIDED FORMATS
; 2021-07-26: v5.8 ADDED SUPPORT MBC FDC
; 2021-07-26: v5.8 ADDED SUPPORT FOR NHYODYNE (MBC) FDC
; 2023-12-10: v5.9 ADDED SUPPORT FOR DUODYNE (DUO) FDC
; ;
;_______________________________________________________________________________ ;_______________________________________________________________________________
; ;
@ -85,6 +86,7 @@ FDC_SMZ80 .EQU 8
FDC_DYNO .EQU 9 FDC_DYNO .EQU 9
FDC_EPFDC .EQU 10 FDC_EPFDC .EQU 10
FDC_MBC .EQU 11 FDC_MBC .EQU 11
FDC_DUO .EQU 12
; ;
; FDC MODE ; FDC MODE
; ;
@ -219,8 +221,8 @@ INIT5:
XOR A XOR A
RET RET
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.8, 26-Jul-2021$"
STR_BANNER2 .DB "Copyright (C) 2021, Wayne Warthen, GNU GPL v3","$"
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.9, 10-Dec-2023$"
STR_BANNER2 .DB "Copyright (C) 2023, Wayne Warthen, GNU GPL v3","$"
STR_HBIOS .DB " [HBIOS]$" STR_HBIOS .DB " [HBIOS]$"
STR_UBIOS .DB " [UBIOS]$" STR_UBIOS .DB " [UBIOS]$"
; ;
@ -292,6 +294,7 @@ FDCTBL: ; LABEL CONFIG DATA
.DW STR_DYNO, CFG_DYNO .DW STR_DYNO, CFG_DYNO
.DW STR_EPFDC, CFG_EPFDC .DW STR_EPFDC, CFG_EPFDC
.DW STR_MBC, CFG_MBC .DW STR_MBC, CFG_MBC
.DW STR_DUO, CFG_DUO
FDCCNT .EQU ($-FDCTBL)/4 ; FD CONTROLLER COUNT FDCCNT .EQU ($-FDCTBL)/4 ; FD CONTROLLER COUNT
; ;
; FDC LABEL STRINGS ; FDC LABEL STRINGS
@ -307,7 +310,8 @@ STR_RCWDC .TEXT "RC-WDC$"
STR_SMZ80 .TEXT "SMZ80$" STR_SMZ80 .TEXT "SMZ80$"
STR_DYNO .TEXT "DYNO$" STR_DYNO .TEXT "DYNO$"
STR_EPFDC .TEXT "EPFDC$" STR_EPFDC .TEXT "EPFDC$"
STR_MBC .TEXT "MBC$"
STR_MBC .TEXT "NHYODYNE$"
STR_DUO .TEXT "DUODYNE$"
; ;
; FDC CONFIGURATION BLOCKS ; FDC CONFIGURATION BLOCKS
; ;
@ -448,7 +452,18 @@ CFG_MBC:
.DB 035H ; CONFIGURATION CONTROL REGISTER .DB 035H ; CONFIGURATION CONTROL REGISTER
.DB 036H ; DACK (WHEN READ) .DB 036H ; DACK (WHEN READ)
.DB 037H ; TERMINAL COUNT (W/ DACK) .DB 037H ; TERMINAL COUNT (W/ DACK)
.DB 0FFH ; NOT USED BY ZETA SBC V2
.DB 0FFH ; NOT USED
.DB _PCAT ; MODE=
;
CFG_DUO:
.DB 080H ; FDC MAIN STATUS REGISTER
.DB 081H ; FDC DATA PORT
.DB 0FFH ; DATA INPUT REGISTER
.DB 086H ; DIGITAL OUTPUT REGISTER (WHEN WRITTEN)
.DB 085H ; CONFIGURATION CONTROL REGISTER
.DB 086H ; DACK (WHEN READ)
.DB 087H ; TERMINAL COUNT (W/ DACK)
.DB 0FFH ; NOT USED
.DB _PCAT ; MODE= .DB _PCAT ; MODE=
; ;
FDCID .DB 0 ; FDC IDENTIFIER (0 INDEXED) FDCID .DB 0 ; FDC IDENTIFIER (0 INDEXED)
@ -470,7 +485,8 @@ FSS_MENU:
.TEXT " (I) SmallZ80 Expansion\r\n" .TEXT " (I) SmallZ80 Expansion\r\n"
.TEXT " (J) Dyno-Card FDC, D1030\r\n" .TEXT " (J) Dyno-Card FDC, D1030\r\n"
.TEXT " (K) RCBus EPFDC\r\n" .TEXT " (K) RCBus EPFDC\r\n"
.TEXT " (L) Multi-Board Computer FDC\r\n"
.TEXT " (L) Nhyodyne FDC\r\n"
.TEXT " (M) Duodyne FDC\r\n"
.TEXT " (X) Exit\r\n" .TEXT " (X) Exit\r\n"
.TEXT "=== OPTION ===> $\r\n" .TEXT "=== OPTION ===> $\r\n"
; ;
@ -1561,6 +1577,7 @@ MD_MAP:
.DB %00000001 ; DYNO POLL .DB %00000001 ; DYNO POLL
.DB %00000001 ; EPFDC POLL .DB %00000001 ; EPFDC POLL
.DB %00000001 ; MBC POLL .DB %00000001 ; MBC POLL
.DB %00000001 ; DUO POLL
; ;
; MEDIA DESCRIPTION BLOCK ; MEDIA DESCRIPTION BLOCK
; ;
@ -2021,7 +2038,7 @@ FM_DRAW0B: ; ZETA, DIO3
LD A,(FST_DOR) LD A,(FST_DOR)
AND 00000010B AND 00000010B
JR FM_DRAW1 JR FM_DRAW1
FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
LD A,(FST_DOR) LD A,(FST_DOR)
AND 11110000B AND 11110000B
JR FM_DRAW1 JR FM_DRAW1
@ -2174,7 +2191,7 @@ FM_MOTOR0B: ; ZETA, DIO3
LD A,(FST_DOR) LD A,(FST_DOR)
AND 00000010B AND 00000010B
JR FM_MOTOR1 JR FM_MOTOR1
FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
LD A,(FST_DOR) LD A,(FST_DOR)
AND 11110000B AND 11110000B
JR FM_MOTOR1 JR FM_MOTOR1
@ -2913,7 +2930,7 @@ FC_INIT1: ; DIO
FC_INIT2: ; ZETA, DIO3 FC_INIT2: ; ZETA, DIO3
LD A,(FCD_DORB) LD A,(FCD_DORB)
JR FC_INIT5 JR FC_INIT5
FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
LD A,(FCD_DORC) LD A,(FCD_DORC)
JR FC_INIT5 JR FC_INIT5
FC_INIT4: ; WDSMC FC_INIT4: ; WDSMC
@ -2957,7 +2974,7 @@ FC_RESETFDC1: ; ZETA, DIO3, RCSMC
POP AF POP AF
OUT (C),A OUT (C),A
JR FC_RESETFDC3 JR FC_RESETFDC3
FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
LD A,0 LD A,0
OUT (C),A OUT (C),A
LD A,(FST_DOR) LD A,(FST_DOR)
@ -2984,7 +3001,7 @@ FC_PULSETC:
;RES 0,A ;RES 0,A
;OUT (C),A ;OUT (C),A
;JR FC_PULSETC2 ;JR FC_PULSETC2
;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
;LD C,(IY+CFG_TC) ;LD C,(IY+CFG_TC)
;IN A,(C) ;IN A,(C)
;JR FC_PULSETC2 ;JR FC_PULSETC2
@ -3016,7 +3033,7 @@ FC_MOTORON2: ; ZETA, DIO3
LD HL,FST_DOR ; POINT TO FDC_DOR LD HL,FST_DOR ; POINT TO FDC_DOR
SET 1,(HL) SET 1,(HL)
JR FC_MOTORON5 JR FC_MOTORON5
FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
LD HL,FST_DOR ; POINT TO FDC_DOR LD HL,FST_DOR ; POINT TO FDC_DOR
LD A,(HL) ; START WITH CURRENT DOR LD A,(HL) ; START WITH CURRENT DOR
AND 11111100B ; GET RID OF ANY ACTIVE DS BITS AND 11111100B ; GET RID OF ANY ACTIVE DS BITS
@ -3080,7 +3097,7 @@ FC_MOTOROFF2: ; ZETA, DIO3
LD HL,FST_DOR ; POINT TO FDC_DOR LD HL,FST_DOR ; POINT TO FDC_DOR
RES 1,(HL) RES 1,(HL)
JR FC_MOTOROFF5 JR FC_MOTOROFF5
FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC
FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO
LD HL,FST_DOR ; POINT TO FDC_DOR LD HL,FST_DOR ; POINT TO FDC_DOR
LD A,DORC_INIT LD A,DORC_INIT
LD (HL),A LD (HL),A
@ -3950,7 +3967,7 @@ DORB_BR500 .EQU 10100000B ; 500KBPS
; ;
DORB_INIT .EQU DORB_BR250 DORB_INIT .EQU DORB_BR250
; ;
; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC/MBC ***
; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC/MBC/DUO ***
; ;
DORC_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED DORC_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED
; ;

32
Source/Apps/FDU/fdu.doc

@ -1,14 +1,15 @@
================================================================ ================================================================
Floppy Disk Utility (FDU) v5.3 for RetroBrew Computers
Disk IO / Zeta / Dual-IDE / N8 / RCBus / SmallZ80 / Dyno
Floppy Disk Utility (FDU) v5.9 for RetroBrew Computers
Disk IO / Zeta / Dual-IDE / N8 / RCBus / SmallZ80 / Dyno / Nhyodyne / Duodyne
================================================================ ================================================================
Updated January 5, 2020
Updated December 12, 2023
by Wayne Warthen (wwarthen@gmail.com) by Wayne Warthen (wwarthen@gmail.com)
Application to test the hardware functionality of the Floppy Application to test the hardware functionality of the Floppy
Disk Controller (FDC) on the ECB DISK I/O, DISK I/O V3, ZETA Disk Controller (FDC) on the ECB DISK I/O, DISK I/O V3, ZETA
SBC, Dual IDE w/ Floppy, or N8 board.
SBC, Dual IDE w/ Floppy, N8, RCBus, SmallZ80, Dyno, Nhyodyne,
Duodyne systems.
The intent is to provide a testbed that allows direct testing The intent is to provide a testbed that allows direct testing
of all possible media types and modes of access. The of all possible media types and modes of access. The
@ -77,9 +78,10 @@ supported:
- RCBus - RCBus
- SmallZ80 - SmallZ80
- Dyno - Dyno
- MBC
- Nhyodyne (MBC)
- Duodyne (DUO)
You must be using either a RomWBW or UBA based OS version.
You must be using either a RomWBW or UNA based OS version.
You must have one of the following floppy disk controllers: You must have one of the following floppy disk controllers:
@ -93,7 +95,8 @@ You must have one of the following floppy disk controllers:
- RCBus Scott Baker WDC-based Floppy Module - RCBus Scott Baker WDC-based Floppy Module
- SmallZ80 FDC - SmallZ80 FDC
- Dyno FDC - Dyno FDC
- MBC FDC
- Nhyodyne (MBC) FDC
- Duodyne (DUO) FDC
Finally, you will need a floppy drive connected via an Finally, you will need a floppy drive connected via an
appropriate cable: appropriate cable:
@ -153,7 +156,8 @@ JP2 (/FAULT) shorted, JP3 (MINI): 2-3, JP4 (/DC/RDY): 2-3.
The RCBus Scott Baker WDC-based floppy module should be jumpered The RCBus Scott Baker WDC-based floppy module should be jumpered
for I/O base address 0x50 (SV1: 11-12), JP1 (/DACK): 1-2, for I/O base address 0x50 (SV1: 11-12), JP1 (/DACK): 1-2,
JP2 (TC): 2-3.
JP2 (TC): 2-3. Note that pin 1 of JPX jumpers is toward the bottom
of the board.
The RCBus FDC by Alan Cox (Etched Pixels) needs to be strapped The RCBus FDC by Alan Cox (Etched Pixels) needs to be strapped
for base I/O address 0x48. for base I/O address 0x48.
@ -164,8 +168,11 @@ hardwired I/O ranges are assumed in the code.
Dyno does not have any relevant jumper settings. The Dyno does not have any relevant jumper settings. The
hardwired I/O ranges are assumed in the code. hardwired I/O ranges are assumed in the code.
The MBC FDC is expected to be strapped to use neither INT nor NMI. It
is also not expected to use DMA.
The Nhyodyne (MBC) FDC is expected to be strapped to use neither INT
nor NMI. It is also not expected to use DMA.
The Duodyne (DUO) FDC is expected to be strapped to use neither INT
nor NMI. It is also not expected to use DMA.
Modes of Operation Modes of Operation
------------------ ------------------
@ -532,4 +539,7 @@ WW 3/24/2021: v5.7
- Added support for a few single-sided formats - Added support for a few single-sided formats
WW 7/26/2021: v5.8 WW 7/26/2021: v5.8
- Added support for MBC FDC
- Added support for Nhyodyne (MBC) FDC
WW 12/10/2023: v5.9
- Added support for Duodyne (DUO) FDC

14
Source/Apps/HTalk/Build.cmd

@ -0,0 +1,14 @@
@echo off
setlocal
set TOOLS=../../../Tools
set PATH=%TOOLS%\tasm32;%PATH%
set TASMTABS=%TOOLS%\tasm32
echo Building HTalk...
tasm -t80 -g3 -fFF htalk.asm htalk.com %htalk.lst || exit /b
copy /Y htalk.com ..\..\..\Binary\Apps\ || exit /b
rem copy /Y *.ovr ..\..\..\Binary\Apps\ || exit /b
rem copy /Y *.hlp ..\..\..\Binary\Apps\ || exit /b
rem copy /Y *.doc ..\..\..\Binary\Apps\ || exit /b

5
Source/Apps/HTalk/Clean.cmd

@ -0,0 +1,5 @@
@echo off
setlocal
if exist *.com del *.com
if exist *.lst del *.lst

10
Source/Apps/HTalk/Makefile

@ -0,0 +1,10 @@
OBJECTS = htalk.com
#DOCS = htalk.txt
DEST = ../../../Binary/Apps
DOCDEST = ../../../Binary/Apps
TOOLS = ../../../Tools
include $(TOOLS)/Makefile.inc
%.com: USETASM=1

725
Source/Apps/HTalk/htalk.asm

@ -0,0 +1,725 @@
;===============================================================================
;HTALK - BARE MINIMUM TERMINAL INTERFACE
;
; CONSOLE TALKS TO ARBITRARY CHARACTER DEVICE.
;===============================================================================
;
; AUTHOR: TOM PLANO (TOMPLANO@PROTON.ME)
;
; USAGE:
; HTALK $<CHAR_DEVICE_NUM>
;
;_______________________________________________________________________________
;
; CHANGE LOG:
; I'VE NOTATED SECTIONS OF CODE THAT ARNT REQUIRED IF THIS APP IS
; INCORPORATED INTO DBGMOD WITH A <OPT> TAG
;
;_______________________________________________________________________________
;
; TODO:
; SEE ENUM_DEV1 TODO
;
;
;_______________________________________________________________________________
;
;===============================================================================
; DEFINITIONS
;===============================================================================
;
STKSIZ .EQU $FF
;
; HBIOS SYSTEM CALLS AND ID STRING ADDRESS
;
ROMWBW_ID .EQU $FFFE ; ROMWBW ID STRING ADDRESS
HBIOS_SYS .EQU $FFF0 ; HBIOS SYSCALL ADDRESS
H_SYSGET .EQU $F8 ; GET SYSTEM INFO
H_CIOCNT .EQU $00 ; GET CHAR DEV COUNT SUBFUNCTION
BF_CIOIN .EQU $00 ; HBIOS CHAR INPUT
BF_CIOOUT .EQU $01 ; HBIOS CHAR OUTPUT
BF_CIOIST .EQU $02 ; HBIOS CHAR INPUT STATUS
BF_CIOOST .EQU $03 ; HBIOS CHAR OUTPUT STATUS
BF_CIOINIT .EQU $04 ; HBIOS CHAR I/O INIT
BF_CIOQUERY .EQU $05 ; HBIOS CHAR I/O QUERY
BF_CIODEVICE .EQU $06 ; HBIOS CHAR I/O DEVICE
;
; SUPPORTED HBIOS CIO DEVICE TYPES
;
CIODEV_UART .EQU $00 ; 16C550 FAMILY SERIAL INTERFACE UART.ASM
CIODEV_ASCI .EQU $10 ; Z180 BUILT-IN SERIAL PORTS ASCI.ASM
CIODEV_TERM .EQU $20 ; TERMINAL ANSI.ASM
CIODEV_PRPCON .EQU $30 ; PROPIO SERIAL CONSOLE INTERFACE PRP.ASM
CIODEV_PPPCON .EQU $40 ; PARPORTPROP SERIAL CONSOLE INTERFACE PPP.ASM
CIODEV_SIO .EQU $50 ; ZILOG SERIAL PORT INTERFACE SIO.ASM
CIODEV_ACIA .EQU $60 ; MC68B50 ASYNCHRONOUS INTERFACE ACIA.ASM
CIODEV_PIO .EQU $70 ; ZILOG PARALLEL INTERFACE CONTROLLER PIO.ASM
CIODEV_UF .EQU $80 ; FT232H-BASED ECB USB FIFO UF.ASM
CIODEV_DUART .EQU $90 ; SCC2681 FAMILY DUAL UART DUART.ASM
CIODEV_Z2U .EQU $A0 ; ZILOG Z280 BUILT-IN SERIAL PORTS Z2U.ASM
CIODEV_LPT .EQU $B0 ; PARALLEL I/O CONTROLLER LPT.ASM
; HBIOS CURRENT CONSOLE NUMBER
CIO_CONSOLE .EQU $80
; SPECIAL CHARS
CTRLC .EQU $03
CHR_BEL .EQU $07
CHR_CR .EQU $0D
CHR_LF .EQU $0A
CHR_BS .EQU $08
CHR_ESC .EQU $1B
CHR_DEL .EQU $7F
;
;===============================================================================
; BEGIN MAIN PROGRAM
;===============================================================================
;
.ORG $0100
;
; SETUP STACK (SAVE OLD VALUE)
; <OPT> HANDLED BY DBGMON
LD (STKSAV),SP
LD SP,STACK
;
; INITIALIZATION + STARTUP MESSAGE + HBIOS DETECT
; <OPT> HANDLED BY DBGMON
CALL INIT_PROG
JP NZ,EXIT
;
; LIST HBIOS DEV OPTIONS FOR REFERENCE
; ALSO GETS MAX CONN
;
; <OPT> THIS IS OPTIONAL BECAUSE IF A CHAR DEVICE DOESNT EXIST, WE NEVER READ OR
; WRITE TO IT, WE SIMPLY CALL CIOIST AND CIOOST OVER AND OVER ON IT, WITHOUT
; EVER PUSHING DATA TO IT
CALL ENUM_DEV
JP NZ,EXIT
;
; PARSE COMMAND LINE
;
CALL PARSE
JP NZ,EXIT
;
; RUN CONVERSTION WITH CHAR DEVICE
;
CALL TALK
;
; DONE
JP EXIT
;
; CLEAN UP AND RETURN TO CALLING PROCESS
;
EXIT:
CALL NEWLINE ; ...
LD HL,STR_EXITMSG ; LOAD EXIT STRING
CALL PRTSTR ; PRINT IT
CALL NEWLINE ; ...
LD SP,(STKSAV) ; RESET STACK
RET ; RETURN TO CALLER
;
;===============================================================================
; END MAIN PROGRAM
;===============================================================================
;
;
;===============================================================================
; BEGIN MAIN PROGRAM SUBROUTINES
;===============================================================================
;
INIT_PROG:
LD HL, STR_BANNER ; LOAD WELCOME BANNER
CALL PRTSTR ; PRINT IT
CALL NEWLINE ; ...
LD HL,(ROMWBW_ID) ; GET FIRST BYTE OF ROMWBW MARKER
LD A,(HL) ; ... THROUGH HL
CP 'W' ; MATCH?
JP NZ,NOTHBIOS ; ABORT WITH INVALID CONFIG BLOCK
INC HL ; NEXT BYTE (MARKER BYTE 2)
LD A,(HL) ; LOAD IT
CP ~'W' ; MATCH?
JP NZ,NOTHBIOS ; ABORT WITH INVALID CONFIG BLOCK
LD HL,STR_HBIOS ; POINT TO HBIOS STR
CALL PRTSTR ; PRINT IT
CALL NEWLINE ; ...
RET
;
; HBOIS NOT DETECTED, BAIL OUT W/ ERROR
;
NOTHBIOS:
LD HL,STR_BIOERR ; LOAD HBIOS NOT FOUND STR
CALL PRTSTR ; PRINT IT
CALL NEWLINE ; ...
AND $FF ; SET FLAGS
RET
ENUM_DEV:
;
; CHAR COUNT HEADER
;
LD HL,STR_DEVS_FOUND
CALL PRTSTR
;
;GET COUNT OF CHAR UNITS
;
LD B,H_SYSGET ; LOAD SYSGET HBIOS FUNCTION
LD C,H_CIOCNT ; LOAD SYSGET CHAR DEV COUNT SUBFUNCTION
CALL HBIOS_SYS ; JUMP TO HBIOS
OR A ; SET FLAGS
JP NZ, EXIT ; JUMP TO EXIT ON FAILED
LD A,E ; NUM CHAR DEVICES NOW IN A
DEC A ; DEC NUM DEVICES TO BE 0 INDEXED
LD (CIODEV_CNT), A ; STORE BEFORE PRINT
LD (CIODEV_MAX), A ; STORE BEFORE PRINT
INC A ; RESTORE NUM DEVICES VALUE
CALL PRTHEX ; PRINT NUMBER OF UNITS FOUND
CALL NEWLINE ; ...
ENUM_DEV1:
LD IX, TGT_DEV
; TODO: H AND L DONT ALWAYS GET SET BY THE DRIVERS. FIND SOME WAY TO MASK
; THEM OUT IF THEY ARE THE SAME BEFORE AND AFTER THE CALL?
LD B, BF_CIODEVICE ; LOAD HBIOS FUNCTION TO QUERRY DEVICE INFO
LD HL, CIODEV_CNT ; REQUEST A CHAR DEVICE
LD C, (HL) ; ...
LD (IX), C ; REMEMBER WHAT DEVICE WE ASKED FOR BEFORE BE
CALL HBIOS_SYS ; EXECUTE HBIOS SUBROUTINE
OR A ; SET FLAGS
RET NZ ; RETURN FAILED
;
; STORE RESULTS OF HBOIS DEVICE QUERRY
;
LD A,C ; MOVE C TO A
LD (IX+1), A ; STORE A DEVICE ATTRIBUTES, SKIP FIRST ENTRY
LD A,D
LD (IX+2), A
LD A,E
LD (IX+3), A
LD A,H
LD (IX+4), A
LD A,L
LD (IX+5), A
;
; PRINT FORMATED DATA LOOP
;
LD B, $06 ; PRINT THE 5 ELEMENTS OF DEV_STR_TBL
LD HL,DEV_STR_TBL ; TABLE BASE PTR
PLOOP_BASE:
CALL PRTSTR ; PTRSTR INCREMENTS HL FOR US
LD A, (IX)
CALL PRTHEX
LD A, '|'
CALL COUT
INC IX
DJNZ PLOOP_BASE
CALL NEWLINE
LD A, (CIODEV_CNT)
DEC A
LD (CIODEV_CNT), A
JP P, ENUM_DEV1 ; JUMP WHILE CIODEV_CNT >=0
AND $00
RET
;
; RUN CONVERSTION WITH CHAR DEVICE
;
TALK:
;
; INIT PING PONG DEVICE POINTERS
;
LD IX, USER_CON ; LOAD VALUE AT ADDR USER_CON
LD A, (IX) ; LOAD VALUE AT ADDR USER_CON
LD (RF_DEV), A ; STORE TO ADDR RF_DEV
LD A, (IX+1) ; LOAD VALUE AT ADDR TARGET_CON
LD (WT_DEV), A ; STORE TO ADDR WT_DEV
;
; READ FROM RF_DEV -> WRITE TO WT_DEV
;
TALK_LOOP:
;
; CHECK FOR DATA ON RF_DEV
;
LD B,BF_CIOIST ; SET HBIOS FUNCTION TO RUN
LD HL, RF_DEV
LD C,(HL)
CALL HBIOS_SYS ; CHECK FOR CHAR PENDING ON INPUT BUFFER USING HBIOS
OR A ; SET FLAGS
JP Z,TALK_NEXT ; JUMP NO CHARACTERS READY
JP M,TALK_NEXT ; JUMP ERROR ON READ
;
; EXEC READ FROM RF_DEV
;
LD B,BF_CIOIN ; SET FUNCTION TO RUN
LD HL, RF_DEV
LD C,(HL) ; RETRIEVE CON_DEV_NUM TO READ/WRITE FROM ACTIVE CONSOLE
CALL HBIOS_SYS ; CHECK FOR CHAR PENDING USING HBIOS
LD A,E ; MOVE RESULT TO A
CP CTRLC ; CHECK FOR EXIT REQUEST (CTRL+C)
RET Z ; IF SO, BAIL OUT
PUSH AF ; SAVE THE CHAR WE READ
;
; CHECK FOR SPACE ON WT_DEV
;
LD B,BF_CIOOST ; SET HBIOS FUNCTION TO RUN
LD HL, WT_DEV
LD C,(HL)
CALL HBIOS_SYS ; CHECK FOR SPACE IN OUTPUT BUFFER USING HBIOS
OR A ; 0 OR 1 IS A VALID RETURN
JP Z,TALK_NEXT ; JUMP NO SPACE
JP M,TALK_NEXT ; JUMP ERROR ON WRITE
;
; EXEC WRITE TO WT_DEV
;
LD B,BF_CIOOUT ; SET HBIOS FUNCTION TO RUN
LD HL, WT_DEV
LD C,(HL) ; RETRIEVE TGT_DEV_NUM TO READ/WRITE FROM TARGET CHAR DEVICE
;
POP AF ; RECOVER THE CHARACTER
LD E,A ; MOVE CHARACTER TO E
CALL HBIOS_SYS ; WRITE CHAR USING HBIOS
TALK_NEXT:
;
; SWAP RF_DEV AND WT_DEV
;
LD IX, RF_DEV ; LOAD VALUE AT ADDR USER_CON
LD A, (IX) ; LOAD VALUE AT ADDR RF_DEV
LD B, (IX+1) ; LOAD VALUE AT ADDR WT_DEV
LD (IX+1), A ; STORE TO OLD RF_DEV TO ADDR WT_DEV
LD A, B ; MOVE OLD WT_DEV TO A
LD (IX), A ; STORE TO OLD WT_DEF TO ADDR RF_DEV
JP TALK_LOOP ; LOOP
;
;===============================================================================
; END MAIN PROGRAM SUBROUTINES
;===============================================================================
;
;
;===============================================================================
; BEGIN ROUTINES THAT ARE NOT COMPATIBLE WITH DBGMON
;===============================================================================
;
PARSE:
;
LD HL,$81 ; POINT TO START OF COMMAND TAIL (AFTER LENGTH BYTE)
CALL NONBLANK ; SKIP LEADING BLANKS,
CALL HEXBYTE
JP C,ERRHEXRD ; IF NOT, ERR
LD (TARGET_CON),A ; REQUESTED TARGET CONN
LD B,A ; MOVE TO B
LD HL,CIODEV_MAX ; GRAB MAX VALUE OF TARGETCON
LD A,(HL)
CP B ; CHECK IF B<=A
JP M, ERROOR ; IF B>A, and both are less then 80 then S SET, ERR
JP C, ERROOR ; IF B> 80 carry set instead (signed numbers problem)
; swap A and B
JP PE, ERROOR ; IF B>A, C SET, ERR
LD HL, MSGTALKING ; PRINT TARGET DEVICE
CALL PRTSTR
LD A, B ; RETRIEVE TARGET CON
CALL PRTHEX
CALL NEWLINE
AND $00
RET
;
;NOT COMPATIBLE WITH THE DBGMON FUNCTION OF THE SAME NAME
;
NONBLANK:
LD A,(HL) ; LOAD NEXT CHARACTER
OR A ; STRING ENDS WITH A NULL
RET Z ; IF NULL, RETURN POINTING TO NULL
CP ' ' ; CHECK FOR BLANK
RET NZ ; RETURN IF NOT BLANK
INC HL ; IF BLANK, INCREMENT CHARACTER POINTER
JR NONBLANK ; AND LOOP
;
;
;===============================================================================
; END ROUTINES THAT ARE NOT COMPATIBLE WITH DBGMON
;===============================================================================
;
;
;===============================================================================
; BEGIN ROUTINES THAT ARE LIFTED FROM DBGMON
;===============================================================================
;
;
; PRINT THE VALUE IN A IN HEX WITHOUT DESTROYING ANY REGISTERS
;
PRTHEX:
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 COUT ; PRINT IT
LD A,E ; GET THE LOW ORDER HEX CHAR
CALL COUT ; PRINT IT
POP DE ; RESTORE DE
RET ; DONE
;
; 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 $0F ; LOW NIBBLE ONLY
ADD A,$90
DAA
ADC A,$40
DAA
RET
;
;
; ADD THE VALUE IN A TO HL (HL := HL + A)
;
ADDHL:
ADD A,L ; A := A + L
LD L,A ; PUT RESULT BACK IN L
RET NC ; IF NO CARRY, WE ARE DONE
INC H ; IF CARRY, INCREMENT H
RET ; AND RETURN
;
;__________________________________________________________________________________________________
;
; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS
;
;__________________________________________________________________________________________________
;
PC_SPACE:
PUSH AF
LD A,' '
JR PC_PRTCHR
PC_COLON:
PUSH AF
LD A,':'
JR PC_PRTCHR
PC_CR:
PUSH AF
LD A,CHR_CR
JR PC_PRTCHR
PC_LF:
PUSH AF
LD A,CHR_LF
JR PC_PRTCHR
PC_PRTCHR:
CALL COUT
POP AF
RET
NEWLINE2:
CALL NEWLINE
NEWLINE:
CALL PC_CR
CALL PC_LF
RET
PRTSTR:
LD A,(HL)
INC HL
CP '$'
RET Z
CALL COUT
JR PRTSTR
;
;__COUT_______________________________________________________________________
;
; OUTPUT CHARACTER FROM A
;_____________________________________________________________________________
;
COUT:
; SAVE ALL INCOMING REGISTERS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
;
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS
LD E,A ; OUTPUT CHAR TO E
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C
LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR
CALL HBIOS_SYS ; HBIOS OUTPUTS CHARACTER
;
; RESTORE ALL REGISTERS
POP HL
POP DE
POP BC
POP AF
RET
;
;__CIN________________________________________________________________________
;
; INPUT CHARACTER TO A
;_____________________________________________________________________________
;
CIN:
; SAVE INCOMING REGISTERS (AF IS OUTPUT)
PUSH BC
PUSH DE
PUSH HL
;
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C
LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR
CALL HBIOS_SYS ; HBIOS READS CHARACTER
LD A,E ; MOVE CHARACTER TO A FOR RETURN
;
; RESTORE REGISTERS (AF IS OUTPUT)
POP HL
POP DE
POP BC
RET
;
;__CST________________________________________________________________________
;
; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING)
;_____________________________________________________________________________
;
CST:
; SAVE INCOMING REGISTERS (AF IS OUTPUT)
PUSH BC
PUSH DE
PUSH HL
;
; GET CONSOLE INPUT STATUS VIA HBIOS
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C
LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS
CALL HBIOS_SYS ; HBIOS RETURNS STATUS IN A
;
; RESTORE REGISTERS (AF IS OUTPUT)
POP HL
POP DE
POP BC
RET
;
;
;__ISHEX______________________________________________________________________
;
; CHECK BYTE AT (HL) FOR HEX CHAR, RET Z IF SO, ELSE NZ
;_____________________________________________________________________________
;
ISHEX:
LD A,(HL) ; CHAR TO AS
CP '0' ; < '0'?
JR C,ISHEX1 ; YES, NOT 0-9, CHECK A-F
CP '9' + 1 ; > '9'
JR NC,ISHEX1 ; YES, NOT 0-9, CHECK A-F
XOR A ; MUST BE 0-9, SET ZF
RET ; AND DONE
ISHEX1:
CP 'A' ; < 'A'?
JR C,ISHEX2 ; YES, NOT A-F, FAIL
CP 'F' + 1 ; > 'F'
JR NC,ISHEX2 ; YES, NOT A-F, FAIL
XOR A ; MUST BE A-F, SET ZF
RET ; AND DONE
ISHEX2:
OR $FF ; CLEAR ZF
RET ; AND DONE
;
;__HEXBYTE____________________________________________________________________
;
; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A
;_____________________________________________________________________________
;
HEXBYTE:
LD C,0 ; INIT WORKING VALUE
HEXBYTE1:
CALL ISHEX ; DO WE HAVE A HEX CHAR?
JR NZ,HEXBYTE3 ; IF NOT, WE ARE DONE
LD B,4 ; SHIFT WORKING VALUE (C := C * 16)
HEXBYTE2:
SLA C ; SHIFT ONE BIT
RET C ; RETURN W/ CF SET INDICATING OVERFLOW ERROR
DJNZ HEXBYTE2 ; LOOP FOR 4 BITS
CALL NIBL ; CONVERT HEX CHAR TO BINARY VALUE IN A & INC HL
OR C ; COMBINE WITH WORKING VALUE
LD C,A ; AND PUT BACK IN WORKING VALUE
JR HEXBYTE1 ; DO ANOTHER CHARACTER
HEXBYTE3:
LD A,C ; WORKING VALUE TO A
OR A ; CLEAR CARRY
RET
;
;__NIBL_______________________________________________________________________
;
; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A
;_____________________________________________________________________________
;
NIBL:
LD A,(HL) ; GET K B. DATA
INC HL ; INC KB POINTER
CP 40H ; TEST FOR ALPHA
JR NC,ALPH
AND 0FH ; GET THE BITS
RET
ALPH:
AND 0FH ; GET THE BITS
ADD A,09H ; MAKE IT HEX A-F
RET
;
;===============================================================================
; END ROUTINES THAT ARE LIFTED FROM DBGMON
;===============================================================================
;
;
;===============================================================================
; ERROR RESPONCES
;===============================================================================
;
ERROOR: ; REQUESTED DEV OUT OF RANGE (SYNTAX)
CALL NEWLINE
LD A, 'R'
CALL COUT
LD HL,TARGET_CON
LD A,(HL)
CALL PRTHEX
LD A, ':'
CALL COUT
LD A, 'M'
CALL COUT
LD HL,CIODEV_MAX
LD A,(HL)
CALL PRTHEX
LD HL,MSGOOR
JR ERROR
ERRHEXRD: ; COMMAND HEX READ ERROR (SYNTAX)
LD HL,MSGHEXRD
JR ERROR
ERRUSE: ; COMMAND USAGE ERROR (SYNTAX)
LD HL,MSGUSE
JR ERROR
ERRPRM: ; COMMAND PARAMETER ERROR (SYNTAX)
LD HL,MSGPRM
JR ERROR
ERROR: ; PRINT ERROR STRING AND RETURN ERROR SIGNAL
CALL NEWLINE ; PRINT NEWLINE
CALL PRTSTR ; PRINT ERROR STRING
OR $FF ; SIGNAL ERROR
RET ; DONE
;===============================================================================
; STORAGE SECTION
;===============================================================================
;
; CHAR DEV COUNT
CIODEV_CNT .DB $0
CIODEV_MAX .DB $0
;TALK LOOP DATA, DEFAULT TO LOOPBACK
USER_CON .DB $80
TARGET_CON .DB $80
; PING PONG POINTERS
RF_DEV .DB 0
WT_DEV .DB 0
; TARGET CHARACTER DEVICE DATA
TGT_DEV:
.DB 0 ; HBIOS CHAR NUM
.DB 0 ; C: DEVICE ATTRIBUTES
.DB 0 ; D: DEVICE TYPE
.DB 0 ; E: DEVICE NUMBER
.DB 0 ; H: DEVICE MODE
.DB 0 ; L: DEVICE I/O BASE ADDRESS
; STRING LITERALS
MSGUSE .TEXT "USAGE: HTALK <CIO_DEV_ID>$"
MSGPRM .TEXT "PARAMETER ERROR$"
MSGOOR .TEXT "CIO VAL TOO LARGE$"
MSGHEXRD .TEXT "HEX READ ERR$"
MSGTALKING .TEXT "CONNECTING TO CHAR:$"
DEV_STR_TBL:
.TEXT "CHAR:$"
.TEXT "ATTR:$"
.TEXT "TYPE:$"
.TEXT "NUMB:$"
.TEXT "MODE:$"
.TEXT "ADDR:$"
STR_DEVS_FOUND .TEXT "NUM CHAR DEVICES FOUND - $"
STR_EXITMSG .TEXT "HTALK DONE$"
STR_BANNER .TEXT "HTALK V1.0 (CTRL-C TO EXIT)$"
STR_HBIOS .TEXT "HBIOS DETECTED$"
STR_BIOERR .TEXT "*** UNKNOWN BIOS - BAILING OUT ***$"
STKSAV .DW 0 ; STACK POINTER SAVED AT START
.FILL STKSIZ,0 ; STACK
STACK .EQU $ ; STACK TOP
;
.END

2
Source/Apps/Makefile

@ -1,6 +1,6 @@
OBJECTS = sysgen.com syscopy.com assign.com format.com talk.com \ OBJECTS = sysgen.com syscopy.com assign.com format.com talk.com \
mode.com rtc.com timer.com rtchb.com mode.com rtc.com timer.com rtchb.com
SUBDIRS = XM FDU FAT Tune Test ZMP ZMD Dev VGM cpuspd Survey
SUBDIRS = HTalk XM FDU FAT Tune Test ZMP ZMD Dev VGM cpuspd Survey
DEST = ../../Binary/Apps DEST = ../../Binary/Apps
TOOLS =../../Tools TOOLS =../../Tools

131
Source/Apps/Test/DMAmon/dmamon.asm

@ -12,12 +12,26 @@ DMAMODE_Z180 .EQU 2 ; Z180 INTEGRATED DMA
DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA
DMAMODE_RC .EQU 4 ; RCBUS Z80 DMA DMAMODE_RC .EQU 4 ; RCBUS Z80 DMA
DMAMODE_MBC .EQU 5 ; MBC DMAMODE_MBC .EQU 5 ; MBC
DMAMODE_VDG .EQU 6 ; VELESOFT DATAGEAR
DMAMODE_DUO .EQU 6 ; DUO
DMAMODE_VDG .EQU 7 ; VELESOFT DATAGEAR
;
DMAMODE .EQU DMAMODE_DUO ; SELECT DMA DEVICE FOR TESTING
;
;==================================================================================================
; SOME DEFAULT PLATFORM CONFIGURATIONS
;==================================================================================================
; ;
DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_MBC ; SELECT DMA DEVICE FOR TESTING
DMALATCH .EQU DMABASE+1 ; DMA: DMA LATCH ADDRESS
DMAIOTST .EQU $68 ; AN OUTPUT PORT FOR TESTING - 16C450 SERIAL OUT DMAIOTST .EQU $68 ; AN OUTPUT PORT FOR TESTING - 16C450 SERIAL OUT
; ;
#IF (DMAMODE==DMAMODE_DUO)
DMABASE .SET $40 ; DMA: DMA0 BASE ADDRESS
DMALATCH .SET $43 ; DMA: DMA LATCH ADDRESS
DMAIOTST .SET $58 ; AN OUTPUT PORT FOR TESTING - 16C450 SERIAL OUT
;DMAIOTST .SET $94 ; AN ALT OUTPUT PORT FOR TESTING - RTC/SPEAKER/LEDS PORT
#ENDIF
;
;================================================================================================== ;==================================================================================================
; HELPER MACROS AND EQUATES ; HELPER MACROS AND EQUATES
;================================================================================================== ;==================================================================================================
@ -113,7 +127,7 @@ MAIN:
LD SP,STACK ; STACK LD SP,STACK ; STACK
; ;
call PRTSTRD ; WELCOME call PRTSTRD ; WELCOME
.db "\n\rDMA Monitor V3\n\r$"
.db "\n\rDMA Monitor V3.1\n\r$"
; ;
#IF (INTENABLE) #IF (INTENABLE)
; ;
@ -122,6 +136,8 @@ MAIN:
ld de,$A000 ld de,$A000
ld bc,hsiz ld bc,hsiz
ldir ldir
ld a,(dmaport)
ld (int_dmaport),a
; ;
; Install interrupt vector (RomWBW specific!!!) ; Install interrupt vector (RomWBW specific!!!)
ld hl,int ; pointer to my interrupt handler ld hl,int ; pointer to my interrupt handler
@ -156,17 +172,17 @@ MENULP1:
CP 'N' CP 'N'
JP Z,DMATST_N ; MEMORY COPY ITER JP Z,DMATST_N ; MEMORY COPY ITER
CP '0' CP '0'
JP Z,DMATST_01
JP Z,DMATST_0 ; PULSE DMA PORT
CP '1'
JP Z,DMATST_1 ; PULSE LATCH PORT
CP 'O' CP 'O'
JP Z,DMATST_O JP Z,DMATST_O
#IF !(DMAMODE==DMAMODE_VDG)
CP '1'
JP Z,DMATST_01
CP 'R' CP 'R'
JP Z,DMATST_R ; TOGGLE RESET JP Z,DMATST_R ; TOGGLE RESET
CP 'Y' CP 'Y'
JP Z,DMATST_Y ; TOGGLE READY
#ENDIF
JP Z,DMATST_Y
cp 'L'
jp z,DMACFG_L ; SET LATCH PORT
cp 'S' cp 'S'
jp z,DMACFG_S ; SET PORT jp z,DMACFG_S ; SET PORT
cp 'V' cp 'V'
@ -197,12 +213,20 @@ DMABYE:
; ;
DMACFG_S: DMACFG_S:
call PRTSTRD call PRTSTRD
.db "\n\rSet port address\n\rPort:$"
.db "\n\rSet DMA port address\n\rPort:$"
call HEXIN call HEXIN
ld hl,dmaport ld hl,dmaport
ld (hl),a ld (hl),a
inc hl
inc a
#IF (INTENABLE)
ld (int_dmaport),a
#ENDIF
jp MENULP
;
DMACFG_L:
call PRTSTRD
.db "\n\rSet Latch port address\n\rPort:$"
call HEXIN
ld hl,dmalach
ld (hl),a ld (hl),a
jp MENULP jp MENULP
; ;
@ -234,11 +258,17 @@ DMATST_N:
CALL DMAMemTestIter CALL DMAMemTestIter
JP MENULP JP MENULP
; ;
DMATST_01:
DMATST_0:
call PRTSTRD call PRTSTRD
.db "\n\rPerforming Port Selection Test\n\r$"
CALL DMA_Port01
JP MENULP
.db "\n\rPerforming DMA Port Selection Test\n\r$"
CALL DMA_Port0
ret
DMATST_1:
call PRTSTRD
.db "\n\rPerforming Latch Port Selection Test\n\r$"
CALL DMA_Port1
ret
; ;
DMATST_O: DMATST_O:
call PRTSTRD call PRTSTRD
@ -255,7 +285,7 @@ DMATST_D:
DMATST_Y: DMATST_Y:
call PRTSTRD call PRTSTRD
.db "\n\rPerforming Ready Bit Test\n\r$" .db "\n\rPerforming Ready Bit Test\n\r$"
CALL DMA_ReadyT
CALL DMA_ReadyY
JP MENULP JP MENULP
; ;
DMATST_R: DMATST_R:
@ -289,6 +319,10 @@ DISPM: call PRTSTRD
.db ", Port=0x$" .db ", Port=0x$"
LD A,(dmaport) ; DISPLAY LD A,(dmaport) ; DISPLAY
CALL PRTHEXBYTE ; DMA PORT CALL PRTHEXBYTE ; DMA PORT
call PRTSTRD
.db ", Latch Port=0x$"
ld A,(dmalach)
CALL PRTHEXBYTE ; DMA PORT
; ;
#IF (INTENABLE) #IF (INTENABLE)
; ;
@ -351,7 +385,7 @@ DMA_INIT:
CALL PRTHEXBYTE CALL PRTHEXBYTE
; ;
#IF !(DMAMODE==DMAMODE_VDG) #IF !(DMAMODE==DMAMODE_VDG)
ld a,(dmautil)
ld a,(dmalach)
ld c,a ld c,a
LD A,DMA_FORCE LD A,DMA_FORCE
out (c),a ; force ready off out (c),a ; force ready off
@ -369,7 +403,8 @@ DMA_INIT:
; ;
ld hl,DMACode ; program the ld hl,DMACode ; program the
ld b,DMACode_Len ; dma command ld b,DMACode_Len ; dma command
ld c,DMABASE ; block
ld a,(dmaport)
ld c,a ; block
; ;
di di
otir ; load dma otir ; load dma
@ -417,6 +452,7 @@ DMA_DEV_STR:
.TEXT "Z280$" .TEXT "Z280$"
.TEXT "RCBUS$" .TEXT "RCBUS$"
.TEXT "MBC$" .TEXT "MBC$"
.TEXT "DUODYNE$"
.TEXT "DATAGEAR$" .TEXT "DATAGEAR$"
; ;
DMA_SPD_STR: DMA_SPD_STR:
@ -479,11 +515,12 @@ DMACFG_V:
;================================================================================================== ;==================================================================================================
; ;
DMABUF .TEXT "0123456789abcdef" DMABUF .TEXT "0123456789abcdef"
;DMABUF .DB $04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$00,$00,$00 ; SPEAKER
; ;
DMA_ReadyO: DMA_ReadyO:
call PRTSTRD call PRTSTRD
.db "\r\nOutputing string to port 0x$" .db "\r\nOutputing string to port 0x$"
ld a,DMAIOTST
ld a,(tstport)
call PRTHEXBYTE call PRTHEXBYTE
call NEWLINE call NEWLINE
; ;
@ -491,7 +528,7 @@ DMA_ReadyO:
IOLoop: push bc IOLoop: push bc
call NEWLINE call NEWLINE
ld hl,DMABUF ld hl,DMABUF
ld a,DMAIOTST
ld a,(tstport)
ld bc,16 ld bc,16
; ;
call DMAOTIR call DMAOTIR
@ -502,16 +539,17 @@ IOLoop: push bc
ret ret
; ;
;================================================================================================== ;==================================================================================================
; PULSE PORT (COMMON ROUTINE WHERE A CONTAINS THE ASCII PORT OFFSET)
; PULSE PORT
;================================================================================================== ;==================================================================================================
; ;
DMA_Port01:
DMA_Port0:
ld a,(dmaport)
jr DMA_Port
DMA_Port1:
ld a,(dmalach)
DMA_Port:
call PRTSTRD call PRTSTRD
.db "\r\nPulsing port 0x$" .db "\r\nPulsing port 0x$"
sub '0' ; Calculate
ld c,a
ld a,(dmaport) ; Port to
add a,c
call PRTHEXBYTE call PRTHEXBYTE
call NEWLINE call NEWLINE
ld c,a ; toggle ld c,a ; toggle
@ -543,12 +581,9 @@ dlylp: dec bc
; TOGGLE READY BIT ; TOGGLE READY BIT
;================================================================================================== ;==================================================================================================
; ;
DMA_ReadyT:
DMA_ReadyY:
call NEWLINE call NEWLINE
#IF !(DMAMODE==DMAMODE_VDG)
#ENDIF
ld a,(dmautil)
ld a,(dmalach)
ld c,a ; toggle ld c,a ; toggle
ld b,$20 ; loop counter ld b,$20 ; loop counter
portlp2:push bc portlp2:push bc
@ -558,14 +593,12 @@ portlp2:push bc
.db ": ON$" .db ": ON$"
call delay call delay
ld a,$FF ld a,$FF
; ld c,DMABASE+1
out (c),a out (c),a
call PRTSTRD call PRTSTRD
.db " -> OFF$" .db " -> OFF$"
call delay call delay
call PRTSTRD call PRTSTRD
.db "\r \r$" .db "\r \r$"
; ld c,DMABASE+1
ld a,0 ld a,0
out (c),a out (c),a
pop bc pop bc
@ -605,9 +638,9 @@ DMAMemMove1:
; ;
DMAMemMove2: DMAMemMove2:
; ;
; LD HL,$8400 ; PLANT
; LD A,$00 ; BAD
; LD (HL),A ; SEED
;LD HL,$8400 ; PLANT
;LD A,$00 ; BAD
;LD (HL),A ; SEED
; ;
LD A,$AA ; CHECK COPY SUCCESSFULL LD A,$AA ; CHECK COPY SUCCESSFULL
LD HL,$8000 LD HL,$8000
@ -615,6 +648,14 @@ DMAMemMove2:
NXTCMP: CPI NXTCMP: CPI
JP PO,CMPOK JP PO,CMPOK
JR Z,NXTCMP JR Z,NXTCMP
DEC HL
CALL PRTHEXWORDHL
LD A,' '
CALL COUT
LD A,(HL)
CALL PRTHEXBYTE
RET ; RET W/ ZF CLEAR RET ; RET W/ ZF CLEAR
; ;
CMPOK: CMPOK:
@ -1167,10 +1208,10 @@ CST:
RET RET
; ;
USEINT .DB FALSE ; USE INTERRUPTS FLAG USEINT .DB FALSE ; USE INTERRUPTS FLAG
counter .dw 0
dmaport .db DMABASE dmaport .db DMABASE
dmautil .db DMABASE+1
dmalach .db DMALATCH
dmaxfer .db DMA_XMODE dmaxfer .db DMA_XMODE
tstport .db DMAIOTST
dmavbs .db 0 dmavbs .db 0
SAVSTK: .DW 2 SAVSTK: .DW 2
.FILL 64 .FILL 64
@ -1187,11 +1228,16 @@ reladr .equ $ ; relocation start adr
.org $A000 ; code will run here .org $A000 ; code will run here
; ;
int: int:
;LD E,'.' ; OUTPUT CHAR TO E
;LD C,CIO_CONSOLE ; CONSOLE UNIT TO C
;LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR
;CALL $FFF0 ; HBIOS OUTPUTS CHARACTER
; According to the DMA doc, you must issue ; According to the DMA doc, you must issue
; a DMA_DISABLE command prior to a ; a DMA_DISABLE command prior to a
; DMA_REINIT_STATUS_BYTE command to avoid a ; DMA_REINIT_STATUS_BYTE command to avoid a
; potential race condition. ; potential race condition.
ld a,(dmaport)
ld a,(int_dmaport)
ld c,a ld c,a
ld a,DMA_DISABLE ld a,DMA_DISABLE
out (c),a out (c),a
@ -1211,6 +1257,11 @@ int:
or $ff ; signal int handled or $ff ; signal int handled
ret ret
; ;
; data referred to in handler must reside in high mem
;
int_dmaport .db 0 ; hi mem copy of dmaport
counter .dw 0 ; interrupt counter
;
hsiz .equ $ - $A000 ; size of handler to relocate hsiz .equ $ - $A000 ; size of handler to relocate
; ;
.org reladr + hsiz .org reladr + hsiz

2
Source/Apps/Test/I2C/Build.cmd

@ -8,6 +8,8 @@ set TASMTABS=%TOOLS%\tasm32
tasm -t180 -g3 -fFF i2cscan.asm i2cscan.com i2cscan.lst || exit /b tasm -t180 -g3 -fFF i2cscan.asm i2cscan.com i2cscan.lst || exit /b
tasm -t180 -g3 -fFF rtcds7.asm rtcds7.com rtcds7.lst || exit /b tasm -t180 -g3 -fFF rtcds7.asm rtcds7.com rtcds7.lst || exit /b
tasm -t180 -g3 -fFF i2clcd.asm i2clcd.com i2clcd.lst || exit /b tasm -t180 -g3 -fFF i2clcd.asm i2clcd.com i2clcd.lst || exit /b
tasm -t80 -g3 -ff srom.asm srom.com srom.lst || exit /b
copy /Y i2c*.com ..\..\..\..\Binary\Apps\Test\ || exit /b copy /Y i2c*.com ..\..\..\..\Binary\Apps\Test\ || exit /b
copy /Y rtcds7*.com ..\..\..\..\Binary\Apps\Test\ || exit /b copy /Y rtcds7*.com ..\..\..\..\Binary\Apps\Test\ || exit /b
copy /Y srom.com ..\..\..\..\Binary\Apps\Test\ || exit /b

2
Source/Apps/Test/I2C/Makefile

@ -1,4 +1,4 @@
OBJECTS = i2cscan.com rtcds7.com i2clcd.com
OBJECTS = i2cscan.com rtcds7.com i2clcd.com srom.com
DEST = ../../../../Binary/Apps/Test/ DEST = ../../../../Binary/Apps/Test/
TOOLS = ../../../../Tools TOOLS = ../../../../Tools

32
Source/Apps/Test/I2C/i2cscan.asm

@ -5,12 +5,13 @@
; MARCO MACCAFERRI, HTTPS://WWW.MACCASOFT.COM ; MARCO MACCAFERRI, HTTPS://WWW.MACCASOFT.COM
; HBIOS VERSION BY PHIL SUMMERS (B1ACKMAILER) DIFFICULTLEVELHIGH@GMAIL.COM ; HBIOS VERSION BY PHIL SUMMERS (B1ACKMAILER) DIFFICULTLEVELHIGH@GMAIL.COM
; ;
PCF .EQU 1
P8X180 .EQU 0
SC126 .EQU 0
SC137 .EQU 0
PCFECB .EQU 0
PCFDUO .EQU 1
P8X180 .EQU 0
SC126 .EQU 0
SC137 .EQU 0
; ;
#IF (PCF)
#IF (PCFECB)
I2C_BASE .EQU 0F0H I2C_BASE .EQU 0F0H
PCF_ID .EQU 0AAH PCF_ID .EQU 0AAH
CPU_CLK .EQU 12 CPU_CLK .EQU 12
@ -20,6 +21,16 @@ PCF_RS1 .EQU PCF_RS0+1
PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE
#ENDIF #ENDIF
; ;
#IF (PCFDUO)
I2C_BASE .EQU 056H
PCF_ID .EQU 0AAH
CPU_CLK .EQU 12
;
PCF_RS0 .EQU I2C_BASE
PCF_RS1 .EQU PCF_RS0+1
PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE
#ENDIF
;
#IF (P8X180) #IF (P8X180)
I2C_BASE .EQU 0A0h I2C_BASE .EQU 0A0h
_sda .EQU 0 _sda .EQU 0
@ -153,8 +164,11 @@ lp5f: ld a,(addr) ; next address
jp 0 jp 0
signon: .db "I2C Bus Scanner" signon: .db "I2C Bus Scanner"
#IF (PCF)
.DB " - PCF8584"
#IF (PCFECB)
.DB " - PCF8584 (ECB)"
#ENDIF
#IF (PCFDUO)
.DB " - PCF8584 (Duodyne)"
#ENDIF #ENDIF
#IF (SC126) #IF (SC126)
.DB " - SC126" .DB " - SC126"
@ -219,7 +233,7 @@ _cout: ; character
ret ret
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
#IF (PCF)
#IF (PCFECB | PCFDUO)
_i2c_start: _i2c_start:
PCF_START: PCF_START:
LD A,PCF_START_ LD A,PCF_START_
@ -418,7 +432,7 @@ PCF_PINFAIL .DB "PIN FAIL$"
PCF_BBFAIL .DB "BUS BUSY$" PCF_BBFAIL .DB "BUS BUSY$"
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
#IF (PCF)
#IF (PCFECB | PCFDUO)
_i2c_stop: _i2c_stop:
PCF_STOP: PCF_STOP:
LD A,PCF_STOP_ ; issue LD A,PCF_STOP_ ; issue

1679
Source/Apps/Test/I2C/srom.asm

File diff suppressed because it is too large

136
Source/Apps/Test/ps2info/ps2info.asm

@ -7,20 +7,24 @@
; keyboard, and mouse. ; keyboard, and mouse.
; ;
; WBW 2022-03-28: Add menu driven port selection ; WBW 2022-03-28: Add menu driven port selection
; Add support for RHYOPHYRE
; Add support for Rhyophyre
; WBW 2022-04-01: Add menu for test functions ; WBW 2022-04-01: Add menu for test functions
; WBW 2022-04-02: Fix prtchr register saving/recovery ; WBW 2022-04-02: Fix prtchr register saving/recovery
; WBW 2023-10-19: Add support for Duodyne
; ;
;======================================================================= ;=======================================================================
; ;
; PS/2 Keyboard/Mouse controller port addresses (adjust as needed) ; PS/2 Keyboard/Mouse controller port addresses (adjust as needed)
; ;
; MBC:
; Nhyodyne:
iocmd_mbc .equ $E3 ; PS/2 controller command port address iocmd_mbc .equ $E3 ; PS/2 controller command port address
iodat_mbc .equ $E2 ; PS/2 controller data port address iodat_mbc .equ $E2 ; PS/2 controller data port address
; RPH:
; Rhyophyre:
iocmd_rph .equ $8D ; PS/2 controller command port address iocmd_rph .equ $8D ; PS/2 controller command port address
iodat_rph .equ $8C ; PS/2 controller data port address iodat_rph .equ $8C ; PS/2 controller data port address
; Duodyne:
iocmd_duo .equ $4D ; PS/2 controller command port address
iodat_duo .equ $4C ; PS/2 controller data port address
; ;
cpumhz .equ 8 ; for time delay calculations (not critical) cpumhz .equ 8 ; for time delay calculations (not critical)
; ;
@ -77,10 +81,12 @@ setup1:
jr z,setup1 jr z,setup1
call upcase call upcase
call prtchr call prtchr
cp '1' ; MBC
cp '1' ; Nhyodyne
jr z,setup_mbc jr z,setup_mbc
cp '2' ; RHYOPHYRE
cp '2' ; Rhyophyre
jr z,setup_rph jr z,setup_rph
cp '3' ; Duodyne
jr z,setup_duo
cp 'X' cp 'X'
jr z,exit jr z,exit
jr setup jr setup
@ -101,6 +107,14 @@ setup_rph:
ld de,str_rph ld de,str_rph
jr setup2 jr setup2
; ;
setup_duo:
ld a,iocmd_duo
ld (iocmd),a
ld a,iodat_duo
ld (iodat),a
ld de,str_duo
jr setup2
;
setup2: setup2:
call prtstr call prtstr
call crlf2 call crlf2
@ -181,6 +195,12 @@ test_kbd:
; ;
call ctlr_test call ctlr_test
jr nz,test_kbd_fail jr nz,test_kbd_fail
;
ld a,$20 ; kbd enabled, mse disabled, no ints
call ctlr_setup
jr nz,test_kbd_fail
;
call ctlr_flush
; ;
call test_kbd_basic call test_kbd_basic
jr nz,test_kbd_fail jr nz,test_kbd_fail
@ -228,9 +248,13 @@ test_mse:
ld a,$10 ; kbd disabled, mse enabled, no ints ld a,$10 ; kbd disabled, mse enabled, no ints
call ctlr_setup call ctlr_setup
jr nz,test_mse_fail jr nz,test_mse_fail
;
call ctlr_flush
; ;
call mse_reset call mse_reset
jr nz,test_mse_fail jr nz,test_mse_fail
;
call ctlr_flush
; ;
call mse_ident call mse_ident
jr nz,test_mse_fail jr nz,test_mse_fail
@ -262,15 +286,21 @@ test_kbdmse:
ld a,$00 ; kbd enabled, mse enabled, no ints ld a,$00 ; kbd enabled, mse enabled, no ints
call ctlr_setup call ctlr_setup
jr nz,test_kbdmse_fail jr nz,test_kbdmse_fail
;
call ctlr_flush
; ;
call kbd_reset call kbd_reset
jr nz,test_kbdmse_fail jr nz,test_kbdmse_fail
;
call ctlr_flush
; ;
ld a,2 ld a,2
call kbd_setsc call kbd_setsc
; ;
call mse_reset call mse_reset
jr nz,test_kbdmse_fail jr nz,test_kbdmse_fail
;
call ctlr_flush
; ;
call mse_stream call mse_stream
jr nz,test_kbdmse_fail jr nz,test_kbdmse_fail
@ -290,15 +320,13 @@ test_kbdmse_fail:
; inventory the supported scan code sets. ; inventory the supported scan code sets.
; ;
test_kbd_basic: test_kbd_basic:
ld a,$20 ; Xlat off for this checking
call ctlr_setup
ret nz
;
call kbd_reset call kbd_reset
ret nz ret nz
;
call ctlr_flush
; ;
call kbd_ident call kbd_ident
;ret nz
ret nz
; ;
ld b,3 ; Loop control, 3 scan code sets ld b,3 ; Loop control, 3 scan code sets
ld c,1 ; Current scan code number ld c,1 ; Current scan code number
@ -436,6 +464,19 @@ ctlr_setup:
xor a xor a
ret ret
; ;
; Flush incoming data buffer
;
ctlr_flush:
call crlf2
ld de,str_ctlr_flush
call prtstr
ctlr_flush1:
call delay ; small delay
call check_read ; data pending?
ret nz ; return if nothing there
call get_data_dbg ; get and discard byte
jr ctlr_flush1 ; loop
;
; Perform a keyboard reset ; Perform a keyboard reset
; ;
kbd_reset: kbd_reset:
@ -612,13 +653,17 @@ mse_reset:
call crlf2 call crlf2
ld de,str_mse_reset ld de,str_mse_reset
call prtstr call prtstr
ld a,$f2 ; Identify mouse command
ld a,$ff ; Identify mouse command
call put_data_mse_dbg call put_data_mse_dbg
jp c,err_ctlr_to ; handle controller error jp c,err_ctlr_to ; handle controller error
call get_data_dbg call get_data_dbg
jp c,err_ctlr_to ; handle controller error jp c,err_ctlr_to ; handle controller error
cp $fa ; Is it an ack as expected? cp $fa ; Is it an ack as expected?
jp nz,err_mse_reset jp nz,err_mse_reset
call get_data_dbg
jp c,err_ctlr_to ; handle controller error
cp $aa ; Success?
jp nz,err_mse_reset
call crlf call crlf
ld de,str_mse_reset_ok ld de,str_mse_reset_ok
call prtstr call prtstr
@ -634,18 +679,61 @@ mse_ident:
ld a,$f2 ; Identify mouse command ld a,$f2 ; Identify mouse command
call put_data_mse_dbg call put_data_mse_dbg
jp c,err_ctlr_to ; handle controller error jp c,err_ctlr_to ; handle controller error
mse_ident0:
call get_data_dbg call get_data_dbg
jp c,err_ctlr_to ; handle controller error jp c,err_ctlr_to ; handle controller error
;cp $00 ; extraneous?
;jr z,mse_ident0 ; ignore it, get another
cp $fa ; Is it an ack as expected? cp $fa ; Is it an ack as expected?
jp nz,err_mse_ident jp nz,err_mse_ident
call get_data_dbg
jp c,err_ctlr_to ; handle controller error
; Now we need to receive 0-2 bytes. There is no way to know
; how many are coming, so we receive bytes until there is a
; timeout error. Timeout is shortened here so that we don't
; have to wait seconds for the routine to complete normally.
; A short timeout is more than sufficient here.
ld ix,workbuf
ld a,(timeout) ; save current timeout
push af push af
ld a,stimout ; set a short timeout
ld (timeout),a
ld b,8 ; buf max
ld c,0 ; buf len
mse_ident1:
push bc
call get_data_dbg
pop bc
jr c,mse_ident2
ld (ix),a
inc ix
inc c
djnz mse_ident1
mse_ident2:
pop af ; restore original timeout
ld (timeout),a
call crlf call crlf
ld de,str_mse_ident_disp ld de,str_mse_ident_disp
call prtstr call prtstr
pop af
call prtdecb
ld a,'['
call prtchr
ld ix,workbuf
ld a,c ; bytes to print
or a ; check for zero
jr z,mse_ident4 ; handle zero
ld b,a ; setup loop counter
jr mse_ident3a
mse_ident3:
ld a,','
call prtchr
mse_ident3a:
ld a,(ix)
call prthex
inc ix
djnz mse_ident3
mse_ident4:
ld a,']'
call prtchr
xor a xor a
ret ret
; ;
@ -658,8 +746,13 @@ mse_stream:
ld a,$f4 ; Stream packets cmd ld a,$f4 ; Stream packets cmd
call put_data_mse_dbg call put_data_mse_dbg
jp c,err_ctlr_to ; handle controller error jp c,err_ctlr_to ; handle controller error
mse_stream0:
call get_data_dbg call get_data_dbg
jp c,err_ctlr_to ; handle controller error jp c,err_ctlr_to ; handle controller error
;cp $00 ; extraneous?
;jr z,mse_stream0 ; ignore it, get another
cp $FA ; Is it an ack as expected? cp $FA ; Is it an ack as expected?
jp nz,err_mse_stream jp nz,err_mse_stream
xor a xor a
@ -1344,14 +1437,16 @@ delay1:
; Constants ; Constants
;======================================================================= ;=======================================================================
; ;
str_banner .db "PS/2 Keyboard/Mouse Information v0.6a, 2-Apr-2022",0
str_banner .db "PS/2 Keyboard/Mouse Information v0.8, 6-Nov-2023",0
str_hwmenu .db "PS/2 Controller Port Options:\r\n\r\n" str_hwmenu .db "PS/2 Controller Port Options:\r\n\r\n"
.db " 1 - MBC\r\n"
.db " 2 - RHYOPHYRE\r\n"
.db " 1 - Nhyodyne\r\n"
.db " 2 - Rhyophyre\r\n"
.db " 3 - Duodyne\r\n"
.db " X - Exit Application\r\n" .db " X - Exit Application\r\n"
.db "\r\nSelection? ",0 .db "\r\nSelection? ",0
str_mbc .db "MBC",0
str_rph .db "RHYOPHYRE",0
str_mbc .db "Nhyodyne",0
str_rph .db "Rhyophyre",0
str_duo .db "Duodyne",0
str_menu .db "PS/2 Testing Options:\r\n\r\n" str_menu .db "PS/2 Testing Options:\r\n\r\n"
.db " C - Test PS/2 Controller\r\n" .db " C - Test PS/2 Controller\r\n"
.db " K - Test PS/2 Keyboard\r\n" .db " K - Test PS/2 Keyboard\r\n"
@ -1382,6 +1477,7 @@ str_trans_off .db "***** Testing Keyboard with Scan Code Translation DISABLED *
str_trans_on .db "***** Testing Keyboard with Scan Code Translation ENABLED *****",0 str_trans_on .db "***** Testing Keyboard with Scan Code Translation ENABLED *****",0
str_basic_mse .db "***** Basic Mouse Tests *****",0 str_basic_mse .db "***** Basic Mouse Tests *****",0
str_kbdmse .db "***** Test All Devices Combined *****",0 str_kbdmse .db "***** Test All Devices Combined *****",0
str_ctlr_flush .db "Flushing controller input buffer",0
str_kbd_reset .db "Attempting Keyboard Reset",0 str_kbd_reset .db "Attempting Keyboard Reset",0
str_kbd_reset_ok .db "Keyboard Reset OK",0 str_kbd_reset_ok .db "Keyboard Reset OK",0
str_err_kbd_reset .db "Keyboard Reset Failed",0 str_err_kbd_reset .db "Keyboard Reset Failed",0

4
Source/Apps/Tune/tune.asm

@ -629,6 +629,9 @@ CFGTBL: ; PLT RSEL RDAT RIN Z180 ACR
; ;
.DB 13, $A0, $A1, $A0, $FF, $A2 ; MBC .DB 13, $A0, $A1, $A0, $FF, $A2 ; MBC
.DW HWSTR_MBC .DW HWSTR_MBC
;
.DB 17, $A0, $A1, $A0, $FF, $A2 ; DUODYNE
.DW HWSTR_DUO
; ;
.DB $FF ; END OF TABLE MARKER .DB $FF ; END OF TABLE MARKER
; ;
@ -682,6 +685,7 @@ HWSTR_RCEB6 .DB "RCBus Sound Module (EBv6)",0
HWSTR_RCMF .DB "RCBus Sound Module (MF)",0 HWSTR_RCMF .DB "RCBus Sound Module (MF)",0
HWSTR_LINC .DB "Z50 LiNC Sound Module",0 HWSTR_LINC .DB "Z50 LiNC Sound Module",0
HWSTR_MBC .DB "NHYODYNE Sound Module",0 HWSTR_MBC .DB "NHYODYNE Sound Module",0
HWSTR_DUO .DB "DUODYNE Sound Module",0
MSGUNSUP .db "MYM files not supported with HBIOS yet!\r\n", 0 MSGUNSUP .db "MYM files not supported with HBIOS yet!\r\n", 0

15
Source/Apps/XM/xmdm125.asm

@ -720,12 +720,17 @@ NOBYE: LXI H,FCB+1 ; Get primary option
; Send option processor ; Send option processor
; Single option: "K" - force 1k mode ; Single option: "K" - force 1k mode
; ;
INX H ; Look for a 'K'
CALL SNDOPC
CALL SNDOPC
JMP ALLSET
SNDOPC:INX H ; Look for an option
MOV A,M MOV A,M
CPI ' ' ; Is it a space? CPI ' ' ; Is it a space?
JZ ALLSET ; Then we're ready to send...
CPI 'K'
JNZ OPTERR ; "K" is the only setable 2nd option
JNZ CHKK
POP PSW
JMP ALLSET
CHKK: CPI 'K'
JNZ CHK6TH ; If it's not K it should be a port number
LDA MSPEED LDA MSPEED
CPI MINKSP ; If less than MINKSP bps, ignore 1k CPI MINKSP ; If less than MINKSP bps, ignore 1k
JC ALLSET ; Request JC ALLSET ; Request
@ -733,7 +738,7 @@ NOBYE: LXI H,FCB+1 ; Get primary option
STA KFLAG ; First, force us to 1K mode STA KFLAG ; First, force us to 1K mode
CALL ILPRT CALL ILPRT
DB '(1k protocol selected)',CR,LF,0 DB '(1k protocol selected)',CR,LF,0
JMP ALLSET ; That's it for send...
RET ; That's it for send...
; ;
; Receive option processor ; Receive option processor
; 3 or 4 options: "X" - disable auto-protocol select ; 3 or 4 options: "X" - disable auto-protocol select

41
Source/Apps/assign.asm

@ -30,11 +30,13 @@
; 2021-12-06 [WBW] Fix inverted ROM/RAM DPB mapping in buffer alloc ; 2021-12-06 [WBW] Fix inverted ROM/RAM DPB mapping in buffer alloc
; 2022-02-28 [WBW] Use HBIOS to swap banks under CP/M 3 ; 2022-02-28 [WBW] Use HBIOS to swap banks under CP/M 3
; Use CPM3 BDOS direct BIOS call to get DRVTBL adr ; Use CPM3 BDOS direct BIOS call to get DRVTBL adr
; 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
;_______________________________________________________________________________ ;_______________________________________________________________________________
; ;
; ToDo: ; ToDo:
; 1) Do something to prevent assigning slices when device does not support them
; 2) ASSIGN C: causes drive map to be reinstalled unnecessarily
; 1) ASSIGN C: causes drive map to be reinstalled unnecessarily
;_______________________________________________________________________________ ;_______________________________________________________________________________
; ;
;=============================================================================== ;===============================================================================
@ -664,10 +666,10 @@ makdphwbw: ; determine appropriate dpb (WBW mode, unit number in A)
jr makdph0 ; jump ahead jr makdph0 ; jump ahead
makdph00: makdph00:
ld e,6 ; assume floppy ld e,6 ; assume floppy
cp $10 ; floppy?
cp $01 ; floppy?
jr z,makdph0 ; yes, jump ahead jr z,makdph0 ; yes, jump ahead
ld e,3 ; assume ram floppy ld e,3 ; assume ram floppy
cp $20 ; ram floppy?
cp $02 ; ram floppy?
jr z,makdph0 ; yes, jump ahead jr z,makdph0 ; yes, jump ahead
ld e,4 ; everything else is assumed to be hard disk ld e,4 ; everything else is assumed to be hard disk
jr makdph0 ; yes, jump ahead jr makdph0 ; yes, jump ahead
@ -1065,10 +1067,6 @@ drvmap1: ; loop through device table looking for a match
drvmap2: drvmap2:
; convert index to device type id ; convert index to device type id
ld a,c ; index to accum ld a,c ; index to accum
rlca ; move it to upper nibble
rlca ; ...
rlca ; ...
rlca ; ...
ld (device),a ; save as device id ld (device),a ; save as device id
; ;
; loop thru hbios units looking for device type/unit match ; loop thru hbios units looking for device type/unit match
@ -1308,10 +1306,6 @@ prtdev:
rst 08 ; call hbios, D := device, E := unit rst 08 ; call hbios, D := device, E := unit
push de ; save results push de ; save results
ld a,d ; device to A ld a,d ; device to A
rrca ; isolate high nibble (device)
rrca ; ...
rrca ; ...
rrca ; ... into low nibble
and $0F ; mask out undesired bits and $0F ; mask out undesired bits
push hl ; save HL push hl ; save HL
add a,a ; multiple A by two for word table add a,a ; multiple A by two for word table
@ -1405,12 +1399,11 @@ chkdev: ; HBIOS variant
; get device/unit info ; get device/unit info
ld b,$17 ; hbios func: diodevice ld b,$17 ; hbios func: diodevice
ld c,a ; unit to C ld c,a ; unit to C
rst 08 ; call hbios, D := device, E := unit
ld a,d ; device to A
rst 08 ; call hbios, C := device attributes
; ;
; check slice support ; check slice support
cp $30 ; A has device/unit, in hard disk range?
jr c,chkdev1 ; if not hard disk, check slice val
bit 5,c ; high capacity device?
jr z,chkdev1 ; if not high cap, check slice val
xor a ; otherwise, signal OK xor a ; otherwise, signal OK
ret ret
; ;
@ -1918,11 +1911,11 @@ dev06 .db "SD",0
dev07 .db "PRPSD",0 dev07 .db "PRPSD",0
dev08 .db "PPPSD",0 dev08 .db "PPPSD",0
dev09 .db "HDSK",0 dev09 .db "HDSK",0
dev10 .equ devunk
dev11 .equ devunk
dev12 .equ devunk
dev13 .equ devunk
dev14 .equ devunk
dev10 .db "PPA",0
dev11 .db "IMM",0
dev12 .db "SYQ",0
dev13 .db "CHUSB",0
dev14 .db "CHSD",0
dev15 .equ devunk dev15 .equ devunk
; ;
devcnt .equ 10 ; 10 devices defined devcnt .equ 10 ; 10 devices defined
@ -1943,13 +1936,13 @@ stack .equ $ ; stack top
; Messages ; Messages
; ;
indent .db " ",0 indent .db " ",0
msgban1 .db "ASSIGN v1.5 for RomWBW CP/M ",0
msgban1 .db "ASSIGN v1.8 for RomWBW CP/M ",0
msg22 .db "2.2",0 msg22 .db "2.2",0
msg3 .db "3",0 msg3 .db "3",0
msbban2 .db ", 28-Feb-2022",0
msbban2 .db ", 13-Oct-2023",0
msghb .db " (HBIOS Mode)",0 msghb .db " (HBIOS Mode)",0
msgub .db " (UBIOS Mode)",0 msgub .db " (UBIOS Mode)",0
msgban3 .db "Copyright 2021, Wayne Warthen, GNU GPL v3",0
msgban3 .db "Copyright 2023, Wayne Warthen, GNU GPL v3",0
msguse .db "Usage: ASSIGN D:[=[{D:|<device>[<unitnum>]:[<slicenum>]}]][,...]",13,10 msguse .db "Usage: ASSIGN D:[=[{D:|<device>[<unitnum>]:[<slicenum>]}]][,...]",13,10
.db " ex. ASSIGN (display all active assignments)",13,10 .db " ex. ASSIGN (display all active assignments)",13,10
.db " ASSIGN /? (display version and usage)",13,10 .db " ASSIGN /? (display version and usage)",13,10

38
Source/Apps/cpuspd/cpuspd.asm

@ -189,9 +189,9 @@ show_spd:
ld b,BF_SYSGET ld b,BF_SYSGET
ld c,BF_SYSGET_CPUINFO ld c,BF_SYSGET_CPUINFO
rst 08 rst 08
jp nz,err_not_sup
jp nz,err_api
call crlf2 call crlf2
ld (cpu_spd),de ; save CPU speed for now
push de ; save CPU speed for now
push bc ; Oscillator speed to HL push bc ; Oscillator speed to HL
pop hl pop hl
ld de,str_spacer ld de,str_spacer
@ -199,10 +199,18 @@ show_spd:
call prtd3m ; print it call prtd3m ; print it
ld de,str_oscspd ld de,str_oscspd
call prtstr call prtstr
call crlf
ld de,str_cpuspd
call prtstr
pop hl ; recover CPU speed
call prtd3m ; print it
ld de,str_mhz
call prtstr
;
ld b,BF_SYSGET ld b,BF_SYSGET
ld c,BF_SYSGET_CPUSPD ld c,BF_SYSGET_CPUSPD
rst 08 rst 08
jp nz,err_not_sup
ret nz ; no CPU speed info, done
push de ; save wait states for now push de ; save wait states for now
ld a,l ld a,l
ld de,str_slow ld de,str_slow
@ -216,11 +224,6 @@ show_spd:
jr z,show_spd1 jr z,show_spd1
jp err_invalid jp err_invalid
show_spd1: show_spd1:
call crlf
call prtstr
ld hl,(cpu_spd) ; recover CPU speed
call prtd3m
ld de,str_cpuspd
call prtstr call prtstr
pop hl pop hl
ld a,h ; memory wait states ld a,h ; memory wait states
@ -284,6 +287,9 @@ err_not_sup:
err_invalid: err_invalid:
ld de,str_err_invalid ld de,str_err_invalid
jr err_ret jr err_ret
err_api:
ld de,str_err_api
jr err_ret
; ;
err_ret: err_ret:
call crlf2 call crlf2
@ -659,21 +665,24 @@ delay1:
; Constants ; Constants
;======================================================================= ;=======================================================================
; ;
str_banner .db "RomWBW CPU Speed Selector v0.5, 2-Feb-2022",0
str_banner .db "RomWBW CPU Speed Selector v0.6, 29-Dec-2023",0
str_spacer .db " ",0 str_spacer .db " ",0
str_oscspd .db " MHz Oscillator",0 str_oscspd .db " MHz Oscillator",0
str_slow .db " CPU speed is HALF (",0
str_full .db " CPU speed is FULL (",0
str_dbl .db " CPU speed is DOUBLE (",0
str_cpuspd .db " MHz)",0
str_cpuspd .db " CPU speed is ",0
str_mhz .db " MHz",0
str_slow .db " (Half)",0
str_full .db " (Full)",0
str_dbl .db " (Double)",0
str_memws .db " Memory Wait State(s)",0 str_memws .db " Memory Wait State(s)",0
str_iows .db " I/O Wait State(s)",0 str_iows .db " I/O Wait State(s)",0
str_err_una .db " ERROR: UNA not supported by application",0 str_err_una .db " ERROR: UNA not supported by application",0
str_err_inv .db " ERROR: Invalid BIOS (signature missing)",0 str_err_inv .db " ERROR: Invalid BIOS (signature missing)",0
str_err_ver .db " ERROR: Unexpected HBIOS version",0 str_err_ver .db " ERROR: Unexpected HBIOS version",0
str_err_parm .db " ERROR: Parameter error (CPUSPD /? for usage)",0 str_err_parm .db " ERROR: Parameter error (CPUSPD /? for usage)",0
str_err_not_sup .db " ERROR: Platform or configuration not supported!",0
str_err_not_sup .db " ERROR: Platform or configuration does not support CPU speed configuration!",0
str_err_invalid .db " ERROR: Invalid configuration!",0 str_err_invalid .db " ERROR: Invalid configuration!",0
str_err_api .db " ERROR: HBIOS API error!",0
str_usage .db " Usage: CPUSPD <cpuspd>,<memws>,<iows>\r\n" str_usage .db " Usage: CPUSPD <cpuspd>,<memws>,<iows>\r\n"
.db "\r\n" .db "\r\n"
.db " <cpuspd>: \"Half\", \"Full\", or \"Double\"\r\n" .db " <cpuspd>: \"Half\", \"Full\", or \"Double\"\r\n"
@ -693,7 +702,6 @@ stack .equ $ ; stack top
; ;
; ;
tmpstr .fill 9,0 ; temp string (8 chars, 0 term) tmpstr .fill 9,0 ; temp string (8 chars, 0 term)
cpu_spd .dw 0 ; current cpu speed
new_cpu_spd .db $FF ; new CPU speed new_cpu_spd .db $FF ; new CPU speed
new_ws_mem .db $FF ; new memory wait states new_ws_mem .db $FF ; new memory wait states
new_ws_io .db $FF ; new I/O wait states new_ws_io .db $FF ; new I/O wait states

37
Source/Apps/rtc.asm

@ -31,6 +31,8 @@
; ;
;[2022/03/27] v1.8 Support RHYOPHYRE ;[2022/03/27] v1.8 Support RHYOPHYRE
; ;
;[2023/07/07] v1.9 Support DUODYNE
;
; Constants ; Constants
; ;
mask_data .EQU %10000000 ; RTC data line mask_data .EQU %10000000 ; RTC data line
@ -49,6 +51,7 @@ PORT_DYNO .EQU $0C ; RTC port for DYNO
PORT_RCZ280 .EQU $C0 ; RTC port for RCZ280 PORT_RCZ280 .EQU $C0 ; RTC port for RCZ280
PORT_MBC .EQU $70 ; RTC port for MBC PORT_MBC .EQU $70 ; RTC port for MBC
PORT_RPH .EQU $84 ; RTC port for RHYOPHYRE PORT_RPH .EQU $84 ; RTC port for RHYOPHYRE
PORT_DUO .EQU $94 ; RTC port for DUODYNE
BDOS .EQU 5 ; BDOS invocation vector BDOS .EQU 5 ; BDOS invocation vector
@ -1079,61 +1082,66 @@ HINIT:
LD C,PORT_SBC LD C,PORT_SBC
LD DE,PLT_SBC LD DE,PLT_SBC
CP $01 ; SBC CP $01 ; SBC
JR Z,RTC_INIT2
JP Z,RTC_INIT2
CP $02 ; ZETA CP $02 ; ZETA
JR Z,RTC_INIT2
JP Z,RTC_INIT2
CP $03 ; ZETA 2 CP $03 ; ZETA 2
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_N8 LD C,PORT_N8
LD DE,PLT_N8 LD DE,PLT_N8
CP $04 ; N8 CP $04 ; N8
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_MK4 LD C,PORT_MK4
LD DE,PLT_MK4 LD DE,PLT_MK4
CP $05 ; Mark IV CP $05 ; Mark IV
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_RCZ80 LD C,PORT_RCZ80
LD DE,PLT_RCZ80 LD DE,PLT_RCZ80
CP $07 ; RCBus w/ Z80 CP $07 ; RCBus w/ Z80
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_RCZ180 LD C,PORT_RCZ180
LD DE,PLT_RCZ180 LD DE,PLT_RCZ180
CP $08 ; RCBus w/ Z180 CP $08 ; RCBus w/ Z180
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_EZZ80 LD C,PORT_EZZ80
LD DE,PLT_EZZ80 LD DE,PLT_EZZ80
CP $09 ; Easy Z80 CP $09 ; Easy Z80
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_SCZ180 LD C,PORT_SCZ180
LD DE,PLT_SCZ180 LD DE,PLT_SCZ180
CP $0A ; SCZ180 CP $0A ; SCZ180
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_DYNO LD C,PORT_DYNO
LD DE,PLT_DYNO LD DE,PLT_DYNO
CP 11 ; DYNO CP 11 ; DYNO
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_RCZ280 LD C,PORT_RCZ280
LD DE,PLT_RCZ280 LD DE,PLT_RCZ280
CP 12 ; RCZ280 CP 12 ; RCZ280
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_MBC LD C,PORT_MBC
LD DE,PLT_MBC LD DE,PLT_MBC
CP 13 ; MBC CP 13 ; MBC
JR Z,RTC_INIT2
JP Z,RTC_INIT2
; ;
LD C,PORT_RPH LD C,PORT_RPH
LD DE,PLT_RPH LD DE,PLT_RPH
CP 14 ; RHYOPHYRE CP 14 ; RHYOPHYRE
JR Z,RTC_INIT2
JP Z,RTC_INIT2
;
LD C,PORT_DUO
LD DE,PLT_DUO
CP 17 ; DUODYNE
JP Z,RTC_INIT2
; ;
; Unknown platform ; Unknown platform
LD DE,PLTERR ; BIOS error message LD DE,PLTERR ; BIOS error message
@ -1630,7 +1638,7 @@ TESTING_BIT_DELAY_OVER:
RTC_HELP_MSG: RTC_HELP_MSG:
.DB 0Ah, 0Dh ; line feed and carriage return .DB 0Ah, 0Dh ; line feed and carriage return
.TEXT "RTC: Version 1.8"
.TEXT "RTC: Version 1.9"
.DB 0Ah, 0Dh ; line feed and carriage return .DB 0Ah, 0Dh ; line feed and carriage return
.TEXT "Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot W)arm-start H)elp" .TEXT "Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot W)arm-start H)elp"
.DB 0Ah, 0Dh ; line feed and carriage return .DB 0Ah, 0Dh ; line feed and carriage return
@ -1760,6 +1768,7 @@ PLT_DYNO .TEXT ", DYNO RTC Module Latch Port 0x0C\r\n$"
PLT_RCZ280 .TEXT ", RCBus Z280 RTC Module Latch Port 0xC0\r\n$" PLT_RCZ280 .TEXT ", RCBus Z280 RTC Module Latch Port 0xC0\r\n$"
PLT_MBC .TEXT ", MBC RTC Latch Port 0x70\r\n$" PLT_MBC .TEXT ", MBC RTC Latch Port 0x70\r\n$"
PLT_RPH .TEXT ", RHYOPHYRE RTC Latch Port 0x84\r\n$" PLT_RPH .TEXT ", RHYOPHYRE RTC Latch Port 0x84\r\n$"
PLT_DUO .TEXT ", DUODYNE RTC Latch Port 0x70\r\n$"
; ;
; Generic FOR-NEXT loop algorithm ; Generic FOR-NEXT loop algorithm

7
Source/BPBIOS/Build.cmd

@ -3,8 +3,8 @@ setlocal
pushd ZCPR33 && call Build || exit /b & popd pushd ZCPR33 && call Build || exit /b & popd
set PATH=%PATH%;..\..\Tools\zxcc;..\..\Tools\cpmtools;
set TOOLS=..\..\Tools
set PATH=%PATH%;%TOOLS%\zxcc;%TOOLS%\cpmtools;
set CPMDIR80=%TOOLS%/cpm/ set CPMDIR80=%TOOLS%/cpm/
call :makebp 33 call :makebp 33
@ -48,7 +48,8 @@ if exist bp%VER%.prn del bp%VER%.prn || exit /b
ren bpbio-ww.prn bp%VER%.prn || exit /b ren bpbio-ww.prn bp%VER%.prn || exit /b
if exist bp%VER%.err del bp%VER%.err || exit /b if exist bp%VER%.err del bp%VER%.err || exit /b
ren bpbio-ww.err bp%VER%.err || exit /b ren bpbio-ww.err bp%VER%.err || exit /b
copy bpbio-ww.rel bp%VER%.rel || exit /b
if exist bp%VER%.rel del bp%VER%.rel || exit /b
ren bpbio-ww.rel bp%VER%.rel || exit /b
rem pause rem pause

35
Source/BPBIOS/Makefile

@ -1,44 +1,37 @@
VERSIONS = \ VERSIONS = \
33t 33tbnk \
33n 33nbnk \
34t 34tbnk \
34n 34nbnk \
41tbnk 41nbnk
33 33bnk \
33 33bnk \
34 34bnk \
34 34bnk \
41bnk
HD0IMG = ../../Binary/hd_bp.img
IMGFILES = $(foreach ver,$(VERSIONS),bp$(ver).img) IMGFILES = $(foreach ver,$(VERSIONS),bp$(ver).img)
DISTFILES = *.zex *.rel myterm.z3t DISTFILES = *.zex *.rel myterm.z3t
OTHERS = zcpr33n.rel zcpr33t.rel \
bpbio-ww.rel bpsys.dat bpsys.bak bpbio-ww.err def-ww.lib *.img
OTHERS = zcpr33.rel bp*.prn bp*.rel \
bpbio-ww.rel bpsys.dat bpsys.bak bpbio-ww.err def-ww.lib bp*.img
TOOLS = ../../Tools TOOLS = ../../Tools
SUBDIRS = ZCPR33 SUBDIRS = ZCPR33
include $(TOOLS)/Makefile.inc include $(TOOLS)/Makefile.inc
$(HD0IMG): $(IMGFILES)
if [ -f $(HD0IMG) ] ; then \
for f in $(IMGFILES) $(DISTFILES) ; do \
$(BINDIR)/cpmrm -f wbw_hd0 $(HD0IMG) 0:$$f ; \
done ; \
$(CPMCP) -f wbw_hd0 $(HD0IMG) $(IMGFILES) $(DISTFILES) 0: ; \
fi
zcpr33n.rel zcpr33t.rel:
zcpr33.rel:
(cd ZCPR33 ; make) (cd ZCPR33 ; make)
all:: $(HD0IMG)
all:: $(IMGFILES)
clean::
@rm -f $(HD0IMG)
# clean::
# $(MAKE) --directory ZCPR3 clean
%.img: zcpr33n.rel zcpr33t.rel
%.img: zcpr33.rel
$(eval VER := $(subst .img,,$(subst bp,,$@))) $(eval VER := $(subst .img,,$(subst bp,,$@)))
cp def-ww-z$(VER).lib def-ww.lib cp def-ww-z$(VER).lib def-ww.lib
rm -f bpbio-ww.rel rm -f bpbio-ww.rel
$(ZXCC) ZMAC -BPBIO-WW -/P $(ZXCC) ZMAC -BPBIO-WW -/P
mv bpbio-ww.prn bp$(VER).prn mv bpbio-ww.prn bp$(VER).prn
if [ -f bpbio-ww.err ] ; then mv bpbio-ww.err bp$(VER).err; fi
mv bpbio-ww.rel bp$(VER).rel
cp bp$(VER).dat bpsys.dat cp bp$(VER).dat bpsys.dat
$(ZXCC) ./bpbuild.com -bpsys.dat 0 < bpbld1.rsp $(ZXCC) ./bpbuild.com -bpsys.dat 0 < bpbld1.rsp
cp bpsys.img bpsys.dat cp bpsys.img bpsys.dat

4
Source/BPBIOS/ZCPR33/Build.cmd

@ -1,8 +1,8 @@
@echo off @echo off
setlocal setlocal
set PATH=%PATH%;..\..\..\Tools\zxcc;..\..\..\Tools\cpmtools;
set TOOLS=..\..\..\Tools
set PATH=%PATH%;%TOOLS%\zxcc;%TOOLS%\cpmtools;
set CPMDIR80=%TOOLS%/cpm/ set CPMDIR80=%TOOLS%/cpm/
copy ..\z3base.lib . || exit /b copy ..\z3base.lib . || exit /b

17
Source/BPBIOS/ZCPR33/Makefile

@ -1,5 +1,5 @@
OBJECTS = zcpr33n.rel zcpr33t.rel
OTHERS = z3basen.lib z3baset.lib
OBJECTS = zcpr33.rel
OTHERS = z3base.lib *.prn *.rel
TOOLS = ../../../Tools TOOLS = ../../../Tools
DEST = .. DEST = ..
@ -7,12 +7,7 @@ include $(TOOLS)/Makefile.inc
DIFFPATH = $(DIFFTO)/Source/BPBIOS DIFFPATH = $(DIFFTO)/Source/BPBIOS
zcpr33t.rel: ../z3baset.lib
cp ../z3baset.lib z3baset.lib
$(ZXCC) ZMAC -zcpr33t.z80 -/P
rm z3baset.lib
zcpr33n.rel: ../z3basen.lib
cp ../z3basen.lib z3basen.lib
$(ZXCC) ZMAC -zcpr33n.z80 -/P
rm z3basen.lib
zcpr33.rel: ../z3base.lib
cp ../z3base.lib z3base.lib
$(ZXCC) ZMAC -zcpr33.z80 -/P
rm z3base.lib

3
Source/BPBIOS/cboot-ww.z80

@ -102,6 +102,9 @@ CBOOT:
; BPCNFG to configure a generic IMG file for specific Hard Drive Partitions. ; BPCNFG to configure a generic IMG file for specific Hard Drive Partitions.
CBOOT0: CBOOT0:
LD BC,HBF_SYSRES_INT ; HB Func: Internal Reset
CALL HBX_INVOKE ; Do it
LD HL,BRAME ; Get end of banked RAM LD HL,BRAME ; Get end of banked RAM
LD (HISAV),HL ; and save for later use LD (HISAV),HL ; and save for later use
IF HARDDSK IF HARDDSK

13
Source/BPBIOS/deblock.z80

@ -268,16 +268,15 @@ MATCH: LD A,(SECMSK) ; Get the sector mask
; ;
; Modified to use HBIOS host buffer ; Modified to use HBIOS host buffer
; ;
; HSTBUF is always in HBIOS bank where I/O is done
LD A,(TPABNK) ; TPA BANK
DEC A ; HBIOS bank is one below
LD C,A
; HSTBUF is always in HBIOS bank where I/O is actually done
LD A,(HB_BNKBIOS) ; HBIOS bank id
LD C,A ; Set Read Source Bank
IF BANKED IF BANKED
LD A,(DMABNK) ; Set Read Destination Bank
LD A,(DMABNK) ; Read Destination Bank
ELSE ELSE
LD A,(TPABNK) ; Set Read Destination Bank
LD A,(TPABNK) ; Read Destination Bank
ENDIF ENDIF
LD B,A
LD B,A ; Set Read Destination Bank
LD A,(READOP) ; Direction? LD A,(READOP) ; Direction?
OR A OR A
JR NZ,OKBNKS ; ..jump if read JR NZ,OKBNKS ; ..jump if read

4
Source/BPBIOS/def-ww-z33.lib

@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H
BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H
BNKU EQU 00H ; User Area Bank 58000H BNKU EQU 00H ; User Area Bank 58000H
; (set to 0 to disable) ; (set to 0 to disable)
BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H
BNKM EQU BID_RAMM ; Maximum Bank # F8000H
BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H
BNKM EQU BID_BUF ; Maximum Bank # F8000H
IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a
; nice resource for Z180 programing in general ; nice resource for Z180 programing in general

4
Source/BPBIOS/def-ww-z33bnk.lib

@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H
BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H
BNKU EQU 00H ; User Area Bank 58000H BNKU EQU 00H ; User Area Bank 58000H
; (set to 0 to disable) ; (set to 0 to disable)
BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H
BNKM EQU BID_RAMM ; Maximum Bank # F8000H
BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H
BNKM EQU BID_BUF ; Maximum Bank # F8000H
IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a
; nice resource for Z180 programing in general ; nice resource for Z180 programing in general

4
Source/BPBIOS/def-ww-z34.lib

@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H
BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H
BNKU EQU 00H ; User Area Bank 58000H BNKU EQU 00H ; User Area Bank 58000H
; (set to 0 to disable) ; (set to 0 to disable)
BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H
BNKM EQU BID_RAMM ; Maximum Bank # F8000H
BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H
BNKM EQU BID_BUF ; Maximum Bank # F8000H
IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a
; nice resource for Z180 programing in general ; nice resource for Z180 programing in general

4
Source/BPBIOS/def-ww-z34bnk.lib

@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H
BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H
BNKU EQU 00H ; User Area Bank 58000H BNKU EQU 00H ; User Area Bank 58000H
; (set to 0 to disable) ; (set to 0 to disable)
BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H
BNKM EQU BID_RAMM ; Maximum Bank # F8000H
BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H
BNKM EQU BID_BUF ; Maximum Bank # F8000H
IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a
; nice resource for Z180 programing in general ; nice resource for Z180 programing in general

4
Source/BPBIOS/def-ww-z41bnk.lib

@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H
BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H
BNKU EQU 00H ; User Area Bank 58000H BNKU EQU 00H ; User Area Bank 58000H
; (set to 0 to disable) ; (set to 0 to disable)
BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H
BNKM EQU BID_RAMM ; Maximum Bank # F8000H
BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H
BNKM EQU BID_BUF ; Maximum Bank # F8000H
IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a
; nice resource for Z180 programing in general ; nice resource for Z180 programing in general

26
Source/BPBIOS/diskdefs

@ -310,6 +310,32 @@ diskdef wbw_rom1024
os 2.2 os 2.2
end end
# RomWBW 512KB RAM (256KB reserved, 256KB RAM Disk)
diskdef wbw_ram512
seclen 512
tracks 8
sectrk 64
blocksize 2048
maxdir 256
skew 0
boottrk 0
os 2.2
end
# RomWBW 1024KB RAM (256KB reserved, 768KB RAM Disk)
diskdef wbw_ram1024
seclen 512
tracks 24
sectrk 64
blocksize 2048
maxdir 256
skew 0
boottrk 0
os 2.2
end
# RomWBW 720K floppy media # RomWBW 720K floppy media
diskdef wbw_fd720 diskdef wbw_fd720

148
Source/BPBIOS/dpbhd-ww.lib

@ -46,7 +46,7 @@
; NOTE: No Skew Table needed since Hard Disk Format is locked w/No Skew ; NOTE: No Skew Table needed since Hard Disk Format is locked w/No Skew
;..... ;.....
; Currently, BPBIOS supports 2 memory drive devices and 3 phyical hard
; Currently, BPBIOS supports 2 memory drive devices and 3 physical hard
; drive like devices. BPBIOS can support seven but unfortunately ; drive like devices. BPBIOS can support seven but unfortunately
; BPCNFG only supports 3 hard drive like devices and the source ; BPCNFG only supports 3 hard drive like devices and the source
; code is not available, so menu 4 is meaningless. Devices ; code is not available, so menu 4 is meaningless. Devices
@ -64,26 +64,22 @@
; ;
; Starting with ver 2.8 of HBIOS, devices are discovered at boot ; Starting with ver 2.8 of HBIOS, devices are discovered at boot
; time and assigned device numbers. Since devices are tested in ; time and assigned device numbers. Since devices are tested in
; a certain order, the device numbers are somewhat predicably
; a certain order, the device numbers are somewhat predictably
; assigned. Memory drives are discovered first. IDE drives are ; assigned. Memory drives are discovered first. IDE drives are
; discovered next so that IDE Hard drives including CF cards are ; discovered next so that IDE Hard drives including CF cards are
; assigned device 2 and device 3 if a slave drive is supported by ; assigned device 2 and device 3 if a slave drive is supported by
; the interface. Next comes the SD drive and is assigned device 3 ; the interface. Next comes the SD drive and is assigned device 3
; or 4 depending on the whether there is an ide slave drive. ; or 4 depending on the whether there is an ide slave drive.
; USB drive is assigned device 4 or 5 . For SIMH HDSK0 is device 0
; USB drive is assigned device 4 or 5. For SIMH HDSK0 is device 0
; and HDSK1 is device 1. Memory drives are now handled as LBA ; and HDSK1 is device 1. Memory drives are now handled as LBA
; devices, ie like hard drives. ; devices, ie like hard drives.
; ;
; The following non-memory drive capacities and configurations used for ; The following non-memory drive capacities and configurations used for
; the SIMH, SD and IDE drives: Slice geometry is 256, 512 byte sectors,
; 1 head per track and 1 with one reserved track, a block size of 4096
; bytes with 512 directory entries. An equivalent geometry is 16
; sectors and 16 heads per track. Internally BPBIOS uses a uniform
; logical organization with 64 logical records per logical track.
; Thus there are 16 logical tracks per physical track with 1040
; logical (65 physical) tracks per slice. If all partitions are not
; physically present, the missing partitions can be disabled in the
; BPBCNFG configuration file or by hand. Note that HBIOS uses LBA,
; the SIMH, SD and IDE drives: Track geometry is 16 512 byte sectors.
; A slice is exactly 64 tracks, with 1 of the 64 tracks as a system
; track. There are 1024 directory entries per slice. If all partitions
; are not physically present, the missing partitions can be disabled in
; the BPBCNFG configuration file or by hand. Note that HBIOS uses LBA,
; Logical Block Addressing, for non-floppy drives. ; Logical Block Addressing, for non-floppy drives.
; ;
; For SBC V1,2, ZETA, MARK IV and N8, the following non-memory partitions ; For SBC V1,2, ZETA, MARK IV and N8, the following non-memory partitions
@ -94,26 +90,26 @@
; partition Size Blocks Block Offset in ; partition Size Blocks Block Offset in
; MByte Size logical tracks ; MByte Size logical tracks
;==================================================================== ;====================================================================
; C 8 2048 4096 1*16 = 16
; D 8 2048 4096 (1+65)*16 = 1056
; E 8 2048 4096 (1+2*65)*16 = 2096
; F 8 2048 4096 (1+3*65)*16 = 3136
; G 8 2048 4096 (1+4*65)*16 = 4176
; H 8 2048 4096 (1+5*65)*16 = 5216
; I 8 2048 4096 (1+6*65)*16 = 6256
; J 8 2048 4096 (1+7*65)*16 = 7296
; C 8 2044 4096 128+(1024*0)+2 = 130
; D 8 2044 4096 128+(1024*1)+2 = 1154
; E 8 2044 4096 128+(1024*2)+2 = 2178
; F 8 2044 4096 128+(1024*3)+2 = 3202
; G 8 2044 4096 128+(1024*4)+2 = 4226
; H 8 2044 4096 128+(1024*5)+2 = 5250
; I 8 2044 4096 128+(1024*6)+2 = 6274
; J 8 2044 4096 128+(1024*7)+2 = 7298
; ;
; These are capacities and configurations used for SD card: ; These are capacities and configurations used for SD card:
; ;
; partition Size Blocks Block Offset ; partition Size Blocks Block Offset
; MByte Size logical tracks ; MByte Size logical tracks
;==================================================================== ;====================================================================
; K 8 2048 4096 1*16 = 16
; L 8 2048 4096 (1+65)*16 = 1056
; M 8 2048 4096 (1+2*65)*16 = 2096
; N 8 2048 4096 (1+3*65)*16 = 3136
; K 8 2044 4096 128+(1024*0)+2 = 130
; L 8 2044 4096 128+(1024*1)+2 = 1154
; M 8 2044 4096 128+(1024*2)+2 = 2178
; N 8 2044 4096 128+(1024*3)+2 = 3202
; ;
; RAM drive is paritition A while ROM drive is partition B.
; RAM drive is partition A while ROM drive is partition B.
; ;
; For example, a typical Memory drive configuration is: ; For example, a typical Memory drive configuration is:
; ;
@ -199,17 +195,17 @@ DPBROM: DEFW 64 ; Sectors/Track
; even though real layout is 256 physical ; even though real layout is 256 physical
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ0 EQU 2048 ; # of blocks in first Partition (1024 trks)
HSIZ0 EQU 2048 - 4 ; # of blocks in first Partition (1022 trks)
; ;
DPB50: DEFW 64 ; Sctrs/Trk DPB50: DEFW 64 ; Sctrs/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ0-1 ; Disk Size-1 DEFW HSIZ0-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 - 4 blocks
DEFB 0F0H,0 ; Alloc 0,1 - 4 blocks
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check Size DEFW 0 ; Check Size
DEFW 16 ; Trk Offset
DEFW 128+(1024*0)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -226,17 +222,17 @@ DPB50: DEFW 64 ; Sctrs/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ1 EQU 2048 ; # of blocks in Second Partition (1024 trks)
HSIZ1 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB51: DEFW 64 ; Scts/Trk DPB51: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ1-1 ; Disk Size-1 DEFW HSIZ1-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+65)*16 ; Track offset 1056
DEFW 128+(1024*1)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -253,21 +249,21 @@ DPB51: DEFW 64 ; Scts/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ2 EQU 2048 ; # of blocks in third Partition (1024 tracks)
HSIZ2 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB52: DEFW 64 ; Scts/Trk DPB52: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ2-1 ; Disk Size-1 DEFW HSIZ2-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+2*65)*16 ; Track offset = 2096
DEFW 128+(1024*2)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
; Partition F. HBIOS Disk 0, Slice 4
; Partition F. HBIOS Disk 0, Slice 3
IF DRV_F IF DRV_F
DEFB 'HBDSK0:3 ','F'+80H ; Id - 10 bytes DEFB 'HBDSK0:3 ','F'+80H ; Id - 10 bytes
@ -280,17 +276,17 @@ DPB52: DEFW 64 ; Scts/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ3 EQU 2048 ; # of blocks in Fourth Partition (1024 tracks)
HSIZ3 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB53: DEFW 64 ; Scts/Trk DPB53: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ3-1 ; Disk Size-1 DEFW HSIZ3-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+3*65)*16 ; Track offset = 3136
DEFW 128+(1024*3)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -307,17 +303,17 @@ DPB53: DEFW 64 ; Scts/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ4 EQU 2048 ; # of blocks in first Partition (1024 trks)
HSIZ4 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB54: DEFW 64 ; Sctrs/Trk DPB54: DEFW 64 ; Sctrs/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ4-1 ; Disk Size - 1 DEFW HSIZ4-1 ; Disk Size - 1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+4*65)*16 ; Track offset = 16
DEFW 128+(1024*4)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -334,17 +330,17 @@ DPB54: DEFW 64 ; Sctrs/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ5 EQU 2048 ; # of blocks in Second Partition (1024 trks)
HSIZ5 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB55: DEFW 64 ; Sctrs/Trk - actually 256 DPB55: DEFW 64 ; Sctrs/Trk - actually 256
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ5-1 ; Disk Size-1 DEFW HSIZ5-1 ; Disk Size-1
DEFW 511 ; Dir Max-1
DEFB 0F0H,0 ; Alloc 0,1 - 4 blocks
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check Size DEFW 0 ; Check Size
DEFW (1+5*65)*16 ; Trk Offset = 1056
DEFW 128+(1024*5)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -361,17 +357,17 @@ DPB55: DEFW 64 ; Sctrs/Trk - actually 256
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ6 EQU 2048 ; # of blocks in third Partition (1024 tracks)
HSIZ6 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB56: DEFW 64 ; Scts/Trk DPB56: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ6-1 ; Disk Size-1 DEFW HSIZ6-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+6*65)*16 ; Track offset = 2096
DEFW 128+(1024*6)+2 ; Trk Offset
ENDIF ENDIF
;..... ;.....
@ -388,17 +384,17 @@ DPB56: DEFW 64 ; Scts/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ7 EQU 2048 ; # of blocks in Fourth Partition (1024 tracks)
HSIZ7 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB57: DEFW 64 ; Scts/Trk DPB57: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ7-1 ; Disk Size-1 DEFW HSIZ7-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+7*65)*16 ; Track offset = 3136
DEFW 128+(1024*7)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -414,17 +410,18 @@ DPB57: DEFW 64 ; Scts/Trk
; even though real layout is 256 physical ; even though real layout is 256 physical
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ8 EQU 2048 ; # of blocks in first Partition (1024 trks)
HSIZ8 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB58: DEFW 64 ; Sctrs/Trk DPB58: DEFW 64 ; Sctrs/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ8-1 ; Disk Size-1 DEFW HSIZ8-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 - 4 blocks
DEFB 0F0H,0 ; Alloc 0,1 - 4 blocks
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check Size DEFW 0 ; Check Size
DEFW 16 ; Trk Offset
DEFW 128+(1024*0)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -441,17 +438,17 @@ DPB58: DEFW 64 ; Sctrs/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ9 EQU 2048 ; # of blocks in Second Partition (1024 trks)
HSIZ9 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB59: DEFW 64 ; Scts/Trk DPB59: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ9-1 ; Disk Size-1 DEFW HSIZ9-1 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+65)*16 ; Track offset 1056
DEFW 128+(1024*1)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -468,17 +465,17 @@ DPB59: DEFW 64 ; Scts/Trk
; sectors per track ; sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ10 EQU 2048 ; # of blocks in Second Partition (1024 trks)
HSIZ10 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
; ;
DPB60: DEFW 64 ; Scts/Trk DPB60: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ10 ; Disk Size-1
DEFW 511 ; Dir Max-1 4 blocks
DEFB 0F0H,0 ; Alloc 0,1
DEFW HSIZ10-1 ; Disk Size-1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+2*65)*16 ; Track offset 2096
DEFW 128+(1024*2)+2 ; Trk Offset
ENDIF ENDIF
; ;
;..... ;.....
@ -492,18 +489,17 @@ DPB60: DEFW 64 ; Scts/Trk
DEFB 16 ; Logical Sectors per track DEFB 16 ; Logical Sectors per track
DEFB 0 ; Physical tracks/side (No Meaning in HD) DEFB 0 ; Physical tracks/side (No Meaning in HD)
HSIZ11 EQU 2048 ; # of blocks in Forth Logical Drive
; (1024 tracks)
HSIZ11 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks)
DPB61: DEFW 64 ; Scts/Trk DPB61: DEFW 64 ; Scts/Trk
DEFB 5 ; Blk Shf Fctr DEFB 5 ; Blk Shf Fctr
DEFB 31 ; Block Mask DEFB 31 ; Block Mask
DEFB 1 ; Extent Mask DEFB 1 ; Extent Mask
DEFW HSIZ11-1 ; Disk Size-1 DEFW HSIZ11-1 ; Disk Size-1
DEFW 511 ; Dir Max-1
DEFB 0F0H,0 ; Alloc 0,1
DEFW 1024-1 ; Dir Max-1
DEFB 0FFH,0 ; Alloc 0,1
DEFW 0 ; Check size DEFW 0 ; Check size
DEFW (1+3*65)*16 ; Track offset 3136
DEFW 128+(1024*3)+2 ; Trk Offset
ENDIF ENDIF
;=========== End of Hard Disk DPBs =========== ;=========== End of Hard Disk DPBs ===========

1
Source/BPBIOS/hard-ww.z80

@ -183,7 +183,6 @@ HDSK_RW1:
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL,(HB_DSKBUF) ; GET BUFFER ADDRESS LD HL,(HB_DSKBUF) ; GET BUFFER ADDRESS
;LD D,BID_HB ; BUFFER IN HBIOS BANK
LD A,(HB_BNKBIOS) ; BUFFER IN HBIOS BANK LD A,(HB_BNKBIOS) ; BUFFER IN HBIOS BANK
LD D,A ; PUT IN D LD D,A ; PUT IN D
LD E,1 ; ONE SECTOR LD E,1 ; ONE SECTOR

55
Source/BPBIOS/hbios.z80

@ -9,6 +9,7 @@
HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory
HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte
HBF_POKE EQU 0FBH ; HBIOS Func: Poke Byte HBF_POKE EQU 0FBH ; HBIOS Func: Poke Byte
HBF_SYSRES_INT EQU 0F000H ; HBIOS Func: Internal Reset
HBF_MEMINFO EQU 0F8F1H ; HBIOS Func: Get Memory Info HBF_MEMINFO EQU 0F8F1H ; HBIOS Func: Get Memory Info
HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info
; ;
@ -43,22 +44,23 @@ HBX_CPYLEN EQU 0FFE8H
; call here, make required changes, then update the ; call here, make required changes, then update the
; BIOSJT to point directly to the normal SELMEM routine for ; BIOSJT to point directly to the normal SELMEM routine for
; all subsequent calls. ; all subsequent calls.
; BPBIOS HBIOS Typical
; ------------ -------------- --------------
; -1: <COMMON> BID_COM 90h - 1 = 8Fh
; -2: TPABNK BID_USR 90h - 2 = 8Eh
; -3: <HBIOS> BID_BIOS 90h - 3 = 8Dh
; -4: SYSBNK BID_AUX 90h - 4 = 8Ch
; -9: BNKM BID_AUX-5 90h - 9 = 87h
; -16: RAMBNK RAMD0 90h - 16 = 80h
;
; When called, the incoming bank id will be the original hard-coded
; bank id prior to any adjustments. These original bank id's are
; coded to be an offset from the ending HBIOS RAM bank id which
; is (80h + RAM banks). See romwbw.lib. We update the requested
; bank id for this initial call to make it the proper absolute
; HBIOS bank id.
;
; See romwbw.lib for additional RAM bank layout information.
HB_SELMEM: HB_SELMEM:
PUSH AF
PUSH BC PUSH BC
PUSH DE PUSH DE
PUSH HL PUSH HL
PUSH AF ; Save incoming bank request
IF HB_DEBUG AND FALSE IF HB_DEBUG AND FALSE
CALL PRTSTRD CALL PRTSTRD
DEFB '[HB_SELMEM: $' DEFB '[HB_SELMEM: $'
@ -68,23 +70,30 @@ HB_SELMEM:
ENDIF ENDIF
LD BC,HBF_BNKINFO ; HBIOS BNKINFO function LD BC,HBF_BNKINFO ; HBIOS BNKINFO function
CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER
LD A,D ; BID_BIOS
LD (HB_BNKBIOS),A ; SET HB_BNKBIOS
ADD A,3 ; HBIOS + 3
LD (HB_BNKEND),A ; ... is the ending RAM bank
IF BANKED
LD (BNKADJ+1),A ; Dynamically update SELBNK
ENDIF
CALL HBX_INVOKE ; Do it, D=BIOS bank, E=USER (TPA) bank
LD A,D ; BIOS bank
LD (HB_BNKBIOS),A ; Save it for later (deblock & hard-ww)
LD A,E ; USER (TPA) bank
LD (TPABNK),A ; Update BP register
DEC A ; SYS bank is one below USER
LD (SYSBNK),A ; Update BP register
DEC A ; HBIOS BUF bank is one more below
;LD (UABNK),A ; Set BPBIOS USER bank
LD (RAMBNK),A ; Update BP RAM disk bank register
LD (MAXBNK),A ; Update ending bank register
LD HL,SELMEM ; Future SELMEM calls will LD HL,SELMEM ; Future SELMEM calls will
LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM
POP BC ; Recover requested bank to B
LD A,(TPABNK) ; Get TPA bank
ADD 2 ; Offset to ending RAM bank id
ADD B ; Adjust for incoming request
POP HL POP HL
POP DE POP DE
POP BC POP BC
POP AF
JP SELMEM
JP SELMEM ; Continue to normal SELMEM
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Move Data - Possibly between banks. This resembles CP/M 3, but ; Move Data - Possibly between banks. This resembles CP/M 3, but
@ -97,15 +106,10 @@ HB_SELMEM:
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
HB_MOVE: HB_MOVE:
PUSH HL
LD HL,HB_BNKEND
LD A,(HB_SRCBNK) LD A,(HB_SRCBNK)
ADD A,(HL) ; Adjust for HBIOS bank ids
LD (HBX_SRCBNK),A LD (HBX_SRCBNK),A
LD A,(HB_DSTBNK) LD A,(HB_DSTBNK)
ADD A,(HL) ; Adjust for HBIOS bank ids
LD (HBX_DSTBNK),A LD (HBX_DSTBNK),A
POP HL
CALL HBX_BNKCPY CALL HBX_BNKCPY
PUSH HL PUSH HL
LD HL,(TPABNK) ; Get TPA Bank # LD HL,(TPABNK) ; Get TPA Bank #
@ -141,6 +145,5 @@ HB_XMOVE:
HB_SRCBNK: DEFS 1 ; Move Source Bank # HB_SRCBNK: DEFS 1 ; Move Source Bank #
HB_DSTBNK: DEFS 1 ; Move Destination Bank # HB_DSTBNK: DEFS 1 ; Move Destination Bank #
HB_BNKBIOS: DEFS 1 ; Bank id of HBIOS bank HB_BNKBIOS: DEFS 1 ; Bank id of HBIOS bank
HB_BNKEND: DEFS 1 ; End of available RAM banks (last bank + 1)
HB_DSKBUF: DEFS 2 ; Address of physical disk buffer in HBIOS bank HB_DSKBUF: DEFS 2 ; Address of physical disk buffer in HBIOS bank
 

18
Source/BPBIOS/ibmv-ww.z80

@ -115,10 +115,22 @@ SELMEM: LD (USRBNK),A ; Update user bank
; Must preserve all Registers including Flags. ; Must preserve all Registers including Flags.
; All Bank Switching MUST be done by this routine ; All Bank Switching MUST be done by this routine
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; Parameter to BNKADJ (ADD) is set dynamically at initialization.
SELBNK: PUSH AF ; Save regs SELBNK: PUSH AF ; Save regs
SELBN0: LD (CURBNK),A ; Save as current bank # SELBN0: LD (CURBNK),A ; Save as current bank #
BNKADJ: ADD A,90H ; Adjust for HBIOS bank ids
IF HB_DEBUG AND FALSE
CALL PRTSTRD
DEFB '[SELBNK: $'
CALL PRTHEXBYTE
CALL PRTSTRD
DEFB ']$'
ENDIF
CALL HBX_BNKSEL CALL HBX_BNKSEL
POP AF ; restore regs POP AF ; restore regs
RET RET
@ -172,7 +184,7 @@ FRGETB:
PUSH BC ; Save BC PUSH BC ; Save BC
PUSH DE ; Save DE PUSH DE ; Save DE
LD B,0FAH ; HBIOS Peek function LD B,0FAH ; HBIOS Peek function
LD D,C ; Bank in D
LD D,C
CALL HBX_INVOKE ; Do it CALL HBX_INVOKE ; Do it
LD A,E ; Value to A LD A,E ; Value to A
POP DE ; Restore DE POP DE ; Restore DE
@ -203,8 +215,8 @@ FRPUTB:
PUSH BC ; Save BC PUSH BC ; Save BC
PUSH DE ; Save DE PUSH DE ; Save DE
LD B,0FBH ; HBIOS Poke function LD B,0FBH ; HBIOS Poke function
LD D,C ; Bank in D
LD E,A ; Value in E LD E,A ; Value in E
LD D,C
CALL HBX_INVOKE ; Do it CALL HBX_INVOKE ; Do it
POP DE ; Restore DE POP DE ; Restore DE
POP BC ; Restore BC POP BC ; Restore BC

33
Source/BPBIOS/romwbw.lib

@ -48,20 +48,33 @@ DRV_P SET NO ; YES if system has flopy drives
; ;
; RAM/ROM Bank Reserve ; RAM/ROM Bank Reserve
; ;
HB_RAMRESV EQU 8 ; RAM reserve is 8 banks
HB_RAMRESV EQU 5 ; RAM reserve is 5 banks
HB_ROMRESV EQU 4 ; ROM reserve is 4 banks HB_ROMRESV EQU 4 ; ROM reserve is 4 banks
; ;
; Layout of RAM banks ; Layout of RAM banks
; ;
; TODO: Query system via HBIOS API to determine the actual bank
; assignments, then adjust BPBIOS operation accordingly.
;
BID_RAMD EQU -16 ; 90h - 16 = 80h
BID_RAMM EQU -9 ; 90h - 9 = 87h
BID_SYS EQU -4 ; 90h - 4 = 8Ch
BID_HB EQU -3 ; 90h - 3 = 8Dh
BID_USR EQU -2 ; 90h - 2 = 8Eh
BID_COM EQU -1 ; 90h - 1 = 8Fh
; The BID_xxx values below are used to set the initial values of
; the BPBIOS bank registers (see def-ww-xxx.lib and HB_SELMEM in
; hbios.z80). The running values of the BPBIOS bank registers (TPABNK,
; SYSBNK, etc.) are set to absolute HBIOS bank ids in hbios.z80 during
; startup.
;
; The values below are expressed as an offset from the ending HBIOS
; RAM bank id. They map to HBIOS bank ids
; by subtracting from the ending HBIOS bank id (N). HBIOS RAM bank ids
; start at 80h. The ending HBIOS bank id is (80h + RAM banks). The
; typical layout assumes 16 banks of RAM starting at HBIOS bank id 80h
; and ending at bank id 90h (N = 90h).
;
; BPBIOS HBIOS (TYPICAL)
; -------------------------------------- ---------------
; <HBIOS> 80h (80h)
; <RAMD> 81h (81h)
; <RAMM> N - 5 (8Bh)
BID_BUF EQU -4 ; BNK3 -> RAMBNK N - 4 (8Ch)
BID_SYS EQU -3 ; BNK2 -> SYSBNK N - 3 (8Dh)
BID_USR EQU -2 ; BNK0 -> TPABNK N - 2 (8Eh)
BID_COM EQU -1 ; BNK1 -> N - 1 (8Fh)
; ;
HB_EI MACRO HB_EI MACRO
EI EI

6
Source/Build.cmd

@ -4,11 +4,13 @@ setlocal
:: call BuildDoc || exit /b :: call BuildDoc || exit /b
call BuildProp || exit /b call BuildProp || exit /b
call BuildShared || exit /b call BuildShared || exit /b
:: call BuildBP || exit /b
call BuildBP || exit /b
call BuildImages || exit /b call BuildImages || exit /b
call BuildROM %* || exit /b call BuildROM %* || exit /b
call BuildZRC || exit /b call BuildZRC || exit /b
call BuildZZRC || exit /b
call BuildZ1RCC || exit /b
call BuildZZRCC || exit /b
call BuildZRC512 || exit /b
if "%1" == "dist" ( if "%1" == "dist" (
call Clean || exit /b call Clean || exit /b

1
Source/BuildShared.cmd

@ -4,6 +4,7 @@ setlocal
pushd HDIAG && call Build || exit /b & popd pushd HDIAG && call Build || exit /b & popd
pushd CBIOS && call Build || exit /b & popd pushd CBIOS && call Build || exit /b & popd
pushd CPM22 && call Build || exit /b & popd pushd CPM22 && call Build || exit /b & popd
pushd QPM && call Build || exit /b & popd
pushd ZCPR && call Build || exit /b & popd pushd ZCPR && call Build || exit /b & popd
pushd ZCPR-DJ && call Build || exit /b & popd pushd ZCPR-DJ && call Build || exit /b & popd
pushd ZSDOS && call Build || exit /b & popd pushd ZSDOS && call Build || exit /b & popd

4
Source/BuildZ1RCC.cmd

@ -0,0 +1,4 @@
@echo off
setlocal
pushd Z1RCC && call Build || exit /b & popd

4
Source/BuildZRC512.cmd

@ -0,0 +1,4 @@
@echo off
setlocal
pushd ZRC512 && call Build || exit /b & popd

4
Source/BuildZZRC.cmd

@ -1,4 +0,0 @@
@echo off
setlocal
pushd ZZRC && call Build || exit /b & popd

4
Source/BuildZZRCC.cmd

@ -0,0 +1,4 @@
@echo off
setlocal
pushd ZZRCC && call Build || exit /b & popd

190
Source/CBIOS/cbios.asm

@ -1350,7 +1350,6 @@ DSK_SELECT1A:
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
RST 08 ; GET UNIT INFO, DEVICE TYPE IN D RST 08 ; GET UNIT INFO, DEVICE TYPE IN D
LD A,D ; DEVICE TYPE -> A LD A,D ; DEVICE TYPE -> A
AND $F0 ; ISOLATE HIGH BITS
CP DIODEV_FD ; FLOPPY? CP DIODEV_FD ; FLOPPY?
JR NZ,DSK_SELECT1B ; IF NOT, DO LBA IO JR NZ,DSK_SELECT1B ; IF NOT, DO LBA IO
LD HL,SEKLBA+3 ; POINT TO HIGH ORDER BYTE LD HL,SEKLBA+3 ; POINT TO HIGH ORDER BYTE
@ -1511,8 +1510,8 @@ DSK_MBR3:
; ;
DSK_MBR4: DSK_MBR4:
; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE ; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE
LD HL,16384 ; NEW SECTORS PER SLICE
LD (SPS),HL ; SAVE IT
LD HL,16384 ; NEW SECTORS PER SLICE
LD (SPS),HL ; SAVE IT
; UPDATE MEDIA ID ; UPDATE MEDIA ID
LD A,MID_HDNEW ; NEW MEDIA ID LD A,MID_HDNEW ; NEW MEDIA ID
@ -1520,20 +1519,80 @@ DSK_MBR4:
; ;
DSK_MBR5: DSK_MBR5:
; ADJUST LBA OFFSET BASED ON TARGET SLICE ; ADJUST LBA OFFSET BASED ON TARGET SLICE
LD A,(SLICE) ; GET SLICE, A IS LOOP CNT
LD HL,(SEKLBA) ; SET DE:HL
LD DE,(SEKLBA+2) ; ... TO STARTING LBA
LD BC,(SPS) ; SECTORS PER SLICE
LD A,(SLICE) ; GET SLICE, A IS LOOP CNT
LD HL,(SEKLBA) ; SET DE:HL
LD DE,(SEKLBA+2) ; ... TO STARTING LBA
LD BC,(SPS) ; SECTORS PER SLICE
RES 7,D ; CLEAR LBA MODE BIT
DSK_MBR6: DSK_MBR6:
OR A ; SET FLAGS TO CHECK LOOP CNTR
JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED
ADD HL,BC ; ADD ONE SLICE TO LOW WORD
JR NC,DSK_MBR7 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD
OR A ; SET FLAGS TO CHECK LOOP CNTR
JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED
ADD HL,BC ; ADD ONE SLICE TO LOW WORD
JR NC,DSK_MBR7 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD
DSK_MBR7: DSK_MBR7:
DEC A ; DEC LOOP DOWNCOUNTER
JR DSK_MBR6 ; AND LOOP
DEC A ; DEC LOOP DOWNCOUNTER
JR DSK_MBR6 ; AND LOOP
DSK_MBR8: DSK_MBR8:
; LBA OFFSET OF DESIRED SLICE IS NOW IN DE:HL
; NEED TO CHECK IF THE SLICE IS BEYOND CAPACITY OF MEDIA
; IF LBA_OFF + SPS >= DSK_CAP, ERROR!
;
; SAVE LBA_OFF
PUSH DE ; MSW
PUSH HL ; LSW
;
; ADD SPS TO COMPUTE LBA_REQ
LD BC,(SPS) ; SECTORS PER SLICE
ADD HL,BC ; ADD ONE SLICE TO LOW WORD
JR NC,DSK_MBR9 ; CHECK FOR CARRY
INC DE ; IF SO, BUMP HIGH WORD
DSK_MBR9:
; SAVE CAP_REQ
LD (CAP_REQ),HL ; LSW
LD (CAP_REQ+2),DE ; MSW
;
#IFDEF PLTWBW
; GET DSK_CAP (DE:HL)
LD B,BF_DIOCAP ; HBIOS DISK CAPACITY FUNC
LD A,(SEKUNIT) ; DISK UNIT NUMBER
LD C,A ; ... INTO C
RST 08 ; HBIOS CALL (DE:HL = CAPACITY)
#ENDIF
;
#IFDEF PLTUNA
; GET DSK_CAP (DE:HL)
LD C,$45 ; UBIOS DISK INFO FUNC
LD A,(SEKUNIT) ; DISK UNIT NUMBER
LD B,A ; ... INTO B
RST 08 ; CALL UNA (DE:HL = CAPACITY)
#ENDIF
;
; SAVE DSK_CAP (DE:HL)
PUSH DE ; SAVE DSK_CAP (MSW)
PUSH HL ; SAVE DSK_CAP (LSW)
;
; CHECK DSK_CAP >= CAP_REQ, CF SET ON OVERFLOW
; NO NEED SAVE ACTUAL RESULT
OR A ; CLEAR CARRY FOR SBC
POP HL ; DSK_CAP LSW
LD DE,(CAP_REQ) ; CAP_REQ LSW
SBC HL,DE ; DSK_CAP - LBA_REQ (LSW)
POP HL ; DSK_CAP MSW
LD DE,(CAP_REQ+2) ; CAP_REQ MSW
SBC HL,DE ; DSK_CAP - LBA_REQ (MSW)
;
; RESTORE LBA_OFF
POP HL ; LSW
POP DE ; MSW
;
; ABORT ON OVERFLOW WITH ERROR!
JR NC,DSK_MBR10 ; IF NO OVERFLOW, CONTINUE
OR $FF ; SIGNAL ERROR
RET ; DONE
;
DSK_MBR10:
; FINALIZE SLICE LBA
SET 7,D ; SET LBA ACCESS FLAG SET 7,D ; SET LBA ACCESS FLAG
; RESAVE IT ; RESAVE IT
LD (SEKLBA),HL ; LOWORD LD (SEKLBA),HL ; LOWORD
@ -1758,6 +1817,7 @@ CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID
SLICE .DB 0 ; CURRENT SLICE SLICE .DB 0 ; CURRENT SLICE
SPS .DW 0 ; SECTORS PER SLICE SPS .DW 0 ; SECTORS PER SLICE
CAP_REQ .DW 0,0 ; LBA CAP REQUIRED FOR SLICE
STKSAV .DW 0 ; TEMP SAVED STACK POINTER STKSAV .DW 0 ; TEMP SAVED STACK POINTER
; ;
#IFDEF PLTWBW #IFDEF PLTWBW
@ -2291,8 +2351,8 @@ INIT2:
LD C,(HL) ; PUT UNIT NUM IN C LD C,(HL) ; PUT UNIT NUM IN C
RST 08 ; CALL HBIOS RST 08 ; CALL HBIOS
LD A,C ; GET ATTRIBUTES LD A,C ; GET ATTRIBUTES
AND %00111000 ; ISOLATE TYPE BITS
CP %00101000 ; TYPE = RAM?
AND %10001111 ; ISOLATE TYPE BITS
CP %00000101 ; NOT FLOPPY, TYPE = RAM?
JR NZ,INIT2X ; IF NOT THEN DONE JR NZ,INIT2X ; IF NOT THEN DONE
; ;
; CHECK IF SECOND UNIT IS ROM OR FLASH ; CHECK IF SECOND UNIT IS ROM OR FLASH
@ -2303,10 +2363,10 @@ INIT2:
LD C,(HL) ; PUT UNIT NUM IN C LD C,(HL) ; PUT UNIT NUM IN C
RST 08 ; CALL HBIOS RST 08 ; CALL HBIOS
LD A,C ; GET ATTRIBUTES LD A,C ; GET ATTRIBUTES
AND %00111000 ; ISOLATE TYPE BITS
CP %00100000 ; TYPE = ROM?
AND %10001111 ; ISOLATE TYPE BITS
CP %00000100 ; NOT FLOPPY, TYPE = ROM?
JR Z,INIT2A ; IF SO, ADJUST DEF DRIVE JR Z,INIT2A ; IF SO, ADJUST DEF DRIVE
CP %00111000 ; TYPE = FLASH?
CP %00000111 ; NOT FLOPPY, TYPE = FLASH?
JR NZ,INIT2X ; IF NOT THEN DONE JR NZ,INIT2X ; IF NOT THEN DONE
; ;
INIT2A: INIT2A:
@ -2529,24 +2589,21 @@ MD_INIT:
; UDPATE THE RAM/ROM DPB STRUCTURES BASED ON HARDWARE ; UDPATE THE RAM/ROM DPB STRUCTURES BASED ON HARDWARE
; ;
#IFDEF PLTWBW #IFDEF PLTWBW
; TODO: HANDLE DISABLED RAM/ROM DISK BETTER.
; IF RAM OR ROM DISK ARE DISABLED, BELOW WILL STILL
; TRY TO ADJUST THE DPB BASED ON RAM BANK CALCULATIONS.
; IT SHOULD NOT MATTER BECAUSE THE DPB SHOULD NEVER BE
; USED. IT WOULD BE BETTER TO GET RAMD0/ROMD0 AND
; RAMDN/ROMDN FROM THE HCB AND USE THOSE TO CALC THE
; DPB ADJUSTMENT. IF DN-D0=0, BYPASS ADJUSTMENT.
LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT
SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES
LD IX,DPB_ROM ; ADDRESS OF DPB
CALL MD_INIT1 ; FIX IT UP
;
LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT
SUB 8 ; REDUCE BANK COUNT BY RESERVED PAGES
LD IX,DPB_RAM ; ADDRESS OF DPB
CALL MD_INIT1 ; FIX IT UP
;
JR MD_INIT4 ; DONE
; NOTE: ROM AND/OR RAM DISK MAY NOT BE ACTIVE, BUT WE GO
; AHEAD AND UPDATE BOTH DPBS ANYWAY. IT CAUSES NO HARM SINCE
; INACTIVE RAM/ROM DISK WILL NEVER BE ACCESSED.
;
; ROM DISK
LD A,(HCB + HCB_ROMD_BNKS) ; ROM DISK SIZE IN BANKS
LD IX,DPB_ROM ; ADDRESS OF DPB
CALL MD_INIT1 ; FIX IT UP
;
; RAM DISK
LD A,(HCB + HCB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS
LD IX,DPB_RAM ; ADDRESS OF DPB
CALL MD_INIT1 ; FIX IT UP
;
JR MD_INIT4 ; DONE
; ;
MD_INIT1: MD_INIT1:
; ;
@ -2904,52 +2961,51 @@ DRV_INIT:
LD HL,DRVLST ; INIT HL PTR TO DRIVE LIST LD HL,DRVLST ; INIT HL PTR TO DRIVE LIST
; ;
DRV_INIT2: DRV_INIT2:
PUSH BC ; SAVE LOOP CNT & UNIT
CALL DRV_INIT3 ; CHECK DRIVE CALL DRV_INIT3 ; CHECK DRIVE
POP BC ; RECOVER LOOP CNT & UNIT
INC C ; NEXT UNIT INC C ; NEXT UNIT
DJNZ DRV_INIT2 ; LOOP DJNZ DRV_INIT2 ; LOOP
LD A,D ; TOTAL DEVICE COUNT TO D
LD A,D ; TOTAL DEVICE COUNT TO A
LD (DRVLSTC),A ; SAVE THE COUNT LD (DRVLSTC),A ; SAVE THE COUNT
JR DRV_INIT4 ; CONTINUE JR DRV_INIT4 ; CONTINUE
; ;
DRV_INIT3: DRV_INIT3:
; GET DEVICE ATTRIBUTES
PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER)
PUSH HL ; SAVE DRIVE LIST PTR PUSH HL ; SAVE DRIVE LIST PTR
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
RST 08 ; CALL HBIOS, UNIT TO C RST 08 ; CALL HBIOS, UNIT TO C
LD A,D ; DEVICE TYPE TO A
LD A,C ; DEVICE ATTRIBUTES TO A
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
POP HL ; RESTORE DRIVE LIST PTR POP HL ; RESTORE DRIVE LIST PTR
POP DE ; RESTORE DE POP DE ; RESTORE DE
CP DIODEV_IDE ; HARD DISK DEVICE?
JR NC,DRV_INIT3A ; IF SO, HANDLE SPECIAL
LD (HL),C ; SAVE UNIT NUM IN LIST
INC HL ; BUMP PTR
INC D ; INC TOTAL DEVICE COUNT
RET
LD B,A ; ATTRIBUTES TO B
; ;
DRV_INIT3A:
; CHECK FOR ACTIVE AND RETURN IF NOT
; IF DEVICE IS NOT REMOVABLE, THEN CHECK TO ENSURE IT IS
; ACTUALLY ONLINE. IF NOT, SKIP UNIT ENTIRELY.
BIT 6,B ; REMOVABLE?
JR NZ,DRV_INIT3A ; IF SO, SKIP MEDIA CHECK
PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER)
PUSH HL ; SAVE DRIVE LIST PTR PUSH HL ; SAVE DRIVE LIST PTR
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
LD B,BF_DIOMEDIA ; HBIOS FUNC: SENSE MEDIA LD B,BF_DIOMEDIA ; HBIOS FUNC: SENSE MEDIA
LD E,1 ; PERFORM MEDIA DISCOVERY LD E,1 ; PERFORM MEDIA DISCOVERY
RST 08
RST 08 ; DO IT
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
POP HL ; RESTORE DRIVE LIST PTR POP HL ; RESTORE DRIVE LIST PTR
POP DE ; RESTORE DE POP DE ; RESTORE DE
RET NZ ; IF NO MEDIA, JUST RETURN
; IF ACTIVE...
RET NZ ; OFFLINE, SKIP ENTIRE UNIT
;
DRV_INIT3A:
LD (HL),C ; SAVE UNIT NUM IN LIST LD (HL),C ; SAVE UNIT NUM IN LIST
INC HL ; BUMP PTR INC HL ; BUMP PTR
INC D ; INC TOTAL DEVICE COUNT INC D ; INC TOTAL DEVICE COUNT
BIT 5,B ; HIGH CAPACITY?
RET Z ; DONE IF NOT
INC E ; INCREMENT HARD DISK COUNT INC E ; INCREMENT HARD DISK COUNT
RET ; AND RETURN
RET ; DONE
; ;
DRV_INIT4: ; SET SLICES PER VOLUME (HDSPV) BASED ON HARD DISK VOLUME COUNT DRV_INIT4: ; SET SLICES PER VOLUME (HDSPV) BASED ON HARD DISK VOLUME COUNT
LD A,E ; HARD DISK VOLUME COUNT TO A LD A,E ; HARD DISK VOLUME COUNT TO A
@ -2978,7 +3034,8 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE
LD C,(HL) ; GET UNIT NUM FROM LIST LD C,(HL) ; GET UNIT NUM FROM LIST
PUSH BC ; PRESERVE LOOP CONTROL PUSH BC ; PRESERVE LOOP CONTROL
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
RST 08 ; CALL HBIOS, D := DEVICE TYPE
RST 08 ; CALL HBIOS, C := DEVICE ATTRIBUTES
LD A,C ; DEVICE ATTRIBUTES TO A
POP BC ; GET UNIT INDEX BACK IN C POP BC ; GET UNIT INDEX BACK IN C
PUSH BC ; RESAVE LOOP CONTROL PUSH BC ; RESAVE LOOP CONTROL
CALL DRV_INIT7 ; MAKE DRIVE MAP ENTRY(S) CALL DRV_INIT7 ; MAKE DRIVE MAP ENTRY(S)
@ -2992,10 +3049,9 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE
DRV_INIT7: ; PROCESS UNIT DRV_INIT7: ; PROCESS UNIT
LD E,0 ; INITIALIZE SLICE INDEX LD E,0 ; INITIALIZE SLICE INDEX
LD B,1 ; DEFAULT LOOP COUNTER LD B,1 ; DEFAULT LOOP COUNTER
LD A,D ; DEVICE TYPE TO ACCUM
LD D,C ; UNIT NUMBER TO D LD D,C ; UNIT NUMBER TO D
CP DIODEV_IDE ; HARD DISK DEVICE?
JR C,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1
BIT 5,A ; HIGH CAPACITY DEVICE?
JR Z,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1
LD A,(HDSPV) ; GET SLICES PER VOLUME TO ACCUM LD A,(HDSPV) ; GET SLICES PER VOLUME TO ACCUM
LD B,A ; MOVE TO B FOR LOOP COUNTER LD B,A ; MOVE TO B FOR LOOP COUNTER
; ;
@ -3350,10 +3406,6 @@ DEVUNK .DB "UNK$"
RST 08 ; CALL HBIOS RST 08 ; CALL HBIOS
LD A,D ; RESULTANT DEVICE TYPE LD A,D ; RESULTANT DEVICE TYPE
PUSH DE ; NEED TO SAVE UNIT NUMBER (IN E) PUSH DE ; NEED TO SAVE UNIT NUMBER (IN E)
RRCA ; ROTATE DEVICE
RRCA ; ... BITS
RRCA ; ... INTO
RRCA ; ... LOWEST 4 BITS
AND $0F ; ISOLATE DEVICE BITS AND $0F ; ISOLATE DEVICE BITS
ADD A,A ; MULTIPLY BY TWO FOR WORD TABLE ADD A,A ; MULTIPLY BY TWO FOR WORD TABLE
LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE
@ -3392,11 +3444,11 @@ DEV06 .DB "SD$"
DEV07 .DB "PRPSD$" DEV07 .DB "PRPSD$"
DEV08 .DB "PPPSD$" DEV08 .DB "PPPSD$"
DEV09 .DB "HDSK$" DEV09 .DB "HDSK$"
DEV10 .EQU DEVUNK
DEV11 .EQU DEVUNK
DEV12 .EQU DEVUNK
DEV13 .EQU DEVUNK
DEV14 .EQU DEVUNK
DEV10 .DB "PPA$"
DEV11 .DB "IMM$"
DEV12 .DB "SYQ$"
DEV13 .DB "CHUSB$"
DEV14 .DB "CHSD$"
DEV15 .EQU DEVUNK DEV15 .EQU DEVUNK
; ;
#ENDIF #ENDIF
@ -3406,7 +3458,7 @@ DIRBUF .DW 0 ; DIR BUF POINTER
HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP
BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT UNIT, LSB=BOOT SLICE BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT UNIT, LSB=BOOT SLICE
HDSPV .DB 2 ; SLICES PER VOLUME FOR HARD DISKS (MUST BE >= 1) HDSPV .DB 2 ; SLICES PER VOLUME FOR HARD DISKS (MUST BE >= 1)
DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURINT DRV_INIT
DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURING DRV_INIT
DRVLSTC .DB 0 ; ENTRY COUNT FOR ACTIVE DRIVE LIST DRVLSTC .DB 0 ; ENTRY COUNT FOR ACTIVE DRIVE LIST
; ;
#IFDEF PLTWBW #IFDEF PLTWBW

3
Source/CPM3/biosldr.z80

@ -346,8 +346,7 @@ read:
ld b,17h ; HBIOS DEVICE function ld b,17h ; HBIOS DEVICE function
rst 08 ; Do it, D=device type rst 08 ; Do it, D=device type
ld a,d ; put in accum ld a,d ; put in accum
and 0F0h ; isolate high bits
cp 10h ; floppy?
cp 01h ; floppy?
jr nz,read2 ; if not, do LBA i/o jr nz,read2 ; if not, do LBA i/o
; Floppy I/O ; Floppy I/O

81
Source/CPM3/boot.z80

@ -13,7 +13,7 @@
extrn @dtbl,@ctbl extrn @dtbl,@ctbl
extrn @date,@hour,@min,@sec extrn @date,@hour,@min,@sec
extrn @srch1 extrn @srch1
extrn @hbbio
extrn @hbbio,@hbusr
extrn addhla extrn addhla
extrn phex16, phex8 extrn phex16, phex8
extrn cin, cout extrn cin, cout
@ -44,9 +44,9 @@ tpa$bank equ 0
if banked if banked
; Clone page zero from bank 0 to additional banks ; Clone page zero from bank 0 to additional banks
ld b,4 ; last bank
ld b,2 ; last bank
ld c,0 ; src bank ld c,0 ; src bank
init$2:
init$1:
push bc ; save bank id's push bc ; save bank id's
call ?xmove ; set src/dest banks call ?xmove ; set src/dest banks
ld bc,0100h ; size is one page ld bc,0100h ; size is one page
@ -54,7 +54,7 @@ init$2:
ld de,0 ; src adr is 0 ld de,0 ; src adr is 0
call ?move ; do it call ?move ; do it
pop bc ; restore bank id's pop bc ; restore bank id's
djnz init$2 ; loop till done
djnz init$1 ; loop till done
endif endif
@ -62,6 +62,35 @@ init$2:
ld hl,signon$msg ; signon message ld hl,signon$msg ; signon message
call ?pmsg ; print it call ?pmsg ; print it
if banked
; Confirm that HBIOS is configured with enough RAM banks
; to accommodate banked version of CP/M 3. We use 2
; additional banks which live below the user bank. So we
; check that the these don't overlap with the RomWBW HBIOS
; bank.
ld bc,0F8F2h ; HBIOS GET BNKINFO
call 0FFF0h ; D: BIOS Bank, E: User Bank
ld a,d
ld (@hbbio),a
ld a,e
ld (@hbusr),a
sub 3 ; 2 extra banks (+1 for compare)
cp d ; lowest cpm bank - hbios bank
jr nc,init$2 ; continue if space available
ld hl,noram$msg ; signon message
call ?pmsg ; print it
ld b,0F0h ; HBIOS system reset
ld c,1h ; reset type warm (back to loader)
call 0FFFFh ; do it
endif
init$2:
; Check for HBIOS/CBIOS mismatch ; Check for HBIOS/CBIOS mismatch
ld b,0F1h ; hbios version ld b,0F1h ; hbios version
rst 08 ; do it, de=maj/min/up/pat rst 08 ; do it, de=maj/min/up/pat
@ -156,7 +185,9 @@ dinit:
ld hl,drvlst ; init hl ptr to drive list ld hl,drvlst ; init hl ptr to drive list
; ;
dinit2: dinit2:
push bc ; save loop cnt & unit
call dinit3 ; check drive call dinit3 ; check drive
pop bc ; recover loop cnt & unit
inc c ; next unit inc c ; next unit
djnz dinit2 ; loop djnz dinit2 ; loop
ld a,d ; total device count to d ld a,d ; total device count to d
@ -169,39 +200,35 @@ dinit3:
push bc ; save loop control push bc ; save loop control
ld b,17h ; hbios func: report device info ld b,17h ; hbios func: report device info
rst 08 ; call hbios, unit to c rst 08 ; call hbios, unit to c
ld a,d ; device type to a
ld a,c ; device attributes to a
pop bc ; restore loop control pop bc ; restore loop control
pop hl ; restore drive list ptr pop hl ; restore drive list ptr
pop de ; restore de pop de ; restore de
cp 30h ; hard disk device?
jr nc,dinit3a ; if so, handle special
ld (hl),c ; save unit num in list
inc hl ; bump ptr
inc d ; inc total device count
ret
ld b,a ; attributes to b
; ;
dinit3a:
; check for active and return if not
; if device is not removable, then check to ensure it is
; actually online. if not, skip unit entirely.
bit 6,b ; removable?
jr nz,dinit3a ; if so, skip media check
push de ; save de (hard disk volume counter) push de ; save de (hard disk volume counter)
push hl ; save drive list ptr push hl ; save drive list ptr
push bc ; save loop control push bc ; save loop control
ld b,18h ; hbios func: sense media ld b,18h ; hbios func: sense media
ld e,1 ; perform media discovery ld e,1 ; perform media discovery
rst 08
rst 08 ; do it
pop bc ; restore loop control pop bc ; restore loop control
pop hl ; restore drive list ptr pop hl ; restore drive list ptr
pop de ; restore de pop de ; restore de
ret nz ; if no media, just return
; if active...
ret nz ; offline, skip entire unit
;
dinit3a:
ld (hl),c ; save unit num in list ld (hl),c ; save unit num in list
inc hl ; bump ptr inc hl ; bump ptr
inc d ; inc total device count inc d ; inc total device count
bit 5,b ; high capacity?
ret z ; done if not
inc e ; increment hard disk count inc e ; increment hard disk count
ret ; and return
ret ; done
dinit4: ; set slices per volume (hdspv) based on hard disk volume count dinit4: ; set slices per volume (hdspv) based on hard disk volume count
ld a,e ; hard disk volume count to a ld a,e ; hard disk volume count to a
@ -238,7 +265,8 @@ dinit6:
push bc ; preserve loop control push bc ; preserve loop control
push hl ; preserve dph pointer push hl ; preserve dph pointer
ld b,17h ; hbios func: report device info ld b,17h ; hbios func: report device info
rst 08 ; call hbios, d := device type
rst 08 ; call hbios, a := device attributes
ld a,c ; device attributes to a
pop hl ; restore dph pointer pop hl ; restore dph pointer
pop bc ; get unit index back in c pop bc ; get unit index back in c
push bc ; resave loop control push bc ; resave loop control
@ -253,10 +281,9 @@ dinit6:
dinit7: ; process a unit (all slices) dinit7: ; process a unit (all slices)
ld e,0 ; initialize slice index ld e,0 ; initialize slice index
ld b,1 ; default loop counter ld b,1 ; default loop counter
ld a,d ; device type to accum
ld d,c ; unit number to d ld d,c ; unit number to d
cp 030h ; hard disk device?
jr c,dinit8 ; nope, leave loop count at 1
bit 5,a ; high capacity device?
jr z,dinit8 ; nope, leave loop count at 1
ld a,(hdspv) ; get slices per volume to accum ld a,(hdspv) ; get slices per volume to accum
ld b,a ; move to b for loop counter ld b,a ; move to b for loop counter
@ -733,6 +760,10 @@ clrflg db 0 ; RAM disk cleared flag
clr$msg db 'RAM Disk Initialized',13,10,13,10,0 clr$msg db 'RAM Disk Initialized',13,10,13,10,0
vermis$msg db 7,'*** WARNING: HBIOS/CBIOS Version Mismatch ***',13,10,13,10,0 vermis$msg db 7,'*** WARNING: HBIOS/CBIOS Version Mismatch ***',13,10,13,10,0
if banked
noram$msg db 7,'*** ERROR: Insufficient RAM for banked CP/M 3 ***',13,10,13,10,0
endif
if zpm if zpm
signon$msg db 13,10,'ZPM3' signon$msg db 13,10,'ZPM3'

124
Source/CPM3/diskio.z80

@ -38,7 +38,7 @@
extrn ?bnkxlt extrn ?bnkxlt
extrn phex8, cout
extrn phex16, phex8, cout, crlf, crlf2
; CP/M 3 Disk definition macros ; CP/M 3 Disk definition macros
@ -355,38 +355,30 @@ dpb$hdnew: ; 8MB Hard Disk Drive (new format)
; called for first time initialization. ; called for first time initialization.
dsk$init: dsk$init:
; TODO: Handle disabled RAM/ROM disk better.
; If RAM or ROM disk are disabled, below will still
; try to adjust the DPB based on RAM bank calculations.
; It should not matter because the DPB should never be
; used. It would be better to get RAMD0/ROMD0 and
; RAMDN/ROMDN from the HCB and use those to calc the
; DPB adjustment. If DN-D0=0, bypass adjustment.
ld b,0FAh ; HBIOS Peek Function
ld a,(@hbbio) ; HBIOS bank id
ld d,a ; ... goes in D
ld hl,10Ch ; Offset 10Ch is ROM bank cnt
rst 08 ; Call HBIOS, value in E
ld a,e ; move count to accum
sub 4 ; reduce by # reserved banks
ld ix,dpb$rom ; address of DPB
; NOTE: ROM and/or RAM disk may not be active, but we go
; ahead and update both DPBs anyway. It causes no harm since
; inactive RAM/ROM disk will never be accessed.
ld hl,1DFh ; ROM disk bank cnt in HCB
ld ix,dpb$rom ; address of ROM Disk DPB
call dsk$init1 ; fix it up call dsk$init1 ; fix it up
ld hl,1DDh ; RAM dsik bank cnt in HCB
ld ix,dpb$ram ; address of RAM Disk DPB
call dsk$init1 ; fix it up
ret ; done
dsk$init1:
; Get bank count of RAM/ROM disk
ld b,0FAh ; HBIOS Peek Function ld b,0FAh ; HBIOS Peek Function
ld a,(@hbbio) ; HBIOS bank id ld a,(@hbbio) ; HBIOS bank id
ld d,a ; ... goes in D ld d,a ; ... goes in D
ld hl,10Bh ; Offset 10Bh is RAM bank cnt
rst 08 ; Call HBIOS, value in E rst 08 ; Call HBIOS, value in E
ld a,e ; move count to accum
sub 8 ; reduce by # reserved banks
ld ix,dpb$ram ; address of DPB
call dsk$init1 ; fix it up
ret ; done
;ld a,e ; move count to accum
dsk$init1:
; Setup HL with bank count ; Setup HL with bank count
ld l,a ; lsb
;ld l,a ; lsb
ld l,e ; lsb
ld h,0 ; msb is always zero ld h,0 ; msb is always zero
; Update EXM field ; Update EXM field
@ -501,8 +493,7 @@ media:
ld b,17h ; HBIOS func: report device info ld b,17h ; HBIOS func: report device info
call 0FFF0h ; get unit info, device type in D call 0FFF0h ; get unit info, device type in D
ld a,d ; device type -> A ld a,d ; device type -> A
and 0F0h ; isolate high bits
cp 10h ; floppy?
cp 01h ; floppy?
jr nz,media1 ; if not, do LBA I/O jr nz,media1 ; if not, do LBA I/O
ld hl,lba+3 ; point to high order byte ld hl,lba+3 ; point to high order byte
res 7,(hl) ; switch from LBA -> CHS res 7,(hl) ; switch from LBA -> CHS
@ -585,29 +576,77 @@ media4:
; adjust the sectors per slice and media id. ; adjust the sectors per slice and media id.
; Use new slice format sectors per slice value ; Use new slice format sectors per slice value
ld hl,16384 ; new sectors per slice
ld (sps),hl ; save it
ld hl,16384 ; new sectors per slice
ld (sps),hl ; save it
; Update media id for new hard disk format ; Update media id for new hard disk format
ld a,10 ; new media id
ld (medid),a ; save it
ld a,10 ; new media id
ld (medid),a ; save it
media5: media5:
; Adjust LBA offset based on target slice ; Adjust LBA offset based on target slice
ld a,(slice) ; get slice, A is loop cnt
ld hl,(lba) ; set DE:HL
ld de,(lba+2) ; ... to starting LBA
ld bc,(sps) ; sectors per slice
ld a,(slice) ; get slice, A is loop cnt
ld hl,(lba) ; set DE:HL
ld de,(lba+2) ; ... to starting LBA
ld bc,(sps) ; sectors per slice
res 7,d ; clear lba mode bit
boot6: boot6:
or a ; set flags to check loop cntr
jr z,boot8 ; done if counter exhausted
add hl,bc ; add one slice to low word
jr nc,boot7 ; check for carry
inc de ; if so, bump high word
or a ; set flags to check loop cntr
jr z,boot8 ; done if counter exhausted
add hl,bc ; add one slice to low word
jr nc,boot7 ; check for carry
inc de ; if so, bump high word
boot7: boot7:
dec a ; dec loop downcounter
jr boot6 ; and loop
dec a ; dec loop downcounter
jr boot6 ; and loop
boot8: boot8:
; LBA offset of desired slice is now in DE:HL.
; Need to check if the slice is beyond capacity of media.
; If lba_off + sps >= dsk_cap, error!
; Save lba_off
push de ; msw
push hl ; lsw
; Add sps to compute lba_req
ld bc,(sps) ; sectors per slice
add hl,bc ; add one slice to low word
jr nc,dsk_mbr9 ; check for carry
inc de ; if so, bump high word
dsk_mbr9:
; Save cap_req
ld (cap_req),hl ; lsw
ld (cap_req+2),de ; msw
; Get dsk_cap (de:hl)
ld b,1Ah ; hbios disk capacity func
ld a,(unit) ; disk unit number
ld c,a ; ... into c
rst 08 ; hbios call (de:hl = capacity)
; Save dsk_cap (de:hl)
push de ; save dsk_cap (msw)
push hl ; save dsk_cap (lsw)
; Check dsk_cap >= cap_req, cf set on overflow
; No need save actual result
or a ; clear carry for sbc
pop hl ; dsk_cap lsw
ld de,(cap_req) ; cap_req lsw
sbc hl,de ; dsk_cap - lba_req (lsw)
pop hl ; dsk_cap msw
ld de,(cap_req+2) ; cap_req msw
sbc hl,de ; dsk_cap - lba_req (msw)
; Restore lba_off
pop hl ; lsw
pop de ; msw
; Abort on overflow with error!
jp c,err_noslice ; slice too high, error exit
; Finalize slice lba
set 7,d ; set LBA access flag set 7,d ; set LBA access flag
ld (lba),hl ; save new lba, low word ld (lba),hl ; save new lba, low word
ld (lba+2),de ; save new lba, high word ld (lba+2),de ; save new lba, high word
@ -878,6 +917,7 @@ unit db 0 ; working disk unit num
slice db 0 ; working slice num slice db 0 ; working slice num
lba dw 0,0 ; working lba lba dw 0,0 ; working lba
sps dw 0 ; sectors per slice sps dw 0 ; sectors per slice
cap_req dw 0,0 ; lba cap required for slice
mbrsec ds 512 ; MBR sector buffer mbrsec ds 512 ; MBR sector buffer
dma dw 0 ; current DMA address dma dw 0 ; current DMA address
bank db 0 ; HBIOS DMA bank bank db 0 ; HBIOS DMA bank

38
Source/CPM3/genbnk.dat

@ -8,12 +8,12 @@ MEMTOP = FD
BNKSWT = Y BNKSWT = Y
COMBAS = 80 COMBAS = 80
LERROR = Y LERROR = Y
NUMSEGS = 04
NUMSEGS = 02
MEMSEG00 = 01,17,00 MEMSEG00 = 01,17,00
MEMSEG01 = 0E,72,02 MEMSEG01 = 0E,72,02
MEMSEG02 = 01,7F,03 MEMSEG02 = 01,7F,03
MEMSEG03 = 01,7F,04
MEMSEG04 = 01,7F,05
MEMSEG03 = 00,C0,04
MEMSEG04 = 00,C0,05
MEMSEG05 = 00,C0,06 MEMSEG05 = 00,C0,06
MEMSEG06 = 00,C0,07 MEMSEG06 = 00,C0,07
MEMSEG07 = 00,C0,08 MEMSEG07 = 00,C0,08
@ -25,22 +25,22 @@ MEMSEG0C = 00,C0,0D
MEMSEG0D = 00,C0,0E MEMSEG0D = 00,C0,0E
MEMSEG0E = 00,C0,0F MEMSEG0E = 00,C0,0F
MEMSEG0F = 00,C0,10 MEMSEG0F = 00,C0,10
HASHDRVA = Y
HASHDRVB = Y
HASHDRVC = Y
HASHDRVD = Y
HASHDRVE = Y
HASHDRVF = Y
HASHDRVG = Y
HASHDRVH = Y
HASHDRVI = Y
HASHDRVJ = Y
HASHDRVK = Y
HASHDRVL = Y
HASHDRVM = Y
HASHDRVN = Y
HASHDRVO = Y
HASHDRVP = Y
HASHDRVA = N
HASHDRVB = N
HASHDRVC = N
HASHDRVD = N
HASHDRVE = N
HASHDRVF = N
HASHDRVG = N
HASHDRVH = N
HASHDRVI = N
HASHDRVJ = N
HASHDRVK = N
HASHDRVL = N
HASHDRVM = N
HASHDRVN = N
HASHDRVO = N
HASHDRVP = N
ALTBNKSA = Y ALTBNKSA = Y
ALTBNKSB = Y ALTBNKSB = Y
ALTBNKSC = Y ALTBNKSC = Y

2
Source/CPM3/genres.dat

@ -8,7 +8,7 @@ MEMTOP = FD
BNKSWT = N BNKSWT = N
COMBAS = 00 COMBAS = 00
LERROR = Y LERROR = Y
NUMSEGS = 03
NUMSEGS = 01
MEMSEG00 = 00,80,00 MEMSEG00 = 00,80,00
MEMSEG01 = 00,C0,02 MEMSEG01 = 00,C0,02
MEMSEG02 = 00,C0,03 MEMSEG02 = 00,C0,03

23
Source/CPM3/move.z80

@ -65,12 +65,11 @@ xbnkmov:
; ------------ -------------- ------- ; ------------ -------------- -------
; COMMON BID_COM 8Fh ; COMMON BID_COM 8Fh
; 0: OS/BUFS BID_USR 8Eh ; 0: OS/BUFS BID_USR 8Eh
; BID_BIOS 8Dh
; 1: TPA BID_AUX 8Ch
; 2: BUFS BID_AUX-1 8Bh
; 3: BUFS BID_AUX-2 8Ah
; 4: BUFS BID_AUX-3 89h
; 5: BUFS BID_AUX-4 88h
; 1: TPA BID_AUX 8Dh
; 2: BUFS BID_AUX-1 8Ch
; 3: BUFS BID_AUX-2 8Bh
; 4: BUFS BID_AUX-3 8Ah
; 5: BUFS BID_AUX-4 89h
; ;
; N.B., Below BID_AUX is considered RAM disk bank. Need to ; N.B., Below BID_AUX is considered RAM disk bank. Need to
; make sure RAM disk is kept small enough to stay below ; make sure RAM disk is kept small enough to stay below
@ -80,17 +79,13 @@ xbnkmov:
; to adjust for real size of RAM in system ; to adjust for real size of RAM in system
; ;
?bnkxlt: ?bnkxlt:
or a
jr z,bank0
neg ; 2 -> -2
add a,8Dh ; 8Dh - 2 = 8Bh
@hbbio equ $ - 1 ; BID_BIOS
ret
bank0:
ld a,8Eh ; 0 -> 8Eh
neg ; ex: 2 -> -2
add a,8Eh ; ex: 8Eh - 2 = 8Ch
@hbusr equ $ - 1 ; BID_USR @hbusr equ $ - 1 ; BID_USR
ret ret
@hbbio db 0 ; BID_BIOS
movtyp db 0 ; non-zero for interbank move movtyp db 0 ; non-zero for interbank move
movbnks: movbnks:

4
Source/Clean.cmd

@ -4,6 +4,7 @@ setlocal
pushd HDIAG && call Clean.cmd & popd pushd HDIAG && call Clean.cmd & popd
pushd Apps && call Clean.cmd & popd pushd Apps && call Clean.cmd & popd
pushd CPM22 && call Clean.cmd & popd pushd CPM22 && call Clean.cmd & popd
pushd QPM && call Clean.cmd & popd
pushd ZCPR && call Clean.cmd & popd pushd ZCPR && call Clean.cmd & popd
pushd ZCPR-DJ && call Clean.cmd & popd pushd ZCPR-DJ && call Clean.cmd & popd
pushd ZSDOS && call Clean.cmd & popd pushd ZSDOS && call Clean.cmd & popd
@ -21,4 +22,5 @@ pushd Prop && call Clean & popd
pushd RomDsk && call Clean & popd pushd RomDsk && call Clean & popd
pushd Doc && call Clean & popd pushd Doc && call Clean & popd
pushd ZRC && call Clean & popd pushd ZRC && call Clean & popd
pushd ZZRC && call Clean & popd
pushd Z1RCC && call Clean & popd
pushd ZZRCC && call Clean & popd

147
Source/Doc/Applications.md

@ -51,6 +51,8 @@ found:
| INTTEST | No | Yes | Yes | | INTTEST | No | Yes | Yes |
| FAT | No | Yes | Yes | | FAT | No | Yes | Yes |
| TUNE | No | Yes | Yes | | TUNE | No | Yes | Yes |
| WDATE | No | Yes | Yes |
| HTALK | No | Yes | Yes |
`\clearpage`{=latex} `\clearpage`{=latex}
@ -164,6 +166,13 @@ Be aware that this command will allow you to reassign or remove the
assignment of your system drive letter. This can cause your operating assignment of your system drive letter. This can cause your operating
system to fail and force you to reboot. system to fail and force you to reboot.
The `ASSIGN` command does **not** prevent you from assigning a drive
letter to a slice that does not fit on the physical media. However,
any subsequent attempt to refer to that drive letter will result in
an immediate OS error of "no disk". Refer to "Hard Disk Capacity"
in the $doc_user$ for a discussion of the exact number of slices that
will fit on a specific physical disk size.
This command is particularly sensitive to being matched to the This command is particularly sensitive to being matched to the
appropriate version of the RomWBW ROM you are using. Be very careful appropriate version of the RomWBW ROM you are using. Be very careful
to keep all copies of `ASSIGN.COM` up to date with your ROM. to keep all copies of `ASSIGN.COM` up to date with your ROM.
@ -620,9 +629,9 @@ shown on your console. The `TALK` application does this.
`TALK` operates at the operating system level (not HBIOS). `TALK` operates at the operating system level (not HBIOS).
The parameter to `TALK` refers to logical CP/M serial devices. Upon The parameter to `TALK` refers to logical CP/M serial devices. Upon
execution all characters types at the console will be sent to the
execution all characters typed at the console will be sent to the
device specified and all characters received by the specified device device specified and all characters received by the specified device
will be echoes on the console.
will be echoed on the console.
Press Control+Z on the console to terminate the application. Press Control+Z on the console to terminate the application.
@ -638,6 +647,36 @@ provided in the RomWBW distribution.
`\clearpage`{=latex} `\clearpage`{=latex}
# HTALK
`HTALK` is a variation of the `TALK` utility, but it works directly
against HBIOS Character Units.
## Syntax
`HTALK COMn:`
## Usage
`HTALK` operates at the HBIOS level.
The parameter to `TALK` refers to a HBIOS character unit. Upon
execution all characters typed at the console will be sent to the
device specified and all characters received by the specified device
will be echoed on the console.
Press Control+Z on the console to terminate the application.
## Notes
## Etymology
The `TALK` command was created and donated to RomWBW by Tom Plano. It
is an original product designed specifically for RomWBW.
`\clearpage`{=latex}
# RTC # RTC
Many RomWBW systems provide real time clock hardware. The RTC Many RomWBW systems provide real time clock hardware. The RTC
@ -889,6 +928,28 @@ written in C and requires SDCC to compile. As such it is not part of
the RomWBW build process. However, the full project and source code is the RomWBW build process. However, the full project and source code is
found in the [FAT GitHub Repository](https://github.com/wwarthen/FAT). found in the [FAT GitHub Repository](https://github.com/wwarthen/FAT).
## Known Issues
CP/M (and workalike) OSes have significant restrictions on filename
characters. The FAT application will block any attempt to create a
file on the CP/M filesystem containing any of these prohibited
characters:
| `< > . , ; : = ? * [ ] _ % | ( ) / \`
The operation will be aborted with "`Error: Invalid Path Name`" if such
a filename character is encountered.
Since MS-DOS does allow some of these characters, you can have
issues when copying files from MS-DOS to CP/M if the MS-DOS filenames
use these characters. Unfortunately, FAT is not yet smart enough to
substitute illegal characters with legal ones. So, you will need to
clean the filenames before trying to copy them to CP/M.
The FAT application does try to detect the scenario where you are
copying a file to itself. However, this detection is not perfect and
can corrupt a file if it occurs. Be careful to avoid this.
`\clearpage`{=latex} `\clearpage`{=latex}
# TUNE # TUNE
@ -1106,3 +1167,85 @@ can be used to reduce your processor speed.
VGMPLAY is still under development. The source code is provided in the VGMPLAY is still under development. The source code is provided in the
RomWBW distribution. RomWBW distribution.
`\clearpage`{=latex}
# WDATE
`wdate` is a utility for CP/M systems that have Wayne Warthen's
ROMWBW firmware. It reads or sets the real-time clock, using function
calls in the BIOS. It should work on any RTC device that is supported by
ROMWBW, including the internal interrupt-driven timer that is is available
on some systems.
`wdate` differs from the `rtc.com` utility that is provided with the
ROMWBW version of CP/M in that it only gets and sets the date/time.
`rtc.com` can also manipulate the nonvolatile RAM in certain clock
devices, and modify the charge controller. However, `wdate` is (I would
argue) easier to use, as it takes its input from the command line, which
can be edited, and it's less fussy about the format. It doesn't require
the date to be set if you only want to change the time, for example.
In addition, `wdate` has at least some error checking.
`wdate` displays the day-of-week and month as English text, not
numbers. It calculates the day-of-week from the year, month, and day.
RTC chips usually store a day-of-week value, but it's useless in this
application for two reasons: first, the BIOS does not expose it. Second,
there is no universally-accepted way to interpret it (which day does
the week start on? Is '0' a valid day of the week?)
## Syntax
| `WDATE`
| `WDATE ` *`<hr> <min>`*
| `WDATE ` *`<hr> <min> <sec>`*
| `WDATE ` *`<year> <month> <day> <hr> <min> <sec>`*
## Usage
A> wdate
Saturday 27 May 13:14:39 2023
With no arguments, displays the current date and time.
A> wdate hr min
With two arguments, sets the time in hours and minutes, without changing date
or seconds
A> wdate hr min sec
With three arguments, sets the time in hours, minutes, and seconds, without
changing date
A> wdate year month day hr min sec
With six arguments, sets date and time. All numbers are one or two digits. The
two-digit year starts at 2000.
A> wdate /?
Show a summary of the command-line usage.
## Notes
I've tested this utility with the DS1302 clock board designed by Ed
Brindly, and on the interrupt-driven timer built into my Z180 board.
However, it does not interact with hardware, only BIOS; I would expect
it to work with other hardware.
wdate checks for the non-existence of ROMWBW, and also for failing
operations on the RTC. It will display the terse "No RTC" message in
both cases.
The ROMWBW functions that manipulate the date and time operate on BCD
numbers, as RTC chips themselves usually do. wdate works in decimal, so
that it can check that the user input makes sense. A substantial part of
the program's code is taken up by number format conversion and range
checking.
## Etymology
The `WDATE` application was written and contributed by Kevin Boone.
The source code is available on GitHub at
[https://github.com/kevinboone/wdate-cpm/blob/main/README.md](https://github.com/kevinboone/wdate-cpm/blob/main/README.md).

2
Source/Doc/Basic.h

@ -1,4 +1,4 @@
$define{doc_ver}{Version 3.2.1}$
$define{doc_ver}{Version 3.4}$
$define{doc_product}{RomWBW}$ $define{doc_product}{RomWBW}$
$define{doc_root}{https://github.com/wwarthen/RomWBW/raw/dev/Doc}$ $define{doc_root}{https://github.com/wwarthen/RomWBW/raw/dev/Doc}$
$ifndef{doc_title}$ $define{doc_title}{Document Title}$ $endif$ $ifndef{doc_title}$ $define{doc_title}{Document Title}$ $endif$

4
Source/Doc/Book.h

@ -30,7 +30,9 @@ header-includes:
{\scshape \bfseries \fontsize{48pt}{56pt} \selectfont $doc_product$ \par} {\scshape \bfseries \fontsize{48pt}{56pt} \selectfont $doc_product$ \par}
{\bfseries \fontsize{32pt}{36pt} \selectfont $doc_title$ \par} {\bfseries \fontsize{32pt}{36pt} \selectfont $doc_title$ \par}
\vspace{24pt} \vspace{24pt}
{\huge $doc_ver$ \\ $doc_date$ \par}
{\huge $doc_ver$ \par}
\vspace{12pt}
{\large Updated $doc_date$ \par}
\vspace{24pt} \vspace{24pt}
{\large \itshape $doc_orgname$ \\ \href{http://$doc_orgurl$}{$doc_orgurl$} \par} {\large \itshape $doc_orgname$ \\ \href{http://$doc_orgurl$}{$doc_orgurl$} \par}
\vspace{12pt} \vspace{12pt}

BIN
Source/Doc/Graphics/Panel.pdf

Binary file not shown.

BIN
Source/Doc/Graphics/Panel.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
Source/Doc/Graphics/Panel.vsdx

Binary file not shown.

6
Source/Doc/Makefile

@ -1,7 +1,7 @@
# #
# NOTE: Pandoc, Latex (MiKTeX or TexLive), and gpp must be installed
# NOTE: gpp, Pandoc, and Latex (MiKTeX or TexLive) must be installed
# and available on commandline for this build to work!!! # and available on commandline for this build to work!!!
# Typically "sudo apt install pandoc, texlive-latex-extra, gpp"
# Typically "sudo apt install gpp pandoc texlive-latex-extra texlive-luatex texlive-fonts-extra fonts-roboto"
# #
OBJECTS = ReadMe.gfm ReadMe.txt UserGuide.pdf SystemGuide.pdf Applications.pdf ROM_Applications.pdf Catalog.pdf Errata.pdf OBJECTS = ReadMe.gfm ReadMe.txt UserGuide.pdf SystemGuide.pdf Applications.pdf ROM_Applications.pdf Catalog.pdf Errata.pdf
# DEST = ../../Doc # DEST = ../../Doc
@ -16,7 +16,7 @@ all :: deploy
gpp -o $@ -U "$$" "$$" "{" "}{" "}$$" "{" "}" "@@@" "" -M "$$" "$$" "{" "}{" "}$$" "{" "}" $< gpp -o $@ -U "$$" "$$" "{" "}{" "}$$" "{" "}" "@@@" "" -M "$$" "$$" "{" "}{" "}$$" "{" "}" $<
%.pdf : %.tmp %.pdf : %.tmp
pandoc $< -f markdown -t latex -s -o $@ --default-image-extension=pdf
pandoc $< -f markdown -t pdf -s -o $@ --default-image-extension=pdf --pdf-engine=lualatex
%.html : %.tmp %.html : %.tmp
pandoc $< -f markdown -t html -s -o $@ --default-image-extension=pdf pandoc $< -f markdown -t html -s -o $@ --default-image-extension=pdf

82
Source/Doc/ReadMe.md

@ -10,14 +10,23 @@ A wide variety of platforms are supported including those
produced by these developer communities: produced by these developer communities:
* [RetroBrew Computers](https://www.retrobrewcomputers.org) * [RetroBrew Computers](https://www.retrobrewcomputers.org)
* [RC2014](https://rc2014.co.uk), [RC2014-Z80](https://groups.google.com/g/rc2014-z80)
* [retro-comp](https://groups.google.com/forum/#!forum/retro-comp)
(<https://www.retrobrewcomputers.org>)
* [RC2014](https://rc2014.co.uk) (<https://rc2014.co.uk>), \
[RC2014-Z80](https://groups.google.com/g/rc2014-z80)
(<https://groups.google.com/g/rc2014-z80>)
* [Retro Computing](https://groups.google.com/g/retro-comp)
(<https://groups.google.com/g/retro-comp>)
* [Small Computer Central](https://smallcomputercentral.com/) * [Small Computer Central](https://smallcomputercentral.com/)
(<https://smallcomputercentral.com/>)
A complete list of the currently supported platforms is found in the
[Installation] section.
General features include: General features include:
* Z80 Family CPUs including Z80, Z180, and Z280
* Banked memory services for several banking designs * Banked memory services for several banking designs
* Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD
* Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, Iomega
* Serial drivers including UART (16550-like), ASCI, ACIA, SIO * Serial drivers including UART (16550-like), ASCI, ACIA, SIO
* Video drivers including TMS9918, SY6545, MOS8563, HD6445 * Video drivers including TMS9918, SY6545, MOS8563, HD6445
* Keyboard (PS/2) drivers via VT8242 or PPI interfaces * Keyboard (PS/2) drivers via VT8242 or PPI interfaces
@ -36,10 +45,10 @@ ROM firmware itself:
A dynamic disk drive letter assignment mechanism allows mapping A dynamic disk drive letter assignment mechanism allows mapping
operating system drive letters to any available disk media. operating system drive letters to any available disk media.
Additionally, mass storage devices (IDE Disk, CF Card, SD Card) 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
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 accessible storage on a single device.
The pre-built ROM firmware images are generally suitable for most The pre-built ROM firmware images are generally suitable for most
@ -61,7 +70,7 @@ By design, RomWBW isolates all of the hardware specific functions in
the ROM chip itself. The ROM provides a hardware abstraction layer the ROM chip itself. The ROM provides a hardware abstraction layer
such that all of the operating systems and applications on a disk 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 will run on any RomWBW-based system. To put it simply, you can take
a disk (or CF/SD Card) and move it between systems transparently.
a disk (or CF/SD/USB Card) and move it between systems transparently.
A tool is provided that allows you to access a FAT-12/16/32 filesystem. 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 The FAT filesystem may be coresident on the same disk media as RomWBW
@ -70,18 +79,19 @@ OSes such as Windows, MacOS, and Linux very easy.
# Acquiring RomWBW # Acquiring RomWBW
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.
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
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.
All source code and distributions are maintained on GitHub. Code All source code and distributions are maintained on GitHub. Code
contributions are very welcome. contributions are very welcome.
@ -172,6 +182,38 @@ please let me know if I missed you!
* 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.
* Martin R has provided substantial help reviewing and improving the
User Guide.
* Jacques Pelletier has contributed the DS1501 RTC driver code.
* Jose Collado has contributed enhancements to the TMS driver
including compatibility with standard TMS register configuration.
* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
* Matt Carroll has contributed a fix to XM.COM that corrects the
port specification when doing a send.
* Dean Jenkins enhanced the build process to accommodate the
Raspberry Pi 4.
* Tom Plano has contributed a new utility (HTALK) to allow talking
directly to HBIOS COM ports.
* Lars Nelson has contributed several generic utilities such as
a universal (OS agnostic) UNARC application.
* Dylan Hall added support for specifying a secondary console.
* Bill Shen has contributed boot loaders for several of his
systems.
Contributions of all kinds to RomWBW are very welcome. Contributions of all kinds to RomWBW are very welcome.
# Licensing # Licensing

344
Source/Doc/SystemGuide.md

@ -390,17 +390,20 @@ below enumerates these values.
| **Device Type** | **ID** | **Description** | **Driver** | | **Device Type** | **ID** | **Description** | **Driver** |
|-----------------|-------:|------------------------------------------|------------| |-----------------|-------:|------------------------------------------|------------|
| CIODEV_UART | 0x00 | 16C550 Family Serial Interface | uart.asm | | CIODEV_UART | 0x00 | 16C550 Family Serial Interface | uart.asm |
| CIODEV_ASCI | 0x10 | Z180 Built-in Serial Ports | asci.asm |
| CIODEV_TERM | 0x20 | Terminal | ansi.asm |
| CIODEV_PRPCON | 0x30 | PropIO Serial Console Interface | prp.asm |
| CIODEV_PPPCON | 0x40 | ParPortProp Serial Console Interface | ppp.asm |
| CIODEV_SIO | 0x50 | Zilog Serial Port Interface | sio.asm |
| CIODEV_ACIA | 0x60 | MC68B50 Asynchronous Interface | acia.asm |
| CIODEV_PIO | 0x70 | Zilog Parallel Interface Controller | pio.asm |
| CIODEV_UF | 0x80 | FT232H-based ECB USB FIFO | uf.asm |
| CIODEV_DUART | 0x90 | SCC2681 Family Dual UART | duart.asm |
| CIODEV_Z2U | 0xA0 | Zilog Z280 Built-in Serial Ports | z2u.asm |
| CIODEV_LPT | 0xB0 | Parallel I/O Controller | lpt.asm |
| CIODEV_ASCI | 0x01 | Z180 Built-in Serial Ports | asci.asm |
| CIODEV_TERM | 0x02 | Terminal | ansi.asm |
| CIODEV_PRPCON | 0x03 | PropIO Serial Console Interface | prp.asm |
| CIODEV_PPPCON | 0x04 | ParPortProp Serial Console Interface | ppp.asm |
| CIODEV_SIO | 0x05 | Zilog Serial Port Interface | sio.asm |
| CIODEV_ACIA | 0x06 | MC68B50 Asynchronous Interface | acia.asm |
| CIODEV_PIO | 0x07 | Zilog Parallel Interface Controller | pio.asm |
| CIODEV_UF | 0x08 | FT232H-based ECB USB FIFO | uf.asm |
| CIODEV_DUART | 0x09 | SCC2681 Family Dual UART | duart.asm |
| CIODEV_Z2U | 0x0A | Zilog Z280 Built-in Serial Ports | z2u.asm |
| CIODEV_LPT | 0x0B | Parallel I/O Controller | lpt.asm |
| CIODEV_ESPCON | 0x0B | ESP32 VGA Console | esp.asm |
| CIODEV_ESPSER | 0x0B | ESP32 Serial Port | esp.asm |
| CIODEV_SCON | 0x0B | S100 Console | scon.asm |
Character devices can usually be configured with line characteristics Character devices can usually be configured with line characteristics
such as speed, framing, etc. A word value (16 bit) is used to describe such as speed, framing, etc. A word value (16 bit) is used to describe
@ -568,15 +571,20 @@ below enumerates there values.
| **Device Type** | **ID** | **Description** | **Driver** | | **Device Type** | **ID** | **Description** | **Driver** |
|-----------------|-------:|------------------------------------------|------------| |-----------------|-------:|------------------------------------------|------------|
| DIODEV_MD | 0x00 | Memory Disk | md.asm | | DIODEV_MD | 0x00 | Memory Disk | md.asm |
| DIODEV_FD | 0x10 | Floppy Disk | fd.asm |
| DIODEV_RF | 0x20 | RAM Floppy | rf.asm |
| DIODEV_IDE | 0x30 | IDE Disk | ide.asm |
| DIODEV_ATAPI | 0x40 | ATAPI Disk (not implemented) | |
| DIODEV_PPIDE | 0x50 | PPIDE Disk | ppide.asm |
| DIODEV_SD | 0x60 | SD Card | sd.asm |
| DIODEV_PRPSD | 0x70 | PropIO SD Card | prp.asm |
| DIODEV_PPPSD | 0x80 | ParPortProp SD Card | ppp.asm |
| DIODEV_HDSK | 0x90 | SIMH HDSK Disk | hdsk.asm |
| DIODEV_FD | 0x01 | Floppy Disk | fd.asm |
| DIODEV_RF | 0x02 | RAM Floppy | rf.asm |
| DIODEV_IDE | 0x03 | IDE Disk | ide.asm |
| DIODEV_ATAPI | 0x04 | ATAPI Disk (not implemented) | |
| DIODEV_PPIDE | 0x05 | PPIDE Disk | ppide.asm |
| DIODEV_SD | 0x06 | SD Card | sd.asm |
| DIODEV_PRPSD | 0x07 | PropIO SD Card | prp.asm |
| DIODEV_PPPSD | 0x08 | ParPortProp SD Card | ppp.asm |
| DIODEV_HDSK | 0x09 | SIMH HDSK Disk | hdsk.asm |
| DIODEV_PPA | 0x0A | Iomega PPA Disk | ppa.asm |
| DIODEV_IMM | 0x0B | Iomega IMM Disk | imm.asm |
| DIODEV_SYQ | 0x0C | Syquest Sparq Disk | syq.asm |
| DIODEV_CHUSB | 0x0D | CH375/376 USB Disk | ch.asm |
| DIODEV_CHSD | 0x0E | CH375/376 SD Card | ch.asm |
A fixed set of media types are defined. The currently defined media A fixed set of media types are defined. The currently defined media
types identifiers are listed below. Each driver will support one or types identifiers are listed below. Each driver will support one or
@ -757,28 +765,36 @@ of memory because it avoids a double copy.
Reports device information about the specified Disk Unit (C). The Reports device information about the specified Disk Unit (C). The
Status (A) is a standard HBIOS result code. Status (A) is a standard HBIOS result code.
Bit 7 of the Device Attribute (C) value returned indicates whether the
device is a floppy disk. If it is a floppy disk, the Device Attribute
(C) value is encoded as follows:
The Device Attribute (C) value returned indicates various
feature indicators related to the device being referenced
by the specified Disk Unit (C). The high 3 bits apply to
all devices. The definition of the low 5 bits depends on
whether the device is a Floppy (indicated by bit 5).
The common bits are:
| **Bits** | **Definition** | | **Bits** | **Definition** |
|---------:|--------------------------------------------------| |---------:|--------------------------------------------------|
| 7 | = 1 (Floppy Disk) |
| 6-5 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other |
| 4 | Sides: 0=SS, 1=DS |
| 3-2 | Density: 0=SD, 1=DD, 2=HD, 3=ED |
| 1-0 | Reserved |
| 7 | Floppy |
| 6 | Removable |
| 5 | High Capacity (>8 MB) |
If the Disk Unit (C) specified is a not floppy disk, then the Device
Attribute (C) encoding is as follows:
The Floppy specific bits are:
| **Bits** | **Definition** | | **Bits** | **Definition** |
|---------:|--------------------------------------------------| |---------:|--------------------------------------------------|
| 7 | = 0 (not Floppy Disk) |
| 6 | Removable |
| 5-3 | Type: 0=Hard, 1=CF, 2=SD, 3=USB, |
| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH |
| 2-0 | Reserved |
| 4-3 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other |
| 2 | Sides: 0=SS, 1=DS |
| 1-0 | Density: 0=SD, 1=DD, 2=HD, 3=ED |
The non-Floppy specific bits are:
| **Bits** | **Definition** |
|---------:|--------------------------------------------------|
| 4 | LBA Capable |
| 3-0 | Media Type: 0=Hard Disk, 1=CF, 2=SD, 3=USB, |
| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH, 8=CD-ROM, |
| | 9=Cartridge |
Device Type (D) indicates the specific hardware driver that handles the Device Type (D) indicates the specific hardware driver that handles the
specified Disk Unit (C). Values are listed at the start of this specified Disk Unit (C). Values are listed at the start of this
@ -870,11 +886,11 @@ unit. The table below enumerates these values.
| **Device Type** | **ID** | **Description** | **Driver** | | **Device Type** | **ID** | **Description** | **Driver** |
|-----------------|-------:|------------------------------------------|------------| |-----------------|-------:|------------------------------------------|------------|
| RTCDEV_DS | 0x00 | Maxim DS1302 Real-Time Clock w/ NVRAM | dsrtc.asm | | RTCDEV_DS | 0x00 | Maxim DS1302 Real-Time Clock w/ NVRAM | dsrtc.asm |
| RTCDEV_BQ | 0x10 | BQ4845P Real Time Clock | bqrtc.asm |
| RTCDEV_SIMH | 0x20 | SIMH Simulator Real-Time Clock | simrtc.asm |
| RTCDEV_INT | 0x30 | Interrupt-based Real Time Clock | intrtc.asm |
| RTCDEV_DS7 | 0x40 | Maxim DS1307 PCF I2C RTC w/ NVRAM | ds7rtc.asm |
| RTCDEV_RP5 | 0x50 | Ricoh RPC01A Real-Time Clock w/ NVRAM | rp5rtc.asm |
| RTCDEV_BQ | 0x01 | BQ4845P Real Time Clock | bqrtc.asm |
| RTCDEV_SIMH | 0x02 | SIMH Simulator Real-Time Clock | simrtc.asm |
| RTCDEV_INT | 0x03 | Interrupt-based Real Time Clock | intrtc.asm |
| RTCDEV_DS7 | 0x04 | Maxim DS1307 PCF I2C RTC w/ NVRAM | ds7rtc.asm |
| RTCDEV_RP5 | 0x05 | Ricoh RPC01A Real-Time Clock w/ NVRAM | rp5rtc.asm |
The time functions to get and set the time (RTCGTM and RTCSTM) require a The time functions to get and set the time (RTCGTM and RTCSTM) require a
6 byte date/time buffer in the following format. Each byte is BCD 6 byte date/time buffer in the following format. Each byte is BCD
@ -1001,6 +1017,198 @@ used.
`\clearpage`{=latex} `\clearpage`{=latex}
## Display Keypad (DSKY)
The Display Keypad functions provide read/write access to a segment
style display and associated hex keypad.
HBIOS only supports a single DSKY device since there is no reason to have
more than one at a time. The DSKY unit is assigned a Device Type ID
which indicates the specific hardware device driver that handles the
unit. The table below enumerates these values.
| **Device Type** | **ID** | **Description** | **Driver** |
|-----------------|-------:|------------------------------------------|------------|
| DSKYDEV_ICM | 0x01 | Original ICM7218 based DSKY | icm.asm |
| DSKYDEV_PKD | 0x02 | Next Gen Intel P8279 based DSKY | pkd.asm |
When segment display function encodes the display data in a byte per
character format. Currently, all segment displays are exactly
8 charadcters and this is assumed in API calls. The encoding of each
byte is as shown below:
```
+---01---+
| |
20 02
| |
+---40---+
| |
10 04
| |
+---08---+ 80
```
The keypad keys are identified by the following key ids. Not all
keypads will contain all keys.
| **Key Id** | **Key Definition** | **Key Id** | **Key Definition** |
|------------|--------------------|------------|--------------------|
| $00 | Hex Numeric 0 | $10 | Forward |
| $01 | Hex Numeric 1 | $11 | Backward |
| $02 | Hex Numeric 2 | $12 | Clear |
| $03 | Hex Numeric 3 | $13 | Enter |
| $04 | Hex Numeric 4 | $14 | Deposit |
| $05 | Hex Numeric 5 | $15 | Examine |
| $06 | Hex Numeric 6 | $16 | Go |
| $07 | Hex Numeric 7 | $17 | Boot |
| $08 | Hex Numeric 8 | $18 | F4 |
| $09 | Hex Numeric 9 | $19 | F3 |
| $0A | Hex Numeric A | $1A | F2 |
| $0B | Hex Numeric B | $1B | F1 |
| $0C | Hex Numeric C | | |
| $0D | Hex Numeric D | | |
| $0E | Hex Numeric E | | |
| $0F | Hex Numeric F | | |
### Function 0x30 -- DSKY Reset (DSKYRESET)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x30 | A: Status |
This function performs a device dependent reset operation on the DSKY.
The display will be cleared, keyboard queue will be flushed, and
chip will be reinitialized. The returned Status (A) is a standard
HBIOS result code.
### Function 0x31 -- DSKY (DSKYSTATUS)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x31 | A: Status / Characters Pending |
Return the count of Characters Pending (A) in the input buffer of the
DSKY. If the unit has no input buffer or the
buffer utilization is not available, the function may return simply 0 or
1 where 0 means there is no character available and 1 means there is at
least one character available.
The value returned in register A is used as both a Status (A) code and
the return value. Negative values (bit 7 set) indicate a standard HBIOS
result (error) code. Otherwise, the return value represents the number
of characters in the buffer.
### Function 0x32 -- DSKY Get Key (DSKYGETKEY)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x32 | A: Status |
| | E: Character Value |
Read and return a Character (E) from the DSKY.
If no character(s) are available in the unit's input buffer, this
function will wait indefinitely. The returned Status (A) is a standard
HBIOS result code.
The Character Value (E) returned is not ASCII. It is a keypad key
id. The possible id values are listed at the start of this section.
### Function 0x33 -- DSKY Show HEX (RTCSHOWHEX)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x33 | A: Status |
| DE:HL=Binary Value | |
Display the 32-bit binary value (DE:HL) in hex on the DSKY segment
display. All decimal points of the display will be off.
The Status (A) is a standard HBIOS result code.
### Function 0x34 -- DSKY Show Segments (DSKYSHOWSEG)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x34 | A: Status |
| HL: Buffer Address | |
Display the segment-encoded values on the segment display. The encoding
is defined at the start of this section. The entire displa is updated
and it is assumed that an 8 character buffer will be pointed to by HL.
The buffer must reside in high memory.
The Status (A) is a standard HBIOS result code.
### Function 0x35 -- DSKY Keypad LEDs (DSKYKEYLEDS)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x35 | A: Status |
| HL: Buffer Address | |
Light the LEDs for the keypad keys according to the
bitmap contained in the buffer pointed to by HL. The buffer
must be located in high memory and is assumed to be 8 bytes.
At this time, the bitmap is specific to the PKD hardware.
This function is ignored by the ICM hardware.
The Status (A) is a standard HBIOS result code.
### Function 0x36 -- DSKY Status LED (DSKYSTATLED)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x36 | A: Status |
| D: LED Number | |
| E: LED State | |
Set or clear the status LED specified in D. The state of
the LED is contained in E. If E=0, the LED will be turned
off. If E=1, the LED will be turned on.
This function is specific to the PKD hardware. It will be ignored
by the ICM hardware.
The Status (A) is a standard HBIOS result code.
### Function 0x37 -- DSKY Beep (DSKYBEEP)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x37 | A: Status |
Beep the onboard speaker of the DSKY.
This function is specific to the PKD hardware. It will be ignored
by the ICM hardware.
The Status (A) is a standard HBIOS result code.
### Function 0x38 -- DSKY Device (DSKYDEVICE)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0x38 | A: Status |
| | C: Device Attributes |
| | D: Device Type |
| | E: Device Number |
| | H: Device Unit Mode |
| | L: Device I/O Base Address |
Returns device information for the DSKY unit. The Status (A) is a
standard HBIOS result code.
Device Attribute (C) values are not yet defined. Device Type (D)
indicates the specific hardware driver that handles the specified
character unit. Values are listed at the start of this section. Device
Number (E) indicates the physical device number assigned per driver
which is always 0 for DSKY.
Device Mode (H) is used to indicate the variant of the chip or circuit
that is used by the specified unit. The Device I/O Base Address (L)
indicates the starting port address of the hardware interface that is
servicing the specified unit. Both of these values are considered
driver specific. Refer to the associated hardware driver for the values
used.
`\clearpage`{=latex}
## Video Display Adapter (VDA) ## Video Display Adapter (VDA)
The VDA functions are provided as a common interface to Video Display The VDA functions are provided as a common interface to Video Display
@ -1014,10 +1222,11 @@ below enumerates there values.
| **Device Type** | **ID** | **Description** | **Driver** | | **Device Type** | **ID** | **Description** | **Driver** |
|-----------------|-------:|------------------------------------------|------------| |-----------------|-------:|------------------------------------------|------------|
| VDADEV_VDU | 0x00 | MC6845 Family Video Display Controller | vdu.asm | | VDADEV_VDU | 0x00 | MC6845 Family Video Display Controller | vdu.asm |
| VDADEV_CVDU | 0x10 | MC8563-based Video Display Controller | cvdu.asm |
| VDADEV_GDC | 0x20 | uPD7220 Video Display Controller | gdc.asm |
| VDADEV_TMS | 0x30 | TMS9918/38/58 Video Display Controller | tms.asm |
| VDADEV_VGA | 0x40 | HD6445CP4-based Video Display Controller | vga.asm |
| VDADEV_CVDU | 0x01 | MC8563-based Video Display Controller | cvdu.asm |
| VDADEV_GDC | 0x02 | uPD7220 Video Display Controller | gdc.asm |
| VDADEV_TMS | 0x03 | TMS9918/38/58 Video Display Controller | tms.asm |
| VDADEV_VGA | 0x04 | HD6445CP4-based Video Display Controller | vga.asm |
| VDADEV_VRC | 0x05 | VGARC | vrc.asm |
Depending on the capabilities of the hardware, the use of colors and Depending on the capabilities of the hardware, the use of colors and
attributes may or may not be supported. If the hardware does not support attributes may or may not be supported. If the hardware does not support
@ -1251,14 +1460,17 @@ standard HBIOS result code.
|----------------------------------------|----------------------------------------| |----------------------------------------|----------------------------------------|
| B: 0x47 | A: Status | | B: 0x47 | A: Status |
| C: Video Unit | | | C: Video Unit | |
| D: Scope | |
| E: Color | | | E: Color | |
Assign the specified Color (E) code to be used for all subsequent
character writes/fills. This color is also used to fill new lines
generated by scroll operations. Refer to the color code table above for
a list of the available color codes. Note that a given video display may
or may not support any/all colors. The Status (A) is a standard HBIOS
result code.
Assign the specified Color (E) code for character foreground/background.
If Scope (D) is 0, the specified color will be used for all
subsequent character writes/fills. This color is also used to fill new
lines generated by scroll operations. If Scope (D) is 1, then the
specified foreground/background color will be applied immediately to the
entire screen. Refer to the color code table above for a list of the
available color codes. Note that a given video display may or may not
support any/all colors. The Status (A) is a standard HBIOS result code.
### Function 0x48 -- Video Write Character (VDAWRC) ### Function 0x48 -- Video Write Character (VDAWRC)
@ -1429,9 +1641,9 @@ below enumerates these values.
| **Device Type** | **ID** | **Description** | **Driver** | | **Device Type** | **ID** | **Description** | **Driver** |
|-----------------|-------:|----------------------------------------------|-------------| |-----------------|-------:|----------------------------------------------|-------------|
| SNDDEV_SN76489 | $00 | SN76489 Programmable Sound Generator | sn76489.asm | | SNDDEV_SN76489 | $00 | SN76489 Programmable Sound Generator | sn76489.asm |
| SNDDEV_AY38910 | $10 | AY-3-8910/YM2149 Programmable Sound Generator| ay38910.asm |
| SNDDEV_BITMODE | $20 | Bit-bang Speaker | spk.asm |
| SNDDEV_YM2612 | $30 | YM2612 Programmable Sound Generator | ym2612.asm |
| SNDDEV_AY38910 | $01 | AY-3-8910/YM2149 Programmable Sound Generator| ay38910.asm |
| SNDDEV_BITMODE | $02 | Bit-bang Speaker | spk.asm |
| SNDDEV_YM2612 | $03 | YM2612 Programmable Sound Generator | ym2612.asm |
The Sound functions defer the actual programming of the sound chip The Sound functions defer the actual programming of the sound chip
until the SNDPLAY function is called. You will call the volume until the SNDPLAY function is called. You will call the volume
@ -1752,6 +1964,9 @@ The hardware Platform (L) is identified as follows:
| PLT_RCZ280 |12 | RCBUS W/ Z280 | | PLT_RCZ280 |12 | RCBUS W/ Z280 |
| PLT_MBC |13 | NHYODYNE MULTI-BOARD COMPUTER | | PLT_MBC |13 | NHYODYNE MULTI-BOARD COMPUTER |
| PLT_RPH |14 | RHYOPHYRE GRAPHICS SBC | | PLT_RPH |14 | RHYOPHYRE GRAPHICS SBC |
| PLT_Z80RETRO |15 | Z80 RETRO COMPUTER |
| PLT_S100 |16 | S100 COMPUTERS Z180 |
| PLT_DUO |17 | DUODYNE Z80 SYSTEM |
### Function 0xF2 -- System Set Bank (SYSSETBNK) ### Function 0xF2 -- System Set Bank (SYSSETBNK)
@ -2123,6 +2338,17 @@ Wait States (D) is the actual number of wait states, not the number
of wait states added. The returned Status (A) is a standard HBIOS of wait states added. The returned Status (A) is a standard HBIOS
result code. result code.
#### SYSGET Subfunction 0xF4 -- Get Front Panel Swithes (PANEL)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0xF8 | A: Status |
| C: 0xF4 | L: Switches |
This function will return the current value of the switches (L) from the
front panel of the system. If no front panel is available in the
system, the returned Status (A) will indicate a No Hardware error.
### Function 0xF9 -- System Set (SYSSET) ### Function 0xF9 -- System Set (SYSSET)
| **Entry Parameters** | **Returned Values** | | **Entry Parameters** | **Returned Values** |
@ -2206,6 +2432,18 @@ limited set of divisors. If there is no satisfactory divisor to
retain the existing baud rate under the new CPU speed, then the baud retain the existing baud rate under the new CPU speed, then the baud
rate of the ASCI port(s) will be affected. rate of the ASCI port(s) will be affected.
#### SYSSET Subfunction 0xF4 -- Set Front Panel LEDs (PANEL)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0xF9 | A: Status |
| C: 0xF4 | |
| L: LEDs | |
This function will set the front panel LEDs based on the bits in L. If
no front panel is available in the system, the returned Status (A) will
indicate a No Hardware error.
### Function 0xFA -- System Peek (SYSPEEK) ### Function 0xFA -- System Peek (SYSPEEK)
| **Entry Parameters** | **Returned Values** | | **Entry Parameters** | **Returned Values** |

2956
Source/Doc/UserGuide.md

File diff suppressed because it is too large

BIN
Source/Doc/Z180 ASCI Baud Rate Options.xlsx

Binary file not shown.

5
Source/Fonts/Build.cmd

@ -11,8 +11,8 @@ echo Preparing compressed font files...
lzsa -f2 -r font8x8u.bin font8x8c.bin || exit /b lzsa -f2 -r font8x8u.bin font8x8c.bin || exit /b
lzsa -f2 -r font8x11u.bin font8x11c.bin || exit /b lzsa -f2 -r font8x11u.bin font8x11c.bin || exit /b
lzsa -f2 -r font8x16u.bin font8x16c.bin || exit /b lzsa -f2 -r font8x16u.bin font8x16c.bin || exit /b
lzsa -f2 -r fontcgau.bin fontcgac.bin || exit /b lzsa -f2 -r fontcgau.bin fontcgac.bin || exit /b
lzsa -f2 -r fontvgarcu.bin fontvgarcc.bin || exit /b
fonttool font8x8u.bin > font8x8u.asm || exit /b fonttool font8x8u.bin > font8x8u.asm || exit /b
fonttool font8x11u.bin > font8x11u.asm || exit /b fonttool font8x11u.bin > font8x11u.asm || exit /b
@ -20,6 +20,7 @@ fonttool font8x16u.bin > font8x16u.asm || exit /b
fonttool font8x8c.bin > font8x8c.asm || exit /b fonttool font8x8c.bin > font8x8c.asm || exit /b
fonttool font8x11c.bin > font8x11c.asm || exit /b fonttool font8x11c.bin > font8x11c.asm || exit /b
fonttool font8x16c.bin > font8x16c.asm || exit /b fonttool font8x16c.bin > font8x16c.asm || exit /b
fonttool fontcgau.bin > fontcgau.asm || exit /b fonttool fontcgau.bin > fontcgau.asm || exit /b
fonttool fontcgac.bin > fontcgac.asm || exit /b fonttool fontcgac.bin > fontcgac.asm || exit /b
fonttool fontvgarcu.bin > fontvgarcu.asm || exit /b
fonttool fontvgarcc.bin > fontvgarcc.asm || exit /b

9
Source/Fonts/Makefile

@ -1,8 +1,8 @@
OBJECTS = \ OBJECTS = \
font8x8u.asm font8x11u.asm font8x16u.asm fontcgau.asm \
font8x8c.asm font8x11c.asm font8x16c.asm fontcgac.asm
font8x8u.asm font8x11u.asm font8x16u.asm fontcgau.asm fontvgarcu.asm \
font8x8c.asm font8x11c.asm font8x16c.asm fontcgac.asm fontvgarcc.asm
OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin fontcgac.bin
OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin fontcgac.bin fontvgarcc.bin
TOOLS = ../../Tools TOOLS = ../../Tools
@ -26,5 +26,8 @@ font8x16c.bin: font8x16u.bin
fontcgac.bin: fontcgau.bin fontcgac.bin: fontcgau.bin
$(BINDIR)/lzsa -f2 -r $< $@ $(BINDIR)/lzsa -f2 -r $< $@
fontvgarcc.bin: fontvgarcu.bin
$(BINDIR)/lzsa -f2 -r $< $@
%.asm: %.bin %.asm: %.bin
$(BINDIR)/bin2asm $< > $@ $(BINDIR)/bin2asm $< > $@

BIN
Source/Fonts/fontvgarcu.bin

Binary file not shown.

99
Source/HBIOS/API.txt

@ -118,6 +118,10 @@ GET ($F8):
D=Memory Wait States D=Memory Wait States
E=I/O Wait States E=I/O Wait States
PANEL ($F4):
BC=Function/Subfunction A=Result
L=Switch Values
SET ($F9): SET ($F9):
BC=Function/Subfunction A=Result BC=Function/Subfunction A=Result
@ -142,6 +146,11 @@ SET ($F9):
E=I/O Wait States E=I/O Wait States
PANEL ($F4):
BC=Function/Subfunction A=Result
L=LED Values
PEEK ($FA): PEEK ($FA):
B=Function A=Result B=Function A=Result
D=Bank E=Byte Value D=Bank E=Byte Value
@ -475,3 +484,93 @@ TERM_ATTACH: (C=VIDEO UNIT, DE=<VDA>_DISPATCH)
- QUERY ATTACHED VDA FOR SCREEN SIZE (VIA <EMU>_VDADISP) - QUERY ATTACHED VDA FOR SCREEN SIZE (VIA <EMU>_VDADISP)
- INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE - INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE
- RETURN (A=STATUS) - RETURN (A=STATUS)
==============
DSKY Functions
==============
RESET ($30):
B=Function A=Result
STAT ($31):
B=Function A=Result / Bytes Pending
A=Number of characters waiting or error code if negative
GETKEY ($32):
B=Function A=Result
E=Key Code
A=DSKY key value or error code if negative
SHOWHEX ($33):
B=Function A=Result
DE:HL=Value (32-bit)
Display value of DE:HL in hex on display. It is not
possible to show decimal points.
SHOWSEG ($34):
B=Function A=Result
HL=Buffer (raw segment encoded)
Display raw segment values. Each byte represents one
character. Each segment of the character is represented
by a bit. The buffer must be located in high memory.
The segments are encoded as shown below:
+--01--+
20 02
+--40--+
10 04
+--08--+ 80
KEYLEDS ($35):
B=Function A=Result
HL=Buffer (LED bitmap)
Light the LEDs for the keypad keys according to the
bitmap contained in the buffer pointed to by HL. The buffer
must be located in high memory.
At this time, the bitmap is specific to the DSKYNG hardware.
This function is ignored by the original DSKY.
STATLED ($36):
B=Function A=Result
D=LED Number
E=LED State (0/1)
Set or clear the status LED specified in D. The state of
the LED is contained in E. If E=0, the LED will be turned
off. If E=1, the LED will be turned on.
BEEP ($37):
B=Function A=Result
Beep the onboard speaker of the DSKY. Only the DSKYNG hardware
has a speaker. This function will be ignored by the original
DSKY.
DEVICE ($38):
B=Function A=Result
D=Device Type
E=Device Number
C=Device Attributes
H=Device Mode
L=Base I/O Adr
Returns device information for the DSKY unit. The Status (A) is a
standard HBIOS result code. Device Attribute (C) values are not yet
defined. Device Type (D) indicates the specific hardware driver that
handles the specified character unit. Values are listed at the start
of this section. Device Number (E) indicates the physical device
number assigned per driver which is always 0 for DSKY.
Device Mode (H) is used to indicate the variant of the chip or circuit
that is used by the specified unit. The Device I/O Base Address (L)
indicates the starting port address of the hardware interface that is
servicing the specified unit. Both of these values are considered
driver specific. Refer to the associated hardware driver for the
values used.

85
Source/HBIOS/Bank Layout.txt

@ -0,0 +1,85 @@
ROM Bank Layout
Bank ID Module Start Size
------ ------ ------ ------
0x00 hbios 0x0000 0x8000
<end> 0x8000
0x01 loader 0x0000 0x1000
dbgmon 0x1000 0x2000
cpm22 0x2000 0x3000
zsys 0x5000 0x3000
<end> 0x8000
0x02 forth 0x0000 0x1700
basic 0x1700 0x2000
tbasic 0x3700 0x0900
game 0x4000 0x0900
egg 0x4900 0x0200
netboot 0x4B00 0x1000
updater 0x5B00 0x0D00
usrrom 0x6800 0x1800
<end> 0x8000
0x03 imgpad2 0x0000 0x8000
<end> 0x8000
0x04 - N ROM Disk Data
Typical ROM Bank Layout
Bank ID Usage
------- ------
0x00 Boot Bank (HBIOS image)
0x01 ROM Loader, Monitor, ROM OSes
0x02 ROM Applications
0x03 Reserved
0x04-0x0F ROM Disk Banks
Typical RAM Bank Layout
Bank ID Usage
------- ------
0x80 RomWBW HBIOS
0x81-0x8B RAM Disk Data
0x8C CP/M 3 Buffers
0x8D CP/M 3 OS
0x8E User TPA
0x8F Common
Typical ROMless Bank Layout
Bank ID Usage
------- ------
0x80 RomWBW HBIOS
0x81 Loader, DbgMon, CP/M 2.2, ZSDOS
0x82 ROM Apps
0x83 More ROM Apps
0x84-0x8B RAM Disk Data
0x8C CP/M 3 Buffers
0x8D CP/M 3 OS
0x8E User TPA
0x8F Common
ROMless Tiny Bank Layout (128K)
NOTE: no ROM Apps, no CP/M 3 support, no RAM disk
Bank ID Usage
------- ------
0x80 RomWBW HBIOS
0x81 Loader, DbgMon, CP/M 2.2, ZSDOS
0x82 User TPA
0x83 Common
Disk Image Sizes
Image Size ROM System ROMless System
---------- ---------- --------------
1024K 896K 768K
512 384K 256K
256 128K 0K
128 (tiny) n/a 0K

47
Source/HBIOS/Build.cmd

@ -33,6 +33,16 @@ PowerShell -ExecutionPolicy Unrestricted .\Build.ps1 %* || exit /b
call build_env.cmd call build_env.cmd
::
:: Start of the actual build process for a given ROM.
::
echo.
echo ============================================================
echo %ROMName% for Z%CPUType% CPU
echo ============================================================
echo.
:: ::
:: Create a small app that is used to export key build variables of the build. :: Create a small app that is used to export key build variables of the build.
:: Then run the app to output a file with the variables. Finally, read the :: Then run the app to output a file with the variables. Finally, read the
@ -43,12 +53,6 @@ tasm -t80 -g3 -dCMD hbios_env.asm hbios_env.com hbios_env.lst || exit /b
zxcc hbios_env >hbios_env.cmd zxcc hbios_env >hbios_env.cmd
call hbios_env.cmd call hbios_env.cmd
::
:: Start of the actual build process for a given ROM.
::
echo Building %ROMSize%K ROM %ROMName% for Z%CPUType% CPU...
:: ::
:: UNA is a special case, check for it and jump if needed. :: UNA is a special case, check for it and jump if needed.
:: ::
@ -93,7 +97,14 @@ call :asm imgpad2 || exit /b
copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin + ..\cpm22\cpm_wbw.bin osimg.bin || exit /b copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin + ..\cpm22\cpm_wbw.bin osimg.bin || exit /b
copy /b ..\Forth\camel80.bin + nascom.bin + ..\tastybasic\src\tastybasic.bin + game.bin + eastaegg.bin + netboot.mod + updater.bin + usrrom.bin osimg1.bin || exit /b copy /b ..\Forth\camel80.bin + nascom.bin + ..\tastybasic\src\tastybasic.bin + game.bin + eastaegg.bin + netboot.mod + updater.bin + usrrom.bin osimg1.bin || exit /b
copy /b imgpad2.bin osimg2.bin || exit /b
if %Platform%==S100 (
zxcc slr180 -s100mon/fh
zxcc mload25 -s100mon || exit /b
copy /b s100mon.com osimg2.bin || exit /b
) else (
copy /b imgpad2.bin osimg2.bin || exit /b
)
copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b
@ -103,10 +114,8 @@ copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit
:: should yield a result of zero. :: should yield a result of zero.
:: ::
if %ROMSize% gtr 0 (
for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do (
"%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o %%f -Binary || exit /b
)
for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do (
"%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o %%f -Binary || exit /b
) )
:: ::
@ -130,8 +139,8 @@ if %ROMSize% gtr 0 (
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b
copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b
) else ( ) else (
copy /b hbios_rom.bin + osimg_small.bin %ROMName%.rom || exit /b
copy /b hbios_rom.bin + osimg_small.bin %ROMName%.upd || exit /b
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\ram%RAMSize%_wbw.dat %ROMName%.rom || exit /b
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b
copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b
) )
@ -209,19 +218,29 @@ call Build RCZ80 skz || exit /b
:: call Build RCZ80 duart || exit /b :: call Build RCZ80 duart || exit /b
call Build RCZ80 zrc || exit /b call Build RCZ80 zrc || exit /b
call Build RCZ80 zrc_ram || exit /b call Build RCZ80 zrc_ram || exit /b
call Build RCZ80 zrc512 || exit /b
call Build RCZ180 ext || exit /b call Build RCZ180 ext || exit /b
call Build RCZ180 nat || exit /b call Build RCZ180 nat || exit /b
call Build RCZ180 z1rcc || exit /b
call Build RCZ280 ext || exit /b call Build RCZ280 ext || exit /b
call Build RCZ280 nat || exit /b call Build RCZ280 nat || exit /b
call Build RCZ280 zz80mb || exit /b call Build RCZ280 zz80mb || exit /b
call Build RCZ280 zzrc || exit /b
call Build RCZ280 zzrcc || exit /b
call Build RCZ280 zzrcc_ram || exit /b
call Build SCZ180 sc126 || exit /b call Build SCZ180 sc126 || exit /b
call Build SCZ180 sc130 || exit /b call Build SCZ180 sc130 || exit /b
call Build SCZ180 sc131 || exit /b call Build SCZ180 sc131 || exit /b
call Build SCZ180 sc140 || exit /b call Build SCZ180 sc140 || exit /b
call Build SCZ180 sc503 || exit /b call Build SCZ180 sc503 || exit /b
call Build SCZ180 sc700 || exit /b
call Build DYNO std || exit /b call Build DYNO std || exit /b
call Build UNA std || exit /b call Build UNA std || exit /b
call Build RPH std || exit /b call Build RPH std || exit /b
call Build Z80RETRO std || exit /b
call Build S100 std || exit /b
call Build DUO std || exit /b
call Build HEATH std || exit /b
call Build EPITX std || exit /b
:: call Build MON std || exit /b
goto :eof goto :eof

4
Source/HBIOS/Build.ps1

@ -27,8 +27,8 @@ $ErrorAction = 'Stop'
# UNA BIOS is simply imbedded, it is not built here. # UNA BIOS is simply imbedded, it is not built here.
# #
$PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "UNA"
$PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH"
$PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "Z80RETRO", "DUO", "UNA", "HEATH", "MON"
$PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH", "S100", "EPITX"
$PlatformListZ280 = "RCZ280" $PlatformListZ280 = "RCZ280"
# #

15
Source/HBIOS/Build.sh

@ -6,6 +6,7 @@ set -e
export ROM_PLATFORM export ROM_PLATFORM
export ROM_CONFIG export ROM_CONFIG
export ROMSIZE export ROMSIZE
export RAMSIZE
export CPUFAM export CPUFAM
if [ "${ROM_PLATFORM}" == "dist" ] ; then if [ "${ROM_PLATFORM}" == "dist" ] ; then
@ -15,10 +16,12 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then
ROM_PLATFORM="N8"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="N8"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="RCZ180"; ROM_CONFIG="ext"; bash Build.sh ROM_PLATFORM="RCZ180"; ROM_CONFIG="ext"; bash Build.sh
ROM_PLATFORM="RCZ180"; ROM_CONFIG="nat"; bash Build.sh ROM_PLATFORM="RCZ180"; ROM_CONFIG="nat"; bash Build.sh
ROM_PLATFORM="RCZ180"; ROM_CONFIG="z1rcc"; bash Build.sh
ROM_PLATFORM="RCZ280"; ROM_CONFIG="ext"; bash Build.sh ROM_PLATFORM="RCZ280"; ROM_CONFIG="ext"; bash Build.sh
ROM_PLATFORM="RCZ280"; ROM_CONFIG="nat"; bash Build.sh ROM_PLATFORM="RCZ280"; ROM_CONFIG="nat"; bash Build.sh
ROM_PLATFORM="RCZ280"; ROM_CONFIG="zz80mb"; bash Build.sh ROM_PLATFORM="RCZ280"; ROM_CONFIG="zz80mb"; bash Build.sh
ROM_PLATFORM="RCZ280"; ROM_CONFIG="zzrc"; bash Build.sh
ROM_PLATFORM="RCZ280"; ROM_CONFIG="zzrcc"; bash Build.sh
ROM_PLATFORM="RCZ280"; ROM_CONFIG="zzrcc_ram"; bash Build.sh
# ROM_PLATFORM="RCZ80"; ROM_CONFIG="mt"; bash Build.sh # ROM_PLATFORM="RCZ80"; ROM_CONFIG="mt"; bash Build.sh
# ROM_PLATFORM="RCZ80"; ROM_CONFIG="duart"; bash Build.sh # ROM_PLATFORM="RCZ80"; ROM_CONFIG="duart"; bash Build.sh
ROM_PLATFORM="RCZ80"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="std"; bash Build.sh
@ -28,18 +31,26 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then
ROM_PLATFORM="RCZ80"; ROM_CONFIG="skz"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="skz"; bash Build.sh
ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc"; bash Build.sh
ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc_ram"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc_ram"; bash Build.sh
ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc512"; bash Build.sh
ROM_PLATFORM="RPH"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="RPH"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="SBC"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="SBC"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="SBC"; ROM_CONFIG="simh"; bash Build.sh ROM_PLATFORM="SBC"; ROM_CONFIG="simh"; bash Build.sh
ROM_PLATFORM="MBC"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="MBC"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="DUO"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc126"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc126"; bash Build.sh
ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc130"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc130"; bash Build.sh
ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc131"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc131"; bash Build.sh
ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc140"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc140"; bash Build.sh
ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc503"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc503"; bash Build.sh
ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc700"; bash Build.sh
ROM_PLATFORM="S100"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="UNA"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="UNA"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="Z80RETRO"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="ZETA"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="ZETA"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="ZETA2"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="ZETA2"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="HEATH"; ROM_CONFIG="std"; bash Build.sh
ROM_PLATFORM="EPITX"; ROM_CONFIG="std"; bash Build.sh
# ROM_PLATFORM="MON"; ROM_CONFIG="std"; bash Build.sh
exit exit
fi fi
@ -104,4 +115,4 @@ fi
#echo OBJECTS=${OBJECTS} #echo OBJECTS=${OBJECTS}
make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE}
make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE} RAMSIZE=${RAMSIZE}

1
Source/HBIOS/Clean.cmd

@ -11,6 +11,7 @@ if exist *.exp del *.exp
if exist *.tmp del *.tmp if exist *.tmp del *.tmp
if exist *.mrk del *.mrk if exist *.mrk del *.mrk
if exist *.sys del *.sys if exist *.sys del *.sys
if exist *.hex del *.hex
if exist build.inc del build.inc if exist build.inc del build.inc
if exist font*.asm del font*.asm if exist font*.asm del font*.asm
if exist build_env.cmd del build_env.cmd if exist build_env.cmd del build_env.cmd

47
Source/HBIOS/Config/DUO_std.asm

@ -0,0 +1,47 @@
;
;==================================================================================================
; DUODYNE STANDARD CONFIGURATION
;==================================================================================================
;
; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE
; CFG_<PLT>.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS
; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE
; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS.
; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE <PLT>_XXX.ASM AND SPECIFY
; YOUR FILE IN THE BUILD PROCESS.
;
; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM.
; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO
; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON
; SETTINGS.
;
; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE,
; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING
; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS!
;
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO
; DIRECTORIES ABOVE THIS ONE).
;
#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON <CR> OR AUTO BOOT
;
#include "cfg_duo.asm"
;
CPUOSC .SET 8000000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
;
;;;DMAENABLE .SET TRUE ; DMA: ENABLE DMA DRIVER (DMA.ASM)
;
BATCOND .SET TRUE ; ENABLE LOW BATTERY WARNING MESSAGE
;
ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
;
PCFENABLE .SET TRUE ; ENABLE PCF8584 I2C CONTROLLER
;
MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM
;
UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3
;
ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM)

2
Source/HBIOS/Config/DYNO_std.asm

@ -34,8 +34,6 @@ Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
; ;
ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM)
;ASCI0CFG .SET SER_115200_8N1 ; ASCI 0: SERIAL LINE CONFIG
;ASCI1CFG .SET SER_115200_8N1 ; ASCI 1: SERIAL LINE CONFIG
; ;
FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
; ;

64
Source/HBIOS/Config/EPITX_std.asm

@ -0,0 +1,64 @@
;
;==================================================================================================
; Z180 Mini ITX STANDARD CONFIGURATION
;==================================================================================================
;
; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE
; CFG_<PLT>.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS
; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE
; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS.
; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE <PLT>_XXX.ASM AND SPECIFY
; YOUR FILE IN THE BUILD PROCESS.
;
; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM.
; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO
; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON
; SETTINGS.
;
; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE,
; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING
; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS!
;
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO
; DIRECTORIES ABOVE THIS ONE).
;
#DEFINE PLATFORM_NAME "Z180 MiniITX"
;
#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON <CR> OR AUTO BOOT
;
#include "cfg_epitx.asm"
;
CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ
;
Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
HBIOS_MUTEX .SET FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD)
;
LEDENABLE .SET FALSE ; ENABLE STATUS LED (SINGLE LED)
;
DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM)
;
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM)
ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
;
TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
;
FDENABLE .SET TRUE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC]
FDMODE .SET FDMODE_EPFDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
;
IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
;
PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
;
SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

69
Source/HBIOS/Config/HEATH_std.asm

@ -0,0 +1,69 @@
;
;==================================================================================================
; HEATH H8 Z80 STANDARD CONFIGURATION
;==================================================================================================
;
; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE
; CFG_<PLT>.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS
; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE
; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS.
; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE <PLT>_XXX.ASM AND SPECIFY
; YOUR FILE IN THE BUILD PROCESS.
;
; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM.
; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO
; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON
; SETTINGS.
;
; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE,
; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING
; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS!
;
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO
; DIRECTORIES ABOVE THIS ONE).
;
#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON <CR> OR AUTO BOOT
;
#include "cfg_rcz80.asm"
;
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
DSKYENABLE .SET TRUE ; ENABLES DSKY FUNCTIONALITY
H8PENABLE .SET TRUE ; ENABLES HEATH H8 FRONT PANEL
;
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
;
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM)
;
LPTENABLE .SET FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1)
TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO]
MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER)
VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM)
VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD
;
AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER
AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC]
SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER
;
FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC]
;
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|USR]
SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY
IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
;
PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM)

10
Source/HBIOS/Config/MBC_std.asm

@ -42,11 +42,15 @@ RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
; ;
MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM
; ;
DSKYENABLE .SET FALSE ; ENABLES DSKY
DSKYMODE .SET DSKYMODE_NG ; DSKY VERSION: DSKYMODE_[V1|NG]
DSKYENABLE .SET TRUE ; ENABLES DSKY FUNCTIONALITY
ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
PKDENABLE .SET TRUE ; ENABLES DSKY NG PKD DRIVER (8259)
; ;
UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3
;UARTCFG .SET UARTCFG | SER_RTS
;
ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM)
;
LPTENABLE .SET TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
; ;
CVDUMON .SET CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] CVDUMON .SET CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA]
; ;

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save